301 |
299 |
302 |
300 |
303 namespace _iterable_maps_bits { |
301 namespace _iterable_maps_bits { |
304 template <typename Item> |
302 template <typename Item> |
305 struct IterableIntMapNode { |
303 struct IterableIntMapNode { |
306 IterableIntMapNode() : value(-1) {} |
304 IterableIntMapNode() {} |
|
305 IterableIntMapNode(int _value) : value(_value) {} |
307 Item prev, next; |
306 Item prev, next; |
308 int value; |
307 int value; |
309 }; |
308 }; |
310 } |
309 } |
311 |
310 |
312 ///\ingroup maps |
311 ///\ingroup maps |
313 /// |
312 /// |
314 /// \brief Dynamic iterable integer map. |
313 /// \brief Dynamic iterable integer map. |
315 /// |
314 /// |
316 /// \todo Document please |
315 /// This class provides a special graph map type which can store |
|
316 /// for each graph item(node, edge, etc.) an integer value. For each |
|
317 /// non negative value it is possible to iterate on the keys which |
|
318 /// mapped to the given value. |
|
319 /// |
|
320 /// \param _Graph The graph type. |
|
321 /// \param _Item One of the graph's item type, the key of the map. |
317 template <typename _Graph, typename _Item> |
322 template <typename _Graph, typename _Item> |
318 class IterableIntMap : protected ItemSetTraits<_Graph, _Item> |
323 class IterableIntMap : protected ItemSetTraits<_Graph, _Item> |
319 ::template Map<_iterable_maps_bits::IterableIntMapNode<_Item> >::Parent { |
324 ::template Map<_iterable_maps_bits::IterableIntMapNode<_Item> >::Parent { |
320 public: |
325 public: |
321 typedef typename ItemSetTraits<_Graph, _Item> |
326 typedef typename ItemSetTraits<_Graph, _Item> |
322 ::template Map<_iterable_maps_bits::IterableIntMapNode<_Item> > |
327 ::template Map<_iterable_maps_bits::IterableIntMapNode<_Item> > |
323 ::Parent Parent; |
328 ::Parent Parent; |
324 |
329 |
|
330 /// The key type |
325 typedef _Item Key; |
331 typedef _Item Key; |
|
332 /// The value type |
326 typedef int Value; |
333 typedef int Value; |
|
334 /// The graph type |
327 typedef _Graph Graph; |
335 typedef _Graph Graph; |
328 |
336 |
329 explicit IterableIntMap(const Graph& graph) : Parent(graph) {} |
337 /// \brief Constructor of the Map. |
|
338 /// |
|
339 /// Constructor of the Map. It set all values -1. |
|
340 explicit IterableIntMap(const Graph& graph) |
|
341 : Parent(graph, _iterable_maps_bits::IterableIntMapNode<_Item>(-1)) {} |
|
342 |
|
343 /// \brief Constructor of the Map with a given value. |
|
344 /// |
|
345 /// Constructor of the Map with a given value. |
|
346 explicit IterableIntMap(const Graph& graph, int value) |
|
347 : Parent(graph, _iterable_maps_bits::IterableIntMapNode<_Item>(value)) { |
|
348 if (value >= 0) { |
|
349 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) { |
|
350 lace(it); |
|
351 } |
|
352 } |
|
353 } |
330 |
354 |
331 private: |
355 private: |
332 |
356 |
333 void unlace(const Key& key) { |
357 void unlace(const Key& key) { |
334 typename Parent::Value& node = Parent::operator[](key); |
358 typename Parent::Value& node = Parent::operator[](key); |
360 first[node.value] = key; |
384 first[node.value] = key; |
361 } |
385 } |
362 |
386 |
363 public: |
387 public: |
364 |
388 |
|
389 /// Indicates that the map if reference map. |
365 typedef True ReferenceMapTag; |
390 typedef True ReferenceMapTag; |
366 |
391 |
|
392 /// \brief Refernce to the value of the map. |
|
393 /// |
|
394 /// This class is near to similar to the int type. It can |
|
395 /// be converted to int and it has the same operators. |
367 class Reference { |
396 class Reference { |
368 friend class IterableIntMap; |
397 friend class IterableIntMap; |
369 private: |
398 private: |
370 Reference(IterableIntMap& map, const Key& key) |
399 Reference(IterableIntMap& map, const Key& key) |
371 : _key(key), _map(map) {} |
400 : _key(key), _map(map) {} |
445 |
474 |
446 private: |
475 private: |
447 Key _key; |
476 Key _key; |
448 IterableIntMap& _map; |
477 IterableIntMap& _map; |
449 }; |
478 }; |
450 |
479 |
|
480 /// The const reference type. |
451 typedef const Value& ConstReference; |
481 typedef const Value& ConstReference; |
452 |
482 |
|
483 /// \brief Gives back the maximal value plus one. |
|
484 /// |
|
485 /// Gives back the maximal value plus one. |
453 int size() const { |
486 int size() const { |
454 return (int)first.size(); |
487 return (int)first.size(); |
455 } |
488 } |
456 |
489 |
|
490 /// \brief Set operation of the map. |
|
491 /// |
|
492 /// Set operation of the map. |
457 void set(const Key& key, const Value& value) { |
493 void set(const Key& key, const Value& value) { |
458 unlace(key); |
494 unlace(key); |
459 Parent::operator[](key).value = value; |
495 Parent::operator[](key).value = value; |
460 lace(key); |
496 lace(key); |
461 } |
497 } |
462 |
498 |
|
499 /// \brief Const subscript operator of the map. |
|
500 /// |
|
501 /// Const subscript operator of the map. |
463 const Value& operator[](const Key& key) const { |
502 const Value& operator[](const Key& key) const { |
464 return Parent::operator[](key).value; |
503 return Parent::operator[](key).value; |
465 } |
504 } |
466 |
505 |
|
506 /// \brief Subscript operator of the map. |
|
507 /// |
|
508 /// Subscript operator of the map. |
467 Reference operator[](const Key& key) { |
509 Reference operator[](const Key& key) { |
468 return Reference(*this, key); |
510 return Reference(*this, key); |
469 } |
511 } |
470 |
512 |
|
513 /// \brief Iterator for the keys with the same value. |
|
514 /// |
|
515 /// Iterator for the keys with the same value. It works |
|
516 /// like a graph item iterator in the map, it can be converted |
|
517 /// the item type of the map, incremented with \c ++ operator, and |
|
518 /// if the iterator leave the last valid item it will be equal to |
|
519 /// \c INVALID. |
471 class ItemIt : public _Item { |
520 class ItemIt : public _Item { |
472 public: |
521 public: |
473 typedef _Item Parent; |
522 typedef _Item Parent; |
474 |
523 |
|
524 /// \brief Invalid constructor \& conversion. |
|
525 /// |
|
526 /// This constructor initializes the item to be invalid. |
|
527 /// \sa Invalid for more details. |
475 ItemIt(Invalid) : Parent(INVALID), _map(0) {} |
528 ItemIt(Invalid) : Parent(INVALID), _map(0) {} |
476 |
529 |
|
530 /// \brief Creates an iterator with a value. |
|
531 /// |
|
532 /// Creates an iterator with a value. It iterates on the |
|
533 /// keys which have the given value. |
|
534 /// \param map The IterableIntMap |
|
535 /// \param value The value |
477 ItemIt(const IterableIntMap& map, int value) : _map(&map) { |
536 ItemIt(const IterableIntMap& map, int value) : _map(&map) { |
478 if (value < 0 || value >= (int)_map->first.size()) { |
537 if (value < 0 || value >= (int)_map->first.size()) { |
479 Parent::operator=(INVALID); |
538 Parent::operator=(INVALID); |
480 } else { |
539 } else { |
481 Parent::operator=(_map->first[value]); |
540 Parent::operator=(_map->first[value]); |
482 } |
541 } |
483 } |
542 } |
484 |
543 |
|
544 /// \brief Increment operator. |
|
545 /// |
|
546 /// Increment Operator. |
485 ItemIt& operator++() { |
547 ItemIt& operator++() { |
486 Parent::operator=(_map->IterableIntMap::Parent:: |
548 Parent::operator=(_map->IterableIntMap::Parent:: |
487 operator[](static_cast<Parent&>(*this)).next); |
549 operator[](static_cast<Parent&>(*this)).next); |
488 return *this; |
550 return *this; |
489 } |
551 } |