1 // Copyright (C) 2002 Ronald Garcia
3 // Permission to copy, use, sell and distribute this software is granted
4 // provided this copyright notice appears in all copies.
5 // Permission to modify the code and to distribute modified code is granted
6 // provided this copyright notice appears in all copies, and a notice
7 // that the code was modified is included with the copyright notice.
9 // This software is provided "as is" without express or implied warranty,
10 // and with no claim as to its suitability for any purpose.
13 #ifndef BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
14 #define BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
17 // concept-checks.hpp - Checks out Const MultiArray and MultiArray
21 #include "boost/concept_check.hpp"
25 namespace multi_array {
29 // This is a helper for generating index_gen instantiations with
30 // the right type in order to test the call to
31 // operator[](index_gen). Since one would normally write:
32 // A[ indices[range1][range2] ]; // or
33 // B[ indices[index1][index2][range1] ];
34 // idgen helper allows us to generate the "indices" type by
35 // creating it through recursive calls.
36 template <std::size_t N>
39 template <typename Array, typename IdxGen, typename Call_Type>
40 static void call(Array& a, const IdxGen& idgen, Call_Type c) {
41 typedef typename Array::index_range index_range;
42 typedef typename Array::index index;
43 idgen_helper<N-1>::call(a,idgen[c],c);
48 struct idgen_helper<0> {
50 template <typename Array, typename IdxGen, typename Call_Type>
51 static void call(Array& a, const IdxGen& idgen, Call_Type) {
52 typedef typename Array::index_range index_range;
53 typedef typename Array::index index;
59 template <typename Array, std::size_t NumDims >
60 struct ConstMultiArrayConcept
63 // function_requires< CopyConstructibleConcept<Array> >();
65 // RG - a( CollectionArchetype) when available...
67 // Test slicing, keeping only the first dimension, losing the rest
68 idgen_helper<NumDims-1>::call(a,idgen[range],id);
70 // Test slicing, keeping all dimensions.
71 idgen_helper<NumDims-1>::call(a,idgen[range],range);
74 st = a.num_dimensions();
75 st = a.num_elements();
78 idp = a.index_bases();
86 typedef typename Array::value_type value_type;
87 typedef typename Array::reference reference;
88 typedef typename Array::const_reference const_reference;
89 typedef typename Array::size_type size_type;
90 typedef typename Array::difference_type difference_type;
91 typedef typename Array::iterator iterator;
92 typedef typename Array::const_iterator const_iterator;
93 typedef typename Array::reverse_iterator reverse_iterator;
94 typedef typename Array::const_reverse_iterator const_reverse_iterator;
95 typedef typename Array::element element;
96 typedef typename Array::index index;
97 typedef typename Array::index_gen index_gen;
98 typedef typename Array::index_range index_range;
99 typedef typename Array::extent_gen extent_gen;
100 typedef typename Array::extent_range extent_range;
104 const size_type* stp;
108 const_reverse_iterator crit;
115 template <typename Array, std::size_t NumDims >
116 struct MutableMultiArrayConcept
119 // function_requires< CopyConstructibleConcept<Array> >();
121 // RG - a( CollectionArchetype) when available...
122 value_type vt = a[ id ];
124 // Test slicing, keeping only the first dimension, losing the rest
125 idgen_helper<NumDims-1>::call(a,idgen[range],id);
127 // Test slicing, keeping all dimensions.
128 idgen_helper<NumDims-1>::call(a,idgen[range],range);
131 st = a.num_dimensions();
132 st = a.num_elements();
135 idp = a.index_bases();
141 const_constraints(a);
144 void const_constraints(const Array& a) {
146 // value_type vt = a[ id ];
148 // Test slicing, keeping only the first dimension, losing the rest
149 idgen_helper<NumDims-1>::call(a,idgen[range],id);
151 // Test slicing, keeping all dimensions.
152 idgen_helper<NumDims-1>::call(a,idgen[range],range);
155 st = a.num_dimensions();
156 st = a.num_elements();
159 idp = a.index_bases();
167 typedef typename Array::value_type value_type;
168 typedef typename Array::reference reference;
169 typedef typename Array::const_reference const_reference;
170 typedef typename Array::size_type size_type;
171 typedef typename Array::difference_type difference_type;
172 typedef typename Array::iterator iterator;
173 typedef typename Array::const_iterator const_iterator;
174 typedef typename Array::reverse_iterator reverse_iterator;
175 typedef typename Array::const_reverse_iterator const_reverse_iterator;
176 typedef typename Array::element element;
177 typedef typename Array::index index;
178 typedef typename Array::index_gen index_gen;
179 typedef typename Array::index_range index_range;
180 typedef typename Array::extent_gen extent_gen;
181 typedef typename Array::extent_range extent_range;
185 const size_type* stp;
190 reverse_iterator rit;
191 const_reverse_iterator crit;
198 } // namespace multi_array
199 } // namespace detail
203 #endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP