Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/merger/src/class_hierarchy/Identifier.h @ 343

Last change on this file since 343 was 300, checked in by nicolasc, 17 years ago

initial merge of main_reto

File size: 5.8 KB
Line 
1#ifndef _Identifier_H__
2#define _Identifier_H__
3
4#include "ClassHierarchy.h"
5#include "IdentifierList.h"
6#include "ObjectList.h"
7#include "OrxonoxClass.h"
8
9namespace orxonox
10{
11    // ##### Identifier #####
12    class Identifier
13    {
14        template <class T>
15        friend class ClassIdentifier;
16
17        template <class T>
18        friend class BaseIdentifier;
19
20        public:
21            void addObject(OrxonoxClass* object);
22            void removeObject(OrxonoxClass* object);
23
24            bool isA(Identifier* identifier);
25            bool isDirectlyA(Identifier* identifier);
26            bool isChildOf(Identifier* identifier);
27            bool isDirectChildOf(Identifier* identifier);
28            bool isParentOf(Identifier* identifier);
29            bool isDirectParentOf(Identifier* identifier);
30
31            std::string getName() { return this->name_; }
32            IdentifierList* getDirectParents() { return this->directParents_; }
33            IdentifierList* getAllParents() { return this->allParents_; }
34            IdentifierList* getDirectChildren() { return this->directChildren_; }
35            IdentifierList* getAllChildren() { return this->allChildren_; }
36
37        private:
38            Identifier();
39            Identifier(const Identifier& identifier) {}
40            virtual ~Identifier();
41            void initialize(IdentifierList* parents);
42
43            IdentifierList* directParents_;
44            IdentifierList* allParents_;
45            IdentifierList* directChildren_;
46            IdentifierList* allChildren_;
47
48            ObjectList* objects_;
49            std::string name_;
50
51            bool bIsAbstractClass_;
52            bool bCreatedOneObject_;
53    };
54
55
56    // ##### ClassIdentifier #####
57    template <class T>
58    class ClassIdentifier : public Identifier
59    {
60        public:
61            static ClassIdentifier<T>* registerClass(IdentifierList* parents, std::string name, bool bRootClass, bool bIsAbstractClass);
62            static ClassIdentifier<T>* getIdentifier();
63
64        private:
65            ClassIdentifier();
66            ClassIdentifier(const ClassIdentifier<T>& identifier) {}
67            ~ClassIdentifier();
68
69            static ClassIdentifier<T>* pointer_;
70
71    };
72
73    template <class T>
74    ClassIdentifier<T>* ClassIdentifier<T>::pointer_ = NULL;
75
76    template <class T>
77    ClassIdentifier<T>::ClassIdentifier()
78    {
79    }
80
81    template <class T>
82    ClassIdentifier<T>::~ClassIdentifier()
83    {
84        this->pointer_ = NULL;
85    }
86
87    template <class T>
88    ClassIdentifier<T>* ClassIdentifier<T>::registerClass(IdentifierList* parents, std::string name, bool bRootClass, bool bIsAbstractClass)
89    {
90        std::cout << "*** Register Class in " << name << "-Singleton.\n";
91        if (!pointer_)
92        {
93            std::cout << "*** Register Class in " << name << "-Singleton -> Create Singleton.\n";
94            if (parents || bRootClass)
95            {
96                pointer_ = new ClassIdentifier();
97                pointer_->name_ = name;
98                pointer_->bIsAbstractClass_ = bIsAbstractClass;
99                pointer_->initialize(parents);
100            }
101            else
102            {
103                pointer_ = getIdentifier();
104            }
105        }
106
107        return pointer_;
108    }
109
110    template <class T>
111    ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier()
112    {
113//        std::cout << "*** Get Identifier.\n";
114        if (!pointer_)
115        {
116            std::cout << "*** Get Identifier -> Create Class\n";
117            ClassHierarchy::getSingleton()->startCreatingHierarchy();
118            T* temp = new T();
119            ClassHierarchy::getSingleton()->stopCreatingHierarchy();
120            delete temp;
121        }
122
123        return pointer_;
124    }
125
126
127    // ##### BaseIdentifier #####
128    template <class B>
129    class BaseIdentifier// : public Identifier
130    {
131        public:
132            BaseIdentifier();
133
134            //template <class T>
135            BaseIdentifier<B>& operator= (/*Class*/Identifier/*<T>*/* identifier)
136            {
137                if (!identifier->isA(ClassIdentifier<B>::getIdentifier()))
138                {
139                    std::cout << "Error: Class " << identifier->getName() << " is not a " << ClassIdentifier<B>::getIdentifier()->getName() << "!\n";
140                    std::cout << "Error: BaseIdentifier<" << ClassIdentifier<B>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden.\n";
141                    std::cout << "Aborting...\n";
142                    abort();
143                }
144                this->identifier_ = identifier;
145                return *this;
146            }
147            inline Identifier* getIdentifier()
148                { return this->identifier_; }
149            inline bool isA(Identifier* identifier)
150                { return this->identifier_->isA(identifier); }
151            inline bool isDirectlyA(Identifier* identifier)
152                { return this->identifier_->isDirectlyA(identifier); }
153            inline bool isChildOf(Identifier* identifier)
154                { return this->identifier_->isChildOf(identifier); }
155            inline bool isDirectChildOf(Identifier* identifier)
156                { return this->identifier_->isDirectChildOf(identifier); }
157            inline bool isParentOf(Identifier* identifier)
158                { return this->identifier_->isParentOf(identifier); }
159            inline bool isDirectParentOf(Identifier* identifier)
160                { return this->identifier_->isDirectParentOf(identifier); }
161
162        private:
163            Identifier* identifier_;
164    };
165
166    template <class B>
167    BaseIdentifier<B>::BaseIdentifier()
168    {
169        this->identifier_ = ClassIdentifier<B>::getIdentifier();
170    }
171}
172
173#endif
Note: See TracBrowser for help on using the repository browser.