Changeset 209:765619b7cbb2 in lemon for lemon/bits/array_map.h
- Timestamp:
- 07/13/08 20:51:02 (17 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bits/array_map.h
r107 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 39 39 /// The ArrayMap template class is graph map structure what 40 40 /// automatically updates the map when a key is added to or erased from 41 /// the map. This map uses the allocators to implement 41 /// the map. This map uses the allocators to implement 42 42 /// the container functionality. 43 43 /// … … 45 45 /// the Value type of the map. 46 46 template <typename _Graph, typename _Item, typename _Value> 47 class ArrayMap 47 class ArrayMap 48 48 : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase { 49 49 public: 50 /// The graph type of the maps. 50 /// The graph type of the maps. 51 51 typedef _Graph Graph; 52 52 /// The item type of the map. … … 70 70 /// The MapBase of the Map which imlements the core regisitry function. 71 71 typedef typename Notifier::ObserverBase Parent; 72 72 73 73 private: 74 74 typedef std::allocator<Value> Allocator; … … 85 85 Item it; 86 86 for (nf->first(it); it != INVALID; nf->next(it)) { 87 88 89 } 90 } 91 92 /// \brief Constructor to use default value to initialize the map. 93 /// 94 /// It constructs a map and initialize all of the the map. 87 int id = nf->id(it);; 88 allocator.construct(&(values[id]), Value()); 89 } 90 } 91 92 /// \brief Constructor to use default value to initialize the map. 93 /// 94 /// It constructs a map and initialize all of the the map. 95 95 ArrayMap(const Graph& graph, const Value& value) { 96 96 Parent::attach(graph.notifier(Item())); … … 99 99 Item it; 100 100 for (nf->first(it); it != INVALID; nf->next(it)) { 101 102 103 } 101 int id = nf->id(it);; 102 allocator.construct(&(values[id]), value); 103 } 104 104 } 105 105 106 106 /// \brief Constructor to copy a map of the same map type. 107 107 /// 108 /// Constructor to copy a map of the same map type. 108 /// Constructor to copy a map of the same map type. 109 109 ArrayMap(const ArrayMap& copy) : Parent() { 110 110 if (copy.attached()) { 111 111 attach(*copy.notifier()); 112 112 } 113 113 capacity = copy.capacity; … … 117 117 Item it; 118 118 for (nf->first(it); it != INVALID; nf->next(it)) { 119 120 119 int id = nf->id(it);; 120 allocator.construct(&(values[id]), copy.values[id]); 121 121 } 122 122 } … … 125 125 /// 126 126 /// This operator assigns for each item in the map the 127 /// value mapped to the same item in the copied map. 127 /// value mapped to the same item in the copied map. 128 128 /// The parameter map should be indiced with the same 129 129 /// itemset because this assign operator does not change 130 /// the container of the map. 130 /// the container of the map. 131 131 ArrayMap& operator=(const ArrayMap& cmap) { 132 132 return operator=<ArrayMap>(cmap); … … 139 139 /// concecpt and could be indiced by the current item set of 140 140 /// the NodeMap. In this case the value for each item 141 /// is assigned by the value of the given ReadMap. 141 /// is assigned by the value of the given ReadMap. 142 142 template <typename CMap> 143 143 ArrayMap& operator=(const CMap& cmap) { … … 152 152 153 153 /// \brief The destructor of the map. 154 /// 154 /// 155 155 /// The destructor of the map. 156 virtual ~ArrayMap() { 156 virtual ~ArrayMap() { 157 157 if (attached()) { 158 159 160 } 161 } 162 158 clear(); 159 detach(); 160 } 161 } 162 163 163 protected: 164 164 … … 169 169 public: 170 170 171 /// \brief The subscript operator. 171 /// \brief The subscript operator. 172 172 /// 173 173 /// The subscript operator. The map can be subscripted by the 174 /// actual keys of the graph. 174 /// actual keys of the graph. 175 175 Value& operator[](const Key& key) { 176 176 int id = Parent::notifier()->id(key); 177 177 return values[id]; 178 } 179 178 } 179 180 180 /// \brief The const subscript operator. 181 181 /// 182 182 /// The const subscript operator. The map can be subscripted by the 183 /// actual keys of the graph. 183 /// actual keys of the graph. 184 184 const Value& operator[](const Key& key) const { 185 185 int id = Parent::notifier()->id(key); … … 188 188 189 189 /// \brief Setter function of the map. 190 /// 190 /// 191 191 /// Setter function of the map. Equivalent with map[key] = val. 192 192 /// This is a compatibility feature with the not dereferable maps. … … 198 198 199 199 /// \brief Adds a new key to the map. 200 /// 200 /// 201 201 /// It adds a new key to the map. It called by the observer notifier 202 /// and it overrides the add() member function of the observer base. 202 /// and it overrides the add() member function of the observer base. 203 203 virtual void add(const Key& key) { 204 204 Notifier* nf = Parent::notifier(); 205 205 int id = nf->id(key); 206 206 if (id >= capacity) { 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 207 int new_capacity = (capacity == 0 ? 1 : capacity); 208 while (new_capacity <= id) { 209 new_capacity <<= 1; 210 } 211 Value* new_values = allocator.allocate(new_capacity); 212 Item it; 213 for (nf->first(it); it != INVALID; nf->next(it)) { 214 int jd = nf->id(it);; 215 if (id != jd) { 216 allocator.construct(&(new_values[jd]), values[jd]); 217 allocator.destroy(&(values[jd])); 218 } 219 } 220 if (capacity != 0) allocator.deallocate(values, capacity); 221 values = new_values; 222 capacity = new_capacity; 223 223 } 224 224 allocator.construct(&(values[id]), Value()); … … 226 226 227 227 /// \brief Adds more new keys to the map. 228 /// 228 /// 229 229 /// It adds more new keys to the map. It called by the observer notifier 230 /// and it overrides the add() member function of the observer base. 230 /// and it overrides the add() member function of the observer base. 231 231 virtual void add(const std::vector<Key>& keys) { 232 232 Notifier* nf = Parent::notifier(); 233 233 int max_id = -1; 234 234 for (int i = 0; i < int(keys.size()); ++i) { 235 236 237 238 235 int id = nf->id(keys[i]); 236 if (id > max_id) { 237 max_id = id; 238 } 239 239 } 240 240 if (max_id >= capacity) { 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 241 int new_capacity = (capacity == 0 ? 1 : capacity); 242 while (new_capacity <= max_id) { 243 new_capacity <<= 1; 244 } 245 Value* new_values = allocator.allocate(new_capacity); 246 Item it; 247 for (nf->first(it); it != INVALID; nf->next(it)) { 248 int id = nf->id(it); 249 bool found = false; 250 for (int i = 0; i < int(keys.size()); ++i) { 251 int jd = nf->id(keys[i]); 252 if (id == jd) { 253 found = true; 254 break; 255 } 256 } 257 if (found) continue; 258 allocator.construct(&(new_values[id]), values[id]); 259 allocator.destroy(&(values[id])); 260 } 261 if (capacity != 0) allocator.deallocate(values, capacity); 262 values = new_values; 263 capacity = new_capacity; 264 264 } 265 265 for (int i = 0; i < int(keys.size()); ++i) { 266 267 268 } 269 } 270 266 int id = nf->id(keys[i]); 267 allocator.construct(&(values[id]), Value()); 268 } 269 } 270 271 271 /// \brief Erase a key from the map. 272 272 /// 273 273 /// Erase a key from the map. It called by the observer notifier 274 /// and it overrides the erase() member function of the observer base. 274 /// and it overrides the erase() member function of the observer base. 275 275 virtual void erase(const Key& key) { 276 276 int id = Parent::notifier()->id(key); … … 281 281 /// 282 282 /// Erase more keys from the map. It called by the observer notifier 283 /// and it overrides the erase() member function of the observer base. 283 /// and it overrides the erase() member function of the observer base. 284 284 virtual void erase(const std::vector<Key>& keys) { 285 285 for (int i = 0; i < int(keys.size()); ++i) { 286 287 286 int id = Parent::notifier()->id(keys[i]); 287 allocator.destroy(&(values[id])); 288 288 } 289 289 } 290 290 291 291 /// \brief Buildes the map. 292 /// 292 /// 293 293 /// It buildes the map. It called by the observer notifier 294 /// and it overrides the build() member function of the observer base. 294 /// and it overrides the build() member function of the observer base. 295 295 virtual void build() { 296 296 Notifier* nf = Parent::notifier(); … … 298 298 Item it; 299 299 for (nf->first(it); it != INVALID; nf->next(it)) { 300 301 302 } 300 int id = nf->id(it);; 301 allocator.construct(&(values[id]), Value()); 302 } 303 303 } 304 304 … … 306 306 /// 307 307 /// It erase all items from the map. It called by the observer notifier 308 /// and it overrides the clear() member function of the observer base. 309 virtual void clear() { 308 /// and it overrides the clear() member function of the observer base. 309 virtual void clear() { 310 310 Notifier* nf = Parent::notifier(); 311 311 if (capacity != 0) { 312 313 314 315 316 } 317 318 312 Item it; 313 for (nf->first(it); it != INVALID; nf->next(it)) { 314 int id = nf->id(it); 315 allocator.destroy(&(values[id])); 316 } 317 allocator.deallocate(values, capacity); 318 capacity = 0; 319 319 } 320 320 } 321 321 322 322 private: 323 323 324 324 void allocate_memory() { 325 325 int max_id = Parent::notifier()->maxId(); 326 326 if (max_id == -1) { 327 328 329 327 capacity = 0; 328 values = 0; 329 return; 330 330 } 331 331 capacity = 1; 332 332 while (capacity <= max_id) { 333 334 } 335 values = allocator.allocate(capacity); 336 } 333 capacity <<= 1; 334 } 335 values = allocator.allocate(capacity); 336 } 337 337 338 338 int capacity; … … 340 340 Allocator allocator; 341 341 342 }; 342 }; 343 343 344 344 } 345 345 346 #endif 346 #endif
Note: See TracChangeset
for help on using the changeset viewer.