Skip to content

Commit b74ca2e

Browse files
committed
[libc++] Set the child pointer outside __insert_node_at in __tree
1 parent 900d20d commit b74ca2e

File tree

2 files changed

+39
-21
lines changed

2 files changed

+39
-21
lines changed

libcxx/include/__tree

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

17381737
template <class _Tp, class _Compare, class _Allocator>
17391738
void __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

libcxx/include/map

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1433,7 +1433,8 @@ _Tp& map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) {
14331433
__node_pointer __r = static_cast<__node_pointer>(__child);
14341434
if (__child == nullptr) {
14351435
__node_holder __h = __construct_node_with_key(__k);
1436-
__tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
1436+
__child = static_cast<__node_base_pointer>(__h.get());
1437+
__tree_.__insert_node_at(__parent, __child);
14371438
__r = __h.release();
14381439
}
14391440
return __r->__value_.second;

0 commit comments

Comments
 (0)