diff --git a/include/xtensor/views/xview.hpp b/include/xtensor/views/xview.hpp index c647572de..60dd0f287 100644 --- a/include/xtensor/views/xview.hpp +++ b/include/xtensor/views/xview.hpp @@ -1316,14 +1316,10 @@ namespace xt ); std::ptrdiff_t result = 0; - std::size_t i = 0; - for (; i < std::min(sizeof...(S), m_e.strides().size()); ++i) + for (std::size_t i = 0; i < sizeof...(S); ++i) { - result += temp[i] * m_e.strides()[i - newaxis_count_before(i)]; - } - for (; i < sizeof...(S); ++i) - { - result += temp[i]; + std::size_t index = i - newaxis_count_before(i); + result += temp[i] * (index < m_e.strides().size() ? m_e.strides()[index] : 1); } return static_cast(result) + m_e.data_offset(); } diff --git a/test/test_xview.cpp b/test/test_xview.cpp index 8069bb016..0100f1e7b 100644 --- a/test/test_xview.cpp +++ b/test/test_xview.cpp @@ -1457,6 +1457,26 @@ namespace xt EXPECT_EQ(static_cast(doe2), do2); } + TEST(xview, multiple_leading_newaxis_data_offset) + { + xarray a = {{0, 1}, {2, 3}}; + auto v = view(a, newaxis(), newaxis(), range(1, 2), all()); + + view_shape_type expected_shape = {1, 1, 1, 2}; + EXPECT_EQ(v.shape(), expected_shape); + EXPECT_EQ(v.data_offset(), size_t(2)); + EXPECT_EQ(v(0, 0, 0, 0), 2); + EXPECT_EQ(v(0, 0, 0, 1), 3); + + xarray copied = v; + xarray expected_copy = {{{{2, 3}}}}; + EXPECT_EQ(copied, expected_copy); + + v = 100; + xarray expected_parent = {{0, 1}, {100, 100}}; + EXPECT_EQ(a, expected_parent); + } + TEST(xview, view_simd_test) { if (XTENSOR_DEFAULT_LAYOUT == layout_type::row_major)