Simplify reference_wrapper nested typedefs
authorJonathan Wakely <jwakely@redhat.com>
Fri, 14 Oct 2016 09:12:49 +0000 (10:12 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 14 Oct 2016 09:12:49 +0000 (10:12 +0100)
* include/std/functional (_Reference_wrapper_base_impl): Remove.
(_Refwrap_base_arg1, _Refwrap_base_arg2): New helpers using __void_t.
(_Reference_wrapper_base): Inherit from new helpers.

From-SVN: r241151

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/functional

index 32b59a3cf58a94b8572586f30c2b1bcc6541d1d5..cd6ac761d1b58b861e83f59579379da19a0a626f 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-14  Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/std/functional (_Reference_wrapper_base_impl): Remove.
+       (_Refwrap_base_arg1, _Refwrap_base_arg2): New helpers using __void_t.
+       (_Reference_wrapper_base): Inherit from new helpers.
+
 2016-10-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * testsuite/24_iterators/container_access.cc: Remove 'test' variables.
index 8fc60dc515e454ff119d12c374c8b21a0d3b102e..d39b519fb77b896eeb3bc724c5f52fdafb772471 100644 (file)
@@ -207,51 +207,34 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 #endif
 
-  /**
-   *  Knowing which of unary_function and binary_function _Tp derives
-   *  from, derives from the same and ensures that reference_wrapper
-   *  will have a weak result type. See cases below.
-   */
-  template<bool _Unary, bool _Binary, typename _Tp>
-    struct _Reference_wrapper_base_impl;
-
-  // None of the nested argument types.
-  template<typename _Tp>
-    struct _Reference_wrapper_base_impl<false, false, _Tp>
-    : _Weak_result_type<_Tp>
+  // Detect nested argument_type.
+  template<typename _Tp, typename = __void_t<>>
+    struct _Refwrap_base_arg1
     { };
 
-  // Nested argument_type only.
+  // Nested argument_type.
   template<typename _Tp>
-    struct _Reference_wrapper_base_impl<true, false, _Tp>
-    : _Weak_result_type<_Tp>
+    struct _Refwrap_base_arg1<_Tp,
+                             __void_t<typename _Tp::argument_type>>
     {
       typedef typename _Tp::argument_type argument_type;
     };
 
-  // Nested first_argument_type and second_argument_type only.
-  template<typename _Tp>
-    struct _Reference_wrapper_base_impl<false, true, _Tp>
-    : _Weak_result_type<_Tp>
-    {
-      typedef typename _Tp::first_argument_type first_argument_type;
-      typedef typename _Tp::second_argument_type second_argument_type;
-    };
+  // Detect nested first_argument_type and second_argument_type.
+  template<typename _Tp, typename = __void_t<>>
+    struct _Refwrap_base_arg2
+    { };
 
-  // All the nested argument types.
-   template<typename _Tp>
-    struct _Reference_wrapper_base_impl<true, true, _Tp>
-    : _Weak_result_type<_Tp>
+  // Nested first_argument_type and second_argument_type.
+  template<typename _Tp>
+    struct _Refwrap_base_arg2<_Tp,
+                             __void_t<typename _Tp::first_argument_type,
+                                      typename _Tp::second_argument_type>>
     {
-      typedef typename _Tp::argument_type argument_type;
       typedef typename _Tp::first_argument_type first_argument_type;
       typedef typename _Tp::second_argument_type second_argument_type;
     };
 
-  _GLIBCXX_HAS_NESTED_TYPE(argument_type)
-  _GLIBCXX_HAS_NESTED_TYPE(first_argument_type)
-  _GLIBCXX_HAS_NESTED_TYPE(second_argument_type)
-
   /**
    *  Derives from unary_function or binary_function when it
    *  can. Specializations handle all of the easy cases. The primary
@@ -260,11 +243,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   */
   template<typename _Tp>
     struct _Reference_wrapper_base
-    : _Reference_wrapper_base_impl<
-      __has_argument_type<_Tp>::value,
-      __has_first_argument_type<_Tp>::value
-      && __has_second_argument_type<_Tp>::value,
-      _Tp>
+    : _Weak_result_type<_Tp>, _Refwrap_base_arg1<_Tp>, _Refwrap_base_arg2<_Tp>
     { };
 
   // - a function type (unary)