9 #ifndef stk_util_util_PairIter_hpp 10 #define stk_util_util_PairIter_hpp 18 template<
class IterType ,
20 typename std::iterator_traits< IterType >::iterator_category >
34 template<
class IterType >
35 class PairIter< IterType ,
std::random_access_iterator_tag >
36 :
public std::pair< IterType , IterType >
39 typedef std::pair< IterType , IterType > Pair ;
41 typedef std::iterator_traits< IterType > Traits ;
46 typedef IterType iterator ;
47 typedef typename Traits::value_type value_type ;
48 typedef typename Traits::pointer pointer ;
49 typedef typename Traits::reference reference ;
50 typedef typename Traits::difference_type difference_type ;
51 typedef size_t size_type ;
60 PairIter() : Pair() { Pair::second = Pair::first ; }
62 PairIter(
const Self & rhs ) : Pair( rhs ) {}
64 PairIter(
const Pair & rhs ) : Pair( rhs ) {}
66 Self & operator = (
const Self & rhs )
67 { Pair::first = rhs.first ; Pair::second = rhs.second ;
return *this ; }
69 Self & operator = (
const Pair & rhs )
70 { Pair::first = rhs.first ; Pair::second = rhs.second ;
return *this ; }
74 bool operator == (
const Self & rhs )
const 75 {
return Pair::first == rhs.first && Pair::second == rhs.second ; }
77 bool operator != (
const Self & rhs )
const 78 {
return Pair::first != rhs.first || Pair::second != rhs.second ; }
80 bool operator == (
const Pair & rhs )
const 81 {
return Pair::first == rhs.first && Pair::second == rhs.second ; }
83 bool operator != (
const Pair & rhs )
const 84 {
return Pair::first != rhs.first || Pair::second != rhs.second ; }
88 Self & operator ++ () { ++ Pair::first ;
return *this ; }
90 Self operator ++ (
int) { Self tmp(*
this); ++ Pair::first ;
return tmp ; }
92 reference operator * ()
const {
return * Pair::first ; }
93 pointer operator -> ()
const {
return & * Pair::first ; }
98 reference front()
const {
return * Pair::first ; }
99 reference back()
const {
return Pair::second[-1] ; }
101 iterator begin()
const {
return Pair::first ; }
102 iterator end()
const {
return Pair::second ; }
104 template<
class Iterator>
105 PairIter( Iterator i , Iterator e ) : Pair(i,e) {}
107 template<
class Container>
109 PairIter(
const Container & c ) : Pair( c.begin() , c.end() ) {}
111 template<
class Container>
113 PairIter( Container & c ) : Pair( c.begin() , c.end() ) {}
115 bool empty ()
const {
return ! ( Pair::first < Pair::second ) ; }
117 reference operator [] (
size_t n )
const {
return Pair::first[n] ; }
121 const difference_type d = std::distance( Pair::first , Pair::second );
122 return d < 0 ? 0 : (size_t) d ;