| 196 | /// be modified), whereas an array_view_strided<const T> is not mutable. |
| 197 | template <typename T> |
| 198 | class array_view_strided { |
| 199 | public: |
| 200 | typedef T value_type; |
| 201 | typedef strided_ptr<T> pointer; |
| 202 | typedef strided_ptr<const T> const_pointer; |
| 203 | typedef T& reference; |
| 204 | typedef const T& const_reference; |
| 205 | typedef const_pointer const_iterator; |
| 206 | typedef pointer iterator; |
| 207 | typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
| 208 | typedef std::reverse_iterator<iterator> reverse_iterator; |
| 209 | typedef size_t size_type; |
| 210 | typedef ptrdiff_t difference_type; |
| 211 | typedef ptrdiff_t stride_t; |
| 212 | static const size_type npos = ~size_type(0); |
| 213 | static const stride_t AutoStride = ~stride_t(0); |
| 214 | |
| 215 | /// Default ctr -- points to nothing |
| 216 | array_view_strided () : m_data(NULL), m_len(0), m_stride(0) {} |
| 217 | |
| 218 | /// Copy constructor |
| 219 | array_view_strided (const array_view_strided ©) |
| 220 | : m_data(copy.data()), m_len(copy.size()), m_stride(copy.stride()) {} |
| 221 | |
| 222 | /// Construct from T* and length. |
| 223 | array_view_strided (T *data, size_t len) { init(data,len); } |
| 224 | |
| 225 | /// Construct from T*, length, and stride (in bytes). |
| 226 | array_view_strided (T *data, size_t len, ptrdiff_t stride) { |
| 227 | init(data,len,stride); |
| 228 | } |
| 229 | |
| 230 | /// Construct from a single T&. |
| 231 | array_view_strided (T &data) { init (&data, 1); } |
| 232 | |
| 233 | /// Construct from a range (begin and end pointers). |
| 234 | array_view_strided (T *begin, T *end) { init (begin, end-begin); } |
| 235 | |
| 236 | /// Construct from a fixed-length C array. Template magic automatically |
| 237 | /// finds the length from the declared type of the array. |
| 238 | template<size_t N> |
| 239 | array_view_strided (T (&data)[N]) { init(data,N); } |
| 240 | |
| 241 | /// Construct from std::vector<T>. |
| 242 | array_view_strided (std::vector<T> &v) |
| 243 | : m_data(v.size() ? &v[0] : NULL), m_len(v.size()), m_stride(sizeof(T)) {} |
| 244 | |
| 245 | // assignments |
| 246 | array_view_strided& operator= (const array_view_strided ©) { |
| 247 | m_data = copy.data(); |
| 248 | m_len = copy.size(); |
| 249 | m_stride = copy.stride(); |
| 250 | return *this; |
| 251 | } |
| 252 | |
| 253 | // iterators |
| 254 | iterator begin() const { return pointer(m_data,m_stride); } |
| 255 | iterator end() const { return pointer(getptr(m_len),m_stride); } |