diff --git a/include/vectorwrapper/sequence_range.hpp b/include/vectorwrapper/sequence_range.hpp index 5f5ec22..9260fee 100644 --- a/include/vectorwrapper/sequence_range.hpp +++ b/include/vectorwrapper/sequence_range.hpp @@ -83,6 +83,7 @@ namespace vwr { private: V m_current; const sequence_range_type& m_seq; + size_type m_active_elem; }; template @@ -118,10 +119,14 @@ namespace vwr { namespace implem { template struct get_at_index; - template - struct get_at_index { - static_assert(SEEK == IDX, "Index out of range"); - static constexpr size_type value = I; + template + struct get_at_index { + static constexpr size_type value = N; + }; + template + struct get_at_index { + static_assert(SEEK < IDX, "Index out of range"); + static constexpr size_type value = 0; }; template struct get_at_index { @@ -155,7 +160,8 @@ namespace vwr { template sequence_range_iterator::sequence_range_iterator (const V& parCurrent, const sequence_range_type& parSeq) : m_current(parCurrent), - m_seq(parSeq) + m_seq(parSeq), + m_active_elem(implem::get_at_index<0, 0, I...>::value) { } @@ -174,6 +180,7 @@ namespace vwr { m_current[index] = m_seq.from()[index]; index = lst[count++]; m_current[index] = advance_op(m_current[index], m_seq.step()[index]); + m_active_elem = index; } while (count < sizeof...(I) and not cmp_op(m_current[index], m_seq.upper()[index])); } @@ -182,14 +189,17 @@ namespace vwr { template bool sequence_range_iterator::operator!= (const sequence_range_iterator& parOther) const { - assert(&m_seq.from() == &parOther.m_seq.from() and &m_seq.upper() == &parOther.m_seq.upper()); - return m_current != parOther.m_current; + return not this->operator==(parOther); } template bool sequence_range_iterator::operator== (const sequence_range_iterator& parOther) const { assert(&m_seq.from() == &parOther.m_seq.from() and &m_seq.upper() == &parOther.m_seq.upper()); - return m_current == parOther.m_current; + const CMP& cmp_op = *static_cast(this); + return m_current == parOther.m_current or ( + implem::get_at_index::value == m_active_elem and + not cmp_op(m_current[m_active_elem], m_seq.upper()[m_active_elem]) + ); } template diff --git a/test/unit/test_sequence_range.cpp b/test/unit/test_sequence_range.cpp index cede4f0..652f63d 100644 --- a/test/unit/test_sequence_range.cpp +++ b/test/unit/test_sequence_range.cpp @@ -82,4 +82,16 @@ TEST(vwr, vector_iterator) { EXPECT_EQ(expected[z] + 1, results[results.size() - 1 - z]); } } + + { + auto seq = increasing_sequence_range(from, to, ivec3(3)); + std::vector results; + for (auto& itm : seq) { + results.push_back(itm); + } + + ASSERT_EQ(2, results.size()); + EXPECT_EQ(ivec3(100, 200, 300), results[0]); + EXPECT_EQ(ivec3(100, 200, 303), results[1]); + } }