From 49b928a2ab78524ddcf6026c5ed01dc8a09e2a6f Mon Sep 17 00:00:00 2001 From: Ronald Garcia Date: Tue, 19 Aug 2003 15:50:25 +0000 Subject: [PATCH] Updated multi_array to use the new boost iterators library. [SVN r19695] --- include/boost/multi_array.hpp | 2 - include/boost/multi_array/iterator.hpp | 185 ++++++++++-------- include/boost/multi_array/multi_array_ref.hpp | 21 +- include/boost/multi_array/subarray.hpp | 19 +- include/boost/multi_array/view.hpp | 23 +-- 5 files changed, 129 insertions(+), 121 deletions(-) diff --git a/include/boost/multi_array.hpp b/include/boost/multi_array.hpp index c955029..2272175 100644 --- a/include/boost/multi_array.hpp +++ b/include/boost/multi_array.hpp @@ -62,8 +62,6 @@ public: typedef typename super_type::const_reference const_reference; typedef typename super_type::iterator iterator; typedef typename super_type::const_iterator const_iterator; - typedef typename super_type::iter_base iter_base; - typedef typename super_type::const_iter_base const_iter_base; typedef typename super_type::reverse_iterator reverse_iterator; typedef typename super_type::const_reverse_iterator const_reverse_iterator; typedef typename super_type::element element; diff --git a/include/boost/multi_array/iterator.hpp b/include/boost/multi_array/iterator.hpp index cbbeeb9..5cd47c9 100644 --- a/include/boost/multi_array/iterator.hpp +++ b/include/boost/multi_array/iterator.hpp @@ -19,7 +19,7 @@ // #include "boost/multi_array/base.hpp" -#include "boost/multi_array/iterator_adaptors.hpp" +#include "boost/iterator/iterator_facade.hpp" #include "boost/iterator/reverse_iterator.hpp" #include #include @@ -32,138 +32,157 @@ namespace multi_array { // iterator components ///////////////////////////////////////////////////////////////////////// -template -struct iterator_base : private multi_array_base { - typedef multi_array_base super_type; - typedef super_type::index index; - typedef super_type::size_type size_type; +template +struct operator_arrow_proxy +{ + operator_arrow_proxy(T const& px) : value_(px) {} + T* operator->() const { return &value_; } + // This function is needed for MWCW and BCC, which won't call operator-> + // again automatically per 13.3.1.2 para 8 + operator T*() const { return &value_; } + mutable T value_; +}; + + +template +class array_iterator : + public iterator_facade< + array_iterator, + typename value_accessor_generator::type::value_type, + AccessCategory, + ::boost::random_access_traversal_tag, + Reference + >, + private value_accessor_generator::type +{ + friend class iterator_core_access; + template + friend class array_iterator; + + typedef typename value_accessor_generator::type access_t; + + typedef iterator_facade< + array_iterator, + typename access_t::value_type, + AccessCategory, + ::boost::random_access_traversal_tag, + Reference + > facade_type; + + typedef typename value_accessor_generator::type access_t; + typedef typename access_t::index index; + typedef typename access_t::size_type size_type; index idx_; TPtr base_; const size_type* extents_; const index* strides_; const index* index_base_; + +public: + // Typedefs to circumvent ambiguities between parent classes + typedef typename facade_type::reference reference; + typedef typename facade_type::value_type value_type; + typedef typename facade_type::difference_type difference_type; - iterator_base(int idx, TPtr base, const size_type* extents, + array_iterator() {} + + array_iterator(int idx, TPtr base, const size_type* extents, const index* strides, const index* index_base) : idx_(idx), base_(base), extents_(extents), - strides_(strides), index_base_(index_base) { - } + strides_(strides), index_base_(index_base) { } - template - iterator_base(const iterator_base& rhs) : - idx_(rhs.idx_), base_(rhs.base_), extents_(rhs.extents_), - strides_(rhs.strides_), index_base_(rhs.index_base_) { - } + template + array_iterator(const + array_iterator& rhs) + : idx_(rhs.idx_), base_(rhs.base_), extents_(rhs.extents_), + strides_(rhs.strides_), index_base_(rhs.index_base_) { } - // default constructor required - iterator_base() {} -}; -template -struct iterator_policies : - public boost::detail::multi_array::default_iterator_policies, - private value_accessor_generator::type { -private: - typedef typename value_accessor_generator::type super_type; -public: - template - typename IteratorAdaptor::reference - dereference(const IteratorAdaptor& iter) const { - typedef typename IteratorAdaptor::reference reference; - return super_type::access(boost::type(), - iter.base().idx_, - iter.base().base_, - iter.base().extents_, - iter.base().strides_, - iter.base().index_base_); + // RG - we make our own operator-> + operator_arrow_proxy + operator->() const + { + return operator_arrow_proxy(this->dereference()); } - template - static void increment(IteratorAdaptor& x) { ++x.base().idx_; } + + reference dereference() const { + return access_t::access(boost::type(), + idx_, + base_, + extents_, + strides_, + index_base_); + } + + void increment() { ++idx_; } + void decrement() { --idx_; } template - static void decrement(IteratorAdaptor& x) { --x.base().idx_; } - - template - bool equal(IteratorAdaptor1& lhs, IteratorAdaptor2& rhs) const { - return (lhs.base().idx_ == rhs.base().idx_) && - (lhs.base().base_ == rhs.base().base_) && - (lhs.base().extents_ == rhs.base().extents_) && - (lhs.base().strides_ == rhs.base().strides_) && - (lhs.base().index_base_ == rhs.base().index_base_); + bool equal(IteratorAdaptor& rhs) const { + return (idx_ == rhs.idx_) && + (base_ == rhs.base_) && + (extents_ == rhs.extents_) && + (strides_ == rhs.strides_) && + (index_base_ == rhs.index_base_); } - template - static void advance(IteratorAdaptor& x, DifferenceType n) { - x.base().idx_ += n; + template + void advance(DifferenceType n) { + idx_ += n; } - template - typename IteratorAdaptor1::difference_type - distance(IteratorAdaptor1& lhs, IteratorAdaptor2& rhs) const { - return rhs.base().idx_ - lhs.base().idx_; + template + typename facade_type::difference_type + distance_to(IteratorAdaptor& rhs) const { + return rhs.idx_ - idx_; } + + }; -template -struct iterator_gen_helper { -private: - typedef iterator_policies policies; - typedef value_type* pointer_type; - typedef tag category; -public: - typedef boost::detail::multi_array::iterator_adaptor type; -}; - template struct iterator_generator { -private: - typedef iterator_base base_type; -public: - typedef typename iterator_gen_helper::type type; + // RG: readable_writeable is temporary until later dim-based fixes + typedef array_iterator type; }; template struct const_iterator_generator { -private: - typedef iterator_base base_type; -public: - typedef typename iterator_gen_helper::type type; + // RG: readable is temporary until later dim-based fixes + typedef array_iterator type; }; template struct reverse_iterator_generator { private: - typedef iterator_base base_type; - typedef typename iterator_gen_helper::type it_type; + typedef typename iterator_generator::type iterator_type; public: - typedef typename boost::reverse_iterator type; + typedef ::boost::reverse_iterator type; }; template struct const_reverse_iterator_generator { private: - typedef iterator_base base_type; - typedef typename iterator_gen_helper::type it_type; + typedef typename const_iterator_generator::type iterator_type; public: - typedef typename boost::reverse_iterator type; + typedef ::boost::reverse_iterator type; }; + } // namespace multi_array } // namespace detail } // namespace boost diff --git a/include/boost/multi_array/multi_array_ref.hpp b/include/boost/multi_array/multi_array_ref.hpp index 8fb5cda..ec55638 100644 --- a/include/boost/multi_array/multi_array_ref.hpp +++ b/include/boost/multi_array/multi_array_ref.hpp @@ -48,7 +48,6 @@ public: typedef typename super_type::value_type value_type; typedef typename super_type::const_reference const_reference; typedef typename super_type::const_iterator const_iterator; - typedef typename super_type::const_iter_base const_iter_base; typedef typename super_type::const_reverse_iterator const_reverse_iterator; typedef typename super_type::element element; typedef typename super_type::size_type size_type; @@ -232,13 +231,13 @@ public: } const_iterator begin() const { - return const_iterator(const_iter_base(*index_bases(),origin(), - shape(),strides(),index_bases())); + return const_iterator(*index_bases(),origin(), + shape(),strides(),index_bases()); } const_iterator end() const { - return const_iterator(const_iter_base(*index_bases()+*shape(),origin(), - shape(),strides(),index_bases())); + return const_iterator(*index_bases()+*shape(),origin(), + shape(),strides(),index_bases()); } const_reverse_iterator rbegin() const { @@ -401,11 +400,9 @@ public: typedef typename super_type::value_type value_type; typedef typename super_type::reference reference; typedef typename super_type::iterator iterator; - typedef typename super_type::iter_base iter_base; typedef typename super_type::reverse_iterator reverse_iterator; typedef typename super_type::const_reference const_reference; typedef typename super_type::const_iterator const_iterator; - typedef typename super_type::const_iter_base const_iter_base; typedef typename super_type::const_reverse_iterator const_reverse_iterator; typedef typename super_type::element element; typedef typename super_type::size_type size_type; @@ -531,14 +528,14 @@ public: iterator begin() { - return iterator(iter_base(*this->index_bases(),origin(),this->shape(), - this->strides(),this->index_bases())); + return iterator(*this->index_bases(),origin(),this->shape(), + this->strides(),this->index_bases()); } iterator end() { - return iterator(iter_base(*this->index_bases()+*this->shape(),origin(), - this->shape(),this->strides(), - this->index_bases())); + return iterator(*this->index_bases()+*this->shape(),origin(), + this->shape(),this->strides(), + this->index_bases()); } // RG - rbegin() and rend() written naively to thwart MSVC ICE. diff --git a/include/boost/multi_array/subarray.hpp b/include/boost/multi_array/subarray.hpp index a19f4a9..00e8b9c 100644 --- a/include/boost/multi_array/subarray.hpp +++ b/include/boost/multi_array/subarray.hpp @@ -44,7 +44,6 @@ public: typedef typename super_type::value_type value_type; typedef typename super_type::const_reference const_reference; typedef typename super_type::const_iterator const_iterator; - typedef typename super_type::const_iter_base const_iter_base; typedef typename super_type::const_reverse_iterator const_reverse_iterator; typedef typename super_type::element element; typedef typename super_type::size_type size_type; @@ -138,13 +137,13 @@ public: } const_iterator begin() const { - return const_iterator(const_iter_base(*index_bases(),origin(), - shape(),strides(),index_bases())); + return const_iterator(*index_bases(),origin(), + shape(),strides(),index_bases()); } const_iterator end() const { - return const_iterator(const_iter_base(*index_bases()+*shape(),origin(), - shape(),strides(),index_bases())); + return const_iterator(*index_bases()+*shape(),origin(), + shape(),strides(),index_bases()); } const_reverse_iterator rbegin() const { @@ -211,11 +210,9 @@ public: typedef typename super_type::size_type size_type; typedef typename super_type::iterator iterator; typedef typename super_type::reverse_iterator reverse_iterator; - typedef typename super_type::iter_base iter_base; typedef typename super_type::const_reference const_reference; typedef typename super_type::const_iterator const_iterator; typedef typename super_type::const_reverse_iterator const_reverse_iterator; - typedef typename super_type::const_iter_base const_iter_base; // template typedefs template @@ -292,13 +289,13 @@ public: } iterator begin() { - return iterator(iter_base(*this->index_bases(),origin(), - this->shape(),this->strides(),this->index_bases())); + return iterator(*this->index_bases(),origin(), + this->shape(),this->strides(),this->index_bases()); } iterator end() { - return iterator(iter_base(*this->index_bases()+*this->shape(),origin(), - this->shape(),this->strides(),this->index_bases())); + return iterator(*this->index_bases()+*this->shape(),origin(), + this->shape(),this->strides(),this->index_bases()); } // RG - rbegin() and rend() written naively to thwart MSVC ICE. diff --git a/include/boost/multi_array/view.hpp b/include/boost/multi_array/view.hpp index 396aba9..5c23b78 100644 --- a/include/boost/multi_array/view.hpp +++ b/include/boost/multi_array/view.hpp @@ -44,7 +44,6 @@ public: typedef typename super_type::value_type value_type; typedef typename super_type::const_reference const_reference; typedef typename super_type::const_iterator const_iterator; - typedef typename super_type::const_iter_base const_iter_base; typedef typename super_type::const_reverse_iterator const_reverse_iterator; typedef typename super_type::element element; typedef typename super_type::size_type size_type; @@ -142,13 +141,13 @@ public: origin()); } const_iterator begin() const { - return const_iterator(const_iter_base(*index_bases(),origin(), - shape(),strides(),index_bases())); + return const_iterator(*index_bases(),origin(), + shape(),strides(),index_bases()); } const_iterator end() const { - return const_iterator(const_iter_base(*index_bases()+*shape(),origin(), - shape(),strides(),index_bases())); + return const_iterator(*index_bases()+*shape(),origin(), + shape(),strides(),index_bases()); } const_reverse_iterator rbegin() const { @@ -262,11 +261,9 @@ public: typedef typename super_type::value_type value_type; typedef typename super_type::reference reference; typedef typename super_type::iterator iterator; - typedef typename super_type::iter_base iter_base; typedef typename super_type::reverse_iterator reverse_iterator; typedef typename super_type::const_reference const_reference; typedef typename super_type::const_iterator const_iterator; - typedef typename super_type::const_iter_base const_iter_base; typedef typename super_type::const_reverse_iterator const_reverse_iterator; typedef typename super_type::element element; typedef typename super_type::size_type size_type; @@ -353,15 +350,15 @@ public: iterator begin() { - return iterator(iter_base(*this->index_bases(),origin(), - this->shape(),this->strides(), - this->index_bases())); + return iterator(*this->index_bases(),origin(), + this->shape(),this->strides(), + this->index_bases()); } iterator end() { - return iterator(iter_base(*this->index_bases()+*this->shape(),origin(), - this->shape(),this->strides(), - this->index_bases())); + return iterator(*this->index_bases()+*this->shape(),origin(), + this->shape(),this->strides(), + this->index_bases()); } reverse_iterator rbegin() {