Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

use lists instead of sets to store parent identifiers. this allows to store the exact order of initialization of parent classes.

  • Property svn:eol-style set to native
File size: 5.0 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 <list>
41#include <string>
42
43namespace orxonox
44{
45    class _CoreExport IdentifierManager
46    {
47        public:
48            static IdentifierManager& getInstance();
49
50            Identifier* getGloballyUniqueIdentifier(Identifier* proposal);
51            void addIdentifierToLookupMaps(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 destroyAllIdentifiers();
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
78            void clearNetworkIDs();
79
80            /// Returns the map that stores all Identifiers with their names.
81            inline const std::map<std::string, Identifier*>& getIdentifierByStringMap()
82                { return this->identifierByString_; }
83            /// Returns the map that stores all Identifiers with their names in lowercase.
84            inline const std::map<std::string, Identifier*>& getIdentifierByLowercaseStringMap()
85                { return this->identifierByLowercaseString_; }
86            /// Returns the map that stores all Identifiers with their IDs.
87            inline const std::map<uint32_t, Identifier*>& getIdentifierByNetworkIdMap()
88                { return this->identifierByNetworkId_; }
89
90        private:
91            IdentifierManager();
92            IdentifierManager(const IdentifierManager&);
93            ~IdentifierManager() {}
94
95            /// Increases the hierarchyCreatingCounter_s variable, causing all new objects to store their parents.
96            inline void startCreatingHierarchy()
97                { hierarchyCreatingCounter_s++; }
98            /// Decreases the hierarchyCreatingCounter_s variable, causing the objects to stop storing their parents.
99            inline void stopCreatingHierarchy()
100                { hierarchyCreatingCounter_s--; }
101
102            std::map<std::string, Identifier*> identifierByTypeidName_;      //!< Map with the names as received by typeid(). This is only used internally.
103
104            std::map<std::string, Identifier*> identifierByString_;          //!< Map that stores all Identifiers with their names.
105            std::map<std::string, Identifier*> identifierByLowercaseString_; //!< Map that stores all Identifiers with their names in lowercase.
106            std::map<uint32_t, Identifier*> identifierByNetworkId_;          //!< Returns the map that stores all Identifiers with their network IDs.
107
108            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)
109            unsigned int classIDCounter_s;                          //!< counter for the unique classIDs
110
111            /// 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
112            /// a consequence of this, e.g. nested member objects).
113            std::map<Identifiable*, std::list<const Identifier*> > identifierTraceOfNewObject_;
114            Identifier* recordTraceForIdentifier_; //!< The identifier for which we want to record the trace of identifiers during object creation. If null, no trace is recorded.
115    };
116}
117
118#endif /* _IdentifierManager_H__ */
Note: See TracBrowser for help on using the repository browser.