Skip to content

Commit

Permalink
sized_sentinel_for, sized_rangeに対応
Browse files Browse the repository at this point in the history
  • Loading branch information
acd1034 committed Sep 18, 2022
1 parent bbdac64 commit 12fc131
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
17 changes: 17 additions & 0 deletions include/ns/enumerate_view.hpp
Expand Up @@ -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<View> {
return std::ranges::size(base_);
}
};

template <class Range>
Expand Down Expand Up @@ -179,5 +183,18 @@ namespace ns {
std::ranges::iterator_t<View>> {
return x.base() == y.end_;
}

friend constexpr std::ranges::range_difference_t<View> //
operator-(const iterator& x, const sentinel& y) requires
std::sized_sentinel_for<std::ranges::sentinel_t<View>,
std::ranges::iterator_t<View>> {
return x.base() - y.end_;
}
friend constexpr std::ranges::range_difference_t<View>
operator-(const sentinel& x, const iterator& y) requires
std::sized_sentinel_for<std::ranges::sentinel_t<View>,
std::ranges::iterator_t<View>> {
return x.end_ - y.base();
}
};
} // namespace ns
14 changes: 14 additions & 0 deletions tests/enumerate_view/enumerate_view.cpp
Expand Up @@ -116,4 +116,18 @@ TEST_CASE("enumerate_view", "[enumerate_view]") {
CHECK(std::get<1>(*it++) == 'c');
CHECK(it == std::ranges::end(ev));
}
{
std::vector<char> 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<decltype(end), decltype(begin)>);
CHECK(std::ranges::end(ev) - std::ranges::begin(ev) == 3);
}
{
std::vector<char> v{'a', 'b', 'c'};
ns::enumerate_view ev(v);
static_assert(std::ranges::sized_range<decltype(ev)>);
CHECK(std::ranges::size(ev) == 3);
}
}

0 comments on commit 12fc131

Please sign in to comment.