1 #ifndef ITERATOR_RG071801_HPP
2 #define ITERATOR_RG071801_HPP
5 // iterator.hpp - implementation of iterators for the
6 // multi-dimensional array class
9 #include "boost/multi_array/base.hpp"
10 #include "boost/multi_array/iterator_adaptors.hpp"
11 #include "boost/iterator_adaptors.hpp"
17 namespace multi_array {
19 /////////////////////////////////////////////////////////////////////////
20 // iterator components
21 /////////////////////////////////////////////////////////////////////////
23 template <typename T, typename TPtr>
24 struct iterator_base : private multi_array_base {
25 typedef multi_array_base super_type;
26 typedef super_type::index index;
27 typedef super_type::size_type size_type;
31 const size_type* extents_;
32 const index* strides_;
33 const index* index_base_;
35 iterator_base(int idx, TPtr base, const size_type* extents,
37 const index* index_base) :
38 idx_(idx), base_(base), extents_(extents),
39 strides_(strides), index_base_(index_base) {
42 template <typename OPtr>
43 iterator_base(const iterator_base<T,OPtr>& rhs) :
44 idx_(rhs.idx_), base_(rhs.base_), extents_(rhs.extents_),
45 strides_(rhs.strides_), index_base_(rhs.index_base_) {
48 // default constructor required
52 template<typename T, std::size_t NumDims>
53 struct iterator_policies :
54 public boost::detail::multi_array::default_iterator_policies,
55 private value_accessor_generator<T,NumDims>::type {
57 typedef typename value_accessor_generator<T,NumDims>::type super_type;
59 template <class IteratorAdaptor>
60 typename IteratorAdaptor::reference
61 dereference(const IteratorAdaptor& iter) const {
62 typedef typename IteratorAdaptor::reference reference;
63 return super_type::access(boost::type<reference>(),
68 iter.base().index_base_);
71 template <class IteratorAdaptor>
72 static void increment(IteratorAdaptor& x) { ++x.base().idx_; }
74 template <class IteratorAdaptor>
75 static void decrement(IteratorAdaptor& x) { --x.base().idx_; }
77 template <class IteratorAdaptor1, class IteratorAdaptor2>
78 bool equal(IteratorAdaptor1& lhs, IteratorAdaptor2& rhs) const {
79 return (lhs.base().idx_ == rhs.base().idx_) &&
80 (lhs.base().base_ == rhs.base().base_) &&
81 (lhs.base().extents_ == rhs.base().extents_) &&
82 (lhs.base().strides_ == rhs.base().strides_) &&
83 (lhs.base().index_base_ == rhs.base().index_base_);
86 template <class IteratorAdaptor, class DifferenceType>
87 static void advance(IteratorAdaptor& x, DifferenceType n) {
91 template <class IteratorAdaptor1, class IteratorAdaptor2>
92 typename IteratorAdaptor1::difference_type
93 distance(IteratorAdaptor1& lhs, IteratorAdaptor2& rhs) const {
94 return rhs.base().idx_ - lhs.base().idx_;
99 template <typename T, typename base_type,
100 std::size_t NumDims, typename value_type,
101 typename reference_type, typename tag, typename difference_type>
102 struct iterator_gen_helper {
104 typedef iterator_policies<T,NumDims> policies;
105 typedef value_type* pointer_type;
106 typedef tag category;
108 typedef boost::detail::multi_array::iterator_adaptor<base_type,policies,value_type,
109 reference_type,pointer_type,category,difference_type> type;
113 template <typename T, std::size_t NumDims, typename value_type,
114 typename reference_type, typename tag, typename difference_type>
115 struct iterator_generator {
117 typedef iterator_base<T,T*> base_type;
119 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
120 reference_type,tag,difference_type>::type type;
123 template <typename T, std::size_t NumDims, typename value_type,
124 typename reference_type, typename tag, typename difference_type>
125 struct const_iterator_generator {
127 typedef iterator_base<T,const T*> base_type;
129 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
130 reference_type,tag,difference_type>::type type;
133 template <typename T, std::size_t NumDims, typename value_type,
134 typename reference_type, typename tag, typename difference_type>
135 struct reverse_iterator_generator {
137 typedef iterator_base<T,T*> base_type;
138 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
139 reference_type,tag,difference_type>::type it_type;
141 typedef typename boost::reverse_iterator_generator<it_type>::type type;
144 template <typename T, std::size_t NumDims, typename value_type,
145 typename reference_type, typename tag, typename difference_type>
146 struct const_reverse_iterator_generator {
148 typedef iterator_base<T,const T*> base_type;
149 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
150 reference_type,tag,difference_type>::type it_type;
152 typedef typename boost::reverse_iterator_generator<it_type>::type type;
155 } // namespace multi_array
156 } // namespace detail
159 #endif // ITERATOR_RG071801_HPP