summaryrefslogtreecommitdiff
path: root/include/module/ModuleRegistry.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/module/ModuleRegistry.hpp')
-rwxr-xr-xinclude/module/ModuleRegistry.hpp190
1 files changed, 190 insertions, 0 deletions
diff --git a/include/module/ModuleRegistry.hpp b/include/module/ModuleRegistry.hpp
new file mode 100755
index 0000000..e217092
--- /dev/null
+++ b/include/module/ModuleRegistry.hpp
@@ -0,0 +1,190 @@
+#ifndef __MODULEINTERFACE_H
+#define __MODULEINTERFACE_H
+
+#include <string>
+
+#include "TypeList.hpp"
+
+template< typename Interface, typename CtorParams = NullType >
+struct ModuleRegistry;
+
+template< typename Interface>
+struct ModuleRegistry< Interface > {
+ std::string name;
+ Interface *(*create)( );
+ void (*destroy)( Interface *obj );
+
+ ModuleRegistry( std::string _name, Interface *(*_create)( ),
+ void (*_destroy)( Interface *obj ) )
+ : name( _name ), create( _create ), destroy( _destroy )
+ {
+ }
+};
+
+template< typename Interface, typename P1 >
+struct ModuleRegistry< Interface, TYPELIST_1( P1 ) > {
+ std::string name;
+ Interface *(*create)( P1 );
+ void (*destroy)( Interface *obj );
+
+ ModuleRegistry( std::string _name, Interface *(*_create)( P1 ),
+ void (*_destroy)( Interface *obj ) )
+ : name( _name ), create( _create ), destroy( _destroy )
+ {
+ }
+};
+
+template< typename Interface, typename P1, typename P2 >
+struct ModuleRegistry< Interface, TYPELIST_2( P1, P2 ) > {
+ std::string name;
+ Interface *(*create)( P1, P2 );
+ void (*destroy)( Interface *obj );
+
+ ModuleRegistry( std::string _name, Interface *(*_create)( P1, P2 ),
+ void (*_destroy)( Interface *obj ) )
+ : name( _name ), create( _create ), destroy( _destroy )
+ {
+ }
+};
+
+template< typename Interface, typename P1, typename P2, typename P3 >
+struct ModuleRegistry< Interface, TYPELIST_3( P1, P2, P3 ) > {
+ std::string name;
+ Interface *(*create)( P1, P2, P3 );
+ void (*destroy)( Interface *obj );
+
+ ModuleRegistry( std::string _name, Interface *(*_create)( P1, P2, P3 ),
+ void (*_destroy)( Interface *obj ) )
+ : name( _name ), create( _create ), destroy( _destroy )
+ {
+ }
+};
+
+template< typename Interface, typename P1, typename P2, typename P3, typename P4 >
+struct ModuleRegistry< Interface, TYPELIST_4( P1, P2, P3, P4 ) > {
+ std::string name;
+ Interface *(*create)( P1, P2, P3, P4 );
+ void (*destroy)( Interface *obj );
+
+ ModuleRegistry( std::string _name, Interface *(*_create)( P1, P2, P3, P4 ),
+ void (*_destroy)( Interface *obj ) )
+ : name( _name ), create( _create ), destroy( _destroy )
+ {
+ }
+};
+
+#ifdef SHARED
+
+#ifndef _WIN32
+#define DLLEXPORT
+#else
+#define DLLEXPORT __declspec( dllexport )
+#endif
+
+// no param macro
+
+#define DECLARE_MODULE( baseClass ) \
+ extern "C" DLLEXPORT ModuleRegistry<baseClass> registry ## _ ## baseClass;
+
+#define REGISTER_MODULE( name, baseClass, subClass ) \
+static baseClass *create( ) \
+{ \
+ return new subClass( ); \
+} \
+ \
+static void destroy( baseClass *obj ) \
+{ \
+ delete obj; \
+} \
+ \
+ModuleRegistry<baseClass> registry ## _ ## baseClass( name, &create, &destroy );
+
+// 1 param macro
+
+#define DECLARE_MODULE_1( baseClass, T1 ) \
+ extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_1( T1 ) > registry ## _ ## baseClass;
+
+#define REGISTER_MODULE_1( name, baseClass, subClass, T1 ) \
+static baseClass *create( T1 t1 ) \
+{ \
+ return new subClass( t1 ); \
+} \
+ \
+static void destroy( baseClass *obj ) \
+{ \
+ delete obj; \
+} \
+ \
+ModuleRegistry<baseClass, TYPELIST_1( T1 )> registry ## _ ## baseClass( name, &create, &destroy );
+
+// 2 param macro
+
+#define DECLARE_MODULE_2( baseClass, T1, T2 ) \
+ extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_2( T1, T2 ) > registry ## _ ## baseClass;
+
+#define REGISTER_MODULE_2( name, baseClass, subClass, T1, T2 ) \
+static baseClass *create( T1 t1, T2 t2 ) \
+{ \
+ return new subClass( t1, t2 ); \
+} \
+ \
+static void destroy( baseClass *obj ) \
+{ \
+ delete obj; \
+} \
+ \
+ModuleRegistry<baseClass, TYPELIST_2( T1, T2 )> registry ## _ ## baseClass( name, &create, &destroy );
+
+// 3 param macro
+
+#define DECLARE_MODULE_3( baseClass, T1, T2, T3 ) \
+ extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_3( T1, T2, T3 ) > registry ## _ ## baseClass;
+
+#define REGISTER_MODULE_3( name, baseClass, subClass, T1, T2, T3 ) \
+static baseClass *create( T1 t1, T2 t2, T3 t3 ) \
+{ \
+ return new subClass( t1, t2, t3 ); \
+} \
+ \
+static void destroy( baseClass *obj ) \
+{ \
+ delete obj; \
+} \
+ \
+ModuleRegistry<baseClass, TYPELIST_3( T1, T2, T3 )> registry ## _ ## baseClass( name, &create, &destroy );
+
+// 4 param macro
+
+#define DECLARE_MODULE_4( baseClass, T1, T2, T3, T4 ) \
+ extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_4( T1, T2, T3, T4 ) > registry ## _ ## baseClass;
+
+#define REGISTER_MODULE_4( name, baseClass, subClass, T1, T2, T3, T4 ) \
+static baseClass *create( T1 t1, T2 t2, T3 t3, T4 t4 ) \
+{ \
+ return new subClass( t1, t2, t3, t4 ); \
+} \
+ \
+static void destroy( baseClass *obj ) \
+{ \
+ delete obj; \
+} \
+ \
+ModuleRegistry<baseClass, TYPELIST_4( T1, T2, T3, T4 )> registry ## _ ## baseClass( name, &create, &destroy );
+
+#else // SHARED
+
+#define DECLARE_MODULE( baseClass )
+#define DECLARE_MODULE_1( baseClass, T1 )
+#define DECLARE_MODULE_2( baseClass, T1, T2 )
+#define DECLARE_MODULE_3( baseClass, T1, T2, T3 )
+#define DECLARE_MODULE_4( baseClass, T1, T2, T3, T4 )
+
+#define REGISTER_MODULE( name, baseClass, subClass )
+#define REGISTER_MODULE_1( name, baseClass, subClass, T1 )
+#define REGISTER_MODULE_2( name, baseClass, subClass, T1, T2 )
+#define REGISTER_MODULE_3( name, baseClass, subClass, T1, T2, T3 )
+#define REGISTER_MODULE_4( name, baseClass, subClass, T1, T2, T3, T4 )
+
+#endif // SHARED
+
+#endif // __MODULEINTERFACE_H