Browse Source

stl: refine iterator concepts

skypjack 1 tháng trước cách đây
mục cha
commit
9509d37431
1 tập tin đã thay đổi với 21 bổ sung1 xóa
  1. 21 1
      src/entt/stl/iterator.hpp

+ 21 - 1
src/entt/stl/iterator.hpp

@@ -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