Program listing for file control/src/utils/ObserverFactory.hpp

Program listing for file control/src/utils/ObserverFactory.hpp#

 1#ifndef ObserverFactory_H
 2#define ObserverFactory_H
 3
 4#include <map>
 5
 6#include "Observer.hpp"
 7#include "TimeDiscretisation.hpp"
 8
 9
10namespace ObserverFactory
11{
12
13
14typedef SP::Observer(*object_creator)(SP::ControlSensor, const SiconosVector&) ;
15
16
17typedef std::map<unsigned int, object_creator> MapFactory;
18
19
20typedef MapFactory::iterator MapFactoryIt;
21
22
23template<class SubType> SP::Observer factory(SP::ControlSensor sensor, const SiconosVector& xHat0)
24{
25  return std::shared_ptr<SubType>(new SubType(sensor, xHat0));
26}
27
28
29class Registry
30{
31
32private :
33
34
35  MapFactory factory_map;
36
37public :
38
39
40  static Registry& get() ;
41
42
43  void add(unsigned int type, object_creator creator);
44
45
46  SP::Observer instantiate(unsigned int type, SP::ControlSensor sensor, const SiconosVector& xHat0);
47
48} ;
49
50
51class Registration
52{
53
54public :
55
56
57  Registration(unsigned int type, object_creator creator) ;
58} ;
59
60#define AUTO_REGISTER_OBSERVER(class_name,class_type) ObserverFactory::Registration _registration_## class_type(class_name, &ObserverFactory::factory<class_type>);
61}
62
63
64#endif