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
|