| 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 | 
 | 
|---|
| 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 | 
 | 
|---|
| 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 | 
 | 
|---|
| 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 | 
 | 
|---|
| 119 | #endif /* ITERATORADAPTORS_HPP_ */
 | 
|---|