diff --git a/include/sparrow/fixed_size_layout.hpp b/include/sparrow/fixed_size_layout.hpp index afb89527..63a3384a 100644 --- a/include/sparrow/fixed_size_layout.hpp +++ b/include/sparrow/fixed_size_layout.hpp @@ -120,8 +120,8 @@ namespace sparrow using value_range = std::ranges::subrange; // TODO: implement with `begin` and `end` once the iterator is available. - // using iterator = reference_proxy::iterator; - // using const_iterator = const_reference_proxy::iterator; + // using iterator = layout_iterator; + // using const_iterator = layout_iterator; explicit fixed_size_layout(array_data p); @@ -226,29 +226,28 @@ namespace sparrow { // We only require the presence of the bitmap and the first buffer. assert(m_data.buffers.size() > 0); - assert(m_data.length == m_data.buffers[0].size()); assert(m_data.length == m_data.bitmap.size()); } template auto fixed_size_layout::size() const -> size_type { - assert(m_data.buffers.size() > 0); - return m_data.buffers[0].size(); + assert(m_data.offset <= m_data.length); + return static_cast(m_data.length - m_data.offset); } template auto fixed_size_layout::value(size_type i) -> inner_reference { assert(i < size()); - return data()[i]; + return data()[i + m_data.offset]; } template auto fixed_size_layout::value(size_type i) const -> inner_const_reference { assert(i < size()); - return data()[i]; + return data()[i + m_data.offset]; } template @@ -293,76 +292,76 @@ namespace sparrow auto fixed_size_layout::has_value(size_type i) -> bitmap_reference { assert(i < size()); - return m_data.bitmap[i]; + return m_data.bitmap[i + m_data.offset]; } template auto fixed_size_layout::has_value(size_type i) const -> bitmap_const_reference { assert(i < size()); - return m_data.bitmap[i]; + return m_data.bitmap[i + m_data.offset]; } template auto fixed_size_layout::value_begin() -> value_iterator { - return value_iterator{data()}; + return value_iterator{data() + m_data.offset}; } template auto fixed_size_layout::value_end() -> value_iterator { - return value_iterator{data() + size()}; + return value_begin() + size(); } template auto fixed_size_layout::value_cbegin() const -> const_value_iterator { - return const_value_iterator{data()}; + return const_value_iterator{data() + m_data.offset}; } template auto fixed_size_layout::value_cend() const -> const_value_iterator { - return const_value_iterator{data() + size()}; + return value_cbegin() + size(); } template auto fixed_size_layout::bitmap_begin() -> bitmap_iterator { - return m_data.bitmap.begin(); + return m_data.bitmap.begin() + m_data.offset; } template auto fixed_size_layout::bitmap_end() -> bitmap_iterator { - return m_data.bitmap.begin() + size(); + return bitmap_begin() + size(); } template auto fixed_size_layout::bitmap_cbegin() const -> const_bitmap_iterator { - return m_data.bitmap.cbegin(); + return m_data.bitmap.cbegin() + m_data.offset; } template auto fixed_size_layout::bitmap_cend() const -> const_bitmap_iterator { - return m_data.bitmap.cbegin() + size(); + return bitmap_cbegin() + size(); } template auto fixed_size_layout::data() -> pointer { assert(m_data.buffers.size() > 0); - return m_data.buffers[0].data(); + return m_data.buffers[0].template data(); } template auto fixed_size_layout::data() const -> const_pointer { assert(m_data.buffers.size() > 0); - return m_data.buffers[0].data(); + return m_data.buffers[0].template data(); } } // namespace sparrow diff --git a/test/test_layout.cpp b/test/test_layout.cpp index e1038f4b..249a650c 100644 --- a/test/test_layout.cpp +++ b/test/test_layout.cpp @@ -25,7 +25,8 @@ namespace sparrow // static_assert(std::contiguous_iterator>); // static_assert(std::contiguous_iterator>); - using layout_test_type = fixed_size_layout; + using data_type_t = int32_t; + using layout_test_type = fixed_size_layout; namespace { @@ -33,15 +34,14 @@ namespace sparrow { size_t n = 10; array_data ad; - - ad.type = data_descriptor(data_type::UINT8); + ad.type = data_descriptor(data_type::INT32); ad.bitmap = dynamic_bitset(n, true); - buffer b(n); - std::iota(b.begin(), b.end(), 0); - + size_t buffer_size = (n * sizeof(data_type_t)) / sizeof(uint8_t); + buffer b(buffer_size); + std::iota(b.data(), b.data() + n, -8); ad.buffers.push_back(b); ad.length = n; - ad.offset = 0; + ad.offset = 1; ad.child_data.push_back(array_data()); return ad; } @@ -54,11 +54,12 @@ namespace sparrow { array_data ad = make_test_array_data(); layout_test_type lt(ad); - REQUIRE(lt.size() == ad.length); + CHECK_EQ(lt.size(), ad.length - ad.offset); + auto buffer_data = ad.buffers[0].data(); for (std::size_t i = 0; i < lt.size(); ++i) { - CHECK_EQ(lt[i].value(), ad.buffers[0][i]); + CHECK_EQ(lt[i].value(), buffer_data[i + ad.offset]); } } @@ -90,4 +91,5 @@ namespace sparrow } } + }