35static std::valarray<std::size_t>
38 std::size_t
buf [256];
44 unsigned long val = std::strtoul (
s, &end, 10);
59 return std::valarray<std::size_t>(
buf,
i);
66get_array_size (
const std::gslice &gsl)
68 const std::valarray<std::size_t> sizes = gsl.size ();
70 std::size_t asize = sizes.size () ? 1 : 0;
72 for (std::size_t
i = 0;
i != sizes.size (); ++
i) {
83next_index (
const std::gslice &gsl, std::valarray<std::size_t> &factors)
85 const std::size_t
start = gsl.start ();
86 const std::valarray<std::size_t> asizes = gsl.size ();
87 const std::valarray<std::size_t> astrides = gsl.stride ();
89 const std::size_t ndims = asizes.size ();
91 std::size_t
inx = ndims;
93 if (0 == factors.size ()) {
94 factors.resize (ndims);
100 if ( asizes [
inx - 1]
101 && factors [
inx - 1] != asizes [
inx - 1] - 1)
113 if (
inx < factors.size ()) {
114 for (std::size_t
i =
inx;
i != ndims; ++
i)
118 inx = factors.size ();
122 for (std::size_t
i = 0;
i !=
inx; ++
i)
123 index += factors [
i] * astrides [
i];
131static std::valarray<std::size_t>
132get_index_array (
const std::gslice &gsl)
134 const std::size_t
size = get_array_size (gsl);
136 std::valarray<std::size_t> indices (
size);
138 std::valarray<std::size_t> tmpstore;
140 for (std::size_t
i = 0;
i !=
size; ++
i)
141 indices [
i] = next_index (gsl, tmpstore);
149test_gslice (std::size_t
start,
153 const std::valarray<std::size_t> asizes (make_array (sizes));
154 const std::valarray<std::size_t> astrides (make_array (strides));
156 const std::gslice gsl (
start, asizes, astrides);
158 const std::valarray<std::size_t> indices = get_index_array (gsl);
160 std::size_t maxinx = 0;
162 for (std::size_t
i = 0;
i != indices.size (); ++
i)
163 if (maxinx < indices [
i])
164 maxinx = indices [
i];
166 std::valarray<std::size_t> va (indices.size () ? maxinx + 1 : 0);
167 for (std::size_t
i = 0;
i != va.size (); ++
i)
170 for (
int i = 0;
i != 3; ++
i) {
175 const std::valarray<std::size_t> array_slice =
176 i < 2 ? va [gsl] : va [std::gslice (gsl)];
178 bool equal = array_slice.size () == indices.size ();
181 "size() == %zu, got %zu",
182 indices.size (), array_slice.size ());
185 for (std::size_t
j = 0;
j != array_slice.size (); ++
j) {
187 equal = array_slice [
j] == va [indices [
j]];
190 "mismatch at %u, index %u: expected %u, got %u",
191 j, indices [
j], va [indices [
j]],
201test_gslice (
const char *sizes,
const char *strides)
203 for (std::size_t
i = 0;
i != 10; ++
i)
204 test_gslice (
i, sizes, strides);
212 test_gslice (
"1",
"1");
213 test_gslice (
"1",
"2");
214 test_gslice (
"2",
"1");
215 test_gslice (
"2",
"3");
216 test_gslice (
"3",
"2");
218 test_gslice (
"1,1",
"1,1");
219 test_gslice (
"1,1",
"1,2");
220 test_gslice (
"1,1",
"2,1");
221 test_gslice (
"1,9",
"2,1");
222 test_gslice (
"9,1",
"2,1");
224 test_gslice (
"1,1,1",
"1,1,1");
225 test_gslice (
"1,2,3",
"4,5,6");
226 test_gslice (
"6,5,4",
"3,2,1");
227 test_gslice (
"10,11,12",
"13,14,15");
230 test_gslice (
"2,4,3",
"19,4,1");
233 test_gslice (
"2,4,3",
"1,1,1");
240int main (
int argc,
char *argv[])
242 return rw_test (argc, argv, __FILE__,
bool equal(const T &x, const U &y)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
constexpr std::array< T, sizeof...(Args)> make_array(Args &&... args)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)