KernelTable::KernelTable(const Converter& converter) :
		converter(converter),
	    declaration(c_ast::CCodeFragment::createNew(
			converter.getFragmentManager(),
			converter.getCNodeManager()->create<c_ast::OpaqueCode>("extern irt_opencl_kernel_implementation *" KERNEL_TABLE_NAME "[];"))) {
		addDependency(declaration);
		runtime::ContextHandlingFragmentPtr ctx = runtime::ContextHandlingFragment::get(converter);
		// add the dataReq. table as well
		ctx->addInitExpression("\tirt_opencl_init_context(%s, " KERNEL_TABLE_NAME ");\n");
		ctx->addCleanupExpression("\tirt_opencl_cleanup_context(%s);\n");
	}
	KernelTablePtr KernelTable::get(const Converter& converter) {
		static string ENTRY_NAME = "KernelTable";

		// look up the entry within the fragment manager
		auto manager = converter.getFragmentManager();
		auto res = manager->getFragment(ENTRY_NAME);
		if(!res) {
			// create new instance
			KernelTablePtr table = manager->create<KernelTable>(boost::ref(converter));
			manager->bindFragment(ENTRY_NAME, table);
			res = table;
		}
		return static_pointer_cast<KernelTable>(res);
	}