IfaceFactory.hh
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef IFACEFACTORY_HH
00029 #define IFACEFACTORY_HH
00030
00031 #include <string>
00032 #include <map>
00033
00034 struct LibgazeboPluginRegister
00035 {
00036 LibgazeboPluginRegister(void (*initFunc)())
00037 {
00038 (*initFunc)();
00039 }
00040 };
00041
00042 namespace gazebo
00043 {
00044 class Iface;
00045
00046
00047 typedef Iface* (*IfaceFactoryFn) ();
00048
00049
00051 class IfaceFactory
00052 {
00053
00055
00056
00059 public: static void RegisterIface(std::string classname, IfaceFactoryFn factoryfn);
00060
00063 public: static Iface *NewIface(const std::string &classname);
00064
00065
00066 private: static std::map<std::string, IfaceFactoryFn> ifaces;
00067
00068 };
00069
00070 }
00071
00077 #define GZ_REGISTER_IFACE(name, classname) \
00078 Iface *New##classname() \
00079 { \
00080 return new classname(); \
00081 } \
00082 void Register##classname() \
00083 {\
00084 IfaceFactory::RegisterIface(name, New##classname);\
00085 }\
00086 LibgazeboPluginRegister Registered##classname (Register##classname);
00087
00088 #endif