#pragma once #include VK_NAMESPACE_BEGIN class GraphModule; class GraphModuleManager; class GraphModuleFactory { public: GraphModuleFactory()=default; virtual ~GraphModuleFactory()=default; virtual GraphModule *Create(GraphModuleManager *)=0; };//class GraphModuleFactory bool RegistryGraphModuleFactory(const char *module_name,GraphModuleFactory *); template class RegistryGraphModule:public GraphModuleFactory { public: GraphModule *Create(GraphModuleManager *gmm) override { if(!gmm) return(nullptr); Map dgm_map; //检查依赖模块 { const auto &dependent_modules=T::GetDependentModules(); if(!dependent_modules.IsEmpty()) { for(const AnsiIDName &name:dependent_modules) { GraphModule *dgm=gmm->GetModule(name,true); if(!dgm) return(nullptr); dgm_map.Add(name,dgm); } } } GraphModule *gm=new T(gmm,dgm_map); if(!gm->InitDependentModules(gmm)) { delete gm; return(nullptr); } if(!gm->Init()) { delete gm; return(nullptr); } return(gm); } };//template class RegistryGraphModule:public GraphModuleFactory #define REGISTRY_GRAPH_MODULE(Class) {RegistryGraphModuleFactory(#Class,new RegistryGraphModule);} VK_NAMESPACE_END