summaryrefslogtreecommitdiffstats
path: root/libcxx/include
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/include')
-rw-r--r--libcxx/include/__config2
-rw-r--r--libcxx/include/__split_buffer8
-rw-r--r--libcxx/include/algorithm24
-rw-r--r--libcxx/include/iterator4
-rw-r--r--libcxx/include/memory6
-rw-r--r--libcxx/include/type_traits809
-rw-r--r--libcxx/include/utility4
-rw-r--r--libcxx/include/vector6
8 files changed, 659 insertions, 204 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config
index f2460665f72..4dde70ad1c2 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -86,6 +86,8 @@
#if defined(__clang__)
+#undef __STRICT_ANSI__
+
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
diff --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer
index e3c2b9dd0b0..88e2c837503 100644
--- a/libcxx/include/__split_buffer
+++ b/libcxx/include/__split_buffer
@@ -118,12 +118,12 @@ public:
__construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
_LIBCPP_INLINE_VISIBILITY void __destruct_at_begin(pointer __new_begin)
- {__destruct_at_begin(__new_begin, has_trivial_destructor<value_type>());}
+ {__destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());}
void __destruct_at_begin(pointer __new_begin, false_type);
void __destruct_at_begin(pointer __new_begin, true_type);
_LIBCPP_INLINE_VISIBILITY void __destruct_at_end(pointer __new_last)
- {__destruct_at_end(__new_last, has_trivial_destructor<value_type>());}
+ {__destruct_at_end(__new_last, is_trivially_destructible<value_type>());}
void __destruct_at_end(pointer __new_last, false_type);
void __destruct_at_end(pointer __new_last, true_type);
@@ -230,8 +230,8 @@ _LIBCPP_INLINE_VISIBILITY inline
void
__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
{
- __construct_at_end(__n, __x, integral_constant<bool, has_trivial_copy_constructor<value_type>::value &&
- has_trivial_copy_assign<value_type>::value>());
+ __construct_at_end(__n, __x, integral_constant<bool, is_trivially_copy_constructible<value_type>::value &&
+ is_trivially_copy_assignable<value_type>::value>());
}
template <class _Tp, class _Allocator>
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm
index 17e20daed1c..a3764dfd0c1 100644
--- a/libcxx/include/algorithm
+++ b/libcxx/include/algorithm
@@ -1438,7 +1438,7 @@ template <class _Tp>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
- has_trivial_copy_assign<_Tp>::value,
+ is_trivially_copy_assignable<_Tp>::value,
_Tp*
>::type
__unwrap_iter(move_iterator<_Tp*> __i)
@@ -1450,7 +1450,7 @@ template <class _Tp>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
- has_trivial_copy_assign<_Tp>::value,
+ is_trivially_copy_assignable<_Tp>::value,
_Tp*
>::type
__unwrap_iter(__wrap_iter<_Tp*> __i)
@@ -1473,7 +1473,7 @@ inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
is_same<typename remove_const<_Tp>::type, _Up>::value &&
- has_trivial_copy_assign<_Up>::value,
+ is_trivially_copy_assignable<_Up>::value,
_Up*
>::type
__copy(_Tp* __first, _Tp* __last, _Up* __result)
@@ -1508,7 +1508,7 @@ inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
is_same<typename remove_const<_Tp>::type, _Up>::value &&
- has_trivial_copy_assign<_Up>::value,
+ is_trivially_copy_assignable<_Up>::value,
_Up*
>::type
__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
@@ -1593,7 +1593,7 @@ inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
is_same<typename remove_const<_Tp>::type, _Up>::value &&
- has_trivial_copy_assign<_Up>::value,
+ is_trivially_copy_assignable<_Up>::value,
_Up*
>::type
__move(_Tp* __first, _Tp* __last, _Up* __result)
@@ -1628,7 +1628,7 @@ inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
is_same<typename remove_const<_Tp>::type, _Up>::value &&
- has_trivial_copy_assign<_Up>::value,
+ is_trivially_copy_assignable<_Up>::value,
_Up*
>::type
__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
@@ -1766,7 +1766,7 @@ fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
{
return _STD::__fill_n(__first, __n, __value, integral_constant<bool,
is_pointer<_OutputIterator>::value &&
- has_trivial_copy_assign<_Tp>::value &&
+ is_trivially_copy_assignable<_Tp>::value &&
sizeof(_Tp) == 1>());
}
@@ -2169,7 +2169,7 @@ rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __l
typename iterator_traits<_ForwardIterator>::iterator_category,
random_access_iterator_tag
>::value &&
- has_trivial_copy_assign
+ is_trivially_copy_assignable
<
typename iterator_traits<_ForwardIterator>::value_type
>::value
@@ -3434,8 +3434,8 @@ __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __c
// _Compare is known to be a reference type
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- const difference_type __limit = has_trivial_copy_constructor<value_type>::value &&
- has_trivial_copy_assign<value_type>::value ? 30 : 6;
+ const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
+ is_trivially_copy_assignable<value_type>::value ? 30 : 6;
while (true)
{
__restart:
@@ -4069,7 +4069,7 @@ __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle,
template <class _Tp>
struct __inplace_merge_switch
{
- static const unsigned value = has_trivial_copy_assign<_Tp>::value;
+ static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
};
template <class _BidirectionalIterator, class _Compare>
@@ -4237,7 +4237,7 @@ __stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1
template <class _Tp>
struct __stable_sort_switch
{
- static const unsigned value = 128*has_trivial_copy_assign<_Tp>::value;
+ static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
};
template <class _Compare, class _RandomAccessIterator>
diff --git a/libcxx/include/iterator b/libcxx/include/iterator
index 0ad489b9652..6fcb259f9a2 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -1038,7 +1038,7 @@ template <class _B1, class _B2> _B2 move_backward(_B1, _B1, _B2);
template <class _Tp>
typename enable_if
<
- has_trivial_copy_assign<_Tp>::value,
+ is_trivially_copy_assignable<_Tp>::value,
_Tp*
>::type
__unwrap_iter(__wrap_iter<_Tp*>);
@@ -1137,7 +1137,7 @@ private:
friend
typename enable_if
<
- has_trivial_copy_assign<_Tp>::value,
+ is_trivially_copy_assignable<_Tp>::value,
_Tp*
>::type
__unwrap_iter(__wrap_iter<_Tp*>);
diff --git a/libcxx/include/memory b/libcxx/include/memory
index ba00f52e6d7..c20e1a0c615 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -2446,15 +2446,15 @@ public:
template <class _Tp>
_LIBCPP_INLINE_VISIBILITY void __incr(_Tp*)
- {__incr(integral_constant<bool, has_trivial_destructor<_Tp>::value>());}
+ {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
template <class _Tp>
_LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*)
- {__set(__s, integral_constant<bool, has_trivial_destructor<_Tp>::value>());}
+ {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
template <class _Tp>
_LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p)
- {__process(__p, integral_constant<bool, has_trivial_destructor<_Tp>::value>());}
+ {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
};
template <class _Alloc>
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits
index 7514330c16c..6b8a99ff4b1 100644
--- a/libcxx/include/type_traits
+++ b/libcxx/include/type_traits
@@ -92,29 +92,32 @@ namespace std
template <class T> struct is_abstract;
template <class T, class... Args> struct is_constructible;
- template <class T, class... Args> struct is_nothrow_constructible;
-
- template <class T> struct has_trivial_default_constructor
- template <class T> struct has_nothrow_default_constructor;
- template <class T> struct has_default_constructor;
-
- template <class T> struct has_trivial_copy_constructor;
- template <class T> struct has_nothrow_copy_constructor;
- template <class T> struct has_copy_constructor;
-
- template <class T> struct has_trivial_move_constructor;
- template <class T> struct has_nothrow_move_constructor;
- template <class T> struct has_move_constructor;
+ 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> struct has_trivial_copy_assign;
- template <class T> struct has_nothrow_copy_assign;
- template <class T> struct has_copy_assign;
-
- template <class T> struct has_trivial_move_assign;
- template <class T> struct has_nothrow_move_assign;
- template <class T> struct has_move_assign;
+ 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_trivial_destructor;
template <class T> struct has_virtual_destructor;
// Relationships between types:
@@ -777,118 +780,6 @@ template <class _Tp> struct __libcpp_polymorphic<_Tp, false> : public false_type
template <class _Tp> struct _LIBCPP_VISIBLE is_polymorphic
: public __libcpp_polymorphic<_Tp> {};
-// has_trivial_default_constructor
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_default_constructor
- : public integral_constant<bool, __has_trivial_constructor(_Tp)> {};
-
-#else // _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct __has_trivial_default_constructor
- : public integral_constant<bool, is_scalar<_Tp>::value> {};
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_default_constructor
- : public __has_trivial_default_constructor<typename remove_all_extents<_Tp>::type> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
-// has_nothrow_default_constructor
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_default_constructor
- : public integral_constant<bool, __has_nothrow_constructor(_Tp)> {};
-
-#else // _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_default_constructor
- : public has_trivial_default_constructor<_Tp> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
-// has_trivial_copy_constructor
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_copy_constructor
- : public integral_constant<bool, __has_trivial_copy(_Tp)> {};
-
-#else // _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_copy_constructor
- : public integral_constant<bool, is_scalar<_Tp>::value ||
- is_reference<_Tp>::value> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
-// has_nothrow_copy_constructor
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_copy_constructor
- : public integral_constant<bool, __has_nothrow_copy(_Tp)> {};
-
-#else // _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_copy_constructor
- : public has_trivial_copy_constructor<_Tp> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
-// has_nothrow_move_constructor
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_move_constructor
- : public has_nothrow_copy_constructor<_Tp> {};
-
-// has_trivial_copy_assign
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_copy_assign
- : public integral_constant<bool, __has_trivial_assign(_Tp)> {};
-
-#else // _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_copy_assign
- : public integral_constant<bool, is_scalar<_Tp>::value &&
- !is_const<_Tp>::value> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
-// has_nothrow_copy_assign
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_copy_assign
- : public integral_constant<bool, __has_nothrow_assign(_Tp)> {};
-
-#else // _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_nothrow_copy_assign
- : public has_trivial_copy_assign<_Tp> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
-// has_trivial_destructor
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-template <class _Tp> struct _LIBCPP_VISIBLE has_trivial_destructor
- : 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 has_trivial_destructor
- : public __libcpp_trivial_destructor<typename remove_all_extents<_Tp>::type> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
// has_virtual_destructor
#ifdef _LIBCPP_HAS_TYPE_TRAITS
@@ -903,23 +794,6 @@ template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor
#endif // _LIBCPP_HAS_TYPE_TRAITS
-// is_pod
-
-#ifdef _LIBCPP_HAS_TYPE_TRAITS
-
-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, has_trivial_default_constructor<_Tp>::value &&
- has_trivial_copy_constructor<_Tp>::value &&
- has_trivial_copy_assign<_Tp>::value &&
- has_trivial_destructor<_Tp>::value> {};
-
-#endif // _LIBCPP_HAS_TYPE_TRAITS
-
// alignment_of
template <class _Tp> struct __alignment_of {_Tp _;};
@@ -1287,6 +1161,8 @@ struct _LIBCPP_VISIBLE common_type<_Tp, _Up, _Vp...>
#endif // _LIBCPP_HAS_NO_VARIADICS
+// is_assignable
+
template <class _Tp, class _Arg>
decltype((_STD::declval<_Tp>() = _STD::declval<_Arg>(), true_type()))
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1311,20 +1187,57 @@ struct __is_assignable_imp
>::type {};
template <class _Tp, class _Arg>
-struct __is_assignable
+struct is_assignable
: public __is_assignable_imp<_Tp, _Arg> {};
-// has_copy_assign
+// is_copy_assignable
-template <class _Tp> struct _LIBCPP_VISIBLE has_copy_assign
- : public __is_assignable<_Tp&, const _Tp&> {};
+template <class _Tp> struct _LIBCPP_VISIBLE is_copy_assignable
+ : public is_assignable<_Tp&, const _Tp&> {};
-template <class _Tp> struct _LIBCPP_VISIBLE has_copy_assign<_Tp[]>
- : public false_type {};
+// is_move_assignable
+
+template <class _Tp> struct _LIBCPP_VISIBLE is_move_assignable
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ : public is_assignable<_Tp&, _Tp&&> {};
+#else
+ : public is_copy_assignable<_Tp> {};
+#endif
+
+// is_destructible
+
+template <class _Tp>
+struct __destructible_test
+{
+ _Tp __t;
+};
-template <class _Tp> struct _LIBCPP_VISIBLE has_copy_assign<_Tp&>
+template <class _Tp>
+decltype((_STD::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
@@ -1638,7 +1551,7 @@ class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1, _A2)>
#endif // _LIBCPP_HAS_NO_VARIADICS
-#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
+#ifndef _LIBCPP_HAS_NO_VARIADICS
// template <class T, class... Args> struct is_constructible;
@@ -1758,24 +1671,35 @@ struct __is_constructible<false, _A[], _Args...>
: public false_type
{};
-template <class _Tp>
-struct _LIBCPP_VISIBLE has_default_constructor
- : public is_constructible<_Tp>
- {};
-
-#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE
+#else // _LIBCPP_HAS_NO_VARIADICS
// template <class T> struct is_constructible0;
// main is_constructible0 test
template <class _Tp>
-decltype((_STD::move(_Tp()), true_type()))
+decltype((_Tp(), true_type()))
__is_constructible0_test(_Tp&);
false_type
__is_constructible0_test(__any);
+template <class _Tp, class _A0>
+decltype((_Tp(_STD::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(_STD::declval<_A0>(), _STD::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
@@ -1784,6 +1708,22 @@ struct __is_constructible0_imp // false, _Tp is not a scalar
>::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
@@ -1793,6 +1733,16 @@ 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>
@@ -1801,6 +1751,18 @@ struct __is_constructible0_void_check
_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>
@@ -1808,21 +1770,69 @@ struct __is_constructible0_void_check<true, _Tp>
: public false_type
{};
-// has_default_constructor entry point
+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 has_default_constructor
+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_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 has_default_constructor<typename remove_all_extents<_A>::type>
+ : 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
@@ -1832,25 +1842,468 @@ struct __is_constructible0_imp<false, _A[]>
: public false_type
{};
-#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
+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
+ {};
-// has_copy_constructor
+#endif // _LIBCPP_HAS_NO_VARIADICS
-#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
+// is_default_constructible
template <class _Tp>
-struct _LIBCPP_VISIBLE has_copy_constructor
- : public is_constructible<_Tp, typename add_lvalue_reference<const _Tp>::type>
+struct _LIBCPP_VISIBLE is_default_constructible
+ : public is_constructible<_Tp>
{};
-#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE
+// is_copy_constructible
template <class _Tp>
-struct _LIBCPP_VISIBLE has_copy_constructor
- : public has_nothrow_copy_constructor<_Tp>
+struct _LIBCPP_VISIBLE is_copy_constructible
+ : public is_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type>
{};
-#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
+// 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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
+
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+
+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
+
+template <class _Tp, class... _Args>
+struct _LIBCPP_VISIBLE is_nothrow_constructible
+ : false_type
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : integral_constant<bool, __has_nothrow_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_nothrow_constructible
+ : false_type
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, __is_construct::__nat,
+ __is_construct::__nat>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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
+
+template <class _Tp, class _Arg>
+struct is_nothrow_assignable
+ : public false_type {};
+
+template <class _Tp>
+struct is_nothrow_assignable<_Tp&, _Tp>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+template <class _Tp>
+struct is_nothrow_assignable<_Tp&, _Tp&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+template <class _Tp>
+struct is_nothrow_assignable<_Tp&, const _Tp&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : 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&&>
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+ : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+// 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
+
+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> {};
+
+// is_pod
+
+#ifdef _LIBCPP_HAS_TYPE_TRAITS
+
+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
template <class _Tp> struct __is_zero_default_constructible
: public integral_constant<bool, is_scalar<_Tp>::value || is_empty<_Tp>::value> {};
diff --git a/libcxx/include/utility b/libcxx/include/utility
index f4c94bea94f..f8a8fc529a9 100644
--- a/libcxx/include/utility
+++ b/libcxx/include/utility
@@ -38,7 +38,7 @@ template <class T> typename remove_reference<T>::type&& move(T&&);
template <class T>
typename conditional
<
- !has_nothrow_move_constructor<T>::value && has_copy_constructor<T>::value,
+ !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value,
const T&,
T&&
>::type
@@ -178,7 +178,7 @@ inline _LIBCPP_INLINE_VISIBILITY
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
typename conditional
<
- !has_nothrow_move_constructor<_Tp>::value && has_copy_constructor<_Tp>::value,
+ !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value,
const _Tp&,
_Tp&&
>::type
diff --git a/libcxx/include/vector b/libcxx/include/vector
index 80b1ceffce6..074e44546af 100644
--- a/libcxx/include/vector
+++ b/libcxx/include/vector
@@ -326,7 +326,7 @@ protected:
_LIBCPP_INLINE_VISIBILITY size_type capacity() const {return static_cast<size_type>(__end_cap() - __begin_);}
_LIBCPP_INLINE_VISIBILITY void __destruct_at_end(const_pointer __new_last)
- {__destruct_at_end(__new_last, has_trivial_destructor<value_type>());}
+ {__destruct_at_end(__new_last, is_trivially_destructible<value_type>());}
void __destruct_at_end(const_pointer __new_last, false_type);
void __destruct_at_end(const_pointer __new_last, true_type);
@@ -771,8 +771,8 @@ _LIBCPP_INLINE_VISIBILITY inline
void
vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
{
- __construct_at_end(__n, __x, integral_constant<bool, has_trivial_copy_constructor<value_type>::value &&
- has_trivial_copy_assign<value_type>::value>());
+ __construct_at_end(__n, __x, integral_constant<bool, is_trivially_copy_constructible<value_type>::value &&
+ is_trivially_copy_assignable<value_type>::value>());
}
template <class _Tp, class _Allocator>
OpenPOWER on IntegriCloud