1 #ifndef UTILMM_ITERATOR_SEQUENCE_HPP 2 #define UTILMM_ITERATOR_SEQUENCE_HPP 4 #include <boost/iterator/iterator_facade.hpp> 5 #include <boost/iterator/iterator_traits.hpp> 13 template<
typename It1,
typename It2>
15 public boost::iterator_facade<
16 iterator_sequence<It1, It2>,
17 typename It1::value_type,
18 typename boost::iterator_traversal<It1>::type,
19 typename It1::reference >
37 It1 first, It1 first_end,
38 It2 second_begin, It2 second)
39 : m_first(first), m_first_end(first_end)
40 , m_second_begin(second_begin), m_second(second) {}
46 It1 m_first, m_first_end;
47 It2 m_second_begin, m_second;
49 typename Self::reference dereference()
const 51 if (m_first == m_first_end)
56 bool equal(Self x)
const 57 {
return (x.m_first == m_first && x.m_second == m_second); }
60 if (m_first == m_first_end)
67 if (m_second == m_second_begin)
72 void advance(
typename Self::difference_type i)
76 typename Self::difference_type remains = m_first_end - m_first;
81 m_first = m_first_end;
82 m_second += i - remains;
87 typename Self::difference_type remains = m_second_begin - m_second;
92 m_second = m_second_begin;
93 m_first += i - remains;
98 typename Self::difference_type distance_to(Self x)
const 99 {
return (x.m_first - m_first) + (x.m_second - m_second); }
iterator_sequence(It1 first, It1 first_end, It2 second_begin, It2 second)
Definition: iterator_sequence.hh:36
friend class boost::iterator_core_access
Definition: iterator_sequence.hh:44
Definition: auto_flag.hh:6
iterator_sequence()
Definition: iterator_sequence.hh:41
Definition: iterator_sequence.hh:14