[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