2727#include < __type_traits/copy_cvref.h>
2828#include < __type_traits/enable_if.h>
2929#include < __type_traits/invoke.h>
30- #include < __type_traits/is_const.h>
3130#include < __type_traits/is_constructible.h>
3231#include < __type_traits/is_nothrow_assignable.h>
3332#include < __type_traits/is_nothrow_constructible.h>
3433#include < __type_traits/is_same.h>
34+ #include < __type_traits/is_specialization.h>
3535#include < __type_traits/is_swappable.h>
3636#include < __type_traits/remove_const.h>
37- #include < __type_traits/remove_const_ref.h>
38- #include < __type_traits/remove_cvref.h>
3937#include < __utility/forward.h>
4038#include < __utility/move.h>
4139#include < __utility/pair.h>
@@ -51,13 +49,6 @@ _LIBCPP_PUSH_MACROS
5149
5250_LIBCPP_BEGIN_NAMESPACE_STD
5351
54- template <class _Tp , class _Compare , class _Allocator >
55- class __tree ;
56- template <class _Tp , class _NodePtr , class _DiffType >
57- class __tree_iterator ;
58- template <class _Tp , class _ConstNodePtr , class _DiffType >
59- class __tree_const_iterator ;
60-
6152template <class _Pointer >
6253class __tree_end_node ;
6354template <class _VoidPtr >
@@ -68,13 +59,6 @@ class __tree_node;
6859template <class _Key , class _Value >
6960struct __value_type ;
7061
71- template <class _Allocator >
72- class __map_node_destructor ;
73- template <class _TreeIterator >
74- class __map_iterator ;
75- template <class _TreeIterator >
76- class __map_const_iterator ;
77-
7862/*
7963
8064_NodePtr algorithms
@@ -492,16 +476,7 @@ _LIBCPP_HIDE_FROM_ABI void __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEP
492476// node traits
493477
494478template <class _Tp >
495- struct __is_tree_value_type_imp : false_type {};
496-
497- template <class _Key , class _Value >
498- struct __is_tree_value_type_imp <__value_type<_Key, _Value> > : true_type {};
499-
500- template <class ... _Args>
501- struct __is_tree_value_type : false_type {};
502-
503- template <class _One >
504- struct __is_tree_value_type <_One> : __is_tree_value_type_imp<__remove_cvref_t <_One> > {};
479+ inline const bool __is_tree_value_type_v = __is_specialization_v<_Tp, __value_type>;
505480
506481template <class _Tp >
507482struct __get_tree_key_type {
@@ -974,23 +949,23 @@ public:
974949 return __emplace_hint_unique_key_args (__p, __x.first , std::forward<_Pp>(__x)).first ;
975950 }
976951
977- template <class _ValueT = _Tp, __enable_if_t <__is_tree_value_type <_ValueT>::value , int > = 0 >
952+ template <class _ValueT = _Tp, __enable_if_t <__is_tree_value_type_v <_ValueT>, int > = 0 >
978953 _LIBCPP_HIDE_FROM_ABI void
979954 __insert_unique_from_orphaned_node (const_iterator __p, __get_node_value_type_t <_Tp>&& __value) {
980955 __emplace_hint_unique (__p, const_cast <key_type&&>(__value.first ), std::move (__value.second ));
981956 }
982957
983- template <class _ValueT = _Tp, __enable_if_t <!__is_tree_value_type <_ValueT>::value , int > = 0 >
958+ template <class _ValueT = _Tp, __enable_if_t <!__is_tree_value_type_v <_ValueT>, int > = 0 >
984959 _LIBCPP_HIDE_FROM_ABI void __insert_unique_from_orphaned_node (const_iterator __p, _Tp&& __value) {
985960 __emplace_hint_unique (__p, std::move (__value));
986961 }
987962
988- template <class _ValueT = _Tp, __enable_if_t <__is_tree_value_type <_ValueT>::value , int > = 0 >
963+ template <class _ValueT = _Tp, __enable_if_t <__is_tree_value_type_v <_ValueT>, int > = 0 >
989964 _LIBCPP_HIDE_FROM_ABI void __insert_multi_from_orphaned_node (const_iterator __p, value_type&& __value) {
990965 __emplace_hint_multi (__p, const_cast <key_type&&>(__value.first ), std::move (__value.second ));
991966 }
992967
993- template <class _ValueT = _Tp, __enable_if_t <!__is_tree_value_type <_ValueT>::value , int > = 0 >
968+ template <class _ValueT = _Tp, __enable_if_t <!__is_tree_value_type_v <_ValueT>, int > = 0 >
994969 _LIBCPP_HIDE_FROM_ABI void __insert_multi_from_orphaned_node (const_iterator __p, _Tp&& __value) {
995970 __emplace_hint_multi (__p, std::move (__value));
996971 }
@@ -1137,7 +1112,7 @@ private:
11371112 }
11381113 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc (__tree&, false_type) _NOEXCEPT {}
11391114
1140- template <class _From , class _ValueT = _Tp, __enable_if_t <__is_tree_value_type <_ValueT>::value , int > = 0 >
1115+ template <class _From , class _ValueT = _Tp, __enable_if_t <__is_tree_value_type_v <_ValueT>, int > = 0 >
11411116 _LIBCPP_HIDE_FROM_ABI static void __assign_value (__get_node_value_type_t <value_type>& __lhs, _From&& __rhs) {
11421117 using __key_type = __remove_const_t <typename value_type::first_type>;
11431118
@@ -1147,7 +1122,7 @@ private:
11471122 __lhs.second = std::forward<_From>(__rhs).second ;
11481123 }
11491124
1150- template <class _To , class _From , class _ValueT = _Tp, __enable_if_t <!__is_tree_value_type <_ValueT>::value , int > = 0 >
1125+ template <class _To , class _From , class _ValueT = _Tp, __enable_if_t <!__is_tree_value_type_v <_ValueT>, int > = 0 >
11511126 _LIBCPP_HIDE_FROM_ABI static void __assign_value (_To& __lhs, _From&& __rhs) {
11521127 __lhs = std::forward<_From>(__rhs);
11531128 }
0 commit comments