Simplify reference_wrapper nested typedefs

* 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
This commit is contained in:
Jonathan Wakely 2016-10-14 10:12:49 +01:00 committed by Jonathan Wakely
parent 6fd9c6f4c5
commit 57c4fbc64b
2 changed files with 22 additions and 37 deletions

View 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.

View 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.
// Detect nested first_argument_type and second_argument_type.
template<typename _Tp, typename = __void_t<>>
struct _Refwrap_base_arg2
{ };
// Nested first_argument_type and second_argument_type.
template<typename _Tp>
struct _Reference_wrapper_base_impl<false, true, _Tp>
: _Weak_result_type<_Tp>
struct _Refwrap_base_arg2<_Tp,
__void_t<typename _Tp::first_argument_type,
typename _Tp::second_argument_type>>
{
typedef typename _Tp::first_argument_type first_argument_type;
typedef typename _Tp::second_argument_type second_argument_type;
};
// All the nested argument types.
template<typename _Tp>
struct _Reference_wrapper_base_impl<true, true, _Tp>
: _Weak_result_type<_Tp>
{
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)