1 // file : cutl/container/pointer-iterator.hxx 2 // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC 3 // license : MIT; see accompanying LICENSE file 4 5 #ifndef CUTL_CONTAINER_POINTER_ITERATOR_HXX 6 #define CUTL_CONTAINER_POINTER_ITERATOR_HXX 7 8 #include <iterator> // std::iterator_traits 9 10 #include <cutl/meta/remove-p.hxx> 11 12 namespace cutl 13 { 14 namespace container 15 { 16 template <typename I> 17 class pointer_iterator 18 { 19 public: 20 typedef 21 typename meta::remove_p<typename std::iterator_traits<I>::value_type>::r 22 value_type; 23 24 typedef 25 typename std::iterator_traits<I>::iterator_category 26 iterator_category; 27 28 typedef 29 typename std::iterator_traits<I>::difference_type 30 difference_type; 31 32 typedef value_type& reference; 33 typedef value_type* pointer; 34 typedef I base_iterator; 35 36 public: pointer_iterator()37 pointer_iterator () 38 : i_ () // I can be of a pointer type. 39 { 40 } 41 pointer_iterator(I const & i)42 pointer_iterator (I const& i) 43 : i_ (i) 44 { 45 } 46 47 public: 48 reference operator *() const49 operator* () const 50 { 51 return **i_; 52 } 53 54 pointer operator ->() const55 operator-> () const 56 { 57 return *i_; 58 } 59 60 I const& base() const61 base () const 62 { 63 return i_; 64 } 65 66 public: 67 // Forward iterator requirements. 68 // 69 pointer_iterator& operator ++()70 operator++ () 71 { 72 ++i_; 73 return *this; 74 } 75 76 pointer_iterator operator ++(int)77 operator++ (int) 78 { 79 pointer_iterator r (*this); 80 ++i_; 81 return r; 82 } 83 84 pointer_iterator& operator --()85 operator-- () 86 { 87 --i_; 88 return *this; 89 } 90 91 pointer_iterator operator --(int)92 operator-- (int) 93 { 94 pointer_iterator r (*this); 95 --i_; 96 return r; 97 } 98 99 private: 100 I i_; 101 }; 102 103 template <typename I> 104 inline bool operator ==(pointer_iterator<I> const & a,pointer_iterator<I> const & b)105 operator== (pointer_iterator<I> const& a, pointer_iterator<I> const& b) 106 { 107 return a.base () == b.base (); 108 } 109 110 template <typename I> 111 inline bool operator !=(pointer_iterator<I> const & a,pointer_iterator<I> const & b)112 operator!= (pointer_iterator<I> const& a, pointer_iterator<I> const& b) 113 { 114 return a.base () != b.base (); 115 } 116 117 template <typename I> 118 inline typename pointer_iterator<I>::difference_type operator -(pointer_iterator<I> const & a,pointer_iterator<I> const & b)119 operator- (pointer_iterator<I> const& a, pointer_iterator<I> const& b) 120 { 121 return a.base () - b.base (); 122 } 123 } 124 } 125 126 #endif // CUTL_CONTAINER_POINTER_ITERATOR_HXX 127