diff --git a/include/ns/enumerate_view.hpp b/include/ns/enumerate_view.hpp index 3012f69..e64bd48 100644 --- a/include/ns/enumerate_view.hpp +++ b/include/ns/enumerate_view.hpp @@ -25,6 +25,10 @@ namespace ns { constexpr iterator begin() { return {std::ranges::begin(base_), 0}; } constexpr auto end() { return sentinel(std::ranges::end(base_)); } + + constexpr auto size() requires std::ranges::sized_range { + return std::ranges::size(base_); + } }; template @@ -179,5 +183,18 @@ namespace ns { std::ranges::iterator_t> { return x.base() == y.end_; } + + friend constexpr std::ranges::range_difference_t // + operator-(const iterator& x, const sentinel& y) requires + std::sized_sentinel_for, + std::ranges::iterator_t> { + return x.base() - y.end_; + } + friend constexpr std::ranges::range_difference_t + operator-(const sentinel& x, const iterator& y) requires + std::sized_sentinel_for, + std::ranges::iterator_t> { + return x.end_ - y.base(); + } }; } // namespace ns diff --git a/tests/enumerate_view/enumerate_view.cpp b/tests/enumerate_view/enumerate_view.cpp index b561224..d4c472b 100644 --- a/tests/enumerate_view/enumerate_view.cpp +++ b/tests/enumerate_view/enumerate_view.cpp @@ -116,4 +116,18 @@ TEST_CASE("enumerate_view", "[enumerate_view]") { CHECK(std::get<1>(*it++) == 'c'); CHECK(it == std::ranges::end(ev)); } + { + std::vector v{'a', 'b', 'c'}; + ns::enumerate_view ev(v); + std::random_access_iterator auto begin = std::ranges::begin(ev); + auto end = std::ranges::end(ev); + static_assert(std::sized_sentinel_for); + CHECK(std::ranges::end(ev) - std::ranges::begin(ev) == 3); + } + { + std::vector v{'a', 'b', 'c'}; + ns::enumerate_view ev(v); + static_assert(std::ranges::sized_range); + CHECK(std::ranges::size(ev) == 3); + } }