#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); \
} \
}