From b00038a03445dcfdc4ca206e57eeec03c3c3afe3 Mon Sep 17 00:00:00 2001 From: skypjack Date: Thu, 29 Jan 2026 13:51:45 +0100 Subject: [PATCH] concepts: refine iterator concepts --- src/entt/stl/concepts.hpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/entt/stl/concepts.hpp b/src/entt/stl/concepts.hpp index db6e044a5..c717f9466 100644 --- a/src/entt/stl/concepts.hpp +++ b/src/entt/stl/concepts.hpp @@ -27,6 +27,7 @@ using std::sentinel_for; #ifndef ENTT_HAS_ITERATOR_CONCEPTS # include # include +# include namespace internal { @@ -42,8 +43,8 @@ struct iterator_tag { using type = typename It::iterator_concept; }; -template -using iterator_tag_t = typename iterator_tag::type; +template +concept has_iterator_tag = std::derived_from::type, Tag>; } // namespace internal @@ -58,19 +59,21 @@ concept input_or_output_iterator = requires(It it) { }; template -concept input_iterator = std::derived_from, std::input_iterator_tag>; +concept input_iterator = input_or_output_iterator && internal::has_iterator_tag; template -concept output_iterator = std::derived_from, std::output_iterator_tag>; +concept output_iterator = input_or_output_iterator && requires(It it, Type &&value) { + *it++ = std::forward(value); +}; template -concept forward_iterator = std::derived_from, std::forward_iterator_tag>; +concept forward_iterator = input_iterator && internal::has_iterator_tag; template -concept bidirectional_iterator = std::derived_from, std::bidirectional_iterator_tag>; +concept bidirectional_iterator = forward_iterator && internal::has_iterator_tag; template -concept random_access_iterator = std::derived_from, std::random_access_iterator_tag>; +concept random_access_iterator = bidirectional_iterator && internal::has_iterator_tag; template concept sentinel_for = input_or_output_iterator && requires(Sentinel sentinel, It it) {