24 #include "../SliceTest.h"
32 namespace astrotypes {
65 template<
int NDim,
typename ValueType=
int>
69 typedef typename std::vector<value_type>::iterator
iterator;
78 while(index<
_vec.size()) {
92 template<
typename Dimension>
97 template<
typename Dimension>
112 ASSERT_EQ(11U, static_cast<std::size_t>(slice.
size<
DimensionA>()));
113 ASSERT_EQ(0U, static_cast<std::size_t>(slice.
size<
DimensionB>()));
119 ASSERT_EQ(slice[i], i+ 10U);
130 auto it = slice.
begin();
131 typedef typename std::iterator_traits<typename decltype(p)::iterator>::iterator_category expected_iterator_category;
132 static_assert(std::is_same<std::iterator_traits<decltype(it)>::iterator_category, expected_iterator_category>::value,
133 "expecting a vector iterator category");
134 auto const& const_slice = slice;
135 auto it2 = const_slice.
begin();
136 static_assert(std::is_same<std::iterator_traits<decltype(it2)>::iterator_category, expected_iterator_category>::value,
137 "expecting a vector iterator category");
138 auto it3 = const_slice.cbegin();
139 static_assert(std::is_same<std::iterator_traits<decltype(it3)>::iterator_category, expected_iterator_category>::value,
140 "expecting a vector iterator category");
143 ASSERT_FALSE(it == slice.
end()) <<
"i=" << i <<
" end=" << *slice.
end() <<
" it=" << *it;
144 ASSERT_FALSE(it2 == slice.
end()) <<
"i=" << i <<
" end=" << *slice.
end() <<
" it=" << *it2;
145 ASSERT_FALSE(it3 == slice.
cend()) <<
"i=" << i <<
" end=" << *slice.
cend() <<
" it=" << *it3;
146 ASSERT_EQ(*it, i+ 10U);
147 ASSERT_EQ(*it2, i+ 10U);
148 ASSERT_EQ(*it3, i+ 10U);
151 ASSERT_EQ(*it, i+ 11U);
156 ASSERT_TRUE(it == slice.
end()) <<
"end=" << *slice.
end() <<
" it=" << *it;
157 ASSERT_TRUE(it2 == slice.
end()) <<
"end=" << *slice.
cend() <<
" it2=" << *it2;
158 ASSERT_TRUE(it3 == slice.
cend()) <<
"end=" << *slice.
cend() <<
" it3=" << *it3;
166 auto it = slice.
begin();
167 auto it2 = slice.
begin();
169 ASSERT_EQ(i, it2 - it) << i;
180 ASSERT_EQ(slice, slice_2);
182 ASSERT_FALSE(slice==slice_2);
198 Slice<true, ParentType<1>, TestSliceMixin,
DimensionA> const_slice_copy = const_slice;
199 ASSERT_EQ(&const_slice_copy.
parent(), &const_slice.parent());
208 auto it = slice.
begin();
209 decltype(it) copy_it = it;
210 ASSERT_TRUE(copy_it == it);
212 auto const_it = slice.
cbegin();
213 decltype(const_it) copy_const_it = const_it;
214 ASSERT_TRUE(copy_const_it == const_it);
230 ASSERT_EQ(&p, &slice.
parent());
231 ASSERT_EQ(&p, &const_slice.
parent());
234 ASSERT_EQ(10U, static_cast<std::size_t>(slice.
size<DimensionA>()));
235 ASSERT_EQ(3U, static_cast<std::size_t>(slice.
size<
DimensionB>()));
236 ASSERT_EQ(10U, static_cast<std::size_t>(slice.
dimension<DimensionA>()));
246 ASSERT_EQ(slice[i][j], (static_cast<std::size_t>(i) + 10U) * static_cast<std::size_t>(p.
size<
DimensionB>()) + static_cast<std::size_t>(j) + 20U) <<
"i=" << i <<
" j=" << j;
247 ASSERT_EQ(const_slice[i][j], (static_cast<std::size_t>(i) + 10U) * static_cast<std::size_t>(p.
size<
DimensionB>()) + static_cast<std::size_t>(j) + 20U) <<
"i=" << i <<
" j=" << j;
248 ASSERT_EQ(slice[j][i], slice[i][j]) <<
"i=" << i <<
" j=" << j;
249 ASSERT_EQ(const_slice[j][i], slice[i][j]) <<
"i=" << i <<
" j=" << j;
267 ASSERT_EQ(10U, static_cast<std::size_t>(slice_a.
size<DimensionA>()));
268 ASSERT_EQ(3U, static_cast<std::size_t>(slice_a.
size<
DimensionB>()));
269 ASSERT_EQ(10U, static_cast<std::size_t>(slice_b.
size<DimensionA>()));
270 ASSERT_EQ(3U, static_cast<std::size_t>(slice_b.
size<
DimensionB>()));
275 ASSERT_EQ(50U, static_cast<std::size_t>(slice_c.
size<DimensionA>()));
276 ASSERT_EQ(3U, static_cast<std::size_t>(slice_c.
size<
DimensionB>()));
282 ASSERT_EQ(10U, static_cast<std::size_t>(slice_d.
size<DimensionA>()));
283 ASSERT_EQ(50U, static_cast<std::size_t>(slice_d.
size<
DimensionB>()));
293 auto it = slice.
begin();
294 auto const_it = slice.
cbegin();
298 ASSERT_EQ(slice[i][j], *it);
299 ASSERT_EQ(slice[i][j], *const_it);
321 Slice<true, ParentType<2>, TestSliceMixin, DimensionA,
DimensionB> const_slice_copy = const_slice;
322 ASSERT_EQ(&const_slice_copy.
parent(), &const_slice.parent());
333 auto it = slice.
begin();
334 decltype(it) copy_it = it;
335 ASSERT_TRUE(it == copy_it);
337 auto const_it = slice.
cbegin();
338 decltype(const_it) copy_const_it = const_it;
339 ASSERT_TRUE(const_it == copy_const_it);
351 auto it = slice.
begin();
352 auto const_it = slice.
cbegin();
355 ASSERT_EQ(&*const_it(overlay_p), &*overlay_p.
begin() + 10 * p.
size<
DimensionB>() + 20) <<
"overlay begin=" << &*overlay_p.
begin();
359 ASSERT_EQ(&*const_it(overlay_different_type), &*overlay_different_type.
begin() + 10 * p.
size<
DimensionB>() + 20);
372 auto it = slice.begin();
373 auto const_it = slice.cbegin();
377 ASSERT_EQ(slice[i][j], *it) <<
"i=" << i <<
" j=" << j;
378 ASSERT_EQ(slice[i][j], *const_it) <<
"i=" << i <<
" j=" << j;
388 auto it = slice.begin();
389 auto const_it = slice.cbegin();
393 ASSERT_EQ(slice[i][j], *it);
394 ASSERT_EQ(slice[i][j], *const_it);
403 auto it = slice.begin();
404 auto const_it = slice.cbegin();
408 ASSERT_EQ(slice[i][j], *it);
409 ASSERT_EQ(slice[i][j], *const_it);
424 auto it = slice.
begin();
425 auto it2 = slice.
begin();
427 std::size_t count = 0;
428 while(it2 != slice.
end()) {
429 ASSERT_EQ(count, it2 - it) << count;
444 ASSERT_EQ(10U, static_cast<std::size_t>(slice.
size<DimensionA>()));
445 ASSERT_EQ(3U, static_cast<std::size_t>(slice.
size<DimensionB>()));
446 ASSERT_EQ(5U, static_cast<std::size_t>(slice.
size<
DimensionC>()));
456 ASSERT_EQ(slice[i][j][k],
457 ((std::size_t)i + 1U) * static_cast<std::size_t>(p.
size<DimensionB>()) * static_cast<std::size_t>(p.
size<
DimensionC>())
458 + ((std::size_t)j + 20U) * static_cast<std::size_t>(p.
size<
DimensionC>())
459 + (std::size_t)k + 2U) <<
"i=" << i <<
" j=" << j <<
" k=" << k;
460 ASSERT_EQ(slice[i][j][k], slice[i][k][j]);
482 ASSERT_EQ(5U, static_cast<std::size_t>(sub_slice.
size<DimensionA>()));
483 ASSERT_EQ(3U, static_cast<std::size_t>(sub_slice.
size<DimensionB>()));
484 ASSERT_EQ(5U, static_cast<std::size_t>(sub_slice.
size<
DimensionC>()));
489 ASSERT_EQ(sub_slice[i][j][k],
490 ((std::size_t)i + 1U + 2U) * static_cast<std::size_t>(p.
size<DimensionB>()) * static_cast<std::size_t>(p.
size<
DimensionC>())
491 + ((std::size_t)j + 20U) * static_cast<std::size_t>(p.
size<
DimensionC>())
492 + (std::size_t)k + 2U) <<
"i=" << i <<
" j=" << j <<
" k=" << k;
509 auto it = sub_slice.
begin();
510 auto end = sub_slice.
end();
515 ASSERT_EQ( val, sub_slice[i][j][k]) <<
"i=" << i <<
" j=" << j <<
" k=" << k;
516 ASSERT_FALSE(it == end) <<
"i=" << i <<
" j=" << j <<
" k=" << k <<
" end=" << *end <<
" it=" << *it;
521 ASSERT_TRUE(it == sub_slice.
end()) <<
"end=" << *sub_slice.
end() <<
" it=" << *it;
535 auto it = sub_slice.
begin();
536 static_assert(std::is_same<std::iterator_traits<decltype(it)>::iterator_category, std::forward_iterator_tag>::value,
"expecting a forward iterator");
537 auto it2 = sub_slice.
cbegin();
538 static_assert(std::is_same<std::iterator_traits<decltype(it2)>::iterator_category, std::forward_iterator_tag>::value,
"expecting a forward iterator");
543 ASSERT_EQ( val, sub_slice[i][j][k]) <<
"i=" << i <<
" j=" << j <<
" k=" << k;
544 ASSERT_FALSE(it == sub_slice.
end()) <<
"i=" << i <<
" j=" << j <<
" k=" << k <<
" end=" << *sub_slice.
end() <<
" it=" << *it;
545 ASSERT_FALSE(it2 == sub_slice.
cend()) <<
"i=" << i <<
" j=" << j <<
" k=" << k <<
" end=" << *sub_slice.
cend() <<
" it2=" << *it2;
551 ASSERT_TRUE(it == sub_slice.
end()) <<
"end=" << *sub_slice.
end() <<
" it=" << *it;
552 ASSERT_TRUE(it2 == sub_slice.
cend()) <<
"end=" << *sub_slice.
cend() <<
" it2=" << *it2;
563 auto it = slice.
begin();
564 auto it2 = slice.
begin();
566 std::size_t count = 0;
567 while(it2 != slice.
end()) {
568 ASSERT_EQ(count, it2 - it) << count;
588 ASSERT_EQ(slice, slice_2);
594 ASSERT_FALSE(slice==slice_2);
iterator end()
iterator pointing to just after the last element
A tagged dimensionIndex variable.
iterator begin()
iterator pointing to the first element in the slice
Defines a contiguous range over dimension in index.
std::vector< value_type > _vec
std::vector< value_type >::const_iterator const_iterator
Representation of a Slice through a Data Array.
std::enable_if< std::is_same< Dim, Dimension >::value, DimensionSize< Dimension > >::type size() const
DimensionSize< Dimension > size() const
TEST_F(MultiArrayTest, test_single_dimension_size)
std::enable_if< arg_helper< Dimension, Dims...>::value, SliceType >::type slice(DimensionSpan< Dims > const &...spans)
Take a sub-slice from this slice pass a DimensionSpan object for each dimension you wish ...
TestSliceMixin(T const &t)
std::vector< value_type >::iterator iterator
const_iterator cend() const
Parent & parent() const
return refernce to the parent object the Slice is based on
return true if the Dimensions provided match exactly those of the structure T (including order) ...
A compile time dimesion tagging of size_t.
const_iterator begin() const
return true if the Dimension is represented in the structure
ParentType(std::size_t size)
const_iterator cbegin() const
DimensionSize< Dimension > dimension() const
std::enable_if< std::is_same< Dim, Dimension >::value, DimensionSize< Dimension > >::type dimension() const