|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // A map of named object pointers 00008 /****************************************************************************/ 00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors 00011 /****************************************************************************/ 00012 // 00013 // This program is free software; you can redistribute it and/or modify 00014 // it under the terms of the GNU General Public License as published by 00015 // the Free Software Foundation; either version 2 of the License, or 00016 // (at your option) any later version. 00017 // 00018 /****************************************************************************/ 00019 #ifndef NamedObjectCont_h 00020 #define NamedObjectCont_h 00021 00022 00023 // =========================================================================== 00024 // included modules 00025 // =========================================================================== 00026 #ifdef _MSC_VER 00027 #include <windows_config.h> 00028 #else 00029 #include <config.h> 00030 #endif 00031 00032 #include <map> 00033 #include <string> 00034 #include <vector> 00035 #include <algorithm> 00036 00037 00038 // =========================================================================== 00039 // class definitions 00040 // =========================================================================== 00050 template<class T> 00051 class NamedObjectCont { 00052 public: 00054 NamedObjectCont() throw() : myHaveChanged(false) { } 00055 00056 00058 virtual ~NamedObjectCont() throw() { 00059 for (typename IDMap::iterator i=myMap.begin(); i!=myMap.end(); i++) { 00060 delete(*i).second; 00061 } 00062 } 00063 00064 00074 virtual bool add(const std::string& id, T item) throw() { 00075 if (myMap.find(id)!=myMap.end()) { 00076 return false; 00077 } 00078 myMap.insert(std::make_pair(id, item)); 00079 myHaveChanged = true; 00080 return true; 00081 } 00082 00083 00088 virtual bool remove(const std::string& id) throw() { 00089 if (myMap.find(id)==myMap.end()) { 00090 return false; 00091 } 00092 typename std::map<std::string, T>::iterator i = myMap.find(id); 00093 delete i->second; 00094 myMap.erase(i); 00095 myHaveChanged = true; 00096 return true; 00097 } 00098 00099 00107 T get(const std::string& id) const throw() { 00108 typename std::map<std::string, T>::const_iterator i = myMap.find(id); 00109 if (i==myMap.end()) { 00110 return 0; 00111 } 00112 return (*i).second; 00113 } 00114 00115 00117 void clear() throw() { 00118 for (typename IDMap::iterator i=myMap.begin(); i!=myMap.end(); i++) { 00119 delete(*i).second; 00120 } 00121 myMap.clear(); 00122 myVector.clear(); 00123 myHaveChanged = true; 00124 } 00125 00126 00131 unsigned int size() const throw() { 00132 return (unsigned int) myMap.size(); 00133 } 00134 00135 00145 bool erase(const std::string& id) throw() { 00146 typename IDMap::iterator i=myMap.find(id); 00147 if (i==myMap.end()) { 00148 return false; 00149 } 00150 T o = (*i).second; 00151 myMap.erase(i); 00152 // and from the vector 00153 typename ObjectVector::iterator i2 = 00154 find(myVector.begin(), myVector.end(), o); 00155 myHaveChanged = true; 00156 if (i2!=myVector.end()) { 00157 myVector.erase(i2); 00158 } 00159 delete o; 00160 return true; 00161 } 00162 00163 00164 /* @brief Returns the reference to a vector that contains all objects. 00165 * 00166 * This method returns the reference to a vector which is stored within 00167 * this class and contains all known objects stored within the map. 00168 * This vector is rebuild in prior if "myHaveChanged" indicates 00169 * a change has taken place. 00170 * 00171 * @return Reference to a saved vector of objects within the map 00172 */ 00173 const std::vector<T> &buildAndGetStaticVector() const throw() { 00174 if (myHaveChanged) { 00175 myVector.clear(); 00176 typename IDMap::const_iterator i; 00177 for (i=myMap.begin(); i!=myMap.end(); ++i) { 00178 myVector.push_back((*i).second); 00179 } 00180 myHaveChanged = false; 00181 } 00182 return myVector; 00183 } 00184 00185 00186 /* @brief Returns a vector that contains all objects. 00187 * 00188 * This method builds and returns a vector which contains all known 00189 * objects stored within the map. 00190 * 00191 * @return A vector of objects within the map 00192 */ 00193 std::vector<T> getTempVector() const throw() { 00194 std::vector<T> ret; 00195 typename IDMap::const_iterator i; 00196 for (i=myMap.begin(); i!=myMap.end(); ++i) { 00197 ret.push_back((*i).second); 00198 } 00199 return ret; 00200 } 00201 00202 00203 /* @brief Fills the given vector with the stored objects' ids 00204 * @param[in] into The container to fill 00205 */ 00206 void insertIDs(std::vector<std::string> &into) const throw() { 00207 typename IDMap::const_iterator i; 00208 for (i=myMap.begin(); i!=myMap.end(); ++i) { 00209 into.push_back((*i).first); 00210 } 00211 } 00212 00213 00214 /* @brief Returns a reference to the internal map 00215 * 00216 * @return A reference to the internal map 00217 */ 00218 const std::map<std::string, T> &getMyMap() const throw() { 00219 return myMap; 00220 } 00221 00222 00223 private: 00225 typedef std::map< std::string, T > IDMap; 00226 00228 typedef typename IDMap::iterator myContIt; 00229 00231 IDMap myMap; 00232 00234 typedef std::vector<T> ObjectVector; 00235 00237 mutable ObjectVector myVector; 00238 00240 mutable bool myHaveChanged; 00241 00242 }; 00243 00244 00245 #endif 00246 00247 /****************************************************************************/ 00248