ndarray: /home/runner/work/ndarray/ndarray/include/ndarray/detail/StridedIterator.h Source File

1

2

3

4

5

6

7

8

9

10

11#ifndef NDARRAY_DETAIL_StridedIterator_h_INCLUDED

12#define NDARRAY_DETAIL_StridedIterator_h_INCLUDED

13

21#include <boost/iterator/iterator_facade.hpp>

22

23namespace ndarray {

24namespace detail {

25

31template <typename T>

33 StridedIterator<T>,

34 T, boost::random_access_traversal_tag

35 >

36{

37public:

38 typedef T Value;

39 typedef T & Reference;

40

42

43 StridedIterator(T * data, Offset stride) : _data(data), _stride(stride) {}

44

46

47 template <typename U>

49 BOOST_STATIC_ASSERT((boost::is_convertible<U*,T*>::value));

50 }

51

53 if (&other != this) {

54 _data = other._data;

55 _stride = other._stride;

56 }

57 return *this;

58 }

59

60 template <typename U>

62 BOOST_STATIC_ASSERT((boost::is_convertible<U*,T*>::value));

63 _data = other._data;

64 _stride = other._stride;

65 return *this;

66 }

67

68private:

69

70 friend class boost::iterator_core_access;

71

73

74 Reference dereference() const { return *_data; }

75

76 void increment() { _data += _stride; }

77 void decrement() { _data -= _stride; }

78 void advance(Offset n) { _data += _stride * n; }

79

80 template <typename U>

82 return std::distance(_data, other._data) / _stride;

83 }

84

85 template <typename U>

87 return _data == other._data;

88 }

89

90 T * _data;

91 Offset _stride;

92

93};

94

95}

96}

97

98#endif

Definition StridedIterator.h:36

Forward declarations and default template parameters for ndarray.