$search
00001 #ifndef UTILMM_ITERATOR_SEQUENCE_HPP 00002 #define UTILMM_ITERATOR_SEQUENCE_HPP 00003 00004 #include <boost/iterator/iterator_facade.hpp> 00005 #include <boost/iterator/iterator_traits.hpp> 00006 00007 namespace utilmm { 00013 template<typename It1, typename It2> 00014 class iterator_sequence : 00015 public boost::iterator_facade< 00016 iterator_sequence<It1, It2>, 00017 typename It1::value_type, 00018 typename boost::iterator_traversal<It1>::type, 00019 typename It1::reference > 00020 { 00021 typedef iterator_sequence<It1, It2> Self; 00022 00023 public: 00036 iterator_sequence( 00037 It1 first, It1 first_end, 00038 It2 second_begin, It2 second) 00039 : m_first(first), m_first_end(first_end) 00040 , m_second_begin(second_begin), m_second(second) {} 00041 iterator_sequence() {} 00042 00043 private: 00044 friend class boost::iterator_core_access; 00045 00046 It1 m_first, m_first_end; 00047 It2 m_second_begin, m_second; 00048 00049 typename Self::reference dereference() const 00050 { 00051 if (m_first == m_first_end) 00052 return *m_second; 00053 else 00054 return *m_first; 00055 } 00056 bool equal(Self x) const 00057 { return (x.m_first == m_first && x.m_second == m_second); } 00058 void increment() 00059 { 00060 if (m_first == m_first_end) 00061 ++m_second; 00062 else 00063 ++m_first; 00064 } 00065 void decrement() 00066 { 00067 if (m_second == m_second_begin) 00068 --m_first; 00069 else 00070 --m_second; 00071 } 00072 void advance(typename Self::difference_type i) 00073 { 00074 if (i > 0) 00075 { 00076 typename Self::difference_type remains = m_first_end - m_first; 00077 if (remains > i) 00078 m_first += i; 00079 else 00080 { 00081 m_first = m_first_end; 00082 m_second += i - remains; 00083 } 00084 } 00085 else 00086 { 00087 typename Self::difference_type remains = m_second_begin - m_second; 00088 if (remains < i) 00089 m_second += i; 00090 else 00091 { 00092 m_second = m_second_begin; 00093 m_first += i - remains; 00094 } 00095 } 00096 } 00097 00098 typename Self::difference_type distance_to(Self x) const 00099 { return (x.m_first - m_first) + (x.m_second - m_second); } 00100 }; 00101 } 00102 #endif