concepts: don't check end -> legacy_iterator in iterable

This doesn't work for sentinel ranges. Rather we mainly care that the
begin/end results can be compared.
This commit is contained in:
Danny Robson 2024-08-10 14:18:15 +10:00
parent e151d5c8c3
commit f141cb3e95

View File

@ -53,13 +53,19 @@ namespace cruft::concepts {
/// Anything that can be looped over using begin/end
///
/// We don't check end against legacy_iterator because that won't work for std::default_sentinel.
/// Rather, the important part is that it's equality comparable against whatever std::begin returns.
template <typename T>
concept iterable = requires (T t)
{
{ std::begin (t) } -> named::legacy_iterator;
{ std::end (t) } -> named::legacy_iterator;
std::begin (t) == std::end (t);
std::begin (t) != std::end (t);
{ std::cbegin (t) } -> named::legacy_iterator;
{ std::cend (t) } -> named::legacy_iterator;
std::cbegin (t) == std::cend (t);
std::cbegin (t) != std::cend (t);
};