Kaynağa Gözat

Add an is_associative trait.

Sam Jaffe 5 yıl önce
ebeveyn
işleme
48b293afd3

+ 1 - 4
include/iterator/detail/recursive_iterator_base.hpp

@@ -46,10 +46,7 @@ namespace iterator { namespace detail {
    * with this would be std::tuple<int const&, float const&, double &>.
    */
   template <typename Iterator>
-  class recursive_iterator_base<
-      Iterator,
-      typename std::enable_if<std::is_const<typename end_aware_iterator<
-          Iterator>::value_type::first_type>::value>::type>
+  class recursive_iterator_base<Iterator, is_associative_t<Iterator>>
       : public end_aware_iterator<Iterator> {
   public:
     using super = end_aware_iterator<Iterator>;

+ 14 - 0
include/iterator/detail/recursive_iterator_traits.hpp

@@ -1,5 +1,9 @@
 #pragma once
 
+#include <iterator>
+#include <tuple>
+#include <utility>
+
 namespace iterator { namespace detail {
   struct terminal_layer_tag_t;
   struct continue_layer_tag_t;
@@ -24,4 +28,14 @@ namespace iterator { namespace detail {
   template <typename V> struct next_layer_type<V, continue_layer_tag_t> {
     using type = V;
   };
+
+  template <typename T, typename = void>
+  struct is_associative : std::false_type {};
+  template <typename T>
+  struct is_associative<T, std::enable_if_t<std::is_const<
+                               typename T::value_type::first_type>::value>>
+      : std::true_type {};
+
+  template <typename T>
+  using is_associative_t = std::enable_if_t<is_associative<T>::value>;
 }}

+ 0 - 9
include/iterator/recursive_iterator.hpp

@@ -7,9 +7,7 @@
 
 #pragma once
 
-#include <iterator>
 #include <tuple>
-#include <utility>
 
 #include "detail/recursive_iterator_impl.hpp"
 #include "detail/recursive_iterator_traits.hpp"
@@ -116,13 +114,6 @@ namespace std {
   }
 }
 
-// template <typename Iter0, typename... Iters>
-// auto make_recursive_iterator(iterator::end_aware_iterator<Iter0> it,
-//                             Iters &&... iters)
-//    -> iterator::recursive_iterator<Iter0> {
-//  return {iterator::in_place, std::move(it), std::forward<Iters>(iters)...};
-//}
-
 template <typename C>
 auto make_recursive_iterator(C & collect)
     -> iterator::recursive_iterator<decltype(std::begin(collect))> {