OpenLexocad  27.1
Factory.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <assert.h>
4 
5 #include <string>
6 #include <map>
7 #include <set>
8 #include <list>
9 
10 namespace Base
11 {
12 template <typename BaseClassType, typename ClassType>
13 BaseClassType* CreateObject()
14 {
15  return new ClassType();
16 }
17 
18 template <typename BaseClassType, typename UniqueIdType>
19 class Factory
20 {
21 protected:
22  typedef BaseClassType* (*CreateObjectFunc)();
23 
24 public:
25  typedef typename std::map<UniqueIdType, CreateObjectFunc>::const_iterator ConstIterator;
26  typedef typename std::map<UniqueIdType, CreateObjectFunc>::iterator Iterator;
27 
28  template <typename ClassType>
29  bool Register(UniqueIdType unique_id)
30  {
31  if (m_object_creator.find(unique_id) != m_object_creator.end())
32  return false;
33 
34  m_object_creator[unique_id] = &CreateObject<BaseClassType, ClassType>;
35 
36  return true;
37  }
38 
39  bool Unregister(UniqueIdType unique_id) { return (m_object_creator.erase(unique_id) == 1); }
40 
41  BaseClassType* Create(UniqueIdType unique_id)
42  {
43  Iterator iter = m_object_creator.find(unique_id);
44 
45  if (iter == m_object_creator.end())
46  return NULL;
47 
48  return ((*iter).second)();
49  }
50 
51  ConstIterator GetBegin() const { return m_object_creator.begin(); }
52  Iterator GetBegin() { return m_object_creator.begin(); }
53  ConstIterator GetEnd() const { return m_object_creator.end(); }
54  Iterator GetEnd() { return m_object_creator.end(); }
55 
56 protected:
57  std::map<UniqueIdType, CreateObjectFunc> m_object_creator;
58 };
59 
61 class LX_BASE_EXPORT AbstractProducer
62 {
63 public:
65  virtual ~AbstractProducer() {}
67  virtual void* Produce(void) const = 0;
68 };
69 
76 class LX_BASE_EXPORT Factory2
77 {
78 public:
80  void AddProducer(const char* sClassName, AbstractProducer* pcProducer);
82  bool CanProduce(const char* sClassName) const;
84  std::list<std::string> CanProduce() const;
85 
86 protected:
88  void* Produce(const char* sClassName) const;
89  std::map<const std::string, AbstractProducer*> _mpcProducers;
91  Factory2(void) {}
93  virtual ~Factory2();
94 };
95 
96 // --------------------------------------------------------------------
97 
100 class LX_BASE_EXPORT ScriptFactorySingleton : public Factory2
101 {
102 public:
103  static ScriptFactorySingleton& Instance(void);
104  static void Destruct(void);
105 
106  const char* ProduceScript(const char* sScriptName) const;
107 
108 private:
109  static ScriptFactorySingleton* _pcSingleton;
110 
113 };
114 
116 {
118 }
119 
120 // --------------------------------------------------------------------
121 
126 class LX_BASE_EXPORT ScriptProducer : public AbstractProducer
127 {
128 public:
130  ScriptProducer(const char* name, const char* script) : mScript(script)
131  {
133  }
134 
135  virtual ~ScriptProducer(void) {}
136 
138  virtual void* Produce(void) const
139  {
140  return (void*)mScript;
141  }
142 
143 private:
144  const char* mScript;
145 };
146 
147 } // namespace Base
148 
149 
150 
std::map< UniqueIdType, CreateObjectFunc >::const_iterator ConstIterator
Definition: Factory.h:25
Abstract base class of all producers.
Definition: Factory.h:61
virtual ~AbstractProducer()
Definition: Factory.h:65
Definition: Factory.h:126
bool Unregister(UniqueIdType unique_id)
Definition: Factory.h:39
Core::PropertyText name
Definition: CoreDocument.h:167
ScriptProducer(const char *name, const char *script)
Constructor.
Definition: Factory.h:130
BaseClassType * CreateObject()
Definition: Factory.h:13
Iterator GetBegin()
Definition: Factory.h:52
Iterator GetEnd()
Definition: Factory.h:54
ConstIterator GetBegin() const
Definition: Factory.h:51
std::map< const std::string, AbstractProducer * > _mpcProducers
Definition: Factory.h:89
AbstractProducer()
Definition: Factory.h:64
ConstIterator GetEnd() const
Definition: Factory.h:53
Definition: Factory.h:19
Factory2(void)
construction
Definition: Factory.h:91
std::map< UniqueIdType, CreateObjectFunc >::iterator Iterator
Definition: Factory.h:26
void AddProducer(const char *sClassName, AbstractProducer *pcProducer)
Adds a new producer instance.
Definition: AbstractConstraint.h:6
Definition: Factory.h:76
std::map< UniqueIdType, CreateObjectFunc > m_object_creator
Definition: Factory.h:57
BaseClassType * Create(UniqueIdType unique_id)
Definition: Factory.h:41
virtual void * Produce(void) const
Produce an instance.
Definition: Factory.h:138
Definition: AbstractXMLReader.h:5
virtual ~ScriptProducer(void)
Definition: Factory.h:135
bool Register(UniqueIdType unique_id)
Definition: Factory.h:29
static ScriptFactorySingleton & Instance(void)
Definition: Factory.h:100
ScriptFactorySingleton & ScriptFactory(void)
Definition: Factory.h:115