Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/src/libraries/core/class/IdentifierManager.h @ 10405

Last change on this file since 10405 was 10403, checked in by landauf, 10 years ago

added function to destroy the class hierarchy (i.e. reset all information about parents and children in Identifiers).
tests now use a fixture to create and destroy class hierarchy. this makes them independent of the order of execution (and also fixes the three *_NoFixture tests)

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file
31    @ingroup Class Identifier
32*/
33
34#ifndef _IdentifierManager_H__
35#define _IdentifierManager_H__
36
37#include "core/CorePrereqs.h"
38
39#include <map>
40#include <set>
41#include <list>
42#include <string>
43
44namespace orxonox
45{
46    class _CoreExport IdentifierManager
47    {
48        public:
49            static IdentifierManager& getInstance();
50
51            void addIdentifier(Identifier* identifier);
52
53            unsigned int getUniqueClassId()
54                { return this->classIDCounter_s++; }
55
56
57            /////////////////////////////
58            ////// Class Hierarchy //////
59            /////////////////////////////
60            void createClassHierarchy();
61            void verifyClassHierarchy();
62            void destroyClassHierarchy();
63
64            void createdObject(Identifiable* identifiable);
65
66            /// Returns true, if a branch of the class-hierarchy is being created, causing all new objects to store their parents.
67            inline bool isCreatingHierarchy()
68                { return (hierarchyCreatingCounter_s > 0); }
69
70
71            //////////////////////////
72            ///// Identifier Map /////
73            //////////////////////////
74            Identifier* getIdentifierByString(const std::string& name);
75            Identifier* getIdentifierByLowercaseString(const std::string& name);
76            Identifier* getIdentifierByID(uint32_t id);
77            Identifier* getIdentifierByTypeInfo(const std::type_info& typeInfo);
78
79            void clearNetworkIDs();
80
81            /// Returns the map that stores all Identifiers with their names.
82            inline const std::map<std::string, Identifier*>& getIdentifierByStringMap()
83                { return this->identifierByString_; }
84            /// Returns the map that stores all Identifiers with their names in lowercase.
85            inline const std::map<std::string, Identifier*>& getIdentifierByLowercaseStringMap()
86                { return this->identifierByLowercaseString_; }
87            /// Returns the map that stores all Identifiers with their IDs.
88            inline const std::map<uint32_t, Identifier*>& getIdentifierByNetworkIdMap()
89                { return this->identifierByNetworkId_; }
90
91            void destroyAllIdentifiers();
92
93        private:
94            IdentifierManager();
95            IdentifierManager(const IdentifierManager&);
96            ~IdentifierManager() {}
97
98            /// Increases the hierarchyCreatingCounter_s variable, causing all new objects to store their parents.
99            inline void startCreatingHierarchy()
100                { hierarchyCreatingCounter_s++; }
101            /// Decreases the hierarchyCreatingCounter_s variable, causing the objects to stop storing their parents.
102            inline void stopCreatingHierarchy()
103                { hierarchyCreatingCounter_s--; }
104
105            std::set<Identifier*> identifiers_;                              //!< All identifiers. This is only used internally.
106            std::map<std::string, Identifier*> identifierByString_;          //!< Map that stores all Identifiers with their names.
107            std::map<std::string, Identifier*> identifierByLowercaseString_; //!< Map that stores all Identifiers with their names in lowercase.
108            std::map<uint32_t, Identifier*> identifierByNetworkId_;          //!< Returns the map that stores all Identifiers with their network IDs.
109
110            int hierarchyCreatingCounter_s;                         //!< Bigger than zero if at least one Identifier stores its parents (its an int instead of a bool to avoid conflicts with multithreading)
111            unsigned int classIDCounter_s;                          //!< counter for the unique classIDs
112
113            /// Used while creating the object hierarchy to keep track of the identifiers of a newly created object (and all other objects that get created as
114            /// a consequence of this, e.g. nested member objects).
115            std::map<Identifiable*, std::list<const Identifier*> > identifierTraceOfNewObject_;
116            Identifier* recordTraceForIdentifier_; //!< The identifier for which we want to record the trace of identifiers during object creation. If null, no trace is recorded.
117    };
118}
119
120#endif /* _IdentifierManager_H__ */
Note: See TracBrowser for help on using the repository browser.