diff options
author | Eric Fiselier <eric@efcs.ca> | 2019-09-30 20:55:30 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2019-09-30 20:55:30 +0000 |
commit | c8ad8686ac072fb35862f4d5e09cb1ab91a15a8e (patch) | |
tree | 5c48be6f9e59164b2b2fe3b8d531459b814b2354 | |
parent | 22cb3d2e58f4f232e353678f750d5659c4673520 (diff) | |
download | bcm5719-llvm-c8ad8686ac072fb35862f4d5e09cb1ab91a15a8e.tar.gz bcm5719-llvm-c8ad8686ac072fb35862f4d5e09cb1ab91a15a8e.zip |
Refactor default constructor SFINAE in pair and tuple.
Refactor the recent implicit default constructor changes to match the
existing SFINAE style.
llvm-svn: 373263
-rw-r--r-- | libcxx/include/__tuple | 5 | ||||
-rw-r--r-- | libcxx/include/tuple | 45 | ||||
-rw-r--r-- | libcxx/include/utility | 23 |
3 files changed, 29 insertions, 44 deletions
diff --git a/libcxx/include/__tuple b/libcxx/include/__tuple index 196f3c2b5aa..4da9ec55f35 100644 --- a/libcxx/include/__tuple +++ b/libcxx/include/__tuple @@ -477,8 +477,9 @@ using __tuple_like_with_size _LIBCPP_NODEBUG_TYPE = __tuple_like_with_size_imp< >; struct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail { - template <class ...> - static constexpr bool __enable_default() { return false; } + + static constexpr bool __enable_explicit_default() { return false; } + static constexpr bool __enable_implicit_default() { return false; } template <class ...> static constexpr bool __enable_explicit() { return false; } template <class ...> diff --git a/libcxx/include/tuple b/libcxx/include/tuple index c4cd3bc5495..e93824f0aa7 100644 --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -499,23 +499,18 @@ class _LIBCPP_TEMPLATE_VIS tuple template <class _Dummy> struct _CheckArgsConstructor<true, _Dummy> { - template <class ..._Args> - struct __enable_implicit_default - // In C++03, there's no way to implement the resolution of LWG2510. -#ifdef _LIBCPP_CXX03_LANG - : true_type -#else - : __all<__is_implicitly_default_constructible<_Args>::value...> -#endif - { }; + template <int&...> + static constexpr bool __enable_implicit_default() { + return __all<__is_implicitly_default_constructible<_Tp>::value... >::value; + } + + template <int&...> + static constexpr bool __enable_explicit_default() { + return + __all<is_default_constructible<_Tp>::value...>::value && + !__enable_implicit_default< >(); + } - template <class ..._Args> - struct __enable_explicit_default - : integral_constant<bool, - __all<is_default_constructible<_Args>::value...>::value && - !__enable_implicit_default<_Args...>::value - > - { }; template <class ..._Args> static constexpr bool __enable_explicit() { @@ -655,14 +650,14 @@ class _LIBCPP_TEMPLATE_VIS tuple public: template <bool _Dummy = true, _EnableIf< - _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...>::value + _CheckArgsConstructor<_Dummy>::__enable_implicit_default() , void*> = nullptr> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR tuple() _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} template <bool _Dummy = true, _EnableIf< - _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...>::value + _CheckArgsConstructor<_Dummy>::__enable_explicit_default() , void*> = nullptr> explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR tuple() @@ -671,11 +666,8 @@ public: tuple(tuple const&) = default; tuple(tuple&&) = default; - template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf< - _And< - _IsSame<allocator_arg_t, _AllocArgT>, - typename _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...> - >::value + template <class _AllocArgT, class _Alloc, _EnableIf< + _CheckArgsConstructor<_IsSame<allocator_arg_t, _AllocArgT>::value >::__enable_implicit_default() , void*> = nullptr > _LIBCPP_INLINE_VISIBILITY @@ -685,11 +677,8 @@ public: typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), __tuple_types<_Tp...>()) {} - template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf< - _And< - _IsSame<allocator_arg_t, _AllocArgT>, - typename _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...> - >::value + template <class _AllocArgT, class _Alloc, _EnableIf< + _CheckArgsConstructor<_IsSame<allocator_arg_t, _AllocArgT>::value>::__enable_explicit_default() , void*> = nullptr > explicit _LIBCPP_INLINE_VISIBILITY diff --git a/libcxx/include/utility b/libcxx/include/utility index c90d049cf7b..7ac322bfe71 100644 --- a/libcxx/include/utility +++ b/libcxx/include/utility @@ -334,22 +334,17 @@ struct _LIBCPP_TEMPLATE_VIS pair using _EnableB _LIBCPP_NODEBUG_TYPE = typename enable_if<_Val, bool>::type; struct _CheckArgs { - template <class _U1, class _U2> + template <int&...> static constexpr bool __enable_explicit_default() { - return is_default_constructible<_U1>::value - && is_default_constructible<_U2>::value - && !__enable_implicit_default<_U1, _U2>(); + return is_default_constructible<_T1>::value + && is_default_constructible<_T2>::value + && !__enable_implicit_default<>(); } - template <class _U1, class _U2> + template <int&...> static constexpr bool __enable_implicit_default() { - // In C++03, there's no way to implement the resolution of LWG2510. -#ifdef _LIBCPP_CXX03_LANG - return true; -#else - return __is_implicitly_default_constructible<_U1>::value - && __is_implicitly_default_constructible<_U2>::value; -#endif + return __is_implicitly_default_constructible<_T1>::value + && __is_implicitly_default_constructible<_T2>::value; } template <class _U1, class _U2> @@ -400,7 +395,7 @@ struct _LIBCPP_TEMPLATE_VIS pair >::type; template<bool _Dummy = true, _EnableB< - _CheckArgsDep<_Dummy>::template __enable_explicit_default<_T1, _T2>() + _CheckArgsDep<_Dummy>::__enable_explicit_default() > = false> explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && @@ -408,7 +403,7 @@ struct _LIBCPP_TEMPLATE_VIS pair : first(), second() {} template<bool _Dummy = true, _EnableB< - _CheckArgsDep<_Dummy>::template __enable_implicit_default<_T1, _T2>() + _CheckArgsDep<_Dummy>::__enable_implicit_default() > = false> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && |