diff options
Diffstat (limited to 'include/type_traits')
-rw-r--r-- | include/type_traits | 532 |
1 files changed, 289 insertions, 243 deletions
diff --git a/include/type_traits b/include/type_traits index 90d56df..13129f3 100644 --- a/include/type_traits +++ b/include/type_traits @@ -148,7 +148,7 @@ namespace std _LIBCPP_BEGIN_NAMESPACE_STD -template <bool _B, class _If, class _Then> +template <bool _Bp, class _If, class _Then> struct _LIBCPP_VISIBLE conditional {typedef _If type;}; template <class _If, class _Then> struct _LIBCPP_VISIBLE conditional<false, _If, _Then> {typedef _Then type;}; @@ -741,6 +741,14 @@ struct _LIBCPP_VISIBLE is_base_of // is_empty +#if __has_feature(is_empty) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_empty + : public integral_constant<bool, __is_empty(_Tp)> {}; + +#else // __has_feature(is_empty) + template <class _Tp> struct __is_empty1 : public _Tp @@ -760,8 +768,18 @@ template <class _Tp> struct __libcpp_empty<_Tp, false> : public false_type {}; template <class _Tp> struct _LIBCPP_VISIBLE is_empty : public __libcpp_empty<_Tp> {}; +#endif // __has_feature(is_empty) + // is_polymorphic +#if __has_feature(is_polymorphic) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_polymorphic + : public integral_constant<bool, __is_polymorphic(_Tp)> {}; + +#else + template <class _Tp> struct __is_polymorphic1 : public _Tp {}; template <class _Tp> struct __is_polymorphic2 : public _Tp {virtual ~__is_polymorphic2() throw();}; @@ -774,6 +792,8 @@ template <class _Tp> struct __libcpp_polymorphic<_Tp, false> : public false_type template <class _Tp> struct _LIBCPP_VISIBLE is_polymorphic : public __libcpp_polymorphic<_Tp> {}; +#endif // __has_feature(is_polymorphic) + // has_virtual_destructor #if __has_feature(has_virtual_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) @@ -1134,7 +1154,7 @@ private: static _Up __u(); #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES public: - typedef decltype(true ? __t() : __u()) type; + typedef typename remove_reference<decltype(true ? __t() : __u())>::type type; }; #else // _LIBCPP_HAS_NO_VARIADICS @@ -1155,7 +1175,7 @@ private: static _Up&& __u(); static bool __f(); public: - typedef decltype(__f() ? __t() : __u()) type; + typedef typename remove_reference<decltype(__f() ? __t() : __u())>::type type; }; template <class _Tp, class _Up, class ..._Vp> @@ -1312,6 +1332,18 @@ template <class _Tp> inline _LIBCPP_INLINE_VISIBILITY typename enable_if < + !is_convertible<_Tp, __rv<_Tp> >::value, + const _Tp& +>::type +move(const _Tp& __t) +{ + return __t; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< is_convertible<_Tp, __rv<_Tp> >::value, _Tp >::type @@ -1418,215 +1450,215 @@ struct __member_pointer_traits_imp #ifndef _LIBCPP_HAS_NO_VARIADICS -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...), true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false> { typedef _Class _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false> { typedef _Class const _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false> { typedef _Class volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false> { typedef _Class const volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; #if __has_feature(cxx_reference_qualified_functions) -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) &, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false> { typedef _Class& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false> { typedef _Class const& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false> { typedef _Class volatile& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false> { typedef _Class const volatile& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) &&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false> { typedef _Class&& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const&&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false> { typedef _Class const&& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile&&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false> { typedef _Class volatile&& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class ..._Param> -struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile&&, true, false> +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false> { typedef _Class const volatile&& _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; #endif // __has_feature(cxx_reference_qualified_functions) #else // _LIBCPP_HAS_NO_VARIADICS -template <class _R, class _Class> -struct __member_pointer_traits_imp<_R (_Class::*)(), true, false> +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)(), true, false> { typedef _Class _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0), true, false> +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false> { typedef _Class _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1), true, false> +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false> { typedef _Class _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1, class _P2> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2), true, false> +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false> { typedef _Class _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class> -struct __member_pointer_traits_imp<_R (_Class::*)() const, true, false> +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false> { typedef _Class const _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0) const, true, false> +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false> { typedef _Class const _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) const, true, false> +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false> { typedef _Class const _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1, class _P2> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2) const, true, false> +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false> { typedef _Class const _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class> -struct __member_pointer_traits_imp<_R (_Class::*)() volatile, true, false> +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false> { typedef _Class volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0) volatile, true, false> +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false> { typedef _Class volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) volatile, true, false> +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false> { typedef _Class volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1, class _P2> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2) volatile, true, false> +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false> { typedef _Class volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class> -struct __member_pointer_traits_imp<_R (_Class::*)() const volatile, true, false> +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false> { typedef _Class const volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0) const volatile, true, false> +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false> { typedef _Class const volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) const volatile, true, false> +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false> { typedef _Class const volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; -template <class _R, class _Class, class _P0, class _P1, class _P2> -struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2) const volatile, true, false> +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false> { typedef _Class const volatile _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; #endif // _LIBCPP_HAS_NO_VARIADICS -template <class _R, class _Class> -struct __member_pointer_traits_imp<_R _Class::*, false, true> +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp _Class::*, false, true> { typedef _Class _ClassType; - typedef _R _ReturnType; + typedef _Rp _ReturnType; }; template <class _MP> @@ -1673,21 +1705,21 @@ struct __result_of_mp<_MP, _Tp, true> template <class _MP, class _Tp, bool> struct __result_of_mdp; -template <class _R, class _Class, class _Tp> -struct __result_of_mdp<_R _Class::*, _Tp, false> +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, false> { - typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _R>::type&& type; + typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type&& type; }; -template <class _R, class _Class, class _Tp> -struct __result_of_mdp<_R _Class::*, _Tp, true> +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, true> { - typedef typename __apply_cv<_Tp, _R>::type&& type; + typedef typename __apply_cv<_Tp, _Rp>::type&& type; }; -template <class _R, class _Class, class _Tp> -struct __result_of_mp<_R _Class::*, _Tp, false> - : public __result_of_mdp<_R _Class::*, _Tp, +template <class _Rp, class _Class, class _Tp> +struct __result_of_mp<_Rp _Class::*, _Tp, false> + : public __result_of_mdp<_Rp _Class::*, _Tp, is_base_of<_Class, typename remove_reference<_Tp>::type>::value> { }; @@ -1758,21 +1790,21 @@ struct __result_of_mp<_MP, _Tp, true> template <class _MP, class _Tp, bool> struct __result_of_mdp; -template <class _R, class _Class, class _Tp> -struct __result_of_mdp<_R _Class::*, _Tp, false> +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, false> { - typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _R>::type& type; + typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type& type; }; -template <class _R, class _Class, class _Tp> -struct __result_of_mdp<_R _Class::*, _Tp, true> +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, true> { - typedef typename __apply_cv<_Tp, _R>::type& type; + typedef typename __apply_cv<_Tp, _Rp>::type& type; }; -template <class _R, class _Class, class _Tp> -struct __result_of_mp<_R _Class::*, _Tp, false> - : public __result_of_mdp<_R _Class::*, _Tp, +template <class _Rp, class _Class, class _Tp> +struct __result_of_mp<_Rp _Class::*, _Tp, false> + : public __result_of_mdp<_Rp _Class::*, _Tp, is_base_of<_Class, typename remove_reference<_Tp>::type>::value> { }; @@ -1879,8 +1911,8 @@ struct __is_constructible // false, _Tp is not a scalar // function types are not constructible -template <class _R, class... _A1, class... _A2> -struct __is_constructible<false, _R(_A1...), _A2...> +template <class _Rp, class... _A1, class... _A2> +struct __is_constructible<false, _Rp(_A1...), _A2...> : public false_type {}; @@ -1956,22 +1988,22 @@ struct _LIBCPP_VISIBLE is_constructible // Array types are default constructible if their element type // is default constructible -template <class _A, size_t _N> -struct __is_constructible<false, _A[_N]> - : public is_constructible<typename remove_all_extents<_A>::type> +template <class _Ap, size_t _Np> +struct __is_constructible<false, _Ap[_Np]> + : public is_constructible<typename remove_all_extents<_Ap>::type> {}; // Otherwise array types are not constructible by this syntax -template <class _A, size_t _N, class ..._Args> -struct __is_constructible<false, _A[_N], _Args...> +template <class _Ap, size_t _Np, class ..._Args> +struct __is_constructible<false, _Ap[_Np], _Args...> : public false_type {}; // Incomplete array types are not constructible -template <class _A, class ..._Args> -struct __is_constructible<false, _A[], _Args...> +template <class _Ap, class ..._Args> +struct __is_constructible<false, _Ap[], _Args...> : public false_type {}; @@ -2124,35 +2156,35 @@ struct _LIBCPP_VISIBLE is_constructible<_Tp, _A0, __is_construct::__nat> // Array types are default constructible if their element type // is default constructible -template <class _A, size_t _N> -struct __is_constructible0_imp<false, _A[_N]> - : public is_constructible<typename remove_all_extents<_A>::type> +template <class _Ap, size_t _Np> +struct __is_constructible0_imp<false, _Ap[_Np]> + : public is_constructible<typename remove_all_extents<_Ap>::type> {}; -template <class _A, size_t _N, class _A0> -struct __is_constructible1_imp<false, _A[_N], _A0> +template <class _Ap, size_t _Np, class _A0> +struct __is_constructible1_imp<false, _Ap[_Np], _A0> : public false_type {}; -template <class _A, size_t _N, class _A0, class _A1> -struct __is_constructible2_imp<false, _A[_N], _A0, _A1> +template <class _Ap, size_t _Np, class _A0, class _A1> +struct __is_constructible2_imp<false, _Ap[_Np], _A0, _A1> : public false_type {}; // Incomplete array types are not constructible -template <class _A> -struct __is_constructible0_imp<false, _A[]> +template <class _Ap> +struct __is_constructible0_imp<false, _Ap[]> : public false_type {}; -template <class _A, class _A0> -struct __is_constructible1_imp<false, _A[], _A0> +template <class _Ap, class _A0> +struct __is_constructible1_imp<false, _Ap[], _A0> : public false_type {}; -template <class _A, class _A0, class _A1> -struct __is_constructible2_imp<false, _A[], _A0, _A1> +template <class _Ap, class _A0, class _A1> +struct __is_constructible2_imp<false, _Ap[], _A0, _A1> : public false_type {}; @@ -2187,6 +2219,16 @@ struct _LIBCPP_VISIBLE is_move_constructible #ifndef _LIBCPP_HAS_NO_VARIADICS +#if __has_feature(is_trivially_constructible) + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_trivially_constructible + : integral_constant<bool, __is_trivially_constructible(_Tp, _Args...)> +{ +}; + +#else // !__has_feature(is_trivially_constructible) + template <class _Tp, class... _Args> struct _LIBCPP_VISIBLE is_trivially_constructible : false_type @@ -2209,34 +2251,24 @@ struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&&> #else struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp> #endif -#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_copy(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&> -#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_copy(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&> -#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_copy(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; +#endif // !__has_feature(is_trivially_constructible) + #else // _LIBCPP_HAS_NO_VARIADICS template <class _Tp, class _A0 = __is_construct::__nat, @@ -2246,50 +2278,68 @@ struct _LIBCPP_VISIBLE is_trivially_constructible { }; +#if __has_feature(is_trivially_constructible) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp)> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp)> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp, const _Tp&)> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp&)> +{ +}; + +#else // !__has_feature(is_trivially_constructible) + template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat, __is_construct::__nat> -#if __has_feature(has_trivial_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_constructor(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp, __is_construct::__nat> -#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_copy(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&, __is_construct::__nat> -#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_copy(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&, __is_construct::__nat> -#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_copy(_Tp)> -#else : integral_constant<bool, is_scalar<_Tp>::value> -#endif { }; +#endif // !__has_feature(is_trivially_constructible) + #endif // _LIBCPP_HAS_NO_VARIADICS // is_trivially_default_constructible @@ -2316,46 +2366,42 @@ template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_constructible // is_trivially_assignable +#if __has_feature(is_trivially_constructible) + +template <class _Tp, class _Arg> +struct is_trivially_assignable + : integral_constant<bool, __is_trivially_assignable(_Tp, _Arg)> +{ +}; + +#else // !__has_feature(is_trivially_constructible) + template <class _Tp, class _Arg> struct is_trivially_assignable : public false_type {}; template <class _Tp> struct is_trivially_assignable<_Tp&, _Tp> -#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_assign(_Tp)> {}; -#else : integral_constant<bool, is_scalar<_Tp>::value> {}; -#endif template <class _Tp> struct is_trivially_assignable<_Tp&, _Tp&> -#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_assign(_Tp)> {}; -#else : integral_constant<bool, is_scalar<_Tp>::value> {}; -#endif template <class _Tp> struct is_trivially_assignable<_Tp&, const _Tp&> -#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_assign(_Tp)> {}; -#else : integral_constant<bool, is_scalar<_Tp>::value> {}; -#endif #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template <class _Tp> struct is_trivially_assignable<_Tp&, _Tp&&> -#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) - : integral_constant<bool, __has_trivial_assign(_Tp)> {}; -#else : integral_constant<bool, is_scalar<_Tp>::value> {}; -#endif #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // !__has_feature(is_trivially_constructible) + // is_trivially_copy_assignable template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_assignable @@ -2761,134 +2807,134 @@ template <class _Tp> struct _LIBCPP_VISIBLE is_trivial // Check for complete types -template <class ..._T> struct __check_complete; +template <class ..._Tp> struct __check_complete; template <> struct __check_complete<> { }; -template <class _H, class _T0, class ..._T> -struct __check_complete<_H, _T0, _T...> - : private __check_complete<_H>, - private __check_complete<_T0, _T...> +template <class _Hp, class _T0, class ..._Tp> +struct __check_complete<_Hp, _T0, _Tp...> + : private __check_complete<_Hp>, + private __check_complete<_T0, _Tp...> { }; -template <class _H> -struct __check_complete<_H, _H> - : private __check_complete<_H> +template <class _Hp> +struct __check_complete<_Hp, _Hp> + : private __check_complete<_Hp> { }; -template <class _T> -struct __check_complete<_T> +template <class _Tp> +struct __check_complete<_Tp> { - static_assert(sizeof(_T) > 0, "Type must be complete."); + static_assert(sizeof(_Tp) > 0, "Type must be complete."); }; -template <class _T> -struct __check_complete<_T&> - : private __check_complete<_T> +template <class _Tp> +struct __check_complete<_Tp&> + : private __check_complete<_Tp> { }; -template <class _T> -struct __check_complete<_T&&> - : private __check_complete<_T> +template <class _Tp> +struct __check_complete<_Tp&&> + : private __check_complete<_Tp> { }; -template <class _R, class ..._Param> -struct __check_complete<_R (*)(_Param...)> +template <class _Rp, class ..._Param> +struct __check_complete<_Rp (*)(_Param...)> : private __check_complete<_Param...> { }; -template <class _R, class ..._Param> -struct __check_complete<_R (_Param...)> +template <class _Rp, class ..._Param> +struct __check_complete<_Rp (_Param...)> : private __check_complete<_Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...)> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...)> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) const> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) volatile> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) volatile> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) const volatile> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const volatile> : private __check_complete<_Class, _Param...> { }; #if __has_feature(cxx_reference_qualified_functions) -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) &> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) &> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) const&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const&> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) volatile&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) volatile&> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) const volatile&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const volatile&> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) &&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) &&> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) const&&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const&&> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) volatile&&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) volatile&&> : private __check_complete<_Class, _Param...> { }; -template <class _R, class _Class, class ..._Param> -struct __check_complete<_R (_Class::*)(_Param...) const volatile&&> +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const volatile&&> : private __check_complete<_Class, _Param...> { }; #endif -template <class _R, class _Class> -struct __check_complete<_R _Class::*> +template <class _Rp, class _Class> +struct __check_complete<_Rp _Class::*> : private __check_complete<_Class> { }; @@ -2904,70 +2950,70 @@ __invoke(__any, _Args&& ...__args) // bullets 1 and 2 -template <class _F, class _A0, class ..._Args> +template <class _Fp, class _A0, class ..._Args> auto -__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args) +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)); -template <class _F, class _A0, class ..._Args> +template <class _Fp, class _A0, class ..._Args> auto -__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args) +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)); // bullets 3 and 4 -template <class _F, class _A0> +template <class _Fp, class _A0> auto -__invoke(_F&& __f, _A0&& __a0) +__invoke(_Fp&& __f, _A0&& __a0) -> decltype(_VSTD::forward<_A0>(__a0).*__f); -template <class _F, class _A0> +template <class _Fp, class _A0> auto -__invoke(_F&& __f, _A0&& __a0) +__invoke(_Fp&& __f, _A0&& __a0) -> decltype((*_VSTD::forward<_A0>(__a0)).*__f); // bullet 5 -template <class _F, class ..._Args> +template <class _Fp, class ..._Args> auto -__invoke(_F&& __f, _Args&& ...__args) - -> decltype(_VSTD::forward<_F>(__f)(_VSTD::forward<_Args>(__args)...)); +__invoke(_Fp&& __f, _Args&& ...__args) + -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)); // __invokable -template <class _F, class ..._Args> +template <class _Fp, class ..._Args> struct __invokable_imp - : private __check_complete<_F, _Args...> + : private __check_complete<_Fp, _Args...> { typedef decltype( - __invoke(_VSTD::declval<_F>(), _VSTD::declval<_Args>()...) + __invoke(_VSTD::declval<_Fp>(), _VSTD::declval<_Args>()...) ) type; static const bool value = !is_same<type, __nat>::value; }; -template <class _F, class ..._Args> +template <class _Fp, class ..._Args> struct __invokable : public integral_constant<bool, - __invokable_imp<_F, _Args...>::value> + __invokable_imp<_Fp, _Args...>::value> { }; // __invoke_of -template <bool _Invokable, class _F, class ..._Args> +template <bool _Invokable, class _Fp, class ..._Args> struct __invoke_of_imp // false { }; -template <class _F, class ..._Args> -struct __invoke_of_imp<true, _F, _Args...> +template <class _Fp, class ..._Args> +struct __invoke_of_imp<true, _Fp, _Args...> { - typedef typename __invokable_imp<_F, _Args...>::type type; + typedef typename __invokable_imp<_Fp, _Args...>::type type; }; -template <class _F, class ..._Args> +template <class _Fp, class ..._Args> struct __invoke_of - : public __invoke_of_imp<__invokable<_F, _Args...>::value, _F, _Args...> + : public __invoke_of_imp<__invokable<_Fp, _Args...>::value, _Fp, _Args...> { }; |