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