3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #include <lemon/bits/traits.h>
20 #include <lemon/bits/invalid.h>
22 #include <lemon/bits/default_map.h>
23 #include <lemon/bits/map_extender.h>
33 ///\brief Maps that makes it possible to iterate through the keys having
41 ///\ingroup graph_maps
43 /// \brief Dynamic iterable bool map.
45 /// This class provides a special graph map type which can store
46 /// for each graph item(node, edge, etc.) a bool value. For both
47 /// the true and the false it is possible to iterate on the keys which
48 /// mapped to the given value.
50 /// \param _Graph The graph type.
51 /// \param _Item One of the graph's item type, the key of the map.
52 template <typename _Graph, typename _Item>
53 class IterableBoolMap : protected DefaultMap<_Graph, _Item, int> {
57 typedef typename ItemSetTraits<Graph, _Item>::ItemIt KeyIt;
58 typedef DefaultMap<_Graph, _Item, int> Parent;
60 std::vector<_Item> array;
67 /// Indicates that the map if reference map.
68 typedef True ReferenceMapTag;
74 /// The const reference type.
75 typedef const Value& ConstReference;
79 int position(const Key& key) const {
80 return Parent::operator[](key);
85 /// \brief Refernce to the value of the map.
87 /// This class is near to similar to the bool type. It can
88 /// be converted to bool and it has the same operators.
90 friend class IterableBoolMap;
92 Reference(IterableBoolMap& map, const Key& key)
93 : _key(key), _map(map) {}
96 Reference& operator=(const Reference& value) {
97 _map.set(_key, (bool)value);
101 operator bool() const {
102 return static_cast<const IterableBoolMap&>(_map)[_key];
105 Reference& operator=(bool value) {
106 _map.set(_key, value);
109 Reference& operator&=(bool value) {
110 _map.set(_key, _map[_key] & value);
113 Reference& operator|=(bool value) {
114 _map.set(_key, _map[_key] | value);
117 Reference& operator^=(bool value) {
118 _map.set(_key, _map[_key] ^ value);
123 IterableBoolMap& _map;
126 /// \brief Constructor of the Map with a default value.
128 /// Constructor of the Map with a default value.
129 IterableBoolMap(const Graph& _graph, bool def = false)
130 : Parent(_graph), graph(_graph) {
131 for (KeyIt it(graph); it != INVALID; ++it) {
132 Parent::set(it, array.size());
135 sep = (def ? array.size() : 0);
138 /// \brief Const subscript operator of the map.
140 /// Const subscript operator of the map.
141 bool operator[](const Key& key) const {
142 return position(key) < sep;
145 /// \brief Subscript operator of the map.
147 /// Subscript operator of the map.
148 Reference operator[](const Key& key) {
149 return Reference(*this, key);
152 /// \brief Set operation of the map.
154 /// Set operation of the map.
155 void set(const Key& key, bool value) {
156 int pos = position(key);
158 if (pos < sep) return;
159 Key tmp = array[sep];
161 Parent::set(key, sep);
163 Parent::set(tmp, pos);
166 if (pos >= sep) return;
168 Key tmp = array[sep];
170 Parent::set(key, sep);
172 Parent::set(tmp, pos);
176 /// \brief Returns the number of the keys mapped to true.
178 /// Returns the number of the keys mapped to true.
179 int trueNum() const {
183 /// \brief Returns the number of the keys mapped to false.
185 /// Returns the number of the keys mapped to false.
186 int falseNum() const {
187 return array.size() - sep;
190 /// \brief Iterator for the keys mapped to true.
192 /// Iterator for the keys mapped to true. It works
193 /// like a graph item iterator in the map, it can be converted
194 /// the key type of the map, incremented with \c ++ operator, and
195 /// if the iterator leave the last valid key it will be equal to
197 class TrueIt : public Key {
201 /// \brief Creates an iterator.
203 /// Creates an iterator. It iterates on the
204 /// keys which mapped to true.
205 /// \param _map The IterableIntMap
206 TrueIt(const IterableBoolMap& _map)
207 : Parent(_map.sep > 0 ? _map.array[_map.sep - 1] : INVALID),
210 /// \brief Invalid constructor \& conversion.
212 /// This constructor initializes the key to be invalid.
213 /// \sa Invalid for more details.
214 TrueIt(Invalid) : Parent(INVALID), map(0) {}
216 /// \brief Increment operator.
218 /// Increment Operator.
219 TrueIt& operator++() {
220 int pos = map->position(*this);
221 Parent::operator=(pos > 0 ? map->array[pos - 1] : INVALID);
227 const IterableBoolMap* map;
230 /// \brief Iterator for the keys mapped to false.
232 /// Iterator for the keys mapped to false. It works
233 /// like a graph item iterator in the map, it can be converted
234 /// the key type of the map, incremented with \c ++ operator, and
235 /// if the iterator leave the last valid key it will be equal to
237 class FalseIt : public Key {
241 /// \brief Creates an iterator.
243 /// Creates an iterator. It iterates on the
244 /// keys which mapped to false.
245 /// \param _map The IterableIntMap
246 FalseIt(const IterableBoolMap& _map)
247 : Parent(_map.sep < (int)_map.array.size() ?
248 _map.array.back() : INVALID), map(&_map) {}
250 /// \brief Invalid constructor \& conversion.
252 /// This constructor initializes the key to be invalid.
253 /// \sa Invalid for more details.
254 FalseIt(Invalid) : Parent(INVALID), map(0) {}
256 /// \brief Increment operator.
258 /// Increment Operator.
259 FalseIt& operator++() {
260 int pos = map->position(*this);
261 Parent::operator=(pos > map->sep ? map->array[pos - 1] : INVALID);
266 const IterableBoolMap* map;
269 /// \brief Iterator for the keys mapped to a given value.
271 /// Iterator for the keys mapped to a given value. It works
272 /// like a graph item iterator in the map, it can be converted
273 /// the key type of the map, incremented with \c ++ operator, and
274 /// if the iterator leave the last valid key it will be equal to
276 class ItemIt : public Key {
280 /// \brief Creates an iterator.
282 /// Creates an iterator. It iterates on the
283 /// keys which mapped to false.
284 /// \param _map The IterableIntMap
285 /// \param value Which elements should be iterated.
286 ItemIt(const IterableBoolMap& _map, bool value)
287 : Parent(value ? (_map.sep > 0 ? _map.array[_map.sep - 1] : INVALID) :
288 (_map.sep < (int)_map.array.size() ?
289 _map.array.back() : INVALID)), map(&_map) {}
291 /// \brief Invalid constructor \& conversion.
293 /// This constructor initializes the key to be invalid.
294 /// \sa Invalid for more details.
295 ItemIt(Invalid) : Parent(INVALID), map(0) {}
297 /// \brief Increment operator.
299 /// Increment Operator.
300 ItemIt& operator++() {
301 int pos = map->position(*this);
302 int sep = pos >= map->sep ? map->sep : 0;
303 Parent::operator=(pos > sep ? map->array[pos - 1] : INVALID);
308 const IterableBoolMap* map;
313 virtual void add(const Key& key) {
315 Parent::set(key, array.size());
316 array.push_back(key);
319 virtual void add(const std::vector<Key>& keys) {
321 for (int i = 0; i < (int)keys.size(); ++i) {
322 Parent::set(keys[i], array.size());
323 array.push_back(keys[i]);
327 virtual void erase(const Key& key) {
328 int pos = position(key);
331 Parent::set(array[sep], pos);
332 array[pos] = array[sep];
333 Parent::set(array.back(), sep);
334 array[sep] = array.back();
337 Parent::set(array.back(), pos);
338 array[pos] = array.back();
344 virtual void erase(const std::vector<Key>& keys) {
345 for (int i = 0; i < (int)keys.size(); ++i) {
346 int pos = position(keys[i]);
349 Parent::set(array[sep], pos);
350 array[pos] = array[sep];
351 Parent::set(array.back(), sep);
352 array[sep] = array.back();
355 Parent::set(array.back(), pos);
356 array[pos] = array.back();
363 virtual void build() {
365 for (KeyIt it(graph); it != INVALID; ++it) {
366 Parent::set(it, array.size());
372 virtual void clear() {
381 namespace _iterable_maps_bits {
382 template <typename Item>
383 struct IterableIntMapNode {
384 IterableIntMapNode() : value(-1) {}
385 IterableIntMapNode(int _value) : value(_value) {}
391 ///\ingroup graph_maps
393 /// \brief Dynamic iterable integer map.
395 /// This class provides a special graph map type which can store
396 /// for each graph item(node, edge, etc.) an integer value. For each
397 /// non negative value it is possible to iterate on the keys which
398 /// mapped to the given value.
400 /// \param _Graph The graph type.
401 /// \param _Item One of the graph's item type, the key of the map.
402 template <typename _Graph, typename _Item>
404 : protected MapExtender<DefaultMap<_Graph, _Item, _iterable_maps_bits::
405 IterableIntMapNode<_Item> > >{
407 typedef MapExtender<DefaultMap<_Graph, _Item, _iterable_maps_bits::
408 IterableIntMapNode<_Item> > > Parent;
415 typedef _Graph Graph;
417 /// \brief Constructor of the Map.
419 /// Constructor of the Map. It set all values -1.
420 explicit IterableIntMap(const Graph& graph)
423 /// \brief Constructor of the Map with a given value.
425 /// Constructor of the Map with a given value.
426 explicit IterableIntMap(const Graph& graph, int value)
427 : Parent(graph, _iterable_maps_bits::IterableIntMapNode<_Item>(value)) {
429 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
437 void unlace(const Key& key) {
438 typename Parent::Value& node = Parent::operator[](key);
439 if (node.value < 0) return;
440 if (node.prev != INVALID) {
441 Parent::operator[](node.prev).next = node.next;
443 first[node.value] = node.next;
445 if (node.next != INVALID) {
446 Parent::operator[](node.next).prev = node.prev;
448 while (!first.empty() && first.back() == INVALID) {
453 void lace(const Key& key) {
454 typename Parent::Value& node = Parent::operator[](key);
455 if (node.value < 0) return;
456 if (node.value >= (int)first.size()) {
457 first.resize(node.value + 1, INVALID);
460 node.next = first[node.value];
461 if (node.next != INVALID) {
462 Parent::operator[](node.next).prev = key;
464 first[node.value] = key;
469 /// Indicates that the map if reference map.
470 typedef True ReferenceMapTag;
472 /// \brief Refernce to the value of the map.
474 /// This class is near to similar to the int type. It can
475 /// be converted to int and it has the same operators.
477 friend class IterableIntMap;
479 Reference(IterableIntMap& map, const Key& key)
480 : _key(key), _map(map) {}
483 Reference& operator=(const Reference& value) {
484 _map.set(_key, (const int&)value);
488 operator const int&() const {
489 return static_cast<const IterableIntMap&>(_map)[_key];
492 Reference& operator=(int value) {
493 _map.set(_key, value);
496 Reference& operator++() {
497 _map.set(_key, _map[_key] + 1);
500 int operator++(int) {
501 int value = _map[_key];
502 _map.set(_key, value + 1);
505 Reference& operator--() {
506 _map.set(_key, _map[_key] - 1);
509 int operator--(int) {
510 int value = _map[_key];
511 _map.set(_key, value - 1);
514 Reference& operator+=(int value) {
515 _map.set(_key, _map[_key] + value);
518 Reference& operator-=(int value) {
519 _map.set(_key, _map[_key] - value);
522 Reference& operator*=(int value) {
523 _map.set(_key, _map[_key] * value);
526 Reference& operator/=(int value) {
527 _map.set(_key, _map[_key] / value);
530 Reference& operator%=(int value) {
531 _map.set(_key, _map[_key] % value);
534 Reference& operator&=(int value) {
535 _map.set(_key, _map[_key] & value);
538 Reference& operator|=(int value) {
539 _map.set(_key, _map[_key] | value);
542 Reference& operator^=(int value) {
543 _map.set(_key, _map[_key] ^ value);
546 Reference& operator<<=(int value) {
547 _map.set(_key, _map[_key] << value);
550 Reference& operator>>=(int value) {
551 _map.set(_key, _map[_key] >> value);
557 IterableIntMap& _map;
560 /// The const reference type.
561 typedef const Value& ConstReference;
563 /// \brief Gives back the maximal value plus one.
565 /// Gives back the maximal value plus one.
566 unsigned int size() const {
570 /// \brief Set operation of the map.
572 /// Set operation of the map.
573 void set(const Key& key, const Value& value) {
575 Parent::operator[](key).value = value;
579 /// \brief Const subscript operator of the map.
581 /// Const subscript operator of the map.
582 const Value& operator[](const Key& key) const {
583 return Parent::operator[](key).value;
586 /// \brief Subscript operator of the map.
588 /// Subscript operator of the map.
589 Reference operator[](const Key& key) {
590 return Reference(*this, key);
593 /// \brief Iterator for the keys with the same value.
595 /// Iterator for the keys with the same value. It works
596 /// like a graph item iterator in the map, it can be converted
597 /// the item type of the map, incremented with \c ++ operator, and
598 /// if the iterator leave the last valid item it will be equal to
600 class ItemIt : public _Item {
602 typedef _Item Parent;
604 /// \brief Invalid constructor \& conversion.
606 /// This constructor initializes the item to be invalid.
607 /// \sa Invalid for more details.
608 ItemIt(Invalid) : Parent(INVALID), _map(0) {}
610 /// \brief Creates an iterator with a value.
612 /// Creates an iterator with a value. It iterates on the
613 /// keys which have the given value.
614 /// \param map The IterableIntMap
615 /// \param value The value
616 ItemIt(const IterableIntMap& map, int value) : _map(&map) {
617 if (value < 0 || value >= (int)_map->first.size()) {
618 Parent::operator=(INVALID);
620 Parent::operator=(_map->first[value]);
624 /// \brief Increment operator.
626 /// Increment Operator.
627 ItemIt& operator++() {
628 Parent::operator=(_map->IterableIntMap::Parent::
629 operator[](static_cast<Parent&>(*this)).next);
635 const IterableIntMap* _map;
640 virtual void erase(const Key& key) {
645 virtual void erase(const std::vector<Key>& keys) {
646 for (int i = 0; i < (int)keys.size(); ++i) {
652 virtual void clear() {
658 std::vector<_Item> first;
661 namespace _iterable_maps_bits {
662 template <typename Item, typename Value>
663 struct IterableValueMapNode {
664 IterableValueMapNode(Value _value = Value()) : value(_value) {}
670 ///\ingroup graph_maps
672 /// \brief Dynamic iterable map for comparable values.
674 /// This class provides a special graph map type which can store
675 /// for each graph item(node, edge, etc.) a value. For each
676 /// value it is possible to iterate on the keys which mapped to the
677 /// given value. The type stores for each value a linked list with
678 /// the items which mapped to the value, and the values are stored
679 /// in balanced binary tree. The values of the map can be accessed
680 /// with stl compatible forward iterator.
682 /// This type is not reference map so it cannot be modified with
683 /// the subscription operator.
685 /// \see InvertableMap
687 /// \param _Graph The graph type.
688 /// \param _Item One of the graph's item type, the key of the map.
689 /// \param _Value Any comparable value type.
690 template <typename _Graph, typename _Item, typename _Value>
691 class IterableValueMap
692 : protected MapExtender<DefaultMap<_Graph, _Item, _iterable_maps_bits::
693 IterableValueMapNode<_Item, _Value> > >{
695 typedef MapExtender<DefaultMap<_Graph, _Item, _iterable_maps_bits::
696 IterableValueMapNode<_Item, _Value> > >
702 typedef _Value Value;
704 typedef _Graph Graph;
708 /// \brief Constructor of the Map with a given value.
710 /// Constructor of the Map with a given value.
711 explicit IterableValueMap(const Graph& graph,
712 const Value& value = Value())
713 : Parent(graph, _iterable_maps_bits::
714 IterableValueMapNode<_Item, _Value>(value)) {
715 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
722 void unlace(const Key& key) {
723 typename Parent::Value& node = Parent::operator[](key);
724 if (node.prev != INVALID) {
725 Parent::operator[](node.prev).next = node.next;
727 if (node.next != INVALID) {
728 first[node.value] = node.next;
730 first.erase(node.value);
733 if (node.next != INVALID) {
734 Parent::operator[](node.next).prev = node.prev;
738 void lace(const Key& key) {
739 typename Parent::Value& node = Parent::operator[](key);
740 typename std::map<Value, Key>::iterator it = first.find(node.value);
741 if (it == first.end()) {
742 node.prev = node.next = INVALID;
743 if (node.next != INVALID) {
744 Parent::operator[](node.next).prev = key;
746 first.insert(make_pair(node.value, key));
749 node.next = it->second;
750 if (node.next != INVALID) {
751 Parent::operator[](node.next).prev = key;
759 /// \brief Forward iterator for values.
761 /// This iterator is an stl compatible forward
762 /// iterator on the values of the map. The values can
763 /// be accessed in the [beginValue, endValue) range.
766 : public std::iterator<std::forward_iterator_tag, Value> {
767 friend class IterableValueMap;
769 ValueIterator(typename std::map<Value, Key>::const_iterator _it)
775 ValueIterator& operator++() { ++it; return *this; }
776 ValueIterator operator++(int) {
777 ValueIterator tmp(*this);
782 const Value& operator*() const { return it->first; }
783 const Value* operator->() const { return &(it->first); }
785 bool operator==(ValueIterator jt) const { return it == jt.it; }
786 bool operator!=(ValueIterator jt) const { return it != jt.it; }
789 typename std::map<Value, Key>::const_iterator it;
792 /// \brief Returns an iterator to the first value.
794 /// Returns an stl compatible iterator to the
795 /// first value of the map. The values of the
796 /// map can be accessed in the [beginValue, endValue)
798 ValueIterator beginValue() const {
799 return ValueIterator(first.begin());
802 /// \brief Returns an iterator after the last value.
804 /// Returns an stl compatible iterator after the
805 /// last value of the map. The values of the
806 /// map can be accessed in the [beginValue, endValue)
808 ValueIterator endValue() const {
809 return ValueIterator(first.end());
812 /// \brief Set operation of the map.
814 /// Set operation of the map.
815 void set(const Key& key, const Value& value) {
817 Parent::operator[](key).value = value;
821 /// \brief Const subscript operator of the map.
823 /// Const subscript operator of the map.
824 const Value& operator[](const Key& key) const {
825 return Parent::operator[](key).value;
828 /// \brief Iterator for the keys with the same value.
830 /// Iterator for the keys with the same value. It works
831 /// like a graph item iterator in the map, it can be converted
832 /// the item type of the map, incremented with \c ++ operator, and
833 /// if the iterator leave the last valid item it will be equal to
835 class ItemIt : public _Item {
837 typedef _Item Parent;
839 /// \brief Invalid constructor \& conversion.
841 /// This constructor initializes the item to be invalid.
842 /// \sa Invalid for more details.
843 ItemIt(Invalid) : Parent(INVALID), _map(0) {}
845 /// \brief Creates an iterator with a value.
847 /// Creates an iterator with a value. It iterates on the
848 /// keys which have the given value.
849 /// \param map The IterableValueMap
850 /// \param value The value
851 ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
852 typename std::map<Value, Key>::const_iterator it =
853 map.first.find(value);
854 if (it == map.first.end()) {
855 Parent::operator=(INVALID);
857 Parent::operator=(it->second);
861 /// \brief Increment operator.
863 /// Increment Operator.
864 ItemIt& operator++() {
865 Parent::operator=(_map->IterableValueMap::Parent::
866 operator[](static_cast<Parent&>(*this)).next);
872 const IterableValueMap* _map;
877 virtual void add(const Key& key) {
882 virtual void add(const std::vector<Key>& keys) {
884 for (int i = 0; i < (int)keys.size(); ++i) {
889 virtual void erase(const Key& key) {
894 virtual void erase(const std::vector<Key>& keys) {
895 for (int i = 0; i < (int)keys.size(); ++i) {
901 virtual void build() {
903 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
908 virtual void clear() {
914 std::map<Value, Key> first;