| [d1e0c0] | 1 | /*
 | 
|---|
 | 2 |  * IteratorAdaptors.hpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  This is all copy&pasted from
 | 
|---|
 | 5 |  *  http://stackoverflow.com/questions/4908317/iterate-through-stl-sequence-and-associative-containers-using-same-code
 | 
|---|
 | 6 |  *
 | 
|---|
 | 7 |  *  Kudos go to Emile Cormier for writing this adapter code.
 | 
|---|
 | 8 |  *
 | 
|---|
 | 9 |  *  I just adapted it to sequence through either value or key and changed the name.
 | 
|---|
 | 10 |  *
 | 
|---|
 | 11 |  *  Created on: Feb 21, 2011
 | 
|---|
 | 12 |  *      Author: heber
 | 
|---|
 | 13 |  */
 | 
|---|
 | 14 | 
 | 
|---|
 | 15 | #ifndef ITERATORADAPTORS_HPP_
 | 
|---|
 | 16 | #define ITERATORADAPTORS_HPP_
 | 
|---|
 | 17 | 
 | 
|---|
 | 18 | #include <iostream>
 | 
|---|
 | 19 | #include <map>
 | 
|---|
 | 20 | #include <vector>
 | 
|---|
 | 21 | #include <boost/iterator/iterator_adaptor.hpp>
 | 
|---|
 | 22 | 
 | 
|---|
 | 23 | /** This class wraps an iterator and implements a dereferencer (operator*) that
 | 
|---|
 | 24 |  *  always returns the value
 | 
|---|
 | 25 |  */
 | 
|---|
 | 26 | template <class BaseIterator>
 | 
|---|
 | 27 | class MapValueIterator :
 | 
|---|
 | 28 |     public boost::iterator_adaptor<
 | 
|---|
 | 29 |     MapValueIterator<BaseIterator>,
 | 
|---|
 | 30 |         BaseIterator,
 | 
|---|
 | 31 |         typename BaseIterator::value_type::second_type >
 | 
|---|
 | 32 | {
 | 
|---|
 | 33 | public:
 | 
|---|
 | 34 |     typedef typename BaseIterator::value_type::second_type& reference;
 | 
|---|
 | 35 | 
 | 
|---|
 | 36 |     MapValueIterator() {}
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 |     explicit MapValueIterator(BaseIterator base)
 | 
|---|
 | 39 |     :   MapValueIterator::iterator_adaptor_(base) {}
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 |  private:
 | 
|---|
 | 42 |     friend class boost::iterator_core_access;
 | 
|---|
 | 43 |     reference dereference() const
 | 
|---|
 | 44 |         {return this->base_reference()->second;}
 | 
|---|
 | 45 | };
 | 
|---|
 | 46 | 
 | 
|---|
| [4fb16c] | 47 | /** This class wraps an iterator and implements a dereferencer (operator*) that
 | 
|---|
 | 48 |  *  always returns the value
 | 
|---|
 | 49 |  */
 | 
|---|
 | 50 | template <class BaseIterator>
 | 
|---|
 | 51 | class MapValueConstIterator :
 | 
|---|
 | 52 |     public boost::iterator_adaptor<
 | 
|---|
 | 53 |     MapValueConstIterator<BaseIterator>,
 | 
|---|
 | 54 |         BaseIterator,
 | 
|---|
 | 55 |         const typename BaseIterator::value_type::second_type >
 | 
|---|
 | 56 | {
 | 
|---|
 | 57 | public:
 | 
|---|
 | 58 |     typedef const typename BaseIterator::value_type::second_type& const_reference;
 | 
|---|
 | 59 | 
 | 
|---|
 | 60 |     MapValueConstIterator() {}
 | 
|---|
 | 61 | 
 | 
|---|
 | 62 |     explicit MapValueConstIterator(BaseIterator base)
 | 
|---|
 | 63 |     :   MapValueConstIterator::iterator_adaptor_(base) {}
 | 
|---|
 | 64 | 
 | 
|---|
 | 65 |  private:
 | 
|---|
 | 66 |     friend class boost::iterator_core_access;
 | 
|---|
 | 67 |     const_reference dereference() const
 | 
|---|
 | 68 |         {return this->base_reference()->second;}
 | 
|---|
 | 69 | };
 | 
|---|
 | 70 | 
 | 
|---|
| [d1e0c0] | 71 | /** This class wraps an iterator and implements a dereferencer (operator*) that
 | 
|---|
 | 72 |  *  always returns the key
 | 
|---|
 | 73 |  */
 | 
|---|
 | 74 | template <class BaseIterator>
 | 
|---|
 | 75 | class MapKeyIterator :
 | 
|---|
 | 76 |     public boost::iterator_adaptor<
 | 
|---|
 | 77 |     MapKeyIterator<BaseIterator>,
 | 
|---|
 | 78 |         BaseIterator,
 | 
|---|
 | 79 |         typename BaseIterator::value_type::first_type >
 | 
|---|
 | 80 | {
 | 
|---|
 | 81 | public:
 | 
|---|
 | 82 |     typedef typename BaseIterator::value_type::first_type& reference;
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 |     MapKeyIterator() {}
 | 
|---|
 | 85 | 
 | 
|---|
 | 86 |     explicit MapKeyIterator(BaseIterator base)
 | 
|---|
 | 87 |     :   MapKeyIterator::iterator_adaptor_(base) {}
 | 
|---|
 | 88 | 
 | 
|---|
 | 89 |  private:
 | 
|---|
 | 90 |     friend class boost::iterator_core_access;
 | 
|---|
 | 91 |     reference dereference() const
 | 
|---|
 | 92 |         {return this->base_reference()->first;}
 | 
|---|
 | 93 | };
 | 
|---|
 | 94 | 
 | 
|---|
| [4fb16c] | 95 | /** This class wraps an iterator and implements a dereferencer (operator*) that
 | 
|---|
 | 96 |  *  always returns the key
 | 
|---|
 | 97 |  */
 | 
|---|
 | 98 | template <class BaseIterator>
 | 
|---|
 | 99 | class MapKeyConstIterator :
 | 
|---|
 | 100 |     public boost::iterator_adaptor<
 | 
|---|
 | 101 |     MapKeyConstIterator<BaseIterator>,
 | 
|---|
 | 102 |         BaseIterator,
 | 
|---|
 | 103 |         const typename BaseIterator::value_type::first_type >
 | 
|---|
 | 104 | {
 | 
|---|
 | 105 | public:
 | 
|---|
 | 106 |     typedef const typename BaseIterator::value_type::first_type& const_reference;
 | 
|---|
 | 107 | 
 | 
|---|
 | 108 |     MapKeyConstIterator() {}
 | 
|---|
 | 109 | 
 | 
|---|
 | 110 |     explicit MapKeyConstIterator(BaseIterator base)
 | 
|---|
 | 111 |     :   MapKeyConstIterator::iterator_adaptor_(base) {}
 | 
|---|
 | 112 | 
 | 
|---|
 | 113 |  private:
 | 
|---|
 | 114 |     friend class boost::iterator_core_access;
 | 
|---|
 | 115 |     const_reference dereference() const
 | 
|---|
 | 116 |         {return this->base_reference()->first;}
 | 
|---|
 | 117 | };
 | 
|---|
 | 118 | 
 | 
|---|
| [d1e0c0] | 119 | #endif /* ITERATORADAPTORS_HPP_ */
 | 
|---|