source: ThirdParty/CodePatterns/src/CodePatterns/IteratorAdaptors.hpp

Candidate_v1.6.1
Last change on this file was 41e8e2, checked in by Frederik Heber <heber@…>, 9 years ago

Merge commit '084729c5923f0123e695fbe2548b393288c1f13d' as 'ThirdParty/CodePatterns'

  • Property mode set to 100644
File size: 3.3 KB
Line 
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 */
26template <class BaseIterator>
27class MapValueIterator :
28 public boost::iterator_adaptor<
29 MapValueIterator<BaseIterator>,
30 BaseIterator,
31 typename BaseIterator::value_type::second_type >
32{
33public:
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 */
50template <class BaseIterator>
51class MapValueConstIterator :
52 public boost::iterator_adaptor<
53 MapValueConstIterator<BaseIterator>,
54 BaseIterator,
55 const typename BaseIterator::value_type::second_type >
56{
57public:
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 */
74template <class BaseIterator>
75class MapKeyIterator :
76 public boost::iterator_adaptor<
77 MapKeyIterator<BaseIterator>,
78 BaseIterator,
79 typename BaseIterator::value_type::first_type >
80{
81public:
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 */
98template <class BaseIterator>
99class MapKeyConstIterator :
100 public boost::iterator_adaptor<
101 MapKeyConstIterator<BaseIterator>,
102 BaseIterator,
103 const typename BaseIterator::value_type::first_type >
104{
105public:
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_ */
Note: See TracBrowser for help on using the repository browser.