annotate DEPENDENCIES/generic/include/boost/multi_array/iterator.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Copyright 2002 The Trustees of Indiana University.
Chris@16 2
Chris@16 3 // Use, modification and distribution is subject to the Boost Software
Chris@16 4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6
Chris@16 7 // Boost.MultiArray Library
Chris@16 8 // Authors: Ronald Garcia
Chris@16 9 // Jeremy Siek
Chris@16 10 // Andrew Lumsdaine
Chris@16 11 // See http://www.boost.org/libs/multi_array for documentation.
Chris@16 12
Chris@16 13 #ifndef ITERATOR_RG071801_HPP
Chris@16 14 #define ITERATOR_RG071801_HPP
Chris@16 15
Chris@16 16 //
Chris@16 17 // iterator.hpp - implementation of iterators for the
Chris@16 18 // multi-dimensional array class
Chris@16 19 //
Chris@16 20
Chris@16 21 #include "boost/multi_array/base.hpp"
Chris@16 22 #include "boost/iterator/iterator_facade.hpp"
Chris@16 23 #include <algorithm>
Chris@16 24 #include <cstddef>
Chris@16 25 #include <iterator>
Chris@16 26
Chris@16 27 namespace boost {
Chris@16 28 namespace detail {
Chris@16 29 namespace multi_array {
Chris@16 30
Chris@16 31 /////////////////////////////////////////////////////////////////////////
Chris@16 32 // iterator components
Chris@16 33 /////////////////////////////////////////////////////////////////////////
Chris@16 34
Chris@16 35 template <class T>
Chris@16 36 struct operator_arrow_proxy
Chris@16 37 {
Chris@16 38 operator_arrow_proxy(T const& px) : value_(px) {}
Chris@16 39 T* operator->() const { return &value_; }
Chris@16 40 // This function is needed for MWCW and BCC, which won't call operator->
Chris@16 41 // again automatically per 13.3.1.2 para 8
Chris@16 42 operator T*() const { return &value_; }
Chris@16 43 mutable T value_;
Chris@16 44 };
Chris@16 45
Chris@16 46 template <typename T, typename TPtr, typename NumDims, typename Reference,
Chris@16 47 typename IteratorCategory>
Chris@16 48 class array_iterator;
Chris@16 49
Chris@16 50 template <typename T, typename TPtr, typename NumDims, typename Reference,
Chris@16 51 typename IteratorCategory>
Chris@16 52 class array_iterator
Chris@16 53 : public
Chris@16 54 iterator_facade<
Chris@16 55 array_iterator<T,TPtr,NumDims,Reference,IteratorCategory>
Chris@16 56 , typename associated_types<T,NumDims>::value_type
Chris@16 57 , IteratorCategory
Chris@16 58 , Reference
Chris@16 59 >
Chris@16 60 , private
Chris@16 61 value_accessor_generator<T,NumDims>::type
Chris@16 62 {
Chris@16 63 friend class iterator_core_access;
Chris@16 64 typedef detail::multi_array::associated_types<T,NumDims> access_t;
Chris@16 65
Chris@16 66 typedef iterator_facade<
Chris@16 67 array_iterator<T,TPtr,NumDims,Reference,IteratorCategory>
Chris@16 68 , typename detail::multi_array::associated_types<T,NumDims>::value_type
Chris@16 69 , boost::random_access_traversal_tag
Chris@16 70 , Reference
Chris@16 71 > facade_type;
Chris@16 72
Chris@16 73 typedef typename access_t::index index;
Chris@16 74 typedef typename access_t::size_type size_type;
Chris@16 75
Chris@16 76 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
Chris@16 77 template <typename, typename, typename, typename, typename>
Chris@16 78 friend class array_iterator;
Chris@16 79 #else
Chris@16 80 public:
Chris@16 81 #endif
Chris@16 82
Chris@16 83 index idx_;
Chris@16 84 TPtr base_;
Chris@16 85 const size_type* extents_;
Chris@16 86 const index* strides_;
Chris@16 87 const index* index_base_;
Chris@16 88
Chris@16 89 public:
Chris@16 90 // Typedefs to circumvent ambiguities between parent classes
Chris@16 91 typedef typename facade_type::reference reference;
Chris@16 92 typedef typename facade_type::value_type value_type;
Chris@16 93 typedef typename facade_type::difference_type difference_type;
Chris@16 94
Chris@16 95 array_iterator() {}
Chris@16 96
Chris@16 97 array_iterator(index idx, TPtr base, const size_type* extents,
Chris@16 98 const index* strides,
Chris@16 99 const index* index_base) :
Chris@16 100 idx_(idx), base_(base), extents_(extents),
Chris@16 101 strides_(strides), index_base_(index_base) { }
Chris@16 102
Chris@16 103 template <typename OPtr, typename ORef, typename Cat>
Chris@16 104 array_iterator(
Chris@16 105 const array_iterator<T,OPtr,NumDims,ORef,Cat>& rhs
Chris@16 106 , typename boost::enable_if_convertible<OPtr,TPtr>::type* = 0
Chris@16 107 )
Chris@16 108 : idx_(rhs.idx_), base_(rhs.base_), extents_(rhs.extents_),
Chris@16 109 strides_(rhs.strides_), index_base_(rhs.index_base_) { }
Chris@16 110
Chris@16 111
Chris@16 112 // RG - we make our own operator->
Chris@16 113 operator_arrow_proxy<reference>
Chris@16 114 operator->() const
Chris@16 115 {
Chris@16 116 return operator_arrow_proxy<reference>(this->dereference());
Chris@16 117 }
Chris@16 118
Chris@16 119
Chris@16 120 reference dereference() const
Chris@16 121 {
Chris@16 122 typedef typename value_accessor_generator<T,NumDims>::type accessor;
Chris@16 123 return accessor::access(boost::type<reference>(),
Chris@16 124 idx_,
Chris@16 125 base_,
Chris@16 126 extents_,
Chris@16 127 strides_,
Chris@16 128 index_base_);
Chris@16 129 }
Chris@16 130
Chris@16 131 void increment() { ++idx_; }
Chris@16 132 void decrement() { --idx_; }
Chris@16 133
Chris@16 134 template <class IteratorAdaptor>
Chris@16 135 bool equal(IteratorAdaptor& rhs) const {
Chris@16 136 const std::size_t N = NumDims::value;
Chris@16 137 return (idx_ == rhs.idx_) &&
Chris@16 138 (base_ == rhs.base_) &&
Chris@16 139 ( (extents_ == rhs.extents_) ||
Chris@16 140 std::equal(extents_,extents_+N,rhs.extents_) ) &&
Chris@16 141 ( (strides_ == rhs.strides_) ||
Chris@16 142 std::equal(strides_,strides_+N,rhs.strides_) ) &&
Chris@16 143 ( (index_base_ == rhs.index_base_) ||
Chris@16 144 std::equal(index_base_,index_base_+N,rhs.index_base_) );
Chris@16 145 }
Chris@16 146
Chris@16 147 template <class DifferenceType>
Chris@16 148 void advance(DifferenceType n) {
Chris@16 149 idx_ += n;
Chris@16 150 }
Chris@16 151
Chris@16 152 template <class IteratorAdaptor>
Chris@16 153 typename facade_type::difference_type
Chris@16 154 distance_to(IteratorAdaptor& rhs) const {
Chris@16 155 return rhs.idx_ - idx_;
Chris@16 156 }
Chris@16 157
Chris@16 158
Chris@16 159 };
Chris@16 160
Chris@16 161 } // namespace multi_array
Chris@16 162 } // namespace detail
Chris@16 163 } // namespace boost
Chris@16 164
Chris@16 165 #endif // ITERATOR_RG071801_HPP