Can anyone help shed light on the following?
Suppose I have a 1d-array of size 10 (index base is 0). If I create a view
on [0,10), strided by 3, shouldn't the size of the result be 4,
corresponding to indices 0, 3, 6 and 9? Instead I get 3.
Please forgive me if I'm off the mark here, as I'm new to boost in general
and
MultiArray in particular.
The relevant line (assuming len => size) in boost/multi_array/base.hpp seems
to be
index len = (finish - start) / index_factor;
(boost::detail::multi_array::multi_array_impl_base<>::generate_array_view()
line 427).
I would have written
index len = 1 + (finish - 1 - start) / index_factor;
The following code sample should make all clear. Any clarification greatly
appreciated.
Cheers,
Ben
typedef boost::multi_array array_type;
typedef array_type::index index;
typedef array_type::index_range range;
index i;
int values = 0;
// Setup our base array and data.
// A is a 1-d array with size 10, indices 0,1,...,9 and values
0,1,...,9.
array_type A(boost::extents[10]);
for(i = 0; i != 10; ++i)
A[i] = values++;
for(i = 0; i != 10; ++i)
assert(A[i]==i);
assert(A.size()==10);
// The following views of A should all be effectively the same,
// corresponding to indices 0,3,6,9 of A, so having
// size 4, indices 0,1,2,3 and values 0,3,6,9?
array_type::array_view<1>::type view1 =
A[boost::indices[range(0,12,3)] ];
array_type::array_view<1>::type view2 =
A[boost::indices[range(0,11,3)] ];
array_type::array_view<1>::type view3 =
A[boost::indices[range(0,10,3)] ];
for(i = 0; i != 4; ++i)
{
assert(A[i*3]==view1[i]);
assert(A[i*3]==view2[i]);
assert(A[i*3]==view3[i]);
}
assert(view1.size()==4);
assert(view2.size()==4); // Assert fails!?
assert(view3.size()==4); // Assert fails!?