diff --git a/include/vectorwrapper/sequence_range.hpp b/include/vectorwrapper/sequence_range.hpp index 8b47084..6618ee0 100644 --- a/include/vectorwrapper/sequence_range.hpp +++ b/include/vectorwrapper/sequence_range.hpp @@ -111,6 +111,18 @@ 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 = (IDX == SEEK ? L : get_at_index::value); + }; + template struct make_sequence_helper; @@ -119,10 +131,11 @@ namespace vwr { typedef sequence_range, OP, CMP, I...> type; }; - template + template inline V make_end_vector (V parFrom, const V& parUpper) { - auto& last = parFrom[V::dimensions - 1]; - const auto& upper_last = parUpper[V::dimensions - 1]; + constexpr const size_type last_idx = get_at_index::value; + auto& last = parFrom[last_idx]; + const auto& upper_last = parUpper[last_idx]; last = upper_last; return parFrom; } @@ -181,7 +194,7 @@ namespace vwr { sequence_range::sequence_range (const V& parFrom, const V& parUpper) : m_from(parFrom), m_upper(parUpper), - m_end(implem::make_end_vector(parFrom, parUpper)) + m_end(implem::make_end_vector(parFrom, parUpper)) { }