8#ifndef ADOBE_ITERATOR_HPP
9#define ADOBE_ITERATOR_HPP
23#include <boost/range.hpp>
25#include <boost/iterator/iterator_facade.hpp>
26#include <boost/iterator/iterator_traits.hpp>
31#include <adobe/implementation/swap.hpp>
128 :
public boost::iterator_facade<
129 segmented_iterator<I>,
130 typename boost::range_value<typename boost::iterator_value<I>::type>::type,
131 std::bidirectional_iterator_tag,
132 typename boost::iterator_reference<
133 typename boost::range_iterator<typename boost::iterator_value<I>::type>::type>::type,
134 typename boost::iterator_difference<typename boost::range_iterator<
135 typename boost::iterator_value<I>::type>::type>::type> {
139 while (bucket_m != end_m && boost::empty(*bucket_m)) {
142 if (bucket_m != end_m)
143 current_m = boost::begin(*bucket_m);
147 : bucket_m(x.bucket_m), end_m(x.end_m), current_m(x.current_m) {}
155 swap(x.bucket_m, y.bucket_m);
156 swap(x.end_m, y.end_m);
157 swap(x.curent_m, y.curent_m);
161 typedef typename boost::iterator_reference<
162 typename boost::range_iterator<typename boost::iterator_value<I>::type>
::type>
::type
164 typedef I top_iterator_t;
165 typedef typename boost::range_iterator<typename boost::iterator_value<I>::type>
::type
168 top_iterator_t bucket_m;
169 top_iterator_t end_m;
170 bottom_iterator_t current_m;
176 reference_t dereference()
const {
return *current_m; }
184 return end_m == x.end_m && bucket_m == x.bucket_m &&
185 (bucket_m == end_m || current_m == x.current_m);
191 while (current_m == boost::end(*bucket_m)) {
193 if (bucket_m == end_m)
195 current_m = boost::begin(*bucket_m);
199 while (bucket_m == end_m || current_m == boost::begin(*bucket_m)) {
201 current_m = boost::end(*bucket_m);
210inline boost::iterator_range<segmented_iterator<typename boost::range_iterator<R>::type>>
214 return boost::make_iterator_range(iterator(boost::begin(r), boost::end(r)),
215 iterator(boost::end(r), boost::end(r)));
223 return iterator(boost::begin(r), boost::end(r));
237 typename I = std::size_t,
238 typename D = std::ptrdiff_t
243class index_iterator :
public boost::iterator_facade<index_iterator<F, T, R, I, D>, T,
244 std::random_access_iterator_tag, R, D> {
258 swap(x.dereference_m, y.dereference_m);
259 swap(x.index_m, y.index_m);
262 I
base()
const {
return index_m; }
272 R dereference()
const {
return dereference_m(this->index_m); }
277 return index_m == x.index_m;
280 void increment() { ++index_m; }
281 void decrement() { --index_m; }
282 void advance(D x) { index_m += x; }
296 return D(x.index_m) - D(index_m);
313template <
typename DERIVED,
319 :
public boost::iterator_adaptor<DERIVED, IT, boost::use_default, boost::use_default,
320 boost::use_default, typename S_FN::difference_type> {
322 typedef boost::iterator_adaptor<DERIVED, IT, boost::use_default, boost::use_default,
323 boost::use_default,
typename S_FN::difference_type>
327 typedef typename std::iterator_traits<IT>::reference
reference;
341 void increment() {
_step_fn.advance(this->base_reference(), 1); }
342 void decrement() {
_step_fn.advance(this->base_reference(), -1); }
345 return _step_fn.difference(this->base_reference(), it.base_reference());
355template <
typename D,
typename IT,
typename S_FN>
358 return p1.
step() > 0 ? p1.base() > p2.base() : p1.base() < p2.base();
362template <
typename D,
typename IT,
typename S_FN>
365 return p1.
step() > 0 ? p1.base() < p2.base() : p1.base() > p2.base();
368template <
typename D,
typename IT,
typename S_FN>
371 return p1.
step() > 0 ? p1.base() >= p2.base() : p1.base() <= p2.base();
375template <
typename D,
typename IT,
typename S_FN>
378 return p1.
step() > 0 ? p1.base() <= p2.base() : p1.base() >= p2.base();
382template <
typename D,
typename IT,
typename S_FN>
385 return p1.base() == p2.base();
389template <
typename D,
typename IT,
typename S_FN>
392 return p1.base() != p2.base();
411 template <
typename T>
std::output_iterator_tag iterator_category
counting_output_iterator value_type
counting_output_iterator & reference
counting_output_iterator operator++(int)
counting_output_iterator()
counting_output_iterator(const counting_output_iterator &x)
reference operator=(const T &)
bool operator==(counting_output_iterator const &rhs) const
An iterator over elements which are the result of applying a function to an index.
friend void swap(index_iterator &x, index_iterator &y)
index_iterator(const index_iterator &x)
index_iterator & operator=(const index_iterator &x)
friend class boost::iterator_core_access
segmented_iterator(const segmented_iterator &x)
friend class boost::iterator_core_access
friend void swap(segmented_iterator &x, segmented_iterator &y)
segmented_iterator(I first, I last)
segmented_iterator & operator=(segmented_iterator x)
std::iterator_traits< IT >::reference reference
step_iterator_adaptor(const IT &it, S_FN step_fn=S_FN())
boost::iterator_adaptor< DERIVED, IT, boost::use_default, boost::use_default, boost::use_default, typename S_FN::difference_type > parent_type
difference_type step() const
S_FN::difference_type difference_type
friend class boost::iterator_core_access
std::iterator_traits< IT >::difference_type base_difference_type
segmented_iterator< typename boost::range_iterator< R >::type > make_segmented_iterator(R &r)
bool operator<(const step_iterator_adaptor< D, IT, S_FN > &p1, const step_iterator_adaptor< D, IT, S_FN > &p2)
boost::iterator_range< segmented_iterator< typename boost::range_iterator< R >::type > > make_segmented_range(R &r)
bool operator>=(const step_iterator_adaptor< D, IT, S_FN > &p1, const step_iterator_adaptor< D, IT, S_FN > &p2)
bool operator>(const step_iterator_adaptor< D, IT, S_FN > &p1, const step_iterator_adaptor< D, IT, S_FN > &p2)
bool operator<=(const step_iterator_adaptor< D, IT, S_FN > &p1, const step_iterator_adaptor< D, IT, S_FN > &p2)
bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred)
bool operator==(const any_regular_t &x, const any_regular_t &y)
bool operator!=(const forest< T > &x, const forest< T > &y)
A stub iterator that models OutputIterator and outputs nothing.
std::output_iterator_tag iterator_category
null_output_iterator_t & operator++(int)
null_output_iterator_t & operator++()
null_output_iterator_t value_type
null_output_iterator_t & operator=(const T &)
std::ptrdiff_t difference_type