#pragma once

#ifdef LLVM_AVAILABLE

#include <memory>
#include <string>
#include <unordered_map>

#include "types.h"

#ifdef _MSC_VER
#pragma warning(push, 0)
#endif
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#ifdef _MSC_VER
#pragma warning(pop)
#endif

extern llvm::LLVMContext g_llvm_ctx;

// Temporary compiler interface
class jit_compiler final
{
	// Execution instance
	std::unique_ptr<llvm::ExecutionEngine> m_engine;

	// Compiled functions
	std::unordered_map<std::string, std::uintptr_t> m_map;

public:
	jit_compiler(std::unique_ptr<llvm::Module>&&, std::unordered_map<std::string, std::uintptr_t>&&);
	~jit_compiler();

	// Get compiled function address
	std::uintptr_t get(const std::string& name) const
	{
		const auto found = m_map.find(name);
		
		if (found != m_map.end())
		{
			return found->second;
		}

		return 0;
	}
};

#endif