aboutsummaryrefslogtreecommitdiff
path: root/packages/noncvs/windows/extra/Gem/dev/plugins/PluginFactoryTimple.h
diff options
context:
space:
mode:
Diffstat (limited to 'packages/noncvs/windows/extra/Gem/dev/plugins/PluginFactoryTimple.h')
-rw-r--r--packages/noncvs/windows/extra/Gem/dev/plugins/PluginFactoryTimple.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/packages/noncvs/windows/extra/Gem/dev/plugins/PluginFactoryTimple.h b/packages/noncvs/windows/extra/Gem/dev/plugins/PluginFactoryTimple.h
new file mode 100644
index 00000000..a82762d1
--- /dev/null
+++ b/packages/noncvs/windows/extra/Gem/dev/plugins/PluginFactoryTimple.h
@@ -0,0 +1,134 @@
+
+/*-----------------------------------------------------------------
+LOG
+ GEM - Graphics Environment for Multimedia
+
+ - template implementation for PluginFactory
+
+ Copyright (c) 2010-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
+ For information on usage and redistribution, and for a DISCLAIMER OF ALL
+ WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.
+
+-----------------------------------------------------------------*/
+
+#ifndef _INCLUDE__GEM_PLUGINS_PLUGINFACTORY_H_
+# error you must not include PluginFactory Implementation directly! include PluginFactory.h instead
+#endif
+
+/* on M$VC (at least v2007) we must not define the template-implementation in the plugins
+ * if we want to use the same implementation in both host and application
+ *
+ * on gcc (at least on linux) we have to provide the implementation
+ */
+#if defined _MSC_VER && !defined GEM_INTERNAL
+# define OMIT_PLUGINFACTORY_TEMPLATE_IMPLEMENATION
+#endif
+
+#ifndef OMIT_PLUGINFACTORY_TEMPLATE_IMPLEMENATION
+
+/* Implementation of templated PluginFactory */
+/* actually this should be done in a cpp file rather than a header-file,
+ * but since virtually no compiler can handle this it is done here...
+ */
+
+
+/* ********************************************************************* */
+/* Implementation of PluginFactory<Class> */
+
+template<class Class>
+ PluginFactory<Class>* PluginFactory<Class>::s_factory=NULL;
+
+template<class Class>
+ PluginFactory<Class>* PluginFactory<Class>::getPluginFactory(void) {
+ if(NULL==s_factory) {
+ s_factory=new PluginFactory<Class>;
+ }
+ //std::cerr << "factory @ " << (void*)s_factory << " --> " << typeid(s_factory).name() << std::endl;
+ return s_factory;
+}
+
+template<class Class>
+ void PluginFactory<Class>::doRegisterClass(std::string id, ctor_t*c) {
+ set(id, (void*)c);
+}
+
+template<class Class>
+ Class*PluginFactory<Class>::doGetInstance(std::string id) {
+ ctor_t*ctor=(ctor_t*)get(id);
+ if(ctor)
+ return ctor();
+ else
+ return NULL;
+}
+
+template<class Class>
+void PluginFactory<Class>::registerClass(std::string id, ctor_t*c) {
+ PluginFactory<Class>*fac=getPluginFactory();
+ if(NULL==fac) {
+ std::cerr << "unable to get a factory!" << std::endl;
+ }
+ // std::cerr << "factory @ " << (void*)fac << std::endl;
+ fac->doRegisterClass(id, c);
+}
+
+template<class Class>
+Class*PluginFactory<Class>::getInstance(std::string id) {
+ PluginFactory<Class>*fac=getPluginFactory();
+ if(NULL==fac) {
+ return NULL;
+ }
+ return(fac->doGetInstance(id));
+}
+
+template<class Class>
+ int PluginFactory<Class>::loadPlugins(std::string basename, std::string path) {
+ PluginFactory<Class>*fac=getPluginFactory();
+ if(NULL==fac) {
+ return 0;
+ }
+ return fac->doLoadPlugins(basename, path);
+}
+
+template<class Class>
+ std::vector<std::string>PluginFactory<Class>::doGetIDs() {
+ return get();
+}
+
+template<class Class>
+ std::vector<std::string>PluginFactory<Class>::getIDs() {
+ std::vector<std::string>result;
+ PluginFactory<Class>*fac=getPluginFactory();
+ if(fac) {
+ return fac->doGetIDs();
+ }
+ return result;
+}
+
+#endif /* !OMIT_PLUGINFACTORY_TEMPLATE_IMPLEMENATION */
+
+/* ********************************************************************* */
+/* Implementation of PluginFactoryRegistrar<ChildClass, BaseClass> */
+
+namespace PluginFactoryRegistrar {
+ template<class ChildClass, class BaseClass>
+ BaseClass* allocator() {
+ ChildClass* res0 = new ChildClass();
+ BaseClass* res1 = dynamic_cast<BaseClass*>(res0);
+ if(NULL==res1) {
+ delete res0;
+ }
+ return res1;
+ }
+
+ template<class ChildClass, class BaseClass>
+ registrar<ChildClass, BaseClass> :: registrar(std::string id) {
+ PluginFactory<BaseClass>::registerClass(id, allocator<ChildClass, BaseClass>);
+ }
+ template<class BaseClass>
+ dummy<BaseClass> :: dummy() {
+ std::string id; // default ID
+ PluginFactory<BaseClass>::registerClass(id, NULL);
+ }
+
+};
+