1 // Copyright (C) 2002 Ronald Garcia
3 // Permission to copy, use, sell and distribute this software is granted
4 // provided this copyright notice appears in all copies.
5 // Permission to modify the code and to distribute modified code is granted
6 // provided this copyright notice appears in all copies, and a notice
7 // that the code was modified is included with the copyright notice.
9 // This software is provided "as is" without express or implied warranty,
10 // and with no claim as to its suitability for any purpose.
13 #ifndef ITERATOR_RG071801_HPP
14 #define ITERATOR_RG071801_HPP
17 // iterator.hpp - implementation of iterators for the
18 // multi-dimensional array class
21 #include "boost/multi_array/base.hpp"
22 #include "boost/multi_array/iterator_adaptors.hpp"
23 #include "boost/iterator_adaptors.hpp"
29 namespace multi_array {
31 /////////////////////////////////////////////////////////////////////////
32 // iterator components
33 /////////////////////////////////////////////////////////////////////////
35 template <typename T, typename TPtr>
36 struct iterator_base : private multi_array_base {
37 typedef multi_array_base super_type;
38 typedef super_type::index index;
39 typedef super_type::size_type size_type;
43 const size_type* extents_;
44 const index* strides_;
45 const index* index_base_;
47 iterator_base(int idx, TPtr base, const size_type* extents,
49 const index* index_base) :
50 idx_(idx), base_(base), extents_(extents),
51 strides_(strides), index_base_(index_base) {
54 template <typename OPtr>
55 iterator_base(const iterator_base<T,OPtr>& rhs) :
56 idx_(rhs.idx_), base_(rhs.base_), extents_(rhs.extents_),
57 strides_(rhs.strides_), index_base_(rhs.index_base_) {
60 // default constructor required
64 template<typename T, std::size_t NumDims>
65 struct iterator_policies :
66 public boost::detail::multi_array::default_iterator_policies,
67 private value_accessor_generator<T,NumDims>::type {
69 typedef typename value_accessor_generator<T,NumDims>::type super_type;
71 template <class IteratorAdaptor>
72 typename IteratorAdaptor::reference
73 dereference(const IteratorAdaptor& iter) const {
74 typedef typename IteratorAdaptor::reference reference;
75 return super_type::access(boost::type<reference>(),
80 iter.base().index_base_);
83 template <class IteratorAdaptor>
84 static void increment(IteratorAdaptor& x) { ++x.base().idx_; }
86 template <class IteratorAdaptor>
87 static void decrement(IteratorAdaptor& x) { --x.base().idx_; }
89 template <class IteratorAdaptor1, class IteratorAdaptor2>
90 bool equal(IteratorAdaptor1& lhs, IteratorAdaptor2& rhs) const {
91 return (lhs.base().idx_ == rhs.base().idx_) &&
92 (lhs.base().base_ == rhs.base().base_) &&
93 (lhs.base().extents_ == rhs.base().extents_) &&
94 (lhs.base().strides_ == rhs.base().strides_) &&
95 (lhs.base().index_base_ == rhs.base().index_base_);
98 template <class IteratorAdaptor, class DifferenceType>
99 static void advance(IteratorAdaptor& x, DifferenceType n) {
103 template <class IteratorAdaptor1, class IteratorAdaptor2>
104 typename IteratorAdaptor1::difference_type
105 distance(IteratorAdaptor1& lhs, IteratorAdaptor2& rhs) const {
106 return rhs.base().idx_ - lhs.base().idx_;
111 template <typename T, typename base_type,
112 std::size_t NumDims, typename value_type,
113 typename reference_type, typename tag, typename difference_type>
114 struct iterator_gen_helper {
116 typedef iterator_policies<T,NumDims> policies;
117 typedef value_type* pointer_type;
118 typedef tag category;
120 typedef boost::detail::multi_array::iterator_adaptor<base_type,policies,value_type,
121 reference_type,pointer_type,category,difference_type> type;
125 template <typename T, std::size_t NumDims, typename value_type,
126 typename reference_type, typename tag, typename difference_type>
127 struct iterator_generator {
129 typedef iterator_base<T,T*> base_type;
131 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
132 reference_type,tag,difference_type>::type type;
135 template <typename T, std::size_t NumDims, typename value_type,
136 typename reference_type, typename tag, typename difference_type>
137 struct const_iterator_generator {
139 typedef iterator_base<T,const T*> base_type;
141 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
142 reference_type,tag,difference_type>::type type;
145 template <typename T, std::size_t NumDims, typename value_type,
146 typename reference_type, typename tag, typename difference_type>
147 struct reverse_iterator_generator {
149 typedef iterator_base<T,T*> base_type;
150 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
151 reference_type,tag,difference_type>::type it_type;
153 typedef typename boost::reverse_iterator_generator<it_type>::type type;
156 template <typename T, std::size_t NumDims, typename value_type,
157 typename reference_type, typename tag, typename difference_type>
158 struct const_reverse_iterator_generator {
160 typedef iterator_base<T,const T*> base_type;
161 typedef typename iterator_gen_helper<T,base_type,NumDims,value_type,
162 reference_type,tag,difference_type>::type it_type;
164 typedef typename boost::reverse_iterator_generator<it_type>::type type;
167 } // namespace multi_array
168 } // namespace detail
171 #endif // ITERATOR_RG071801_HPP