stl: refine iterator concepts

This commit is contained in:
skypjack
2026-01-29 16:59:28 +01:00
parent cabdc1d1e3
commit 9509d37431

View File

@@ -31,8 +31,28 @@ using std::sentinel_for;
namespace internal {
template<typename It>
concept has_iterator_category = requires {
typename std::iterator_traits<It>::iterator_category;
};
template<typename It>
concept has_iterator_concept = has_iterator_category<It> && requires {
typename It::iterator_concept;
};
template<has_iterator_category It>
struct iterator_tag {
using type = typename std::iterator_traits<It>::iterator_category;
};
template<has_iterator_concept It>
struct iterator_tag<It> {
using type = typename It::iterator_concept;
};
template<typename It, typename Tag>
concept has_iterator_tag = std::derived_from<typename It::iterator_concept, Tag> || std::derived_from<typename std::iterator_traits<It>::iterator_category, Tag>;
concept has_iterator_tag = std::derived_from<typename iterator_tag<It>::type, Tag>;
} // namespace internal