Iterator.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <boost/range/mutable_iterator.hpp>
4 #include <boost/range/const_iterator.hpp>
5 #include <boost/iterator/iterator_facade.hpp>
6 
8 
9 namespace boca
10 {
11 
22 template <template <typename> class Container_, typename Value_>
23 class Iterator : public boost::iterator_facade <
24  Iterator<Container_, Value_>,
25  Container_<Value_>,
26  std::bidirectional_iterator_tag,
27  Value_ &
28  >
29 {
30  using Dimension = typename Container_<Value_>::Dimension;
31 public:
33  container_(0),
34  position_(0)
35  {}
36 
37  Iterator(Container_<Value_> *container, Dimension position) :
38  container_(container),
39  position_(position)
40  {}
41 
42  template<template <typename> class Container_2_>
44  container_(iterator.container_),
45  position_(iterator.position_)
46  {}
47 
48 private:
49 
51  template <template <typename> class , typename > friend class ConstIterator;
52 
53  Value_ &dereference() const
54  {
55  return (*container_)[*position_];
56  }
57 
58  template<template <typename> class Container_2_>
59  bool equal(Iterator<Container_2_, Value_> const &iterator) const
60  {
61  return this->position_ == iterator.position_ && this->container_ == iterator.container_;
62  }
63 
64  void increment()
65  {
66  ++position_;
67  }
68 
69  void decrement()
70  {
71  --position_;
72  }
73 
74  Container_<Value_> *container_;
75 
76  EnumIterator<Dimension> position_;
77 };
78 
82 template <template <typename> class Container_,
83  typename Value_>
84 class ConstIterator : public boost::iterator_facade <
85  ConstIterator<Container_, Value_>,
86  Container_<Value_> const,
87  std::bidirectional_iterator_tag,
88  Value_ const&
89  >
90 {
91  using Dimension = typename Container_<Value_>::Dimension;
92 public:
94  container_(0),
95  position_(0)
96  {}
97 
98  ConstIterator(Container_<Value_> const* container, Dimension position) :
99  container_(container),
100  position_(position)
101  {}
102 
103  template<template <typename> class Container_2_>
105  container_(iterator.container_),
106  position_(iterator.position_)
107  {}
108 
109 private:
110 
111  friend class boost::iterator_core_access;
112  template <template <typename> class , typename > friend class Iterator;
113 
114  Value_ const& dereference() const
115  {
116  return (*container_)[*position_];
117  }
118 
119  template<template <typename> class Container_2_>
120  bool equal(ConstIterator<Container_2_, Value_> const &iterator) const
121  {
122  return this->position_ == iterator.position_ && this->container_ == iterator.container_;
123  }
124 
125  void increment()
126  {
127  ++position_;
128  }
129 
130  void decrement()
131  {
132  --position_;
133  }
134 
135  Container_<Value_> const* container_;
136 
137  EnumIterator<Dimension> position_;
138 };
139 
143 template <template <typename> class Container_, template <typename> class SubContainer_, typename Value_>
144 class SubIterator : public boost::iterator_facade <
145  SubIterator<Container_, SubContainer_, Value_>,
146  Container_<Value_>,
147  std::bidirectional_iterator_tag,
148  SubContainer_<Value_> &
149  >
150 {
151  using Dimension = typename Container_<Value_>::Dimension;
152 public:
154  container_(0),
155  position_(0)
156  {}
157 
158  SubIterator(Container_<Value_> *container, Dimension position) :
159  container_(container),
160  position_(position)
161  {}
162 
163  template<template <typename> class Container_2_>
165  container_(iterator.container_),
166  position_(iterator.position_)
167  {}
168 
169 private:
170 
171  friend class boost::iterator_core_access;
172  template <template <typename> class, template <typename> class, typename > friend class ConstSubIterator;
173 
174  SubContainer_<Value_> &dereference() const
175  {
176  return (*container_)[*position_];
177  }
178 
179  template<template <typename> class Container_2_>
180  bool equal(SubIterator<Container_2_,SubContainer_, Value_> const &iterator) const
181  {
182  return this->position_ == iterator.position_ && this->container_ == iterator.container_;
183  }
184 
185  void increment()
186  {
187  ++position_;
188  }
189 
190  void decrement()
191  {
192  --position_;
193  }
194 
195  Container_<Value_> *container_;
196 
197  EnumIterator<Dimension> position_;
198 };
199 
203 template <template <typename> class Container_, template <typename> class SubContainer_, typename Value_>
204 class ConstSubIterator : public boost::iterator_facade <
205  ConstSubIterator<Container_, SubContainer_, Value_>,
206  Container_<Value_> const,
207  std::bidirectional_iterator_tag,
208  SubContainer_<Value_> const&
209  >
210 {
211  using Dimension = typename Container_<Value_>::Dimension;
212 public:
214  container_(0),
215  position_(0)
216  {}
217 
218  ConstSubIterator(Container_<Value_> const* container, Dimension position) :
219  container_(container),
220  position_(position)
221  {}
222 
223  template<template <typename> class Container_2_>
225  container_(iterator.container_),
226  position_(iterator.position_)
227  {}
228 
229 private:
230 
231  friend class boost::iterator_core_access;
232  template <template <typename> class, template <typename> class, typename > friend class SubIterator;
233 
234  SubContainer_<Value_> const& dereference() const
235  {
236  return (*container_)[*position_];
237  }
238 
239  template<template <typename> class Container_2_>
240  bool equal(ConstSubIterator<Container_2_, SubContainer_, Value_> const &iterator) const
241  {
242  return this->position_ == iterator.position_ && this->container_ == iterator.container_;
243  }
244 
245  void increment()
246  {
247  ++position_;
248  }
249 
250  void decrement()
251  {
252  --position_;
253  }
254 
255  Container_<Value_> const* container_;
256 
257  EnumIterator<Dimension> position_;
258 };
259 
260 }
261 
262 /*
263  * @}
264  */
ConstIterator(Container_< Value_ > const *container, Dimension position)
Definition: Iterator.hh:98
ConstIterator()
Definition: Iterator.hh:93
Const sub-iterator.
Definition: Iterator.hh:204
ConstSubIterator()
Definition: Iterator.hh:213
Iterator(Iterator< Container_2_, Value_ > const &iterator)
Definition: Iterator.hh:43
const iterator
Definition: Iterator.hh:84
ConstIterator(ConstIterator< Container_2_, Value_ > const &iterator)
Definition: Iterator.hh:104
SubIterator()
Definition: Iterator.hh:153
SubIterator(Container_< Value_ > *container, Dimension position)
Definition: Iterator.hh:158
ConstSubIterator(Container_< Value_ > const *container, Dimension position)
Definition: Iterator.hh:218
friend class boost::iterator_core_access
Definition: Iterator.hh:50
Iterator(Container_< Value_ > *container, Dimension position)
Definition: Iterator.hh:37
Iterator()
Definition: Iterator.hh:32
SubIterator(SubIterator< Container_2_, SubContainer_, Value_ > const &iterator)
Definition: Iterator.hh:164
Boosted Collider Analysis.
Definition: Analysis.hh:15
Iterator
Definition: Iterator.hh:144
Iterator
Definition: Iterator.hh:23
ConstSubIterator(ConstSubIterator< Container_2_, SubContainer_, Value_ > const &iterator)
Definition: Iterator.hh:224