Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchie/src/ClassHierarchy.h @ 209

Last change on this file since 209 was 197, checked in by landauf, 17 years ago

i didnt changed much:

  • separated the classes into several files
  • did some tests: it works with cc files (@ bensch)
  • finished BaseIdentifier
File size: 3.9 KB
RevLine 
[132]1#ifndef _ClassHierarchy_H__
2#define _ClassHierarchy_H__
3
4#include <string>
[162]5#include <iostream>
[132]6
[172]7// DONE AND TESTED:
[176]8// - build class hierarchy
9// - isA, isChildOf, ...
10// - insert into class-lists
11// - ClassIdentifier
[197]12// - BaseIdentifier
[172]13
14// IN WORK:
[176]15// - Factory
[132]16
[172]17// TO DO:
[176]18// - iterate through lists
19// - searchtree for classname-strings
[132]20
[149]21
22namespace orxonox
23{
[162]24    // ##### ClassHierarchy #####
[172]25    template <class T>
26    class ClassIdentifier;
27
[162]28    class ClassHierarchy
29    {
[172]30        template <class T>
31        friend class ClassIdentifier;
32
[162]33        public:
34            static ClassHierarchy* getSingleton();
[172]35            bool isCreatingHierarchy() { return (this->hierarchyCreatingCounter_ > 0); }
[162]36
37        private:
38            ClassHierarchy();
[172]39            ~ClassHierarchy();
40            void startCreatingHierarchy() { this->hierarchyCreatingCounter_++; std::cout << "*** Increased Hierarchy-Creating-Counter to " << this->hierarchyCreatingCounter_ << "\n"; }
41            void stopCreatingHierarchy() { this->hierarchyCreatingCounter_--; std::cout << "*** Decreased Hierarchy-Creating-Counter to " << this->hierarchyCreatingCounter_ << "\n"; }
[162]42
43            static ClassHierarchy* pointer_;
[172]44            int hierarchyCreatingCounter_;
[162]45    };
46
[132]47
[149]48    // ##### Macros #####
49    #define registerRootObject(ClassName) \
[162]50        std::cout << "*** Register Root-Object: " << #ClassName << "\n"; \
51        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && !this->getParents()) \
52            this->setParents(new IdentifierList()); \
53        if (this->getIdentifier()) \
54            this->getIdentifier()->removeObject(this); \
[197]55        this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, true, false)); \
[162]56        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
57            this->getParents()->add(this->getIdentifier()); \
58        this->getIdentifier()->addObject(this)
[132]59
[197]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)); \
67        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
68            this->getParents()->add(this->getIdentifier()); \
69        this->getIdentifier()->addObject(this)
70
[149]71    #define registerObject(ClassName) \
[162]72        std::cout << "*** Register Object: " << #ClassName << "\n"; \
73        this->getIdentifier()->removeObject(this); \
[197]74        this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, false, false)); \
[162]75        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
76            this->getParents()->add(this->getIdentifier()); \
77        this->getIdentifier()->addObject(this)
[132]78
[197]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)); \
83        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
84            this->getParents()->add(this->getIdentifier()); \
85        this->getIdentifier()->addObject(this)
86
[132]87    #define unregisterObject() \
[162]88        this->getIdentifier()->removeObject(this)
[132]89
[149]90    #define Class(ClassName) \
91        ClassIdentifier<ClassName>::getIdentifier()
[132]92
[149]93    #define Factory(ClassName) \
94        ClassIdentifier<ClassName>::create()
95}
96
[132]97#endif
Note: See TracBrowser for help on using the repository browser.