annotate DEPENDENCIES/generic/include/boost/multi_array/subarray.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 SUBARRAY_RG071801_HPP
Chris@16 14 #define SUBARRAY_RG071801_HPP
Chris@16 15
Chris@16 16 //
Chris@16 17 // subarray.hpp - used to implement standard operator[] on
Chris@16 18 // multi_arrays
Chris@16 19 //
Chris@16 20
Chris@16 21 #include "boost/multi_array/base.hpp"
Chris@16 22 #include "boost/multi_array/concept_checks.hpp"
Chris@16 23 #include "boost/limits.hpp"
Chris@16 24 #include "boost/type.hpp"
Chris@16 25 #include <algorithm>
Chris@16 26 #include <cstddef>
Chris@16 27 #include <functional>
Chris@16 28
Chris@16 29 namespace boost {
Chris@16 30 namespace detail {
Chris@16 31 namespace multi_array {
Chris@16 32
Chris@16 33 //
Chris@16 34 // const_sub_array
Chris@16 35 // multi_array's proxy class to allow multiple overloads of
Chris@16 36 // operator[] in order to provide a clean multi-dimensional array
Chris@16 37 // interface.
Chris@16 38 template <typename T, std::size_t NumDims, typename TPtr>
Chris@16 39 class const_sub_array :
Chris@16 40 public boost::detail::multi_array::multi_array_impl_base<T,NumDims>
Chris@16 41 {
Chris@16 42 typedef boost::detail::multi_array::multi_array_impl_base<T,NumDims> super_type;
Chris@16 43 public:
Chris@16 44 typedef typename super_type::value_type value_type;
Chris@16 45 typedef typename super_type::const_reference const_reference;
Chris@16 46 typedef typename super_type::const_iterator const_iterator;
Chris@16 47 typedef typename super_type::const_reverse_iterator const_reverse_iterator;
Chris@16 48 typedef typename super_type::element element;
Chris@16 49 typedef typename super_type::size_type size_type;
Chris@16 50 typedef typename super_type::difference_type difference_type;
Chris@16 51 typedef typename super_type::index index;
Chris@16 52 typedef typename super_type::extent_range extent_range;
Chris@16 53
Chris@16 54 // template typedefs
Chris@16 55 template <std::size_t NDims>
Chris@16 56 struct const_array_view {
Chris@16 57 typedef boost::detail::multi_array::const_multi_array_view<T,NDims> type;
Chris@16 58 };
Chris@16 59
Chris@16 60 template <std::size_t NDims>
Chris@16 61 struct array_view {
Chris@16 62 typedef boost::detail::multi_array::multi_array_view<T,NDims> type;
Chris@16 63 };
Chris@16 64
Chris@16 65 // Allow default copy constructor as well.
Chris@16 66
Chris@16 67 template <typename OPtr>
Chris@16 68 const_sub_array (const const_sub_array<T,NumDims,OPtr>& rhs) :
Chris@16 69 base_(rhs.base_), extents_(rhs.extents_), strides_(rhs.strides_),
Chris@16 70 index_base_(rhs.index_base_) {
Chris@16 71 }
Chris@16 72
Chris@16 73 // const_sub_array always returns const types, regardless of its own
Chris@16 74 // constness.
Chris@16 75 const_reference operator[](index idx) const {
Chris@16 76 return super_type::access(boost::type<const_reference>(),
Chris@16 77 idx,base_,shape(),strides(),index_bases());
Chris@16 78 }
Chris@16 79
Chris@16 80 template <typename IndexList>
Chris@16 81 const element& operator()(const IndexList& indices) const {
Chris@16 82 boost::function_requires<
Chris@16 83 CollectionConcept<IndexList> >();
Chris@16 84 return super_type::access_element(boost::type<const element&>(),
Chris@16 85 indices,origin(),
Chris@16 86 shape(),strides(),index_bases());
Chris@16 87 }
Chris@16 88
Chris@16 89 // see generate_array_view in base.hpp
Chris@16 90 template <int NDims>
Chris@16 91 typename const_array_view<NDims>::type
Chris@16 92 operator[](const boost::detail::multi_array::
Chris@16 93 index_gen<NumDims,NDims>& indices)
Chris@16 94 const {
Chris@16 95 typedef typename const_array_view<NDims>::type return_type;
Chris@16 96 return
Chris@16 97 super_type::generate_array_view(boost::type<return_type>(),
Chris@16 98 indices,
Chris@16 99 shape(),
Chris@16 100 strides(),
Chris@16 101 index_bases(),
Chris@16 102 base_);
Chris@16 103 }
Chris@16 104
Chris@16 105 template <typename OPtr>
Chris@16 106 bool operator<(const const_sub_array<T,NumDims,OPtr>& rhs) const {
Chris@16 107 return std::lexicographical_compare(begin(),end(),rhs.begin(),rhs.end());
Chris@16 108 }
Chris@16 109
Chris@16 110 template <typename OPtr>
Chris@16 111 bool operator==(const const_sub_array<T,NumDims,OPtr>& rhs) const {
Chris@16 112 if(std::equal(shape(),shape()+num_dimensions(),rhs.shape()))
Chris@16 113 return std::equal(begin(),end(),rhs.begin());
Chris@16 114 else return false;
Chris@16 115 }
Chris@16 116
Chris@16 117 template <typename OPtr>
Chris@16 118 bool operator!=(const const_sub_array<T,NumDims,OPtr>& rhs) const {
Chris@16 119 return !(*this == rhs);
Chris@16 120 }
Chris@16 121
Chris@16 122 template <typename OPtr>
Chris@16 123 bool operator>(const const_sub_array<T,NumDims,OPtr>& rhs) const {
Chris@16 124 return rhs < *this;
Chris@16 125 }
Chris@16 126
Chris@16 127 template <typename OPtr>
Chris@16 128 bool operator<=(const const_sub_array<T,NumDims,OPtr>& rhs) const {
Chris@16 129 return !(*this > rhs);
Chris@16 130 }
Chris@16 131
Chris@16 132 template <typename OPtr>
Chris@16 133 bool operator>=(const const_sub_array<T,NumDims,OPtr>& rhs) const {
Chris@16 134 return !(*this < rhs);
Chris@16 135 }
Chris@16 136
Chris@16 137 const_iterator begin() const {
Chris@16 138 return const_iterator(*index_bases(),origin(),
Chris@16 139 shape(),strides(),index_bases());
Chris@16 140 }
Chris@16 141
Chris@16 142 const_iterator end() const {
Chris@16 143 return const_iterator(*index_bases()+(index)*shape(),origin(),
Chris@16 144 shape(),strides(),index_bases());
Chris@16 145 }
Chris@16 146
Chris@16 147 const_reverse_iterator rbegin() const {
Chris@16 148 return const_reverse_iterator(end());
Chris@16 149 }
Chris@16 150
Chris@16 151 const_reverse_iterator rend() const {
Chris@16 152 return const_reverse_iterator(begin());
Chris@16 153 }
Chris@16 154
Chris@16 155 TPtr origin() const { return base_; }
Chris@16 156 size_type size() const { return extents_[0]; }
Chris@16 157 size_type max_size() const { return num_elements(); }
Chris@16 158 bool empty() const { return size() == 0; }
Chris@16 159 size_type num_dimensions() const { return NumDims; }
Chris@16 160 const size_type* shape() const { return extents_; }
Chris@16 161 const index* strides() const { return strides_; }
Chris@16 162 const index* index_bases() const { return index_base_; }
Chris@16 163
Chris@16 164 size_type num_elements() const {
Chris@16 165 return std::accumulate(shape(),shape() + num_dimensions(),
Chris@16 166 size_type(1), std::multiplies<size_type>());
Chris@16 167 }
Chris@16 168
Chris@16 169
Chris@16 170 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
Chris@16 171 protected:
Chris@16 172 template <typename,std::size_t> friend class value_accessor_n;
Chris@16 173 template <typename,std::size_t,typename> friend class const_sub_array;
Chris@16 174 #else
Chris@16 175 public: // Should be protected
Chris@16 176 #endif
Chris@16 177
Chris@16 178 const_sub_array (TPtr base,
Chris@16 179 const size_type* extents,
Chris@16 180 const index* strides,
Chris@16 181 const index* index_base) :
Chris@16 182 base_(base), extents_(extents), strides_(strides),
Chris@16 183 index_base_(index_base) {
Chris@16 184 }
Chris@16 185
Chris@16 186 TPtr base_;
Chris@16 187 const size_type* extents_;
Chris@16 188 const index* strides_;
Chris@16 189 const index* index_base_;
Chris@16 190 private:
Chris@16 191 // const_sub_array cannot be assigned to (no deep copies!)
Chris@16 192 const_sub_array& operator=(const const_sub_array&);
Chris@16 193 };
Chris@16 194
Chris@16 195
Chris@16 196 //
Chris@16 197 // sub_array
Chris@16 198 // multi_array's proxy class to allow multiple overloads of
Chris@16 199 // operator[] in order to provide a clean multi-dimensional array
Chris@16 200 // interface.
Chris@16 201 template <typename T, std::size_t NumDims>
Chris@16 202 class sub_array : public const_sub_array<T,NumDims,T*>
Chris@16 203 {
Chris@16 204 typedef const_sub_array<T,NumDims,T*> super_type;
Chris@16 205 public:
Chris@16 206 typedef typename super_type::element element;
Chris@16 207 typedef typename super_type::reference reference;
Chris@16 208 typedef typename super_type::index index;
Chris@16 209 typedef typename super_type::size_type size_type;
Chris@16 210 typedef typename super_type::iterator iterator;
Chris@16 211 typedef typename super_type::reverse_iterator reverse_iterator;
Chris@16 212 typedef typename super_type::const_reference const_reference;
Chris@16 213 typedef typename super_type::const_iterator const_iterator;
Chris@16 214 typedef typename super_type::const_reverse_iterator const_reverse_iterator;
Chris@16 215
Chris@16 216 // template typedefs
Chris@16 217 template <std::size_t NDims>
Chris@16 218 struct const_array_view {
Chris@16 219 typedef boost::detail::multi_array::const_multi_array_view<T,NDims> type;
Chris@16 220 };
Chris@16 221
Chris@16 222 template <std::size_t NDims>
Chris@16 223 struct array_view {
Chris@16 224 typedef boost::detail::multi_array::multi_array_view<T,NDims> type;
Chris@16 225 };
Chris@16 226
Chris@16 227 // Assignment from other ConstMultiArray types.
Chris@16 228 template <typename ConstMultiArray>
Chris@16 229 sub_array& operator=(const ConstMultiArray& other) {
Chris@16 230 function_requires< boost::multi_array_concepts::ConstMultiArrayConcept<
Chris@16 231 ConstMultiArray, NumDims> >();
Chris@16 232
Chris@16 233 // make sure the dimensions agree
Chris@16 234 BOOST_ASSERT(other.num_dimensions() == this->num_dimensions());
Chris@16 235 BOOST_ASSERT(std::equal(other.shape(),other.shape()+this->num_dimensions(),
Chris@16 236 this->shape()));
Chris@16 237 // iterator-based copy
Chris@16 238 std::copy(other.begin(),other.end(),begin());
Chris@16 239 return *this;
Chris@16 240 }
Chris@16 241
Chris@16 242
Chris@16 243 sub_array& operator=(const sub_array& other) {
Chris@16 244 if (&other != this) {
Chris@16 245 // make sure the dimensions agree
Chris@16 246 BOOST_ASSERT(other.num_dimensions() == this->num_dimensions());
Chris@16 247 BOOST_ASSERT(std::equal(other.shape(),
Chris@16 248 other.shape()+this->num_dimensions(),
Chris@16 249 this->shape()));
Chris@16 250 // iterator-based copy
Chris@16 251 std::copy(other.begin(),other.end(),begin());
Chris@16 252 }
Chris@16 253 return *this;
Chris@16 254 }
Chris@16 255
Chris@16 256 T* origin() { return this->base_; }
Chris@16 257 const T* origin() const { return this->base_; }
Chris@16 258
Chris@16 259 reference operator[](index idx) {
Chris@16 260 return super_type::access(boost::type<reference>(),
Chris@16 261 idx,this->base_,this->shape(),this->strides(),
Chris@16 262 this->index_bases());
Chris@16 263 }
Chris@16 264
Chris@16 265 // see generate_array_view in base.hpp
Chris@16 266 template <int NDims>
Chris@16 267 typename array_view<NDims>::type
Chris@16 268 operator[](const boost::detail::multi_array::
Chris@16 269 index_gen<NumDims,NDims>& indices) {
Chris@16 270 typedef typename array_view<NDims>::type return_type;
Chris@16 271 return
Chris@16 272 super_type::generate_array_view(boost::type<return_type>(),
Chris@16 273 indices,
Chris@16 274 this->shape(),
Chris@16 275 this->strides(),
Chris@16 276 this->index_bases(),
Chris@16 277 origin());
Chris@16 278 }
Chris@16 279
Chris@16 280 template <class IndexList>
Chris@16 281 element& operator()(const IndexList& indices) {
Chris@16 282 boost::function_requires<
Chris@16 283 CollectionConcept<IndexList> >();
Chris@16 284 return super_type::access_element(boost::type<element&>(),
Chris@16 285 indices,origin(),
Chris@16 286 this->shape(),this->strides(),
Chris@16 287 this->index_bases());
Chris@16 288 }
Chris@16 289
Chris@16 290 iterator begin() {
Chris@16 291 return iterator(*this->index_bases(),origin(),
Chris@16 292 this->shape(),this->strides(),this->index_bases());
Chris@16 293 }
Chris@16 294
Chris@16 295 iterator end() {
Chris@16 296 return iterator(*this->index_bases()+(index)*this->shape(),origin(),
Chris@16 297 this->shape(),this->strides(),this->index_bases());
Chris@16 298 }
Chris@16 299
Chris@16 300 // RG - rbegin() and rend() written naively to thwart MSVC ICE.
Chris@16 301 reverse_iterator rbegin() {
Chris@16 302 reverse_iterator ri(end());
Chris@16 303 return ri;
Chris@16 304 }
Chris@16 305
Chris@16 306 reverse_iterator rend() {
Chris@16 307 reverse_iterator ri(begin());
Chris@16 308 return ri;
Chris@16 309 }
Chris@16 310
Chris@16 311 //
Chris@16 312 // proxies
Chris@16 313 //
Chris@16 314
Chris@16 315 template <class IndexList>
Chris@16 316 const element& operator()(const IndexList& indices) const {
Chris@16 317 boost::function_requires<
Chris@16 318 CollectionConcept<IndexList> >();
Chris@16 319 return super_type::operator()(indices);
Chris@16 320 }
Chris@16 321
Chris@16 322 const_reference operator[](index idx) const {
Chris@16 323 return super_type::operator[](idx);
Chris@16 324 }
Chris@16 325
Chris@16 326 // see generate_array_view in base.hpp
Chris@16 327 template <int NDims>
Chris@16 328 typename const_array_view<NDims>::type
Chris@16 329 operator[](const boost::detail::multi_array::
Chris@16 330 index_gen<NumDims,NDims>& indices)
Chris@16 331 const {
Chris@16 332 return super_type::operator[](indices);
Chris@16 333 }
Chris@16 334
Chris@16 335 const_iterator begin() const {
Chris@16 336 return super_type::begin();
Chris@16 337 }
Chris@16 338
Chris@16 339 const_iterator end() const {
Chris@16 340 return super_type::end();
Chris@16 341 }
Chris@16 342
Chris@16 343 const_reverse_iterator rbegin() const {
Chris@16 344 return super_type::rbegin();
Chris@16 345 }
Chris@16 346
Chris@16 347 const_reverse_iterator rend() const {
Chris@16 348 return super_type::rend();
Chris@16 349 }
Chris@16 350
Chris@16 351 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
Chris@16 352 private:
Chris@16 353 template <typename,std::size_t> friend class value_accessor_n;
Chris@16 354 #else
Chris@16 355 public: // should be private
Chris@16 356 #endif
Chris@16 357
Chris@16 358 sub_array (T* base,
Chris@16 359 const size_type* extents,
Chris@16 360 const index* strides,
Chris@16 361 const index* index_base) :
Chris@16 362 super_type(base,extents,strides,index_base) {
Chris@16 363 }
Chris@16 364
Chris@16 365 };
Chris@16 366
Chris@16 367 } // namespace multi_array
Chris@16 368 } // namespace detail
Chris@16 369 //
Chris@16 370 // traits classes to get sub_array types
Chris@16 371 //
Chris@16 372 template <typename Array, int N>
Chris@16 373 class subarray_gen {
Chris@16 374 typedef typename Array::element element;
Chris@16 375 public:
Chris@16 376 typedef boost::detail::multi_array::sub_array<element,N> type;
Chris@16 377 };
Chris@16 378
Chris@16 379 template <typename Array, int N>
Chris@16 380 class const_subarray_gen {
Chris@16 381 typedef typename Array::element element;
Chris@16 382 public:
Chris@16 383 typedef boost::detail::multi_array::const_sub_array<element,N> type;
Chris@16 384 };
Chris@16 385 } // namespace boost
Chris@16 386
Chris@16 387 #endif // SUBARRAY_RG071801_HPP