ControllerFactory.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 CONTROLLERFACTORY_HH
00029 #define CONTROLLERFACTORY_HH
00030
00031 #include <string>
00032 #include <map>
00033 #include "StaticPluginRegister.hh"
00034
00035 namespace gazebo
00036 {
00037
00041
00042
00043 class Controller;
00044 class Entity;
00045
00046
00048 typedef Controller* (*ControllerFactoryFn) (Entity *parent);
00049
00050
00052 class ControllerFactory
00053 {
00056 public: static void RegisterController(std::string type, std::string classname, ControllerFactoryFn factoryfn);
00057
00060 public: static Controller *NewController(const std::string &classname, Entity *parent);
00061
00063 public: static void LoadPlugin(const std::string &plugin, const std::string &classname);
00064
00065
00066 private: static std::map<std::string, ControllerFactoryFn> controllers;
00067
00068 };
00069
00070
00076 #define GZ_REGISTER_STATIC_CONTROLLER(name, classname) \
00077 Controller *New##classname(Entity *entity) \
00078 { \
00079 return new classname(entity); \
00080 } \
00081 void Register##classname() \
00082 {\
00083 ControllerFactory::RegisterController("static", name, New##classname);\
00084 }\
00085 StaticPluginRegister Registered##classname (Register##classname);
00086
00092 #define GZ_REGISTER_DYNAMIC_CONTROLLER(name, classname) \
00093 Controller *New##classname(Entity *entity) \
00094 { \
00095 return new classname(entity); \
00096 } \
00097 extern "C" void RegisterPluginController(); \
00098 void RegisterPluginController() \
00099 {\
00100 ControllerFactory::RegisterController("dynamic", name, New##classname);\
00101 }
00102
00104 }
00105
00106 #endif