1#ifndef ENTT_STL_ITERATOR_HPP
2#define ENTT_STL_ITERATOR_HPP
5#if __has_include(<entt/ext/stl/iterator.hpp>)
6# include <entt/ext/stl/iterator.hpp>
10# include "../config/config.h"
15using std::bidirectional_iterator_tag;
17using std::forward_iterator_tag;
18using std::input_iterator_tag;
19using std::iterator_traits;
20using std::make_reverse_iterator;
21using std::random_access_iterator_tag;
22using std::reverse_iterator;
24# ifndef ENTT_FORCE_STL
25# if defined(__cpp_lib_ranges)
26# define ENTT_HAS_ITERATOR_CONCEPTS
28using std::bidirectional_iterator;
29using std::forward_iterator;
30using std::input_iterator;
31using std::input_or_output_iterator;
32using std::output_iterator;
33using std::random_access_iterator;
34using std::sentinel_for;
39# ifndef ENTT_HAS_ITERATOR_CONCEPTS
46concept has_iterator_category =
requires {
47 typename std::iterator_traits<It>::iterator_category;
51concept has_iterator_concept = has_iterator_category<It> &&
requires {
52 typename It::iterator_concept;
55template<has_iterator_category It>
57 using type =
typename std::iterator_traits<It>::iterator_category;
60template<has_iterator_concept It>
61struct iterator_tag<It> {
62 using type =
typename It::iterator_concept;
65template<
typename It,
typename Tag>
66concept has_iterator_tag = std::derived_from<typename iterator_tag<It>::type, Tag>;
74concept input_or_output_iterator =
requires(It it) {
76 { ++it } -> std::same_as<It &>;
81concept input_iterator = input_or_output_iterator<It> && internal::has_iterator_tag<It, std::input_iterator_tag>;
83template<
typename It,
typename Type>
84concept output_iterator = input_or_output_iterator<It> &&
requires(It it, Type &&value) {
85 *it++ = std::forward<Type>(value);
89concept forward_iterator = input_iterator<It> && internal::has_iterator_tag<It, std::forward_iterator_tag>;
92concept bidirectional_iterator = forward_iterator<It> && internal::has_iterator_tag<It, std::bidirectional_iterator_tag>;
95concept random_access_iterator = bidirectional_iterator<It> && internal::has_iterator_tag<It, std::random_access_iterator_tag>;
97template<
class Sentinel,
typename It>
98concept sentinel_for = input_or_output_iterator<It> &&
requires(Sentinel sentinel, It it) {
99 { it == sentinel } -> std::same_as<bool>;
108#undef ENTT_HAS_ITERATOR_CONCEPTS
Custom EnTT namespace for the standard template library.