Opticks 插件註冊宏分析

#define REGISTER_MODULE(name__) \

   GENERATE_FACTORY(name__) \
   REGISTER_MODULE_BASIC(name__, name__, true, MOD_THREE)
   
#define GENERATE_FACTORY(moduleNamespace__) \
   namespace moduleNamespace__ { \
   std::vector<std::pair<std::string, PlugInFactory*> >& factories() \
   { \
      static std::vector<std::pair<std::string, PlugInFactory*> > sFactories; \
      return sFactories; \
   } \
   void addFactory(PlugInFactory* pFactory) \
   { \
      if (pFactory != NULL) \
      { \
         std::vector<std::string> names = pFactory->getPlugInNames(); \
         for (std::vector<std::string>::iterator nameIter = names.begin(); nameIter != names.end(); ++nameIter) \
         { \
            factories().push_back(make_pair(*nameIter, pFactory)); \
         } \
      } \
   } \
   PlugIn* getPlugIn(unsigned int plugInNumber) \
   { \
      static bool factoriesSorted = false; \
      if (!factoriesSorted) \
      { \
         factoriesSorted = true; \
         FactoryPtrComparator comp; \
         std::sort(factories().begin(), factories().end(), comp); \
      } \
      if (plugInNumber >= factories().size()) \
      { \
         return NULL; \
      } \
      const std::pair<std::string, PlugInFactory*>& plugin = factories()[plugInNumber]; \
      return plugin.second->createPlugIn(plugin.first); \
   } \
   }
   
#define REGISTER_MODULE_BASIC(name__, moduleNamespace__, canCache__, modVersion__) \
   extern "C" \
   { \
      struct OpticksModuleDescriptor name__##Descriptor = \
      { \
         modVersion__, \
         #name__, \
         #name__ "InstantiatePlugIn", \
         DEBUG_BOOL, \
         canCache__ \
      }; \
      LINKAGE struct OpticksModuleDescriptor* opticks_get_module_descriptor(External*) \
      { \
         return &name__##Descriptor; \
      } \
      LINKAGE bool name__##InstantiatePlugIn(External* pExternal, unsigned int plugInNumber, PlugIn** pPlugIn) \
      { \
         ModuleManager::instance()->setService(pExternal); \
         *pPlugIn = moduleNamespace__::getPlugIn(plugInNumber); \
         return *pPlugIn != NULL; \
      } \
   }; \
   const char* ModuleManager::mspName = NULL; \
   const char* ModuleManager::mspVersion = NULL; \
   const char* ModuleManager::mspDescription = NULL; \
   const char* ModuleManager::mspValidationKey = NULL; \
   const char* ModuleManager::mspUniqueId = NULL; \
   unsigned int ModuleManager::getTotalPlugIns() { return 0; } \
   PlugIn* ModuleManager::getPlugIn(unsigned int) { return NULL; }
 
#define REGISTER_DYNAMIC_MODULE(name__, dynamicFactoryClass__) \
   GENERATE_DYNAMIC_FACTORY(name__, dynamicFactoryClass__) \
   REGISTER_MODULE_BASIC(name__, name__, false, MOD_THREE) 
     
#define REGISTER_PLUGIN(moduleNamespace__, pluginname__, className__) \
   namespace moduleNamespace__ \
   { \
      void addFactory(PlugInFactory*); \
      class pluginname__##PlugInFactory : public BasicPlugInFactory \
      { \
      public: \
         pluginname__##PlugInFactory(const std::string& name) : BasicPlugInFactory(name) \
         { \
            moduleNamespace__::addFactory(this); \
         } \
         PlugIn* createPlugIn(const std::string& name) \
         { \
            return new className__; \
         } \
      }; \
      static pluginname__##PlugInFactory pluginname__##pluginFactory(#pluginname__); \
   }
 
#define REGISTER_PLUGIN_BASIC(moduleNamespace__, name__) REGISTER_PLUGIN(moduleNamespace__, name__, name__)
 
#define GENERATE_DYNAMIC_FACTORY(moduleNamespace__, dynamicFactoryClass__) \
   namespace moduleNamespace__ { \
   static dynamicFactoryClass__ sDynamicFactoryInstance__; \
   std::vector<std::pair<std::string, PlugInFactory*> >& factories() \
   { \
      static std::vector<std::pair<std::string, PlugInFactory*> > sFactories; \
      return sFactories; \
   } \
   void addFactory(PlugInFactory* pFactory) \
   { \
      if (pFactory != NULL) \
      { \
         std::vector<std::string> names = pFactory->getPlugInNames(); \
         for (std::vector<std::string>::iterator nameIter = names.begin(); nameIter != names.end(); ++nameIter) \
         { \
            factories().push_back(make_pair(*nameIter, pFactory)); \
         } \
      } \
   } \
   PlugIn* getPlugIn(unsigned int plugInNumber) \
   { \
      static bool factoriesSorted = false; \
      if (!factoriesSorted) \
      { \
         factoriesSorted = true; \
         DynamicPlugInFactory* pFac = &sDynamicFactoryInstance__; \
         addFactory(pFac); \
         FactoryPtrComparator comp; \
         std::sort(factories().begin(), factories().end(), comp); \
      } \
      if (plugInNumber >= factories().size()) \
      { \
         return NULL; \
      } \
      const std::pair<std::string, PlugInFactory*>& plugin = factories()[plugInNumber]; \
      return plugin.second->createPlugIn(plugin.first); \
   } \
   }
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章