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