diff options
author | David Chisnall <theraven@FreeBSD.org> | 2011-11-22 17:30:41 +0000 |
---|---|---|
committer | David Chisnall <theraven@FreeBSD.org> | 2011-11-22 17:30:41 +0000 |
commit | 1828c5696f7bf5850943ea6c660a493a5e648669 (patch) | |
tree | 5c73f10d9b3740138364680a74334d50b222cd6d /include/type_traits | |
download | src-1828c5696f7bf5850943ea6c660a493a5e648669.tar.gz src-1828c5696f7bf5850943ea6c660a493a5e648669.zip |
Import libcxxrt / libc++ into a vendor branch.vendor/libc++/r145065
Approved by: dim (mentor)
Notes
Notes:
svn path=/vendor/libc++/dist/; revision=227825
svn path=/vendor/libc++/r145065/; revision=227826; tag=vendor/libc++/r145065
Diffstat (limited to 'include/type_traits')
-rw-r--r-- | include/type_traits | 3082 |
1 files changed, 3082 insertions, 0 deletions
diff --git a/include/type_traits b/include/type_traits new file mode 100644 index 000000000000..90d56df37438 --- /dev/null +++ b/include/type_traits @@ -0,0 +1,3082 @@ +// -*- C++ -*- +//===------------------------ type_traits ---------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_TYPE_TRAITS +#define _LIBCPP_TYPE_TRAITS + +/* + type_traits synopsis + +namespace std +{ + + // helper class: + template <class T, T v> struct integral_constant; + typedef integral_constant<bool, true> true_type; + typedef integral_constant<bool, false> false_type; + + // helper traits + template <bool, class T = void> struct enable_if; + template <bool, class T, class F> struct conditional; + + // Primary classification traits: + template <class T> struct is_void; + template <class T> struct is_integral; + template <class T> struct is_floating_point; + template <class T> struct is_array; + template <class T> struct is_pointer; + template <class T> struct is_lvalue_reference; + template <class T> struct is_rvalue_reference; + template <class T> struct is_member_object_pointer; + template <class T> struct is_member_function_pointer; + template <class T> struct is_enum; + template <class T> struct is_union; + template <class T> struct is_class; + template <class T> struct is_function; + + // Secondary classification traits: + template <class T> struct is_reference; + template <class T> struct is_arithmetic; + template <class T> struct is_fundamental; + template <class T> struct is_member_pointer; + template <class T> struct is_scalar; + template <class T> struct is_object; + template <class T> struct is_compound; + + // Const-volatile properties and transformations: + template <class T> struct is_const; + template <class T> struct is_volatile; + template <class T> struct remove_const; + template <class T> struct remove_volatile; + template <class T> struct remove_cv; + template <class T> struct add_const; + template <class T> struct add_volatile; + template <class T> struct add_cv; + + // Reference transformations: + template <class T> struct remove_reference; + template <class T> struct add_lvalue_reference; + template <class T> struct add_rvalue_reference; + + // Pointer transformations: + template <class T> struct remove_pointer; + template <class T> struct add_pointer; + + // Integral properties: + template <class T> struct is_signed; + template <class T> struct is_unsigned; + template <class T> struct make_signed; + template <class T> struct make_unsigned; + + // Array properties and transformations: + template <class T> struct rank; + template <class T, unsigned I = 0> struct extent; + template <class T> struct remove_extent; + template <class T> struct remove_all_extents; + + // Member introspection: + template <class T> struct is_pod; + template <class T> struct is_trivial; + template <class T> struct is_trivially_copyable; + template <class T> struct is_standard_layout; + template <class T> struct is_literal_type; + template <class T> struct is_empty; + template <class T> struct is_polymorphic; + template <class T> struct is_abstract; + + template <class T, class... Args> struct is_constructible; + template <class T> struct is_default_constructible; + template <class T> struct is_copy_constructible; + template <class T> struct is_move_constructible; + template <class T, class U> struct is_assignable; + template <class T> struct is_copy_assignable; + template <class T> struct is_move_assignable; + template <class T> struct is_destructible; + + template <class T, class... Args> struct is_trivially_constructible; + template <class T> struct is_trivially_default_constructible; + template <class T> struct is_trivially_copy_constructible; + template <class T> struct is_trivially_move_constructible; + template <class T, class U> struct is_trivially_assignable; + template <class T> struct is_trivially_copy_assignable; + template <class T> struct is_trivially_move_assignable; + template <class T> struct is_trivially_destructible; + + template <class T, class... Args> struct is_nothrow_constructible; + template <class T> struct is_nothrow_default_constructible; + template <class T> struct is_nothrow_copy_constructible; + template <class T> struct is_nothrow_move_constructible; + template <class T, class U> struct is_nothrow_assignable; + template <class T> struct is_nothrow_copy_assignable; + template <class T> struct is_nothrow_move_assignable; + template <class T> struct is_nothrow_destructible; + + template <class T> struct has_virtual_destructor; + + // Relationships between types: + template <class T, class U> struct is_same; + template <class Base, class Derived> struct is_base_of; + template <class From, class To> struct is_convertible; + + // Alignment properties and transformations: + template <class T> struct alignment_of; + template <size_t Len, size_t Align = most_stringent_alignment_requirement> + struct aligned_storage; + + template <class T> struct decay; + template <class... T> struct common_type; + template <class T> struct underlying_type; + template <class> class result_of; // undefined + template <class Fn, class... ArgTypes> class result_of<Fn(ArgTypes...)>; + +} // std + +*/ +#include <__config> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <bool _B, 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;}; + +template <bool, class _Tp = void> struct _LIBCPP_VISIBLE enable_if {}; +template <class _Tp> struct _LIBCPP_VISIBLE enable_if<true, _Tp> {typedef _Tp type;}; + +struct __two {char _[2];}; + +// helper class: + +template <class _Tp, _Tp __v> +struct _LIBCPP_VISIBLE integral_constant +{ + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant type; + _LIBCPP_INLINE_VISIBILITY +#ifndef _LIBCPP_HAS_NO_CONSTEXPR + constexpr +#endif + operator value_type() +#ifdef _LIBCPP_HAS_NO_CONSTEXPR + const +#endif + {return value;} +}; + +template <class _Tp, _Tp __v> +constexpr _Tp integral_constant<_Tp, __v>::value; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +// is_const + +template <class _Tp> struct _LIBCPP_VISIBLE is_const : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_const<_Tp const> : public true_type {}; + +// is_volatile + +template <class _Tp> struct _LIBCPP_VISIBLE is_volatile : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_volatile<_Tp volatile> : public true_type {}; + +// remove_const + +template <class _Tp> struct _LIBCPP_VISIBLE remove_const {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_const<const _Tp> {typedef _Tp type;}; + +// remove_volatile + +template <class _Tp> struct _LIBCPP_VISIBLE remove_volatile {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_volatile<volatile _Tp> {typedef _Tp type;}; + +// remove_cv + +template <class _Tp> struct _LIBCPP_VISIBLE remove_cv +{typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;}; + +// is_void + +template <class _Tp> struct __is_void : public false_type {}; +template <> struct __is_void<void> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_void + : public __is_void<typename remove_cv<_Tp>::type> {}; + +// __is_nullptr_t + +template <class _Tp> struct ____is_nullptr_t : public false_type {}; +template <> struct ____is_nullptr_t<nullptr_t> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE __is_nullptr_t + : public ____is_nullptr_t<typename remove_cv<_Tp>::type> {}; + +// is_integral + +template <class _Tp> struct __is_integral : public false_type {}; +template <> struct __is_integral<bool> : public true_type {}; +template <> struct __is_integral<char> : public true_type {}; +template <> struct __is_integral<signed char> : public true_type {}; +template <> struct __is_integral<unsigned char> : public true_type {}; +template <> struct __is_integral<wchar_t> : public true_type {}; +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS +template <> struct __is_integral<char16_t> : public true_type {}; +template <> struct __is_integral<char32_t> : public true_type {}; +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS +template <> struct __is_integral<short> : public true_type {}; +template <> struct __is_integral<unsigned short> : public true_type {}; +template <> struct __is_integral<int> : public true_type {}; +template <> struct __is_integral<unsigned int> : public true_type {}; +template <> struct __is_integral<long> : public true_type {}; +template <> struct __is_integral<unsigned long> : public true_type {}; +template <> struct __is_integral<long long> : public true_type {}; +template <> struct __is_integral<unsigned long long> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_integral + : public __is_integral<typename remove_cv<_Tp>::type> {}; + +// is_floating_point + +template <class _Tp> struct __is_floating_point : public false_type {}; +template <> struct __is_floating_point<float> : public true_type {}; +template <> struct __is_floating_point<double> : public true_type {}; +template <> struct __is_floating_point<long double> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_floating_point + : public __is_floating_point<typename remove_cv<_Tp>::type> {}; + +// is_array + +template <class _Tp> struct _LIBCPP_VISIBLE is_array + : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_array<_Tp[]> + : public true_type {}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE is_array<_Tp[_Np]> + : public true_type {}; + +// is_pointer + +template <class _Tp> struct __is_pointer : public false_type {}; +template <class _Tp> struct __is_pointer<_Tp*> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_pointer + : public __is_pointer<typename remove_cv<_Tp>::type> {}; + +// is_reference + +template <class _Tp> struct _LIBCPP_VISIBLE is_lvalue_reference : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_lvalue_reference<_Tp&> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_rvalue_reference : public false_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> struct _LIBCPP_VISIBLE is_rvalue_reference<_Tp&&> : public true_type {}; +#endif + +template <class _Tp> struct _LIBCPP_VISIBLE is_reference : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_reference<_Tp&> : public true_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> struct _LIBCPP_VISIBLE is_reference<_Tp&&> : public true_type {}; +#endif + +#if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +#define _LIBCPP_HAS_TYPE_TRAITS +#endif + +// is_union + +#if __has_feature(is_union) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_union + : public integral_constant<bool, __is_union(_Tp)> {}; + +#else + +template <class _Tp> struct __libcpp_union : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_union + : public __libcpp_union<typename remove_cv<_Tp>::type> {}; + +#endif + +// is_class + +#if __has_feature(is_class) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_class + : public integral_constant<bool, __is_class(_Tp)> {}; + +#else + +namespace __is_class_imp +{ +template <class _Tp> char __test(int _Tp::*); +template <class _Tp> __two __test(...); +} + +template <class _Tp> struct _LIBCPP_VISIBLE is_class + : public integral_constant<bool, sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && !is_union<_Tp>::value> {}; + +#endif + +// is_same + +template <class _Tp, class _Up> struct _LIBCPP_VISIBLE is_same : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_same<_Tp, _Tp> : public true_type {}; + +// is_function + +namespace __is_function_imp +{ +template <class _Tp> char __test(_Tp*); +template <class _Tp> __two __test(...); +template <class _Tp> _Tp& __source(); +} + +template <class _Tp, bool = is_class<_Tp>::value || + is_union<_Tp>::value || + is_void<_Tp>::value || + is_reference<_Tp>::value || + is_same<_Tp, nullptr_t>::value > +struct __is_function + : public integral_constant<bool, sizeof(__is_function_imp::__test<_Tp>(__is_function_imp::__source<_Tp>())) == 1> + {}; +template <class _Tp> struct __is_function<_Tp, true> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_function + : public __is_function<_Tp> {}; + +// is_member_function_pointer + +template <class _Tp> struct __is_member_function_pointer : public false_type {}; +template <class _Tp, class _Up> struct __is_member_function_pointer<_Tp _Up::*> : public is_function<_Tp> {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_member_function_pointer + : public __is_member_function_pointer<typename remove_cv<_Tp>::type> {}; + +// is_member_pointer + +template <class _Tp> struct __is_member_pointer : public false_type {}; +template <class _Tp, class _Up> struct __is_member_pointer<_Tp _Up::*> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_member_pointer + : public __is_member_pointer<typename remove_cv<_Tp>::type> {}; + +// is_member_object_pointer + +template <class _Tp> struct _LIBCPP_VISIBLE is_member_object_pointer + : public integral_constant<bool, is_member_pointer<_Tp>::value && + !is_member_function_pointer<_Tp>::value> {}; + +// is_enum + +#if __has_feature(is_enum) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_enum + : public integral_constant<bool, __is_enum(_Tp)> {}; + +#else + +template <class _Tp> struct _LIBCPP_VISIBLE is_enum + : public integral_constant<bool, !is_void<_Tp>::value && + !is_integral<_Tp>::value && + !is_floating_point<_Tp>::value && + !is_array<_Tp>::value && + !is_pointer<_Tp>::value && + !is_reference<_Tp>::value && + !is_member_pointer<_Tp>::value && + !is_union<_Tp>::value && + !is_class<_Tp>::value && + !is_function<_Tp>::value > {}; + +#endif + +// is_arithmetic + +template <class _Tp> struct _LIBCPP_VISIBLE is_arithmetic + : public integral_constant<bool, is_integral<_Tp>::value || + is_floating_point<_Tp>::value> {}; + +// is_fundamental + +template <class _Tp> struct _LIBCPP_VISIBLE is_fundamental + : public integral_constant<bool, is_void<_Tp>::value || + __is_nullptr_t<_Tp>::value || + is_arithmetic<_Tp>::value> {}; + +// is_scalar + +template <class _Tp> struct _LIBCPP_VISIBLE is_scalar + : public integral_constant<bool, is_arithmetic<_Tp>::value || + is_member_pointer<_Tp>::value || + is_pointer<_Tp>::value || + __is_nullptr_t<_Tp>::value || + is_enum<_Tp>::value > {}; + +template <> struct _LIBCPP_VISIBLE is_scalar<nullptr_t> : public true_type {}; + +// is_object + +template <class _Tp> struct _LIBCPP_VISIBLE is_object + : public integral_constant<bool, is_scalar<_Tp>::value || + is_array<_Tp>::value || + is_union<_Tp>::value || + is_class<_Tp>::value > {}; + +// is_compound + +template <class _Tp> struct _LIBCPP_VISIBLE is_compound + : public integral_constant<bool, !is_fundamental<_Tp>::value> {}; + +// add_const + +template <class _Tp, bool = is_reference<_Tp>::value || + is_function<_Tp>::value || + is_const<_Tp>::value > +struct __add_const {typedef _Tp type;}; + +template <class _Tp> +struct __add_const<_Tp, false> {typedef const _Tp type;}; + +template <class _Tp> struct _LIBCPP_VISIBLE add_const + {typedef typename __add_const<_Tp>::type type;}; + +// add_volatile + +template <class _Tp, bool = is_reference<_Tp>::value || + is_function<_Tp>::value || + is_volatile<_Tp>::value > +struct __add_volatile {typedef _Tp type;}; + +template <class _Tp> +struct __add_volatile<_Tp, false> {typedef volatile _Tp type;}; + +template <class _Tp> struct _LIBCPP_VISIBLE add_volatile + {typedef typename __add_volatile<_Tp>::type type;}; + +// add_cv + +template <class _Tp> struct _LIBCPP_VISIBLE add_cv + {typedef typename add_const<typename add_volatile<_Tp>::type>::type type;}; + +// remove_reference + +template <class _Tp> struct _LIBCPP_VISIBLE remove_reference {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_reference<_Tp&> {typedef _Tp type;}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> struct _LIBCPP_VISIBLE remove_reference<_Tp&&> {typedef _Tp type;}; +#endif + +// add_lvalue_reference + +template <class _Tp> struct _LIBCPP_VISIBLE add_lvalue_reference {typedef _Tp& type;}; +template <class _Tp> struct _LIBCPP_VISIBLE add_lvalue_reference<_Tp&> {typedef _Tp& type;}; // for older compiler +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<void> {typedef void type;}; +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<const void> {typedef const void type;}; +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<volatile void> {typedef volatile void type;}; +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<const volatile void> {typedef const volatile void type;}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> struct _LIBCPP_VISIBLE add_rvalue_reference {typedef _Tp&& type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<void> {typedef void type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<const void> {typedef const void type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<volatile void> {typedef volatile void type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<const volatile void> {typedef const volatile void type;}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +typename add_rvalue_reference<_Tp>::type +declval() _NOEXCEPT; + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +typename add_lvalue_reference<_Tp>::type +declval(); + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +struct __any +{ + __any(...); +}; + +// remove_pointer + +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp*> {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* const> {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* volatile> {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* const volatile> {typedef _Tp type;}; + +// add_pointer + +template <class _Tp> struct _LIBCPP_VISIBLE add_pointer + {typedef typename remove_reference<_Tp>::type* type;}; + +// is_signed + +template <class _Tp, bool = is_integral<_Tp>::value> +struct ___is_signed : public integral_constant<bool, _Tp(-1) < _Tp(0)> {}; + +template <class _Tp> +struct ___is_signed<_Tp, false> : public true_type {}; // floating point + +template <class _Tp, bool = is_arithmetic<_Tp>::value> +struct __is_signed : public ___is_signed<_Tp> {}; + +template <class _Tp> struct __is_signed<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_signed : public __is_signed<_Tp> {}; + +// is_unsigned + +template <class _Tp, bool = is_integral<_Tp>::value> +struct ___is_unsigned : public integral_constant<bool, _Tp(0) < _Tp(-1)> {}; + +template <class _Tp> +struct ___is_unsigned<_Tp, false> : public false_type {}; // floating point + +template <class _Tp, bool = is_arithmetic<_Tp>::value> +struct __is_unsigned : public ___is_unsigned<_Tp> {}; + +template <class _Tp> struct __is_unsigned<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_unsigned : public __is_unsigned<_Tp> {}; + +// rank + +template <class _Tp> struct _LIBCPP_VISIBLE rank + : public integral_constant<size_t, 0> {}; +template <class _Tp> struct _LIBCPP_VISIBLE rank<_Tp[]> + : public integral_constant<size_t, rank<_Tp>::value + 1> {}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE rank<_Tp[_Np]> + : public integral_constant<size_t, rank<_Tp>::value + 1> {}; + +// extent + +template <class _Tp, unsigned _Ip = 0> struct _LIBCPP_VISIBLE extent + : public integral_constant<size_t, 0> {}; +template <class _Tp> struct _LIBCPP_VISIBLE extent<_Tp[], 0> + : public integral_constant<size_t, 0> {}; +template <class _Tp, unsigned _Ip> struct _LIBCPP_VISIBLE extent<_Tp[], _Ip> + : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE extent<_Tp[_Np], 0> + : public integral_constant<size_t, _Np> {}; +template <class _Tp, size_t _Np, unsigned _Ip> struct _LIBCPP_VISIBLE extent<_Tp[_Np], _Ip> + : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {}; + +// remove_extent + +template <class _Tp> struct _LIBCPP_VISIBLE remove_extent + {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_extent<_Tp[]> + {typedef _Tp type;}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE remove_extent<_Tp[_Np]> + {typedef _Tp type;}; + +// remove_all_extents + +template <class _Tp> struct _LIBCPP_VISIBLE remove_all_extents + {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_all_extents<_Tp[]> + {typedef typename remove_all_extents<_Tp>::type type;}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE remove_all_extents<_Tp[_Np]> + {typedef typename remove_all_extents<_Tp>::type type;}; + +// is_abstract + +namespace __is_abstract_imp +{ +template <class _Tp> char __test(_Tp (*)[1]); +template <class _Tp> __two __test(...); +} + +template <class _Tp, bool = is_class<_Tp>::value> +struct __libcpp_abstract : public integral_constant<bool, sizeof(__is_abstract_imp::__test<_Tp>(0)) != 1> {}; + +template <class _Tp> struct __libcpp_abstract<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_abstract : public __libcpp_abstract<_Tp> {}; + +// is_convertible + +#if __has_feature(is_convertible_to) + +template <class _T1, class _T2> struct _LIBCPP_VISIBLE is_convertible + : public integral_constant<bool, __is_convertible_to(_T1, _T2)> {}; + +#else // __has_feature(is_convertible_to) + +namespace __is_convertible_imp +{ +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> char __test(const volatile typename remove_reference<_Tp>::type&&); +#else +template <class _Tp> char __test(_Tp); +#endif +template <class _Tp> __two __test(...); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> _Tp&& __source(); +#else +template <class _Tp> typename remove_reference<_Tp>::type& __source(); +#endif + +template <class _Tp, bool _IsArray = is_array<_Tp>::value, + bool _IsFunction = is_function<_Tp>::value, + bool _IsVoid = is_void<_Tp>::value> + struct __is_array_function_or_void {enum {value = 0};}; +template <class _Tp> struct __is_array_function_or_void<_Tp, true, false, false> {enum {value = 1};}; +template <class _Tp> struct __is_array_function_or_void<_Tp, false, true, false> {enum {value = 2};}; +template <class _Tp> struct __is_array_function_or_void<_Tp, false, false, true> {enum {value = 3};}; +} + +template <class _Tp, + unsigned = __is_convertible_imp::__is_array_function_or_void<typename remove_reference<_Tp>::type>::value> +struct __is_convertible_check +{ + static const size_t __v = 0; +}; + +template <class _Tp> +struct __is_convertible_check<_Tp, 0> +{ + static const size_t __v = sizeof(_Tp); +}; + +template <class _T1, class _T2, + unsigned _T1_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T1>::value, + unsigned _T2_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T2>::value> +struct __is_convertible + : public integral_constant<bool, + sizeof(__is_convertible_imp::__test<_T2>(__is_convertible_imp::__source<_T1>())) == 1 + > +{}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 0> : false_type {}; + +template <class _T1> struct __is_convertible<_T1, const _T1&, 1, 0> : true_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _T1> struct __is_convertible<_T1, _T1&&, 1, 0> : true_type {}; +template <class _T1> struct __is_convertible<_T1, const _T1&&, 1, 0> : true_type {}; +template <class _T1> struct __is_convertible<_T1, volatile _T1&&, 1, 0> : true_type {}; +template <class _T1> struct __is_convertible<_T1, const volatile _T1&&, 1, 0> : true_type {}; +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2*, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2* const, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*const>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2* volatile, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*volatile>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2* const volatile, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*const volatile>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 0> : public false_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _T1> struct __is_convertible<_T1, _T1&&, 2, 0> : public true_type {}; +#endif +template <class _T1> struct __is_convertible<_T1, _T1*, 2, 0> : public true_type {}; +template <class _T1> struct __is_convertible<_T1, _T1*const, 2, 0> : public true_type {}; +template <class _T1> struct __is_convertible<_T1, _T1*volatile, 2, 0> : public true_type {}; +template <class _T1> struct __is_convertible<_T1, _T1*const volatile, 2, 0> : public true_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 0> : public false_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 1> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 1> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 1> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 1> : public false_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 2> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 2> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 2> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 2> : public false_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 3> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 3> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 3> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 3> : public true_type {}; + +template <class _T1, class _T2> struct _LIBCPP_VISIBLE is_convertible + : public __is_convertible<_T1, _T2> +{ + static const size_t __complete_check1 = __is_convertible_check<_T1>::__v; + static const size_t __complete_check2 = __is_convertible_check<_T2>::__v; +}; + +#endif // __has_feature(is_convertible_to) + +// is_base_of + +#ifdef _LIBCP_HAS_IS_BASE_OF + +template <class _Bp, class _Dp> +struct _LIBCPP_VISIBLE is_base_of + : public integral_constant<bool, __is_base_of(_Bp, _Dp)> {}; + +#else // __has_feature(is_base_of) + +#error is_base_of not implemented. + +#endif // __has_feature(is_base_of) + +// is_empty + +template <class _Tp> +struct __is_empty1 + : public _Tp +{ + double _; +}; + +struct __is_empty2 +{ + double _; +}; + +template <class _Tp, bool = is_class<_Tp>::value> +struct __libcpp_empty : public integral_constant<bool, sizeof(__is_empty1<_Tp>) == sizeof(__is_empty2)> {}; + +template <class _Tp> struct __libcpp_empty<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_empty : public __libcpp_empty<_Tp> {}; + +// is_polymorphic + +template <class _Tp> struct __is_polymorphic1 : public _Tp {}; +template <class _Tp> struct __is_polymorphic2 : public _Tp {virtual ~__is_polymorphic2() throw();}; + +template <class _Tp, bool = is_class<_Tp>::value> +struct __libcpp_polymorphic + : public integral_constant<bool, sizeof(__is_polymorphic1<_Tp>) == sizeof(__is_polymorphic2<_Tp>)> {}; + +template <class _Tp> struct __libcpp_polymorphic<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_polymorphic + : public __libcpp_polymorphic<_Tp> {}; + +// has_virtual_destructor + +#if __has_feature(has_virtual_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor + : public integral_constant<bool, __has_virtual_destructor(_Tp)> {}; + +#else // _LIBCPP_HAS_TYPE_TRAITS + +template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor + : public false_type {}; + +#endif // _LIBCPP_HAS_TYPE_TRAITS + +// alignment_of + +template <class _Tp> struct __alignment_of {_Tp _;}; + +template <class _Tp> struct _LIBCPP_VISIBLE alignment_of + : public integral_constant<size_t, __alignof__(__alignment_of<typename remove_all_extents<_Tp>::type>)> {}; + +// aligned_storage + +template <class _Hp, class _Tp> +struct __type_list +{ + typedef _Hp _Head; + typedef _Tp _Tail; +}; + +struct __nat +{ +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS + __nat() = delete; + __nat(const __nat&) = delete; + __nat& operator=(const __nat&) = delete; + ~__nat() = delete; +#endif +}; + +template <class _Tp> +struct __align_type +{ + static const size_t value = alignment_of<_Tp>::value; + typedef _Tp type; +}; + +struct __struct_double {long double _;}; +struct __struct_double4 {double _[4];}; + +typedef + __type_list<__align_type<unsigned char>, + __type_list<__align_type<unsigned short>, + __type_list<__align_type<unsigned int>, + __type_list<__align_type<unsigned long>, + __type_list<__align_type<unsigned long long>, + __type_list<__align_type<double>, + __type_list<__align_type<long double>, + __type_list<__align_type<__struct_double>, + __type_list<__align_type<__struct_double4>, + __type_list<__align_type<int*>, + __nat + > > > > > > > > > > __all_types; + +template <class _TL, size_t _Align> struct __find_pod; + +template <class _Hp, size_t _Align> +struct __find_pod<__type_list<_Hp, __nat>, _Align> +{ + typedef typename conditional< + _Align == _Hp::value, + typename _Hp::type, + void + >::type type; +}; + +template <class _Hp, class _Tp, size_t _Align> +struct __find_pod<__type_list<_Hp, _Tp>, _Align> +{ + typedef typename conditional< + _Align == _Hp::value, + typename _Hp::type, + typename __find_pod<_Tp, _Align>::type + >::type type; +}; + +template <class _TL, size_t _Len> struct __find_max_align; + +template <class _Hp, size_t _Len> +struct __find_max_align<__type_list<_Hp, __nat>, _Len> : public integral_constant<size_t, _Hp::value> {}; + +template <size_t _Len, size_t _A1, size_t _A2> +struct __select_align +{ +private: + static const size_t __min = _A2 < _A1 ? _A2 : _A1; + static const size_t __max = _A1 < _A2 ? _A2 : _A1; +public: + static const size_t value = _Len < __max ? __min : __max; +}; + +template <class _Hp, class _Tp, size_t _Len> +struct __find_max_align<__type_list<_Hp, _Tp>, _Len> + : public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value> {}; + +template <size_t _Len, const size_t _Align = __find_max_align<__all_types, _Len>::value> +struct _LIBCPP_VISIBLE aligned_storage +{ + typedef typename __find_pod<__all_types, _Align>::type _Aligner; + static_assert(!is_void<_Aligner>::value, ""); + union type + { + _Aligner __align; + unsigned char __data[_Len]; + }; +}; + +#define _CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \ +template <size_t _Len>\ +struct _LIBCPP_VISIBLE aligned_storage<_Len, n>\ +{\ + struct _ALIGNAS(n) type\ + {\ + unsigned char _[_Len];\ + };\ +} + +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x8); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x10); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x20); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x40); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x80); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x100); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x200); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x400); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000); +// MSDN says that MSVC does not support alignment beyond 8192 (=0x2000) +#if !defined(_MSC_VER) +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000); +#endif // !_MSC_VER + +#undef _CREATE_ALIGNED_STORAGE_SPECIALIZATION + +// __promote + +template <class _A1, class _A2 = void, class _A3 = void, + bool = (is_arithmetic<_A1>::value || is_void<_A1>::value) && + (is_arithmetic<_A2>::value || is_void<_A2>::value) && + (is_arithmetic<_A3>::value || is_void<_A3>::value)> +class __promote {}; + +template <class _A1, class _A2, class _A3> +class __promote<_A1, _A2, _A3, true> +{ +private: + typedef typename __promote<_A1>::type __type1; + typedef typename __promote<_A2>::type __type2; + typedef typename __promote<_A3>::type __type3; +public: + typedef decltype(__type1() + __type2() + __type3()) type; +}; + +template <class _A1, class _A2> +class __promote<_A1, _A2, void, true> +{ +private: + typedef typename __promote<_A1>::type __type1; + typedef typename __promote<_A2>::type __type2; +public: + typedef decltype(__type1() + __type2()) type; +}; + +template <class _A1> +class __promote<_A1, void, void, true> +{ +public: + typedef typename conditional<is_arithmetic<_A1>::value, + typename conditional<is_integral<_A1>::value, double, _A1>::type, + void + >::type type; +}; + +#ifdef _LIBCPP_STORE_AS_OPTIMIZATION + +// __transform + +template <class _Tp, size_t = sizeof(_Tp), bool = is_scalar<_Tp>::value> struct __transform {typedef _Tp type;}; +template <class _Tp> struct __transform<_Tp, 1, true> {typedef unsigned char type;}; +template <class _Tp> struct __transform<_Tp, 2, true> {typedef unsigned short type;}; +template <class _Tp> struct __transform<_Tp, 4, true> {typedef unsigned int type;}; +template <class _Tp> struct __transform<_Tp, 8, true> {typedef unsigned long long type;}; + +#endif // _LIBCPP_STORE_AS_OPTIMIZATION + +// make_signed / make_unsigned + +typedef + __type_list<signed char, + __type_list<signed short, + __type_list<signed int, + __type_list<signed long, + __type_list<signed long long, + __nat + > > > > > __signed_types; + +typedef + __type_list<unsigned char, + __type_list<unsigned short, + __type_list<unsigned int, + __type_list<unsigned long, + __type_list<unsigned long long, + __nat + > > > > > __unsigned_types; + +template <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)> struct __find_first; + +template <class _Hp, class _Tp, size_t _Size> +struct __find_first<__type_list<_Hp, _Tp>, _Size, true> +{ + typedef _Hp type; +}; + +template <class _Hp, class _Tp, size_t _Size> +struct __find_first<__type_list<_Hp, _Tp>, _Size, false> +{ + typedef typename __find_first<_Tp, _Size>::type type; +}; + +template <class _Tp, class _Up, bool = is_const<typename remove_reference<_Tp>::type>::value, + bool = is_volatile<typename remove_reference<_Tp>::type>::value> +struct __apply_cv +{ + typedef _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp, _Up, true, false> +{ + typedef const _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp, _Up, false, true> +{ + typedef volatile _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp, _Up, true, true> +{ + typedef const volatile _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, false, false> +{ + typedef _Up& type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, true, false> +{ + typedef const _Up& type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, false, true> +{ + typedef volatile _Up& type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, true, true> +{ + typedef const volatile _Up& type; +}; + +template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> +struct __make_signed {}; + +template <class _Tp> +struct __make_signed<_Tp, true> +{ + typedef typename __find_first<__signed_types, sizeof(_Tp)>::type type; +}; + +template <> struct __make_signed<bool, true> {}; +template <> struct __make_signed< signed short, true> {typedef short type;}; +template <> struct __make_signed<unsigned short, true> {typedef short type;}; +template <> struct __make_signed< signed int, true> {typedef int type;}; +template <> struct __make_signed<unsigned int, true> {typedef int type;}; +template <> struct __make_signed< signed long, true> {typedef long type;}; +template <> struct __make_signed<unsigned long, true> {typedef long type;}; +template <> struct __make_signed< signed long long, true> {typedef long long type;}; +template <> struct __make_signed<unsigned long long, true> {typedef long long type;}; + +template <class _Tp> +struct _LIBCPP_VISIBLE make_signed +{ + typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type; +}; + +template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> +struct __make_unsigned {}; + +template <class _Tp> +struct __make_unsigned<_Tp, true> +{ + typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type; +}; + +template <> struct __make_unsigned<bool, true> {}; +template <> struct __make_unsigned< signed short, true> {typedef unsigned short type;}; +template <> struct __make_unsigned<unsigned short, true> {typedef unsigned short type;}; +template <> struct __make_unsigned< signed int, true> {typedef unsigned int type;}; +template <> struct __make_unsigned<unsigned int, true> {typedef unsigned int type;}; +template <> struct __make_unsigned< signed long, true> {typedef unsigned long type;}; +template <> struct __make_unsigned<unsigned long, true> {typedef unsigned long type;}; +template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;}; +template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;}; + +template <class _Tp> +struct _LIBCPP_VISIBLE make_unsigned +{ + typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type; +}; + +#ifdef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Up = void, class V = void> +struct _LIBCPP_VISIBLE common_type +{ +public: + typedef typename common_type<typename common_type<_Tp, _Up>::type, V>::type type; +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE common_type<_Tp, void, void> +{ +public: + typedef _Tp type; +}; + +template <class _Tp, class _Up> +struct _LIBCPP_VISIBLE common_type<_Tp, _Up, void> +{ +private: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + static _Tp&& __t(); + static _Up&& __u(); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + static _Tp __t(); + static _Up __u(); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +public: + typedef decltype(true ? __t() : __u()) type; +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class ..._Tp> struct common_type; + +template <class _Tp> +struct _LIBCPP_VISIBLE common_type<_Tp> +{ + typedef _Tp type; +}; + +template <class _Tp, class _Up> +struct _LIBCPP_VISIBLE common_type<_Tp, _Up> +{ +private: + static _Tp&& __t(); + static _Up&& __u(); + static bool __f(); +public: + typedef decltype(__f() ? __t() : __u()) type; +}; + +template <class _Tp, class _Up, class ..._Vp> +struct _LIBCPP_VISIBLE common_type<_Tp, _Up, _Vp...> +{ + typedef typename common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_assignable + +template <class _Tp, class _Arg> +decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>(), true_type())) +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__is_assignable_test(_Tp&&, _Arg&&); +#else +__is_assignable_test(_Tp, _Arg&); +#endif + +template <class _Arg> +false_type +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__is_assignable_test(__any, _Arg&&); +#else +__is_assignable_test(__any, _Arg&); +#endif + +template <class _Tp, class _Arg, bool = is_void<_Tp>::value || is_void<_Arg>::value> +struct __is_assignable_imp + : public common_type + < + decltype(__is_assignable_test(declval<_Tp>(), declval<_Arg>())) + >::type {}; + +template <class _Tp, class _Arg> +struct __is_assignable_imp<_Tp, _Arg, true> + : public false_type +{ +}; + +template <class _Tp, class _Arg> +struct is_assignable + : public __is_assignable_imp<_Tp, _Arg> {}; + +// is_copy_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_copy_assignable + : public is_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_lvalue_reference<_Tp>::type> {}; + +// is_move_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_move_assignable +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_rvalue_reference<_Tp>::type> {}; +#else + : public is_copy_assignable<_Tp> {}; +#endif + +// is_destructible + +template <class _Tp> +struct __destructible_test +{ + _Tp __t; +}; + +template <class _Tp> +decltype((_VSTD::declval<__destructible_test<_Tp> >().~__destructible_test<_Tp>(), true_type())) +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__is_destructible_test(_Tp&&); +#else +__is_destructible_test(_Tp&); +#endif + +false_type +__is_destructible_test(__any); + +template <class _Tp, bool = is_void<_Tp>::value || is_abstract<_Tp>::value> +struct __destructible_imp + : public common_type + < + decltype(__is_destructible_test(declval<_Tp>())) + >::type {}; + +template <class _Tp> +struct __destructible_imp<_Tp, true> + : public false_type {}; + +template <class _Tp> +struct is_destructible + : public __destructible_imp<_Tp> {}; + +// move + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename remove_reference<_Tp>::type&& +move(_Tp&& __t) _NOEXCEPT +{ + typedef typename remove_reference<_Tp>::type _Up; + return static_cast<_Up&&>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp&& +forward(typename std::remove_reference<_Tp>::type& __t) _NOEXCEPT +{ + return static_cast<_Tp&&>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp&& +forward(typename std::remove_reference<_Tp>::type&& __t) _NOEXCEPT +{ + static_assert(!std::is_lvalue_reference<_Tp>::value, + "Can not forward an rvalue as an lvalue."); + return static_cast<_Tp&&>(__t); +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +class __rv +{ + typedef typename remove_reference<_Tp>::type _Trr; + _Trr& t_; +public: + _LIBCPP_INLINE_VISIBILITY + _Trr* operator->() {return &t_;} + _LIBCPP_INLINE_VISIBILITY + explicit __rv(_Trr& __t) : t_(__t) {} +}; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + _Tp& +>::type +move(_Tp& __t) +{ + return __t; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Tp, __rv<_Tp> >::value, + _Tp +>::type +move(_Tp& __t) +{ + return _Tp(__rv<_Tp>(__t)); +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + typename add_lvalue_reference<_Tp>::type +>::type +forward(_Up& __t) +{ + return __t; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + typename add_lvalue_reference<_Tp>::type +>::type +forward(const _Up& __t) +{ + return __t; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Tp, __rv<_Tp> >::value, + _Tp +>::type +forward(_Up& __t) +{ + return _Tp(__rv<_Tp>(__t)); +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Tp, __rv<_Tp> >::value, + _Tp +>::type +forward(const _Up& __t) +{ + return _Tp(__rv<_Tp>(__t)); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct _LIBCPP_VISIBLE decay +{ +private: + typedef typename remove_reference<_Tp>::type _Up; +public: + typedef typename conditional + < + is_array<_Up>::value, + typename remove_extent<_Up>::type*, + typename conditional + < + is_function<_Up>::value, + typename add_pointer<_Up>::type, + typename remove_cv<_Up>::type + >::type + >::type type; +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename decay<_Tp>::type +__decay_copy(_Tp&& __t) +{ + return _VSTD::forward<_Tp>(__t); +} + +#else + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename decay<_Tp>::type +__decay_copy(const _Tp& __t) +{ + return _VSTD::forward<_Tp>(__t); +} + +#endif + +template <class _MP, bool _IsMemberFuctionPtr, bool _IsMemberObjectPtr> +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> +{ + typedef _Class _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _R _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> +{ + typedef _Class& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const&, true, false> +{ + typedef _Class const& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile&, true, false> +{ + typedef _Class volatile& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile&, true, false> +{ + typedef _Class const volatile& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) &&, true, false> +{ + typedef _Class&& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const&&, true, false> +{ + typedef _Class const&& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile&&, true, false> +{ + typedef _Class volatile&& _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile&&, true, false> +{ + typedef _Class const volatile&& _ClassType; + typedef _R _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> +{ + typedef _Class _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0), true, false> +{ + typedef _Class _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1), true, false> +{ + typedef _Class _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2), true, false> +{ + typedef _Class _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class> +struct __member_pointer_traits_imp<_R (_Class::*)() const, true, false> +{ + typedef _Class const _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0) const, true, false> +{ + typedef _Class const _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) const, true, false> +{ + typedef _Class const _ClassType; + typedef _R _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> +{ + typedef _Class const _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class> +struct __member_pointer_traits_imp<_R (_Class::*)() volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _R _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> +{ + typedef _Class volatile _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class> +struct __member_pointer_traits_imp<_R (_Class::*)() const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _R _ReturnType; +}; + +template <class _R, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _R _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> +{ + typedef _Class const volatile _ClassType; + typedef _R _ReturnType; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _R, class _Class> +struct __member_pointer_traits_imp<_R _Class::*, false, true> +{ + typedef _Class _ClassType; + typedef _R _ReturnType; +}; + +template <class _MP> +struct __member_pointer_traits + : public __member_pointer_traits_imp<_MP, + is_member_function_pointer<_MP>::value, + is_member_object_pointer<_MP>::value> +{ +// typedef ... _ClassType; +// typedef ... _ReturnType; +}; + +// result_of + +template <class _Callable> class result_of; + +template <class _Fn, bool, bool> +class __result_of +{ +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Fn, class ..._ArgTypes> +class __result_of<_Fn(_ArgTypes...), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type; +}; + +template <class _MP, class _Tp, bool _IsMemberFunctionPtr> +struct __result_of_mp; + +// member function pointer + +template <class _MP, class _Tp> +struct __result_of_mp<_MP, _Tp, true> + : public common_type<typename __member_pointer_traits<_MP>::_ReturnType> +{ +}; + +// member data pointer + +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> +{ + typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _R>::type&& type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mdp<_R _Class::*, _Tp, true> +{ + typedef typename __apply_cv<_Tp, _R>::type&& type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mp<_R _Class::*, _Tp, false> + : public __result_of_mdp<_R _Class::*, _Tp, + is_base_of<_Class, typename remove_reference<_Tp>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class ..._ArgTypes> +class __result_of<_Fn(_Tp, _ArgTypes...), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +// result_of + +template <class _Fn, class ..._ArgTypes> +class _LIBCPP_VISIBLE result_of<_Fn(_ArgTypes...)> + : public __result_of<_Fn(_ArgTypes...), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Fn> +class __result_of<_Fn(), true, false> +{ +public: + typedef decltype(declval<_Fn>()()) type; +}; + +template <class _Fn, class _A0> +class __result_of<_Fn(_A0), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_A0>())) type; +}; + +template <class _Fn, class _A0, class _A1> +class __result_of<_Fn(_A0, _A1), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>())) type; +}; + +template <class _Fn, class _A0, class _A1, class _A2> +class __result_of<_Fn(_A0, _A1, _A2), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>(), declval<_A2>())) type; +}; + +template <class _MP, class _Tp, bool _IsMemberFunctionPtr> +struct __result_of_mp; + +// member function pointer + +template <class _MP, class _Tp> +struct __result_of_mp<_MP, _Tp, true> + : public common_type<typename __member_pointer_traits<_MP>::_ReturnType> +{ +}; + +// member data pointer + +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> +{ + typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _R>::type& type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mdp<_R _Class::*, _Tp, true> +{ + typedef typename __apply_cv<_Tp, _R>::type& type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mp<_R _Class::*, _Tp, false> + : public __result_of_mdp<_R _Class::*, _Tp, + is_base_of<_Class, typename remove_reference<_Tp>::type>::value> +{ +}; + + + +template <class _Fn, class _Tp> +class __result_of<_Fn(_Tp), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class _A0> +class __result_of<_Fn(_Tp, _A0), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class _A0, class _A1> +class __result_of<_Fn(_Tp, _A0, _A1), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class _A0, class _A1, class _A2> +class __result_of<_Fn(_Tp, _A0, _A1, _A2), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +// result_of + +template <class _Fn> +class _LIBCPP_VISIBLE result_of<_Fn()> + : public __result_of<_Fn(), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +template <class _Fn, class _A0> +class _LIBCPP_VISIBLE result_of<_Fn(_A0)> + : public __result_of<_Fn(_A0), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +template <class _Fn, class _A0, class _A1> +class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1)> + : public __result_of<_Fn(_A0, _A1), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +template <class _Fn, class _A0, class _A1, class _A2> +class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1, _A2)> + : public __result_of<_Fn(_A0, _A1, _A2), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// template <class T, class... Args> struct is_constructible; + +// main is_constructible test + +template <class _Tp, class ..._Args> +decltype(_VSTD::move(_Tp(_VSTD::declval<_Args>()...)), true_type()) +__is_constructible_test(_Tp&&, _Args&& ...); + +template <class ..._Args> +false_type +__is_constructible_test(__any, _Args&& ...); + +template <bool, class _Tp, class... _Args> +struct __is_constructible // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible_test(declval<_Tp>(), declval<_Args>()...)) + >::type + {}; + +// function types are not constructible + +template <class _R, class... _A1, class... _A2> +struct __is_constructible<false, _R(_A1...), _A2...> + : public false_type + {}; + +// handle scalars and reference types + +// Scalars are default constructible, references are not + +template <class _Tp> +struct __is_constructible<true, _Tp> + : public is_scalar<_Tp> + {}; + +// Scalars and references are constructible from one arg if that arg is +// implicitly convertible to the scalar or reference. + +template <class _Tp> +struct __is_constructible_ref +{ + true_type static __(_Tp); + false_type static __(...); +}; + +template <class _Tp, class _A0> +struct __is_constructible<true, _Tp, _A0> + : public common_type + < + decltype(__is_constructible_ref<_Tp>::__(declval<_A0>())) + >::type + {}; + +// Scalars and references are not constructible from multiple args. + +template <class _Tp, class _A0, class ..._Args> +struct __is_constructible<true, _Tp, _A0, _Args...> + : public false_type + {}; + +// Treat scalars and reference types separately + +template <bool, class _Tp, class... _Args> +struct __is_constructible_void_check + : public __is_constructible<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp, _Args...> + {}; + +// If any of T or Args is void, is_constructible should be false + +template <class _Tp, class... _Args> +struct __is_constructible_void_check<true, _Tp, _Args...> + : public false_type + {}; + +template <class ..._Args> struct __contains_void; + +template <> struct __contains_void<> : false_type {}; + +template <class _A0, class ..._Args> +struct __contains_void<_A0, _Args...> +{ + static const bool value = is_void<_A0>::value || + __contains_void<_Args...>::value; +}; + +// is_constructible entry point + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_constructible + : public __is_constructible_void_check<__contains_void<_Tp, _Args...>::value + || is_abstract<_Tp>::value, + _Tp, _Args...> + {}; + +// 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> + {}; + +// Otherwise array types are not constructible by this syntax + +template <class _A, size_t _N, class ..._Args> +struct __is_constructible<false, _A[_N], _Args...> + : public false_type + {}; + +// Incomplete array types are not constructible + +template <class _A, class ..._Args> +struct __is_constructible<false, _A[], _Args...> + : public false_type + {}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +// template <class T> struct is_constructible0; + +// main is_constructible0 test + +template <class _Tp> +decltype((_Tp(), true_type())) +__is_constructible0_test(_Tp&); + +false_type +__is_constructible0_test(__any); + +template <class _Tp, class _A0> +decltype((_Tp(_VSTD::declval<_A0>()), true_type())) +__is_constructible1_test(_Tp&, _A0&); + +template <class _A0> +false_type +__is_constructible1_test(__any, _A0&); + +template <class _Tp, class _A0, class _A1> +decltype((_Tp(_VSTD::declval<_A0>(), _VSTD::declval<_A1>()), true_type())) +__is_constructible2_test(_Tp&, _A0&, _A1&); + +template <class _A0, class _A1> +false_type +__is_constructible2_test(__any, _A0&, _A1&); + +template <bool, class _Tp> +struct __is_constructible0_imp // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible0_test(declval<_Tp&>())) + >::type + {}; + +template <bool, class _Tp, class _A0> +struct __is_constructible1_imp // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible1_test(declval<_Tp&>(), declval<_A0&>())) + >::type + {}; + +template <bool, class _Tp, class _A0, class _A1> +struct __is_constructible2_imp // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible2_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>())) + >::type + {}; + +// handle scalars and reference types + +// Scalars are default constructible, references are not + +template <class _Tp> +struct __is_constructible0_imp<true, _Tp> + : public is_scalar<_Tp> + {}; + +template <class _Tp, class _A0> +struct __is_constructible1_imp<true, _Tp, _A0> + : public is_convertible<_A0, _Tp> + {}; + +template <class _Tp, class _A0, class _A1> +struct __is_constructible2_imp<true, _Tp, _A0, _A1> + : public false_type + {}; + +// Treat scalars and reference types separately + +template <bool, class _Tp> +struct __is_constructible0_void_check + : public __is_constructible0_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp> + {}; + +template <bool, class _Tp, class _A0> +struct __is_constructible1_void_check + : public __is_constructible1_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp, _A0> + {}; + +template <bool, class _Tp, class _A0, class _A1> +struct __is_constructible2_void_check + : public __is_constructible2_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp, _A0, _A1> + {}; + +// If any of T or Args is void, is_constructible should be false + +template <class _Tp> +struct __is_constructible0_void_check<true, _Tp> + : public false_type + {}; + +template <class _Tp, class _A0> +struct __is_constructible1_void_check<true, _Tp, _A0> + : public false_type + {}; + +template <class _Tp, class _A0, class _A1> +struct __is_constructible2_void_check<true, _Tp, _A0, _A1> + : public false_type + {}; + +// is_constructible entry point + +namespace __is_construct +{ + +struct __nat {}; + +} + +template <class _Tp, class _A0 = __is_construct::__nat, + class _A1 = __is_construct::__nat> +struct _LIBCPP_VISIBLE is_constructible + : public __is_constructible2_void_check<is_void<_Tp>::value + || is_abstract<_Tp>::value + || is_function<_Tp>::value + || is_void<_A0>::value + || is_void<_A1>::value, + _Tp, _A0, _A1> + {}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_constructible<_Tp, __is_construct::__nat, __is_construct::__nat> + : public __is_constructible0_void_check<is_void<_Tp>::value + || is_abstract<_Tp>::value + || is_function<_Tp>::value, + _Tp> + {}; + +template <class _Tp, class _A0> +struct _LIBCPP_VISIBLE is_constructible<_Tp, _A0, __is_construct::__nat> + : public __is_constructible1_void_check<is_void<_Tp>::value + || is_abstract<_Tp>::value + || is_function<_Tp>::value + || is_void<_A0>::value, + _Tp, _A0> + {}; + +// 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 _A, size_t _N, class _A0> +struct __is_constructible1_imp<false, _A[_N], _A0> + : public false_type + {}; + +template <class _A, size_t _N, class _A0, class _A1> +struct __is_constructible2_imp<false, _A[_N], _A0, _A1> + : public false_type + {}; + +// Incomplete array types are not constructible + +template <class _A> +struct __is_constructible0_imp<false, _A[]> + : public false_type + {}; + +template <class _A, class _A0> +struct __is_constructible1_imp<false, _A[], _A0> + : public false_type + {}; + +template <class _A, class _A0, class _A1> +struct __is_constructible2_imp<false, _A[], _A0, _A1> + : public false_type + {}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_default_constructible + +template <class _Tp> +struct _LIBCPP_VISIBLE is_default_constructible + : public is_constructible<_Tp> + {}; + +// is_copy_constructible + +template <class _Tp> +struct _LIBCPP_VISIBLE is_copy_constructible + : public is_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_move_constructible + +template <class _Tp> +struct _LIBCPP_VISIBLE is_move_constructible +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> +#else + : public is_copy_constructible<_Tp> +#endif + {}; + +// is_trivially_constructible + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_trivially_constructible + : false_type +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp> +#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> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +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 +{ +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _A0 = __is_construct::__nat, + class _A1 = __is_construct::__nat> +struct _LIBCPP_VISIBLE is_trivially_constructible + : false_type +{ +}; + +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 // _LIBCPP_HAS_NO_VARIADICS + +// is_trivially_default_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_default_constructible + : public is_trivially_constructible<_Tp> + {}; + +// is_trivially_copy_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_constructible + : public is_trivially_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_trivially_move_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_constructible +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_trivially_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> +#else + : public is_trivially_copy_constructible<_Tp> +#endif + {}; + +// is_trivially_assignable + +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 + +// is_trivially_copy_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_assignable + : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_trivially_move_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_assignable + : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + typename add_rvalue_reference<_Tp>::type> +#else + typename add_lvalue_reference<_Tp>::type> +#endif + {}; + +// is_trivially_destructible + +#if __has_feature(has_trivial_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_destructible + : public integral_constant<bool, __has_trivial_destructor(_Tp)> {}; + +#else // _LIBCPP_HAS_TYPE_TRAITS + +template <class _Tp> struct __libcpp_trivial_destructor + : public integral_constant<bool, is_scalar<_Tp>::value || + is_reference<_Tp>::value> {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_destructible + : public __libcpp_trivial_destructor<typename remove_all_extents<_Tp>::type> {}; + +#endif // _LIBCPP_HAS_TYPE_TRAITS + +// is_nothrow_constructible + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp, class... _Args> struct __is_nothrow_constructible; + +template <class _Tp, class... _Args> +struct __is_nothrow_constructible<true, _Tp, _Args...> + : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> +{ +}; + +template <class _Tp, class... _Args> +struct __is_nothrow_constructible<false, _Tp, _Args...> + : public false_type +{ +}; + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_nothrow_constructible + : __is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, _Tp, _Args...> +{ +}; + +template <class _Tp, size_t _Ns> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp[_Ns]> + : __is_nothrow_constructible<is_constructible<_Tp>::value, _Tp> +{ +}; + +#else // __has_feature(cxx_noexcept) + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_nothrow_constructible + : false_type +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp> +#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_constructor(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&&> +#else +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp> +#endif +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, const _Tp&> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +#endif // __has_feature(cxx_noexcept) + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _A0 = __is_construct::__nat, + class _A1 = __is_construct::__nat> +struct _LIBCPP_VISIBLE is_nothrow_constructible + : false_type +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, __is_construct::__nat, + __is_construct::__nat> +#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_constructor(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp, + __is_construct::__nat> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, const _Tp&, + __is_construct::__nat> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&, + __is_construct::__nat> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_nothrow_default_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_default_constructible + : public is_nothrow_constructible<_Tp> + {}; + +// is_nothrow_copy_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_copy_constructible + : public is_nothrow_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_nothrow_move_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_move_constructible +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_nothrow_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> +#else + : public is_nothrow_copy_constructible<_Tp> +#endif + {}; + +// is_nothrow_assignable + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp, class _Arg> struct __is_nothrow_assignable; + +template <class _Tp, class _Arg> +struct __is_nothrow_assignable<false, _Tp, _Arg> + : public false_type +{ +}; + +template <class _Tp, class _Arg> +struct __is_nothrow_assignable<true, _Tp, _Arg> + : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>()) > +{ +}; + +template <class _Tp, class _Arg> +struct _LIBCPP_VISIBLE is_nothrow_assignable + : public __is_nothrow_assignable<is_assignable<_Tp, _Arg>::value, _Tp, _Arg> +{ +}; + +#else // __has_feature(cxx_noexcept) + +template <class _Tp, class _Arg> +struct _LIBCPP_VISIBLE is_nothrow_assignable + : public false_type {}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, _Tp> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, _Tp&> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, const _Tp&> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct is_nothrow_assignable<_Tp&, _Tp&&> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // __has_feature(cxx_noexcept) + +// is_nothrow_copy_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_copy_assignable + : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_nothrow_move_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_move_assignable + : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + typename add_rvalue_reference<_Tp>::type> +#else + typename add_lvalue_reference<_Tp>::type> +#endif + {}; + +// is_nothrow_destructible + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp> struct __is_nothrow_destructible; + +template <class _Tp> +struct __is_nothrow_destructible<false, _Tp> + : public false_type +{ +}; + +template <class _Tp> +struct __is_nothrow_destructible<true, _Tp> + : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>().~_Tp()) > +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_destructible + : public __is_nothrow_destructible<is_destructible<_Tp>::value, _Tp> +{ +}; + +template <class _Tp, size_t _Ns> +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp[_Ns]> + : public is_nothrow_destructible<_Tp> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&> + : public true_type +{ +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&&> + : public true_type +{ +}; + +#endif + +#else + +template <class _Tp> struct __libcpp_nothrow_destructor + : public integral_constant<bool, is_scalar<_Tp>::value || + is_reference<_Tp>::value> {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_destructible + : public __libcpp_nothrow_destructor<typename remove_all_extents<_Tp>::type> {}; + +#endif + +// is_pod + +#if __has_feature(is_pod) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_pod + : public integral_constant<bool, __is_pod(_Tp)> {}; + +#else // _LIBCPP_HAS_TYPE_TRAITS + +template <class _Tp> struct _LIBCPP_VISIBLE is_pod + : public integral_constant<bool, is_trivially_default_constructible<_Tp>::value && + is_trivially_copy_constructible<_Tp>::value && + is_trivially_copy_assignable<_Tp>::value && + is_trivially_destructible<_Tp>::value> {}; + +#endif // _LIBCPP_HAS_TYPE_TRAITS + +// is_literal_type; + +template <class _Tp> struct _LIBCPP_VISIBLE is_literal_type +#if __has_feature(is_literal) + : public integral_constant<bool, __is_literal(_Tp)> +#else + : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value || + is_reference<typename remove_all_extents<_Tp>::type>::value> +#endif + {}; + +// is_standard_layout; + +template <class _Tp> struct _LIBCPP_VISIBLE is_standard_layout +#if __has_feature(is_standard_layout) + : public integral_constant<bool, __is_standard_layout(_Tp)> +#else + : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value> +#endif + {}; + +// is_trivially_copyable; + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copyable +#if __has_feature(is_trivially_copyable) + : public integral_constant<bool, __is_trivially_copyable(_Tp)> +#else + : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value> +#endif + {}; + +// is_trivial; + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivial +#if __has_feature(is_trivial) + : public integral_constant<bool, __is_trivial(_Tp)> +#else + : integral_constant<bool, is_trivially_copyable<_Tp>::value && + is_trivially_default_constructible<_Tp>::value> +#endif + {}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// Check for complete types + +template <class ..._T> 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 _H> +struct __check_complete<_H, _H> + : private __check_complete<_H> +{ +}; + +template <class _T> +struct __check_complete<_T> +{ + static_assert(sizeof(_T) > 0, "Type must be complete."); +}; + +template <class _T> +struct __check_complete<_T&> + : private __check_complete<_T> +{ +}; + +template <class _T> +struct __check_complete<_T&&> + : private __check_complete<_T> +{ +}; + +template <class _R, class ..._Param> +struct __check_complete<_R (*)(_Param...)> + : private __check_complete<_Param...> +{ +}; + +template <class _R, class ..._Param> +struct __check_complete<_R (_Param...)> + : private __check_complete<_Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...)> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) const> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) volatile> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_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...) &> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) const&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) volatile&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) const volatile&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) &&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) const&&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) volatile&&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _R, class _Class, class ..._Param> +struct __check_complete<_R (_Class::*)(_Param...) const volatile&&> + : private __check_complete<_Class, _Param...> +{ +}; + +#endif + +template <class _R, class _Class> +struct __check_complete<_R _Class::*> + : private __check_complete<_Class> +{ +}; + +// __invoke forward declarations + +// fall back - none of the bullets + +template <class ..._Args> +auto +__invoke(__any, _Args&& ...__args) + -> __nat; + +// bullets 1 and 2 + +template <class _F, class _A0, class ..._Args> +auto +__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)); + +template <class _F, class _A0, class ..._Args> +auto +__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)); + +// bullets 3 and 4 + +template <class _F, class _A0> +auto +__invoke(_F&& __f, _A0&& __a0) + -> decltype(_VSTD::forward<_A0>(__a0).*__f); + +template <class _F, class _A0> +auto +__invoke(_F&& __f, _A0&& __a0) + -> decltype((*_VSTD::forward<_A0>(__a0)).*__f); + +// bullet 5 + +template <class _F, class ..._Args> +auto +__invoke(_F&& __f, _Args&& ...__args) + -> decltype(_VSTD::forward<_F>(__f)(_VSTD::forward<_Args>(__args)...)); + +// __invokable + +template <class _F, class ..._Args> +struct __invokable_imp + : private __check_complete<_F, _Args...> +{ + typedef decltype( + __invoke(_VSTD::declval<_F>(), _VSTD::declval<_Args>()...) + ) type; + static const bool value = !is_same<type, __nat>::value; +}; + +template <class _F, class ..._Args> +struct __invokable + : public integral_constant<bool, + __invokable_imp<_F, _Args...>::value> +{ +}; + +// __invoke_of + +template <bool _Invokable, class _F, class ..._Args> +struct __invoke_of_imp // false +{ +}; + +template <class _F, class ..._Args> +struct __invoke_of_imp<true, _F, _Args...> +{ + typedef typename __invokable_imp<_F, _Args...>::type type; +}; + +template <class _F, class ..._Args> +struct __invoke_of + : public __invoke_of_imp<__invokable<_F, _Args...>::value, _F, _Args...> +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE +typename enable_if +< + is_move_constructible<_Tp>::value && + is_move_assignable<_Tp>::value +>::type +#else +void +#endif +swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value && + is_nothrow_move_assignable<_Tp>::value) +{ + _Tp __t(_VSTD::move(__x)); + __x = _VSTD::move(__y); + __y = _VSTD::move(__t); +} + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +void +iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) + // _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b))) + _NOEXCEPT_(_NOEXCEPT_(swap(*_VSTD::declval<_ForwardIterator1>(), + *_VSTD::declval<_ForwardIterator2>()))) +{ + swap(*__a, *__b); +} + +// __swappable + +namespace __detail +{ + +using _VSTD::swap; +__nat swap(__any, __any); + +template <class _Tp> +struct __swappable +{ + typedef decltype(swap(_VSTD::declval<_Tp&>(), _VSTD::declval<_Tp&>())) type; + static const bool value = !is_same<type, __nat>::value; +}; + +} // __detail + +template <class _Tp> +struct __is_swappable + : public integral_constant<bool, __detail::__swappable<_Tp>::value> +{ +}; + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp> +struct __is_nothrow_swappable_imp + : public integral_constant<bool, noexcept(swap(_VSTD::declval<_Tp&>(), + _VSTD::declval<_Tp&>()))> +{ +}; + +template <class _Tp> +struct __is_nothrow_swappable_imp<false, _Tp> + : public false_type +{ +}; + +template <class _Tp> +struct __is_nothrow_swappable + : public __is_nothrow_swappable_imp<__is_swappable<_Tp>::value, _Tp> +{ +}; + +#else // __has_feature(cxx_noexcept) + +template <class _Tp> +struct __is_nothrow_swappable + : public false_type +{ +}; + +#endif // __has_feature(cxx_noexcept) + +#ifdef _LIBCXX_UNDERLYING_TYPE + +template <class _Tp> +struct underlying_type +{ + typedef _LIBCXX_UNDERLYING_TYPE(_Tp) type; +}; + +#else // _LIBCXX_UNDERLYING_TYPE + +template <class _Tp, bool _Support = false> +struct underlying_type +{ + static_assert(_Support, "The underyling_type trait requires compiler " + "support. Either no such support exists or " + "libc++ does not know how to use it."); +}; + +#endif // _LIBCXX_UNDERLYING_TYPE + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_TYPE_TRAITS |