Nymph  v1.5.2
Flow-Based Data Processing Framework
KTTIFactory.hh
Go to the documentation of this file.
1 /*
2  * KTTIFactory.hh
3  *
4  * Created on: Jan 2, 2013
5  * Author: nsoblath
6  *
7  * Type-Indexed Factory and Registrars
8  */
9 
10 #ifndef KTTIFACTORY_HH_
11 #define KTTIFACTORY_HH_
12 
13 #include "KTLogger.hh"
14 
15 #include "singleton.hh"
16 
17 #include <map>
18 #include <typeinfo>
19 
20 namespace Nymph
21 {
22  KTLOGGER(utillog_ti_factory, "KTTIFactory");
23 
24  template< class XBaseType >
25  class KTTIFactory;
26 
27  template< class XBaseType >
29  {
30  public:
32  virtual ~KTTIRegistrarBase() {}
33 
34  public:
35  friend class KTTIFactory< XBaseType >;
36 
37  protected:
38  virtual XBaseType* Create() const = 0;
39 
40  };
41 
42  template< class XBaseType, class XDerivedType >
43  class KTTIRegistrar : public KTTIRegistrarBase< XBaseType >
44  {
45  public:
46  KTTIRegistrar();
47  virtual ~KTTIRegistrar();
48 
49  protected:
50  void Register() const;
51 
52  XBaseType* Create() const;
53 
54  };
55 
56 
57  template< class XBaseType >
58  class KTTIFactory : public scarab::singleton< KTTIFactory< XBaseType > >
59  {
60  public:
62  {
63  bool operator() (const std::type_info* lhs, const std::type_info* rhs)
64  {
65  return lhs->before(*rhs);
66  }
67  };
68 
69  public:
70  typedef std::map< const std::type_info*, const KTTIRegistrarBase< XBaseType >* > FactoryMap;
71  typedef typename FactoryMap::value_type FactoryEntry;
72  typedef typename FactoryMap::iterator FactoryIt;
73  typedef typename FactoryMap::const_iterator FactoryCIt;
74 
75  public:
76  template< class XDerivedType >
77  XBaseType* Create();
78 
79  XBaseType* Create(const FactoryCIt& iter);
80 
81  template< class XDerivedType >
82  void Register(const KTTIRegistrarBase< XBaseType >* registrar);
83 
84  FactoryCIt GetFactoryMapBegin() const;
85  FactoryCIt GetFactoryMapEnd() const;
86 
87  protected:
88  FactoryMap* fMap;
89 
90 
91  protected:
92  friend class scarab::singleton< KTTIFactory >;
93  friend class scarab::destroyer< KTTIFactory >;
94  KTTIFactory();
95  ~KTTIFactory();
96  };
97 
98  template< class XBaseType >
99  template< class XDerivedType >
101  {
102  FactoryCIt it = fMap->find(&typeid(XDerivedType));
103  if (it == fMap->end())
104  {
105  KTERROR(utillog_ti_factory, "Did not find factory with type <" << typeid(XDerivedType).name() << ">.");
106  return NULL;
107  }
108 
109  return it->second->Create();
110  }
111 
112  template< class XBaseType >
114  {
115  return iter->second->Create();
116  }
117 
118  template< class XBaseType >
119  template< class XDerivedType >
121  {
122  // A local (static) logger is created inside this function to avoid static initialization order problems
123  KTLOGGER(utillog_ti_factory_reg, "KTTIFactory-Register");
124 
125  FactoryCIt it = fMap->find(&typeid(XDerivedType));
126  if (it != fMap->end())
127  {
128  KTERROR(utillog_ti_factory_reg, "Already have factory registered for type <" << typeid(XDerivedType).name() << ">.");
129  return;
130  }
131  fMap->insert(std::pair< const std::type_info*, const KTTIRegistrarBase< XBaseType >* >(&typeid(XDerivedType), registrar));
132  KTDEBUG(utillog_ti_factory_reg, "Registered a factory for class type " << typeid(XDerivedType).name() << ", factory #" << fMap->size()-1);
133  }
134 
135  template< class XBaseType >
137  fMap(new FactoryMap())
138  {}
139 
140  template< class XBaseType >
142  {
143  delete fMap;
144  }
145 
146  template< class XBaseType >
148  {
149  return fMap->begin();
150  }
151 
152  template< class XBaseType >
154  {
155  return fMap->end();
156  }
157 
158 
159 
160 
161  template< class XBaseType, class XDerivedType >
163  KTTIRegistrarBase< XBaseType >()
164  {
165  Register();
166  }
167 
168  template< class XBaseType, class XDerivedType >
170  {}
171 
172  template< class XBaseType, class XDerivedType >
174  {
175  KTTIFactory< XBaseType >::get_instance()->template Register<XDerivedType>(this);
176  return;
177  }
178 
179  template< class XBaseType, class XDerivedType >
181  {
182  return dynamic_cast< XBaseType* >(new XDerivedType());
183  }
184 
185 
186 } /* namespace Nymph */
187 #endif /* KTTIFACTORY_HH_ */
FactoryMap::const_iterator FactoryCIt
Definition: KTTIFactory.hh:73
FactoryMap::value_type FactoryEntry
Definition: KTTIFactory.hh:71
FactoryCIt GetFactoryMapEnd() const
Definition: KTTIFactory.hh:153
FactoryMap::iterator FactoryIt
Definition: KTTIFactory.hh:72
virtual ~KTTIRegistrar()
Definition: KTTIFactory.hh:169
FactoryCIt GetFactoryMapBegin() const
Definition: KTTIFactory.hh:147
FactoryMap * fMap
Definition: KTTIFactory.hh:88
#define KTDEBUG(...)
Definition: KTLogger.hh:343
KTLOGGER(applog, "KTApplication")
XBaseType * Create() const
Definition: KTTIFactory.hh:180
virtual XBaseType * Create() const =0
void Register() const
Definition: KTTIFactory.hh:173
XBaseType * Create()
Definition: KTTIFactory.hh:100
void Register(const KTTIRegistrarBase< XBaseType > *registrar)
Definition: KTTIFactory.hh:120
std::map< const std::type_info *, const KTTIRegistrarBase< XBaseType > *> FactoryMap
Definition: KTTIFactory.hh:70
::Nymph::KTLogger utillog_ti_factory("KTTIFactory")
#define KTERROR(...)
Definition: KTLogger.hh:347
Contains the logger class and macros, based on Kasper&#39;s KLogger class.