Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 218 was 218, checked in by landauf, 16 years ago

added factory

File size: 4.0 KB
Line 
1#ifndef _ClassHierarchy_H__
2#define _ClassHierarchy_H__
3
4#include <string>
5#include <iostream>
6
7// DONE AND TESTED:
8// - build class hierarchy
9// - isA, isChildOf, ...
10// - insert into class-lists
11// - ClassIdentifier
12// - BaseIdentifier
13// - Factory
14
15// IN WORK:
16
17// TO DO:
18// - iterate through lists
19
20
21namespace orxonox
22{
23    // ##### ClassHierarchy #####
24    template <class T>
25    class ClassIdentifier;
26
27    class ClassHierarchy
28    {
29        template <class T>
30        friend class ClassIdentifier;
31
32        public:
33            static ClassHierarchy* getSingleton();
34            bool isCreatingHierarchy() { return (this->hierarchyCreatingCounter_ > 0); }
35
36        private:
37            ClassHierarchy();
38            ClassHierarchy(const ClassHierarchy& hierarchy);
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"; }
42
43            static ClassHierarchy* pointer_;
44            int hierarchyCreatingCounter_;
45    };
46
47
48    // ##### Macros #####
49    #define registerRootObject(ClassName) \
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); \
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)); \
67        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
68            this->getParents()->add(this->getIdentifier()); \
69        this->getIdentifier()->addObject(this)
70
71    #define registerObject(ClassName) \
72        std::cout << "*** Register Object: " << #ClassName << "\n"; \
73        this->getIdentifier()->removeObject(this); \
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)); \
83        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
84            this->getParents()->add(this->getIdentifier()); \
85        this->getIdentifier()->addObject(this)
86
87    #define unregisterObject() \
88        this->getIdentifier()->removeObject(this)
89
90    #define Class(ClassName) \
91        ClassIdentifier<ClassName>::getIdentifier()
92
93    #define CreateFactory(ClassName) \
94        Identifier* global_##ClassName##_Identifier = ClassIdentifier<ClassName>::getIdentifier()
95
96    #define Factory(Name) \
97        ClassFactory::fabricate(Name)
98}
99
100#endif
Note: See TracBrowser for help on using the repository browser.