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

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
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 BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
Chris@16 14 #define BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
Chris@16 15
Chris@16 16 //
Chris@16 17 // concept-checks.hpp - Checks out Const MultiArray and MultiArray
Chris@16 18 // concepts
Chris@16 19 //
Chris@16 20
Chris@16 21 #include "boost/concept_check.hpp"
Chris@16 22 #include "boost/iterator/iterator_concepts.hpp"
Chris@16 23
Chris@16 24 namespace boost {
Chris@16 25 namespace multi_array_concepts {
Chris@16 26
Chris@16 27 namespace detail {
Chris@16 28 //
Chris@16 29 // idgen_helper -
Chris@16 30 // This is a helper for generating index_gen instantiations with
Chris@16 31 // the right type in order to test the call to
Chris@16 32 // operator[](index_gen). Since one would normally write:
Chris@16 33 // A[ indices[range1][range2] ]; // or
Chris@16 34 // B[ indices[index1][index2][range1] ];
Chris@16 35 // idgen helper allows us to generate the "indices" type by
Chris@16 36 // creating it through recursive calls.
Chris@16 37 template <std::size_t N>
Chris@16 38 struct idgen_helper {
Chris@16 39
Chris@16 40 template <typename Array, typename IdxGen, typename Call_Type>
Chris@16 41 static void call(Array& a, const IdxGen& idgen, Call_Type c) {
Chris@16 42 typedef typename Array::index_range index_range;
Chris@16 43 typedef typename Array::index index;
Chris@16 44 idgen_helper<N-1>::call(a,idgen[c],c);
Chris@16 45 }
Chris@16 46 };
Chris@16 47
Chris@16 48 template <>
Chris@16 49 struct idgen_helper<0> {
Chris@16 50
Chris@16 51 template <typename Array, typename IdxGen, typename Call_Type>
Chris@16 52 static void call(Array& a, const IdxGen& idgen, Call_Type) {
Chris@16 53 typedef typename Array::index_range index_range;
Chris@16 54 typedef typename Array::index index;
Chris@16 55 a[ idgen ];
Chris@16 56 }
Chris@16 57 };
Chris@16 58
Chris@16 59 } // namespace detail
Chris@16 60
Chris@16 61
Chris@16 62 template <typename Array, std::size_t NumDims >
Chris@16 63 struct ConstMultiArrayConcept
Chris@16 64 {
Chris@16 65 void constraints() {
Chris@16 66 // function_requires< CopyConstructibleConcept<Array> >();
Chris@16 67 function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
Chris@16 68 function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
Chris@16 69 function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
Chris@16 70 function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
Chris@16 71
Chris@16 72 // RG - a( CollectionArchetype) when available...
Chris@16 73 a[ id ];
Chris@16 74 // Test slicing, keeping only the first dimension, losing the rest
Chris@16 75 detail::idgen_helper<NumDims-1>::call(a,idgen[range],id);
Chris@16 76
Chris@16 77 // Test slicing, keeping all dimensions.
Chris@16 78 detail::idgen_helper<NumDims-1>::call(a,idgen[range],range);
Chris@16 79
Chris@16 80 st = a.size();
Chris@16 81 st = a.num_dimensions();
Chris@16 82 st = Array::dimensionality;
Chris@16 83 st = a.num_elements();
Chris@16 84 stp = a.shape();
Chris@16 85 idp = a.strides();
Chris@16 86 idp = a.index_bases();
Chris@16 87 cit = a.begin();
Chris@16 88 cit = a.end();
Chris@16 89 crit = a.rbegin();
Chris@16 90 crit = a.rend();
Chris@16 91 eltp = a.origin();
Chris@16 92 }
Chris@16 93
Chris@16 94 typedef typename Array::value_type value_type;
Chris@16 95 typedef typename Array::reference reference;
Chris@16 96 typedef typename Array::const_reference const_reference;
Chris@16 97 typedef typename Array::size_type size_type;
Chris@16 98 typedef typename Array::difference_type difference_type;
Chris@16 99 typedef typename Array::iterator iterator;
Chris@16 100 typedef typename Array::const_iterator const_iterator;
Chris@16 101 typedef typename Array::reverse_iterator reverse_iterator;
Chris@16 102 typedef typename Array::const_reverse_iterator const_reverse_iterator;
Chris@16 103 typedef typename Array::element element;
Chris@16 104 typedef typename Array::index index;
Chris@16 105 typedef typename Array::index_gen index_gen;
Chris@16 106 typedef typename Array::index_range index_range;
Chris@16 107 typedef typename Array::extent_gen extent_gen;
Chris@16 108 typedef typename Array::extent_range extent_range;
Chris@16 109
Chris@16 110 Array a;
Chris@16 111 size_type st;
Chris@16 112 const size_type* stp;
Chris@16 113 index id;
Chris@16 114 const index* idp;
Chris@16 115 const_iterator cit;
Chris@16 116 const_reverse_iterator crit;
Chris@16 117 const element* eltp;
Chris@16 118 index_gen idgen;
Chris@16 119 index_range range;
Chris@16 120 };
Chris@16 121
Chris@16 122
Chris@16 123 template <typename Array, std::size_t NumDims >
Chris@16 124 struct MutableMultiArrayConcept
Chris@16 125 {
Chris@16 126 void constraints() {
Chris@16 127 // function_requires< CopyConstructibleConcept<Array> >();
Chris@16 128
Chris@16 129 function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
Chris@16 130 function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
Chris@16 131 function_requires< boost_concepts::WritableIteratorConcept<iterator> >();
Chris@16 132 function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
Chris@16 133 function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
Chris@16 134 function_requires< boost::OutputIterator<iterator,value_type> >();
Chris@16 135
Chris@16 136 // RG - a( CollectionArchetype) when available...
Chris@16 137 value_type vt = a[ id ];
Chris@16 138
Chris@16 139 // Test slicing, keeping only the first dimension, losing the rest
Chris@16 140 detail::idgen_helper<NumDims-1>::call(a,idgen[range],id);
Chris@16 141
Chris@16 142 // Test slicing, keeping all dimensions.
Chris@16 143 detail::idgen_helper<NumDims-1>::call(a,idgen[range],range);
Chris@16 144
Chris@16 145 st = a.size();
Chris@16 146 st = a.num_dimensions();
Chris@16 147 st = a.num_elements();
Chris@16 148 stp = a.shape();
Chris@16 149 idp = a.strides();
Chris@16 150 idp = a.index_bases();
Chris@16 151 it = a.begin();
Chris@16 152 it = a.end();
Chris@16 153 rit = a.rbegin();
Chris@16 154 rit = a.rend();
Chris@16 155 eltp = a.origin();
Chris@16 156 const_constraints(a);
Chris@16 157 }
Chris@16 158
Chris@16 159 void const_constraints(const Array& a) {
Chris@16 160
Chris@16 161 // value_type vt = a[ id ];
Chris@16 162
Chris@16 163 // Test slicing, keeping only the first dimension, losing the rest
Chris@16 164 detail::idgen_helper<NumDims-1>::call(a,idgen[range],id);
Chris@16 165
Chris@16 166 // Test slicing, keeping all dimensions.
Chris@16 167 detail::idgen_helper<NumDims-1>::call(a,idgen[range],range);
Chris@16 168
Chris@16 169 st = a.size();
Chris@16 170 st = a.num_dimensions();
Chris@16 171 st = a.num_elements();
Chris@16 172 stp = a.shape();
Chris@16 173 idp = a.strides();
Chris@16 174 idp = a.index_bases();
Chris@16 175 cit = a.begin();
Chris@16 176 cit = a.end();
Chris@16 177 crit = a.rbegin();
Chris@16 178 crit = a.rend();
Chris@16 179 eltp = a.origin();
Chris@16 180 }
Chris@16 181
Chris@16 182 typedef typename Array::value_type value_type;
Chris@16 183 typedef typename Array::reference reference;
Chris@16 184 typedef typename Array::const_reference const_reference;
Chris@16 185 typedef typename Array::size_type size_type;
Chris@16 186 typedef typename Array::difference_type difference_type;
Chris@16 187 typedef typename Array::iterator iterator;
Chris@16 188 typedef typename Array::const_iterator const_iterator;
Chris@16 189 typedef typename Array::reverse_iterator reverse_iterator;
Chris@16 190 typedef typename Array::const_reverse_iterator const_reverse_iterator;
Chris@16 191 typedef typename Array::element element;
Chris@16 192 typedef typename Array::index index;
Chris@16 193 typedef typename Array::index_gen index_gen;
Chris@16 194 typedef typename Array::index_range index_range;
Chris@16 195 typedef typename Array::extent_gen extent_gen;
Chris@16 196 typedef typename Array::extent_range extent_range;
Chris@16 197
Chris@16 198 Array a;
Chris@16 199 size_type st;
Chris@16 200 const size_type* stp;
Chris@16 201 index id;
Chris@16 202 const index* idp;
Chris@16 203 iterator it;
Chris@16 204 const_iterator cit;
Chris@16 205 reverse_iterator rit;
Chris@16 206 const_reverse_iterator crit;
Chris@16 207 const element* eltp;
Chris@16 208 index_gen idgen;
Chris@16 209 index_range range;
Chris@16 210 };
Chris@16 211
Chris@16 212
Chris@16 213 } // namespace multi_array
Chris@16 214
Chris@16 215 namespace detail {
Chris@16 216 namespace multi_array { // Old locations for these
Chris@16 217 using boost::multi_array_concepts::ConstMultiArrayConcept;
Chris@16 218 using boost::multi_array_concepts::MutableMultiArrayConcept;
Chris@16 219 }
Chris@16 220 }
Chris@16 221
Chris@16 222 } // namespace boost
Chris@16 223
Chris@16 224
Chris@16 225 #endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP