Changeset 1041
- Timestamp:
- Feb 6, 2008, 6:36:54 PM (16 years ago)
- Location:
- trunk/yat/utility
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/yat/utility/StrideIterator.h
r1038 r1041 25 25 */ 26 26 27 #include "iterator_traits.h" 27 28 #include "yat_assert.h" 28 29 … … 33 34 namespace utility { 34 35 36 // forward declaration 37 template<typename Iter> 38 class StrideIterator; 39 35 40 /** 36 @brief Stride Iterator 37 38 Works as a pointer except that all arithmetic is using the stride value 41 StrideIterator is weighted if underlying iterator is weighted. 42 */ 43 template <typename Iter> 44 struct weighted_iterator_traits<StrideIterator<Iter> > { 45 typedef typename weighted_iterator_traits<Iter>::type type; 46 }; 47 48 /** 49 @brief Adaptor using a stride on underlying iterator 50 51 Works as underlying iterator except that all arithmetic uses the 52 stride, so e.g., ++StrideIterator returns underlying 53 _iterator+stride 54 39 55 */ 40 template<typename T>56 template<typename Iter> 41 57 class StrideIterator 42 : public std::iterator<std::random_access_iterator_tag, T> 58 : public std::iterator<typename std::iterator_traits<Iter>::iterator_category, 59 typename std::iterator_traits<Iter>::value_type, 60 typename std::iterator_traits<Iter>::difference_type, 61 typename std::iterator_traits<Iter>::pointer, 62 typename std::iterator_traits<Iter>::reference> 43 63 { 44 64 public: 45 typedef typename std::iterator_traits<T*>::difference_type difference_type; 46 typedef typename std::iterator_traits<T*>::reference reference; 47 typedef typename std::iterator_traits<T*>::pointer pointer; 65 typedef typename std::iterator_traits<Iter>::difference_type difference_type; 66 typedef typename std::iterator_traits<Iter>::reference reference; 67 typedef typename std::iterator_traits<Iter>::pointer pointer; 68 typedef typename yat::utility::weighted_iterator_traits<Iter>::type w_type; 48 69 49 70 /** 50 71 \brief Constructor 51 72 */ 52 explicit StrideIterator(pointer p, difference_type stride=1) 53 : pointer_(p), stride_(stride) {} 54 55 operator StrideIterator<const T>() 56 { return StrideIterator<const T>(pointer_, stride_); } 73 explicit StrideIterator(Iter p, difference_type stride=1) 74 : iterator_(p), stride_(stride) {} 75 76 77 /** 78 */ 79 // Peter, this is ugly hack to provide iteartor to const_iterator 80 // for our gsl_iterators - solution? use Boost:iterator_adaptor 81 operator StrideIterator<const double*>() 82 { return StrideIterator<const double*>(base(), stride_); } 83 84 /** 85 \return underlying iterator 86 */ 87 inline Iter base(void) const { return iterator_; } 88 89 /** 90 \return stride 91 */ 92 inline size_t stride(void) const { return stride_; } 57 93 58 94 /** … … 60 96 */ 61 97 reference operator*(void) const 62 { return * pointer_; }98 { return *iterator_; } 63 99 64 100 /** … … 71 107 reference operator[](difference_type n) const 72 108 { 73 return pointer_[stride_*n];109 return iterator_[stride_*n]; 74 110 } 75 111 … … 79 115 \return reference to *this 80 116 */ 81 StrideIterator& operator++(void) { pointer_+=stride_; return *this; }117 StrideIterator& operator++(void) { iterator_+=stride_; return *this; } 82 118 83 119 /** … … 87 123 */ 88 124 StrideIterator operator++(int) 89 { StrideIterator tmp(*this); pointer_+=stride_; return tmp;}125 { StrideIterator tmp(*this); iterator_+=stride_; return tmp;} 90 126 91 127 /** … … 94 130 \return reference to resulting iterator 95 131 */ 96 StrideIterator& operator+=(int n) { pointer_+=stride_*n; return *this; }132 StrideIterator& operator+=(int n) { iterator_+=stride_*n; return *this; } 97 133 98 134 /** … … 102 138 */ 103 139 StrideIterator operator--(int) 104 { StrideIterator tmp(*this); pointer_-=stride_; return tmp;}140 { StrideIterator tmp(*this); iterator_-=stride_; return tmp;} 105 141 106 142 /** … … 109 145 \return reference to resulting iterator 110 146 */ 111 StrideIterator& operator--(void) { pointer_-=stride_; return *this; }147 StrideIterator& operator--(void) { iterator_-=stride_; return *this; } 112 148 113 149 /** … … 116 152 \return reference to resulting iterator 117 153 */ 118 StrideIterator& operator-=(int n) { pointer_-=n*stride_; return *this; }154 StrideIterator& operator-=(int n) { iterator_-=n*stride_; return *this; } 119 155 120 156 /** … … 145 181 yat_assert<std::runtime_error>(lhs.stride_==rhs.stride_, 146 182 "StrideIterator::operator- different stride in lhs and rhs."); 147 return static_cast<difference_type>( (lhs. pointer_-rhs.pointer_)/183 return static_cast<difference_type>( (lhs.iterator_-rhs.iterator_)/ 148 184 lhs.stride_); 149 185 } … … 156 192 */ 157 193 friend bool operator==(const StrideIterator& lhs, const StrideIterator& rhs) 158 { return lhs. pointer_==rhs.pointer_; }194 { return lhs.iterator_==rhs.iterator_; } 159 195 160 196 /** … … 164 200 */ 165 201 friend bool operator!=(const StrideIterator& lhs, const StrideIterator& rhs) 166 { return !(lhs==rhs); }202 { return lhs.iterator_!=rhs.iterator_; } 167 203 168 204 /** … … 170 206 */ 171 207 friend bool operator<(const StrideIterator& lhs, const StrideIterator& rhs) 172 { return lhs. pointer_<rhs.pointer_; }208 { return lhs.iterator_<rhs.iterator_; } 173 209 174 210 /** … … 176 212 */ 177 213 friend bool operator<=(const StrideIterator& lhs, const StrideIterator& rhs) 178 { return !(rhs<lhs); }214 { return lhs.iterator_<=rhs.iterator_; } 179 215 180 216 /** … … 182 218 */ 183 219 friend bool operator>(const StrideIterator& lhs, const StrideIterator& rhs) 184 { return rhs<lhs; }220 { return lhs.iterator_>rhs.iterator_; } 185 221 186 222 /** … … 188 224 */ 189 225 friend bool operator>=(const StrideIterator& lhs, const StrideIterator& rhs) 190 { return !(lhs<rhs); }226 { return lhs.iterator_>=rhs.iterator_; } 191 227 192 228 private: 193 T* pointer_;229 Iter iterator_; 194 230 size_t stride_; 195 231 … … 198 234 //StrideIterator& operator=(const StrideIterator&); 199 235 }; 236 237 238 239 240 200 241 }}} // of namespace utility, yat, and theplu 201 242 -
trunk/yat/utility/VectorBase.h
r1038 r1041 90 90 public: 91 91 /// \brief VectorBase::const_iterator 92 typedef StrideIterator<const double > const_iterator;92 typedef StrideIterator<const double*> const_iterator; 93 93 94 94 /** -
trunk/yat/utility/VectorMutable.h
r1038 r1041 93 93 \brief mutable iterator 94 94 */ 95 typedef StrideIterator<double > iterator;95 typedef StrideIterator<double*> iterator; 96 96 97 97 /** -
trunk/yat/utility/iterator_traits.h
r1000 r1041 25 25 */ 26 26 27 #include " yat/utility/IteratorWeighted.h"27 #include "IteratorWeighted.h" 28 28 29 29 namespace theplu { … … 63 63 typedef weighted_type type; 64 64 }; 65 66 67 65 68 66 /**
Note: See TracChangeset
for help on using the changeset viewer.