Changeset 197 for code/branches/objecthierarchie/src/ClassHierarchy.h
- Timestamp:
- Nov 13, 2007, 3:22:29 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/objecthierarchie/src/ClassHierarchy.h
r176 r197 10 10 // - insert into class-lists 11 11 // - ClassIdentifier 12 // - BaseIdentifier 12 13 13 14 // IN WORK: 14 // - BaseIdentifier15 15 // - Factory 16 16 … … 45 45 }; 46 46 47 // ##### Identifier #####48 class IdentifierList;49 class ObjectList;50 class OrxonoxClass;51 52 class Identifier53 {54 template <class T>55 friend class ClassIdentifier;56 57 template <class T>58 friend class BaseIdentifier;59 60 public:61 void addObject(OrxonoxClass* object);62 void removeObject(OrxonoxClass* object);63 64 bool isA(Identifier* identifier);65 bool isDirectlyA(Identifier* identifier);66 bool isChildOf(Identifier* identifier);67 bool isDirectChildOf(Identifier* identifier);68 bool isParentOf(Identifier* identifier);69 bool isDirectParentOf(Identifier* identifier);70 71 std::string getName() { return this->name_; }72 IdentifierList* getDirectParents() { return this->directParents_; }73 IdentifierList* getAllParents() { return this->allParents_; }74 IdentifierList* getDirectChildren() { return this->directChildren_; }75 IdentifierList* getAllChildren() { return this->allChildren_; }76 77 private:78 Identifier();79 Identifier(const Identifier& identifier) {}80 virtual ~Identifier();81 void initialize(IdentifierList* parents);82 83 IdentifierList* directParents_;84 IdentifierList* allParents_;85 IdentifierList* directChildren_;86 IdentifierList* allChildren_;87 88 ObjectList* objects_;89 std::string name_;90 91 bool bCreatedOneObject_;92 };93 94 95 // ##### ClassIdentifier #####96 template <class T>97 class ClassIdentifier : public Identifier98 {99 public:100 static ClassIdentifier<T>* registerClass(IdentifierList* parents, std::string name, bool bRootClass);101 static ClassIdentifier<T>* getIdentifier();102 static T* create();103 104 private:105 ClassIdentifier();106 ClassIdentifier(const ClassIdentifier<T>& identifier) {}107 ~ClassIdentifier();108 109 static ClassIdentifier<T>* pointer_;110 111 };112 113 template <class T>114 ClassIdentifier<T>* ClassIdentifier<T>::pointer_ = NULL;115 116 template <class T>117 ClassIdentifier<T>::ClassIdentifier()118 {119 }120 121 template <class T>122 ClassIdentifier<T>::~ClassIdentifier()123 {124 this->pointer_ = NULL;125 }126 127 template <class T>128 ClassIdentifier<T>* ClassIdentifier<T>::registerClass(IdentifierList* parents, std::string name, bool bRootClass)129 {130 std::cout << "*** Register Class in " << name << "-Singleton.\n";131 if (!pointer_)132 {133 std::cout << "*** Register Class in " << name << "-Singleton -> Create Singleton.\n";134 if (parents || bRootClass)135 {136 pointer_ = new ClassIdentifier();137 pointer_->name_ = name;138 pointer_->initialize(parents);139 }140 else141 {142 pointer_ = getIdentifier();143 }144 }145 146 return pointer_;147 }148 149 template <class T>150 ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier()151 {152 // std::cout << "*** Get Identifier.\n";153 if (!pointer_)154 {155 std::cout << "*** Get Identifier -> Create Class\n";156 ClassHierarchy::getSingleton()->startCreatingHierarchy();157 T* temp = new T();158 ClassHierarchy::getSingleton()->stopCreatingHierarchy();159 delete temp;160 }161 162 return pointer_;163 }164 165 template <class T>166 T* ClassIdentifier<T>::create()167 {168 return new T();169 }170 171 172 // ##### BaseIdentifier #####173 template <class B>174 class BaseIdentifier// : public Identifier175 {176 public:177 BaseIdentifier();178 179 template <class T>180 BaseIdentifier<B>& operator= (ClassIdentifier<T>* identifier)181 {182 std::cout << "####### Class(" << identifier->getName() << ")->isA( Class(" << ClassIdentifier<B>::getIdentifier()->getName() << ") ) = " << identifier->isA( ClassIdentifier<B>::getIdentifier() ) << "\n";183 if (!identifier->isA(ClassIdentifier<B>::getIdentifier()))184 {185 std::cout << "Error: Class " << identifier->getName() << " is not a " << ClassIdentifier<B>::getIdentifier()->getName() << "!\n";186 std::cout << "Error: BaseIdentifier<" << ClassIdentifier<B>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden.\n";187 std::cout << "Aborting...\n";188 abort();189 }190 this->identifier_ = identifier;191 return *this;192 }193 194 operator Identifier()195 {196 return this->identifier_;197 }198 199 private:200 Identifier* identifier_;201 };202 203 template <class B>204 BaseIdentifier<B>::BaseIdentifier()205 {206 this->identifier_ = ClassIdentifier<B>::getIdentifier();207 }208 209 210 // ##### Identifier List #####211 class IdentifierListElement;212 213 class IdentifierList214 {215 public:216 IdentifierList();217 ~IdentifierList();218 void add(Identifier* identifier);219 void remove(Identifier* identifier);220 bool isInList(Identifier* identifier);221 std::string toString();222 223 IdentifierListElement* first_;224 };225 226 class IdentifierListElement227 {228 public:229 IdentifierListElement(Identifier* identifier);230 ~IdentifierListElement();231 232 Identifier* identifier_;233 IdentifierListElement* next_;234 bool bDirect_;235 };236 237 238 // ##### Object List #####239 class ObjectListElement;240 241 class ObjectList242 {243 public:244 ObjectList();245 ~ObjectList();246 void add(OrxonoxClass* object);247 void remove(OrxonoxClass* object);248 249 ObjectListElement* first_;250 };251 252 class ObjectListElement253 {254 public:255 ObjectListElement(OrxonoxClass* object);256 ~ObjectListElement();257 258 OrxonoxClass* object_;259 ObjectListElement* next_;260 };261 47 262 48 // ##### Macros ##### … … 267 53 if (this->getIdentifier()) \ 268 54 this->getIdentifier()->removeObject(this); \ 269 this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, true)); \ 55 this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, true, false)); \ 56 if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \ 57 this->getParents()->add(this->getIdentifier()); \ 58 this->getIdentifier()->addObject(this) 59 60 #define registerAbstractRootObject(ClassName) \ 61 std::cout << "*** Register Root-Object: " << #ClassName << "\n"; \ 62 if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && !this->getParents()) \ 63 this->setParents(new IdentifierList()); \ 64 if (this->getIdentifier()) \ 65 this->getIdentifier()->removeObject(this); \ 66 this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, true, true)); \ 270 67 if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \ 271 68 this->getParents()->add(this->getIdentifier()); \ … … 275 72 std::cout << "*** Register Object: " << #ClassName << "\n"; \ 276 73 this->getIdentifier()->removeObject(this); \ 277 this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, false)); \ 74 this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, false, false)); \ 75 if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \ 76 this->getParents()->add(this->getIdentifier()); \ 77 this->getIdentifier()->addObject(this) 78 79 #define registerAbstractObject(ClassName) \ 80 std::cout << "*** Register Object: " << #ClassName << "\n"; \ 81 this->getIdentifier()->removeObject(this); \ 82 this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, false, true)); \ 278 83 if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \ 279 84 this->getParents()->add(this->getIdentifier()); \
Note: See TracChangeset
for help on using the changeset viewer.