@@ -1030,8 +1030,7 @@ public:
10301030 template <class _Key >
10311031 _LIBCPP_HIDE_FROM_ABI size_type __erase_multi (const _Key& __k);
10321032
1033- _LIBCPP_HIDE_FROM_ABI void
1034- __insert_node_at (__end_node_pointer __parent, __node_base_pointer& __child, __node_base_pointer __new_node) _NOEXCEPT;
1033+ _LIBCPP_HIDE_FROM_ABI void __insert_node_at (__end_node_pointer __parent, __node_base_pointer __new_node) _NOEXCEPT;
10351034
10361035 template <class _Key >
10371036 _LIBCPP_HIDE_FROM_ABI iterator find (const _Key& __v);
@@ -1737,15 +1736,18 @@ typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& __tree<_Tp, _Co
17371736
17381737template <class _Tp , class _Compare , class _Allocator >
17391738void __tree<_Tp, _Compare, _Allocator>::__insert_node_at(
1740- __end_node_pointer __parent, __node_base_pointer& __child, __node_base_pointer __new_node) _NOEXCEPT {
1739+ __end_node_pointer __parent, __node_base_pointer __new_node) _NOEXCEPT {
1740+ _LIBCPP_ASSERT_INTERNAL (
1741+ __parent->__left_ == __new_node ||
1742+ (__parent != __end_node () && static_cast <__node_base_pointer>(__parent)->__right_ == __new_node),
1743+ " __parent isn't the parent of __new_node!" );
17411744 __new_node->__left_ = nullptr ;
17421745 __new_node->__right_ = nullptr ;
17431746 __new_node->__parent_ = __parent;
17441747 // __new_node->__is_black_ is initialized in __tree_balance_after_insert
1745- __child = __new_node;
17461748 if (__begin_node_->__left_ != nullptr )
17471749 __begin_node_ = static_cast <__end_node_pointer>(__begin_node_->__left_ );
1748- std::__tree_balance_after_insert (__end_node ()->__left_ , __child );
1750+ std::__tree_balance_after_insert (__end_node ()->__left_ , __new_node );
17491751 ++__size_;
17501752}
17511753
@@ -1759,7 +1761,8 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_unique_key_args(_Key const& __k, _A
17591761 bool __inserted = false ;
17601762 if (__child == nullptr ) {
17611763 __node_holder __h = __construct_node (std::forward<_Args>(__args)...);
1762- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1764+ __child = static_cast <__node_base_pointer>(__h.get ());
1765+ __insert_node_at (__parent, __child);
17631766 __r = __h.release ();
17641767 __inserted = true ;
17651768 }
@@ -1778,7 +1781,8 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args(
17781781 bool __inserted = false ;
17791782 if (__child == nullptr ) {
17801783 __node_holder __h = __construct_node (std::forward<_Args>(__args)...);
1781- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1784+ __child = static_cast <__node_base_pointer>(__h.get ());
1785+ __insert_node_at (__parent, __child);
17821786 __r = __h.release ();
17831787 __inserted = true ;
17841788 }
@@ -1806,7 +1810,8 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_unique_impl(_Args&&... __args) {
18061810 __node_pointer __r = static_cast <__node_pointer>(__child);
18071811 bool __inserted = false ;
18081812 if (__child == nullptr ) {
1809- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1813+ __child = static_cast <__node_base_pointer>(__h.get ());
1814+ __insert_node_at (__parent, __child);
18101815 __r = __h.release ();
18111816 __inserted = true ;
18121817 }
@@ -1823,7 +1828,8 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_impl(const_iterator __p
18231828 __node_base_pointer& __child = __find_equal (__p, __parent, __dummy, __h->__value_ );
18241829 __node_pointer __r = static_cast <__node_pointer>(__child);
18251830 if (__child == nullptr ) {
1826- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1831+ __child = static_cast <__node_base_pointer>(__h.get ());
1832+ __insert_node_at (__parent, __child);
18271833 __r = __h.release ();
18281834 }
18291835 return iterator (__r);
@@ -1836,7 +1842,8 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args) {
18361842 __node_holder __h = __construct_node (std::forward<_Args>(__args)...);
18371843 __end_node_pointer __parent;
18381844 __node_base_pointer& __child = __find_leaf_high (__parent, __h->__value_ );
1839- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1845+ __child = static_cast <__node_base_pointer>(__h.get ());
1846+ __insert_node_at (__parent, __child);
18401847 return iterator (static_cast <__node_pointer>(__h.release ()));
18411848}
18421849
@@ -1847,7 +1854,8 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p, _Arg
18471854 __node_holder __h = __construct_node (std::forward<_Args>(__args)...);
18481855 __end_node_pointer __parent;
18491856 __node_base_pointer& __child = __find_leaf (__p, __parent, __h->__value_ );
1850- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1857+ __child = static_cast <__node_base_pointer>(__h.get ());
1858+ __insert_node_at (__parent, __child);
18511859 return iterator (static_cast <__node_pointer>(__h.release ()));
18521860}
18531861
@@ -1860,7 +1868,8 @@ __tree<_Tp, _Compare, _Allocator>::__node_assign_unique(const value_type& __v, _
18601868 bool __inserted = false ;
18611869 if (__child == nullptr ) {
18621870 __assign_value (__nd->__value_ , __v);
1863- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__nd));
1871+ __child = static_cast <__node_base_pointer>(__nd);
1872+ __insert_node_at (__parent, __child);
18641873 __r = __nd;
18651874 __inserted = true ;
18661875 }
@@ -1872,7 +1881,8 @@ typename __tree<_Tp, _Compare, _Allocator>::iterator
18721881__tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd) {
18731882 __end_node_pointer __parent;
18741883 __node_base_pointer& __child = __find_leaf_high (__parent, __nd->__value_ );
1875- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__nd));
1884+ __child = static_cast <__node_base_pointer>(__nd);
1885+ __insert_node_at (__parent, __child);
18761886 return iterator (__nd);
18771887}
18781888
@@ -1881,7 +1891,8 @@ typename __tree<_Tp, _Compare, _Allocator>::iterator
18811891__tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p, __node_pointer __nd) {
18821892 __end_node_pointer __parent;
18831893 __node_base_pointer& __child = __find_leaf (__p, __parent, __nd->__value_ );
1884- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__nd));
1894+ __child = static_cast <__node_base_pointer>(__nd);
1895+ __insert_node_at (__parent, __child);
18851896 return iterator (__nd);
18861897}
18871898
@@ -1911,7 +1922,8 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(_NodeHandle&& __n
19111922 if (__child != nullptr )
19121923 return _InsertReturnType{iterator (static_cast <__node_pointer>(__child)), false , std::move (__nh)};
19131924
1914- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__ptr));
1925+ __child = static_cast <__node_base_pointer>(__ptr);
1926+ __insert_node_at (__parent, __child);
19151927 __nh.__release_ptr ();
19161928 return _InsertReturnType{iterator (__ptr), true , _NodeHandle ()};
19171929}
@@ -1929,7 +1941,8 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(const_iterator __
19291941 __node_base_pointer& __child = __find_equal (__hint, __parent, __dummy, __ptr->__value_ );
19301942 __node_pointer __r = static_cast <__node_pointer>(__child);
19311943 if (__child == nullptr ) {
1932- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__ptr));
1944+ __child = static_cast <__node_base_pointer>(__ptr);
1945+ __insert_node_at (__parent, __child);
19331946 __r = __ptr;
19341947 __nh.__release_ptr ();
19351948 }
@@ -1966,7 +1979,8 @@ _LIBCPP_HIDE_FROM_ABI void __tree<_Tp, _Compare, _Allocator>::__node_handle_merg
19661979 if (__child != nullptr )
19671980 continue ;
19681981 __source.__remove_node_pointer (__src_ptr);
1969- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__src_ptr));
1982+ __child = static_cast <__node_base_pointer>(__src_ptr);
1983+ __insert_node_at (__parent, __child);
19701984 }
19711985}
19721986
@@ -1979,7 +1993,8 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_multi(_NodeHandle&& __nh
19791993 __node_pointer __ptr = __nh.__ptr_ ;
19801994 __end_node_pointer __parent;
19811995 __node_base_pointer& __child = __find_leaf_high (__parent, __ptr->__value_ );
1982- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__ptr));
1996+ __child = static_cast <__node_base_pointer>(__ptr);
1997+ __insert_node_at (__parent, __child);
19831998 __nh.__release_ptr ();
19841999 return iterator (__ptr);
19852000}
@@ -1994,7 +2009,8 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_multi(const_iterator __h
19942009 __node_pointer __ptr = __nh.__ptr_ ;
19952010 __end_node_pointer __parent;
19962011 __node_base_pointer& __child = __find_leaf (__hint, __parent, __ptr->__value_ );
1997- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__ptr));
2012+ __child = static_cast <__node_base_pointer>(__ptr);
2013+ __insert_node_at (__parent, __child);
19982014 __nh.__release_ptr ();
19992015 return iterator (__ptr);
20002016}
@@ -2010,7 +2026,8 @@ _LIBCPP_HIDE_FROM_ABI void __tree<_Tp, _Compare, _Allocator>::__node_handle_merg
20102026 __node_base_pointer& __child = __find_leaf_high (__parent, __src_ptr->__value_ );
20112027 ++__i;
20122028 __source.__remove_node_pointer (__src_ptr);
2013- __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__src_ptr));
2029+ __child = static_cast <__node_base_pointer>(__src_ptr);
2030+ __insert_node_at (__parent, __child);
20142031 }
20152032}
20162033
0 commit comments