1 // Copyright 2002 The Trustees of Indiana University.
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)
7 // Boost.MultiArray Library
8 // Authors: Ronald Garcia
11 // See http://www.boost.org/libs/multi_array for documentation.
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"
22 #include "boost/iterator/iterator_concepts.hpp"
26 namespace multi_array
{
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
>
40 template <typename Array
, typename IdxGen
, typename Call_Type
>
41 static void call(Array
& a
, const IdxGen
& idgen
, Call_Type c
) {
42 typedef typename
Array::index_range index_range
;
43 typedef typename
Array::index index
;
44 idgen_helper
<N
-1>::call(a
,idgen
[c
],c
);
49 struct idgen_helper
<0> {
51 template <typename Array
, typename IdxGen
, typename Call_Type
>
52 static void call(Array
& a
, const IdxGen
& idgen
, Call_Type
) {
53 typedef typename
Array::index_range index_range
;
54 typedef typename
Array::index index
;
60 template <typename Array
, std::size_t NumDims
>
61 struct ConstMultiArrayConcept
64 // function_requires< CopyConstructibleConcept<Array> >();
65 function_requires
< boost_concepts::ForwardTraversalConcept
<iterator
> >();
66 function_requires
< boost_concepts::ReadableIteratorConcept
<iterator
> >();
67 function_requires
< boost_concepts::ForwardTraversalConcept
<const_iterator
> >();
68 function_requires
< boost_concepts::ReadableIteratorConcept
<const_iterator
> >();
70 // RG - a( CollectionArchetype) when available...
72 // Test slicing, keeping only the first dimension, losing the rest
73 idgen_helper
<NumDims
-1>::call(a
,idgen
[range
],id
);
75 // Test slicing, keeping all dimensions.
76 idgen_helper
<NumDims
-1>::call(a
,idgen
[range
],range
);
79 st
= a
.num_dimensions();
80 st
= Array::dimensionality
;
81 st
= a
.num_elements();
84 idp
= a
.index_bases();
92 typedef typename
Array::value_type value_type
;
93 typedef typename
Array::reference reference
;
94 typedef typename
Array::const_reference const_reference
;
95 typedef typename
Array::size_type size_type
;
96 typedef typename
Array::difference_type difference_type
;
97 typedef typename
Array::iterator iterator
;
98 typedef typename
Array::const_iterator const_iterator
;
99 typedef typename
Array::reverse_iterator reverse_iterator
;
100 typedef typename
Array::const_reverse_iterator const_reverse_iterator
;
101 typedef typename
Array::element element
;
102 typedef typename
Array::index index
;
103 typedef typename
Array::index_gen index_gen
;
104 typedef typename
Array::index_range index_range
;
105 typedef typename
Array::extent_gen extent_gen
;
106 typedef typename
Array::extent_range extent_range
;
110 const size_type
* stp
;
114 const_reverse_iterator crit
;
121 template <typename Array
, std::size_t NumDims
>
122 struct MutableMultiArrayConcept
125 // function_requires< CopyConstructibleConcept<Array> >();
127 function_requires
< boost_concepts::ForwardTraversalConcept
<iterator
> >();
128 function_requires
< boost_concepts::ReadableIteratorConcept
<iterator
> >();
129 function_requires
< boost_concepts::WritableIteratorConcept
<iterator
> >();
130 function_requires
< boost_concepts::ForwardTraversalConcept
<const_iterator
> >();
131 function_requires
< boost_concepts::ReadableIteratorConcept
<const_iterator
> >();
133 // RG - a( CollectionArchetype) when available...
134 value_type vt
= a
[ id
];
136 // Test slicing, keeping only the first dimension, losing the rest
137 idgen_helper
<NumDims
-1>::call(a
,idgen
[range
],id
);
139 // Test slicing, keeping all dimensions.
140 idgen_helper
<NumDims
-1>::call(a
,idgen
[range
],range
);
143 st
= a
.num_dimensions();
144 st
= a
.num_elements();
147 idp
= a
.index_bases();
153 const_constraints(a
);
156 void const_constraints(const Array
& a
) {
158 // value_type vt = a[ id ];
160 // Test slicing, keeping only the first dimension, losing the rest
161 idgen_helper
<NumDims
-1>::call(a
,idgen
[range
],id
);
163 // Test slicing, keeping all dimensions.
164 idgen_helper
<NumDims
-1>::call(a
,idgen
[range
],range
);
167 st
= a
.num_dimensions();
168 st
= a
.num_elements();
171 idp
= a
.index_bases();
179 typedef typename
Array::value_type value_type
;
180 typedef typename
Array::reference reference
;
181 typedef typename
Array::const_reference const_reference
;
182 typedef typename
Array::size_type size_type
;
183 typedef typename
Array::difference_type difference_type
;
184 typedef typename
Array::iterator iterator
;
185 typedef typename
Array::const_iterator const_iterator
;
186 typedef typename
Array::reverse_iterator reverse_iterator
;
187 typedef typename
Array::const_reverse_iterator const_reverse_iterator
;
188 typedef typename
Array::element element
;
189 typedef typename
Array::index index
;
190 typedef typename
Array::index_gen index_gen
;
191 typedef typename
Array::index_range index_range
;
192 typedef typename
Array::extent_gen extent_gen
;
193 typedef typename
Array::extent_range extent_range
;
197 const size_type
* stp
;
202 reverse_iterator rit
;
203 const_reverse_iterator crit
;
210 } // namespace multi_array
211 } // namespace detail
215 #endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP