[Orxonox-commit 6331] r10988 - code/branches/cpp11_v2/src/libraries/core/class
landauf at orxonox.net
landauf at orxonox.net
Mon Dec 28 23:22:21 CET 2015
Author: landauf
Date: 2015-12-28 23:22:21 +0100 (Mon, 28 Dec 2015)
New Revision: 10988
Modified:
code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.cc
code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.h
Log:
use an unordered map and type_index to store identifiers by typeid
Modified: code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.cc
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.cc 2015-12-28 21:17:50 UTC (rev 10987)
+++ code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.cc 2015-12-28 22:22:21 UTC (rev 10988)
@@ -59,6 +59,7 @@
orxout(verbose, context::identifier) << "Adding identifier for " << identifier->getName() << " / " << identifier->getTypeInfo().name() << endl;
this->identifiers_.insert(identifier);
+ this->identifierByTypeIndex_[identifier->getTypeInfo()] = identifier;
this->identifierByString_[identifier->getName()] = identifier;
this->identifierByLowercaseString_[getLowercase(identifier->getName())] = identifier;
this->identifierByNetworkId_[identifier->getNetworkID()] = identifier;
@@ -70,6 +71,7 @@
void IdentifierManager::removeIdentifier(Identifier* identifier)
{
this->identifiers_.erase(identifier);
+ this->identifierByTypeIndex_.erase(identifier->getTypeInfo());
this->identifierByString_.erase(identifier->getName());
this->identifierByLowercaseString_.erase(getLowercase(identifier->getName()));
this->identifierByNetworkId_.erase(identifier->getNetworkID());
@@ -257,11 +259,11 @@
*/
Identifier* IdentifierManager::getIdentifierByTypeInfo(const std::type_info& typeInfo)
{
- // TODO: use std::type_index and a map to find identifiers by type_info (only with c++11)
- for (Identifier* identifer : this->identifiers_)
- if (identifer->getTypeInfo() == typeInfo)
- return identifer;
- return nullptr;
+ auto it = this->identifierByTypeIndex_.find(typeInfo);
+ if (it != this->identifierByTypeIndex_.end())
+ return it->second;
+ else
+ return nullptr;
}
/**
Modified: code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.h
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.h 2015-12-28 21:17:50 UTC (rev 10987)
+++ code/branches/cpp11_v2/src/libraries/core/class/IdentifierManager.h 2015-12-28 22:22:21 UTC (rev 10988)
@@ -36,7 +36,9 @@
#include "core/CorePrereqs.h"
+#include <typeindex>
#include <map>
+#include <unordered_map>
#include <set>
#include <list>
#include <string>
@@ -101,10 +103,11 @@
inline void stopCreatingHierarchy()
{ hierarchyCreatingCounter_s--; }
- std::set<Identifier*> identifiers_; //!< All identifiers. This is only used internally.
- std::map<std::string, Identifier*> identifierByString_; //!< Map that stores all Identifiers with their names.
- std::map<std::string, Identifier*> identifierByLowercaseString_; //!< Map that stores all Identifiers with their names in lowercase.
- std::map<uint32_t, Identifier*> identifierByNetworkId_; //!< Returns the map that stores all Identifiers with their network IDs.
+ std::set<Identifier*> identifiers_; //!< All identifiers. This is only used internally.
+ std::unordered_map<std::type_index, Identifier*> identifierByTypeIndex_; //!< Map that stores all Identifiers with their type_index.
+ std::map<std::string, Identifier*> identifierByString_; //!< Map that stores all Identifiers with their names.
+ std::map<std::string, Identifier*> identifierByLowercaseString_; //!< Map that stores all Identifiers with their names in lowercase.
+ std::map<uint32_t, Identifier*> identifierByNetworkId_; //!< Returns the map that stores all Identifiers with their network IDs.
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)
More information about the Orxonox-commit
mailing list