Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core6/src/libraries/core/class/IdentifierManager.cc @ 9634

Last change on this file since 9634 was 9634, checked in by landauf, 11 years ago

reset static maps and variables after destroying identifiers
iterate over the same map in createClassHierarchy() an in destroyAllIdentifiers()

  • Property svn:eol-style set to native
File size: 6.8 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    @brief Implementation of the Identifier class.
32*/
33
34#include "IdentifierManager.h"
35
36#include <ostream>
37
38#include "util/StringUtils.h"
39#include "core/config/ConfigValueContainer.h"
40#include "core/XMLPort.h"
41#include "core/object/ClassFactory.h"
42
43namespace orxonox
44{
45    int IdentifierManager::hierarchyCreatingCounter_s = 0;
46    unsigned int IdentifierManager::classIDCounter_s = 0;
47
48    /**
49        @brief Returns the identifier map with the names as received by typeid(). This is only used internally.
50    */
51    std::map<std::string, Identifier*>& IdentifierManager::getTypeIDIdentifierMap()
52    {
53        static std::map<std::string, Identifier*> identifiers;    //!< The map to store all Identifiers.
54        return identifiers;
55    }
56
57    /**
58        @brief Returns an identifier by name and adds it if not available
59        @param name The name of the identifier as typeid().name() suggests
60        @param proposal A pointer to a newly created identifier for the case of non existence in the map
61        @return The identifier (unique instance)
62    */
63    Identifier* IdentifierManager::getIdentifierSingleton(const std::string& name, Identifier* proposal)
64    {
65        std::map<std::string, Identifier*>::const_iterator it = getTypeIDIdentifierMap().find(name);
66
67        if (it != getTypeIDIdentifierMap().end())
68        {
69            // There is already an entry: return it and delete the proposal
70            delete proposal;
71            return it->second;
72        }
73        else
74        {
75            // There is no entry: put the proposal into the map and return it
76            getTypeIDIdentifierMap()[name] = proposal;
77            return proposal;
78        }
79    }
80
81    /**
82        @brief Creates the class-hierarchy by creating and destroying one object of each type.
83    */
84    void IdentifierManager::createClassHierarchy()
85    {
86        orxout(internal_status) << "Create class-hierarchy" << endl;
87        IdentifierManager::startCreatingHierarchy();
88        for (std::map<std::string, Identifier*>::const_iterator it = IdentifierManager::getTypeIDIdentifierMap().begin(); it != IdentifierManager::getTypeIDIdentifierMap().end(); ++it)
89        {
90            // To create the new branch of the class-hierarchy, we create a new object and delete it afterwards.
91            if (it->second->hasFactory())
92            {
93                Identifiable* temp = it->second->fabricate(0);
94                delete temp;
95            }
96        }
97        IdentifierManager::stopCreatingHierarchy();
98        orxout(internal_status) << "Finished class-hierarchy creation" << endl;
99    }
100
101    /**
102        @brief Destroys all Identifiers. Called when exiting the program.
103    */
104    void IdentifierManager::destroyAllIdentifiers()
105    {
106        for (std::map<std::string, Identifier*>::iterator it = IdentifierManager::getTypeIDIdentifierMap().begin(); it != IdentifierManager::getTypeIDIdentifierMap().end(); ++it)
107            delete (it->second);
108
109        IdentifierManager::getTypeIDIdentifierMap().clear();
110        IdentifierManager::getStringIdentifierMapIntern().clear();
111        IdentifierManager::getLowercaseStringIdentifierMapIntern().clear();
112        IdentifierManager::getIDIdentifierMapIntern().clear();
113    }
114
115    /**
116        @brief Returns the map that stores all Identifiers with their names.
117        @return The map
118    */
119    std::map<std::string, Identifier*>& IdentifierManager::getStringIdentifierMapIntern()
120    {
121        static std::map<std::string, Identifier*> identifierMap;
122        return identifierMap;
123    }
124
125    /**
126        @brief Returns the map that stores all Identifiers with their names in lowercase.
127        @return The map
128    */
129    std::map<std::string, Identifier*>& IdentifierManager::getLowercaseStringIdentifierMapIntern()
130    {
131        static std::map<std::string, Identifier*> lowercaseIdentifierMap;
132        return lowercaseIdentifierMap;
133    }
134
135    /**
136        @brief Returns the map that stores all Identifiers with their network IDs.
137        @return The map
138    */
139    std::map<uint32_t, Identifier*>& IdentifierManager::getIDIdentifierMapIntern()
140    {
141        static std::map<uint32_t, Identifier*> identifierMap;
142        return identifierMap;
143    }
144
145    /**
146        @brief Returns the Identifier with a given name.
147        @param name The name of the wanted Identifier
148        @return The Identifier
149    */
150    Identifier* IdentifierManager::getIdentifierByString(const std::string& name)
151    {
152        std::map<std::string, Identifier*>::const_iterator it = IdentifierManager::getStringIdentifierMapIntern().find(name);
153        if (it != IdentifierManager::getStringIdentifierMapIntern().end())
154            return it->second;
155        else
156            return 0;
157    }
158
159    /**
160        @brief Returns the Identifier with a given name in lowercase.
161        @param name The name of the wanted Identifier
162        @return The Identifier
163    */
164    Identifier* IdentifierManager::getIdentifierByLowercaseString(const std::string& name)
165    {
166        std::map<std::string, Identifier*>::const_iterator it = IdentifierManager::getLowercaseStringIdentifierMapIntern().find(name);
167        if (it != IdentifierManager::getLowercaseStringIdentifierMapIntern().end())
168            return it->second;
169        else
170            return 0;
171    }
172
173    /**
174        @brief Returns the Identifier with a given network ID.
175        @param id The network ID of the wanted Identifier
176        @return The Identifier
177    */
178    Identifier* IdentifierManager::getIdentifierByID(const uint32_t id)
179    {
180        std::map<uint32_t, Identifier*>::const_iterator it = IdentifierManager::getIDIdentifierMapIntern().find(id);
181        if (it != IdentifierManager::getIDIdentifierMapIntern().end())
182            return it->second;
183        else
184            return 0;
185    }
186
187    /**
188        @brief Cleans the NetworkID map (needed on clients for correct initialization)
189    */
190    void IdentifierManager::clearNetworkIDs()
191    {
192        IdentifierManager::getIDIdentifierMapIntern().clear();
193    }
194}
Note: See TracBrowser for help on using the repository browser.