BALL  1.4.79
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
embeddable.h
Go to the documentation of this file.
1 // -*- Mode: C++; tab-width: 2; -*-
2 // vi: set ts=2:
3 //
4 
5 #ifndef BALL_CONCEPT_EMBEDDABLE_H
6 #define BALL_CONCEPT_EMBEDDABLE_H
7 
8 #ifndef BALL_COMMON_H
9 # include <BALL/common.h>
10 #endif
11 
12 #ifndef BALL_DATATYPE_STRINGHASHMAP_H
14 #endif
15 
16 #ifndef BALL_DATATYPE_HASHMAP_H
17 # include <BALL/DATATYPE/hashMap.h>
18 #endif
19 
20 #include <typeinfo>
21 
22 namespace BALL
23 {
24 
31  #define BALL_EMBEDDABLE(TYPE,BASE)\
32  virtual void registerThis() \
33  { \
34  if (typeid(*this) != typeid(TYPE))\
35  {\
36  Log.error() << "Warning: derived class " << typeid(*this).name() << " was derived from BALL::Embeddable, but the macro\n"\
37  << "BALL_EMBEDDABLE(...) was not specified in the class declaration!" << std::endl;\
38  }\
39  Embeddable::registerInstance_(typeid(TYPE), this);\
40  Embeddable::registerInstance_(typeid(BASE), this);\
41  }\
42  \
43  static TYPE* getInstance(Position index) \
44  { \
45  Embeddable* ptr = Embeddable::getInstance_(typeid(TYPE), index);\
46  if (ptr != 0)\
47  {\
48  return dynamic_cast<TYPE*>(ptr); \
49  }\
50  else\
51  {\
52  return 0;\
53  }\
54  }\
55  static TYPE* getInstance(const String& identifier) \
56  {\
57  Embeddable* ptr = Embeddable::getInstance_(typeid(TYPE), identifier);\
58  if (ptr != 0)\
59  {\
60  return dynamic_cast<TYPE*>(ptr); \
61  }\
62  else\
63  {\
64  return 0;\
65  }\
66  }\
67  static Size countInstances() { return (Embeddable::countInstances_(typeid(TYPE))); };
68 
82  {
83  public:
84 
88  typedef std::vector<Embeddable*> EmbeddableVector;
90 
94 
97  Embeddable(const String& identifier = "<Embeddable>")
98  ;
99 
102  Embeddable(const Embeddable& embeddable)
103  ;
104 
107  virtual ~Embeddable()
108  ;
110 
114 
117  void setIdentifier(const String& identifier)
118  ;
119 
122  const String& getIdentifier() const
123  ;
124 
127  void unregisterThis()
128  ;
129 
136  virtual void registerThis()
137  ;
138 
140 
147  virtual void dump(std::ostream& s = std::cout, Size depth = 0) const
148  ;
149 
150  protected:
153  static void registerInstance_(const std::type_info& type, const Embeddable* instance)
154  ;
157  static void unregisterInstance_(const Embeddable* instance)
158  ;
159 
162  static Size countInstances_(const std::type_info& type)
163  ;
164 
169  static Embeddable* getInstance_(const std::type_info& type, Position index)
170  ;
171 
175  static Embeddable* getInstance_(const std::type_info& type, const String& identifier)
176  ;
177 
178 
179  private:
180 
183  String identifier_;
184 
187  static StringHashMap<EmbeddableVector> instance_vectors_;
188 
191  static HashMap<Embeddable*, string> instance_to_type_map_;
192  };
193 
194 } // namespace BALL
195 
196 #endif // BALL_CONCEPT_EMBEDDABLE_H
std::vector< Embeddable * > EmbeddableVector
Definition: embeddable.h:88
HashMap class based on the STL map (containing serveral convenience functions)
Definition: hashMap.h:73
#define BALL_EXPORT
Definition: COMMON/global.h:50