@@ -910,10 +910,9 @@ public:
910910 _LIBCPP_HIDE_FROM_ABI pair<iterator, bool > __emplace_unique (_Args&&... __args) {
911911 return std::__try_key_extraction<key_type>(
912912 [this ](const key_type& __key, _Args&&... __args2) {
913- __end_node_pointer __parent;
914- __node_base_pointer& __child = __find_equal (__parent, __key);
915- __node_pointer __r = static_cast <__node_pointer>(__child);
916- bool __inserted = false ;
913+ auto [__parent, __child] = __find_equal (__key);
914+ __node_pointer __r = static_cast <__node_pointer>(__child);
915+ bool __inserted = false ;
917916 if (__child == nullptr ) {
918917 __node_holder __h = __construct_node (std::forward<_Args>(__args2)...);
919918 __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
@@ -923,11 +922,10 @@ public:
923922 return pair<iterator, bool >(iterator (__r), __inserted);
924923 },
925924 [this ](_Args&&... __args2) {
926- __node_holder __h = __construct_node (std::forward<_Args>(__args2)...);
927- __end_node_pointer __parent;
928- __node_base_pointer& __child = __find_equal (__parent, __h->__get_value ());
929- __node_pointer __r = static_cast <__node_pointer>(__child);
930- bool __inserted = false ;
925+ __node_holder __h = __construct_node (std::forward<_Args>(__args2)...);
926+ auto [__parent, __child] = __find_equal (__h->__get_value ());
927+ __node_pointer __r = static_cast <__node_pointer>(__child);
928+ bool __inserted = false ;
931929 if (__child == nullptr ) {
932930 __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
933931 __r = __h.release ();
@@ -942,11 +940,10 @@ public:
942940 _LIBCPP_HIDE_FROM_ABI pair<iterator, bool > __emplace_hint_unique (const_iterator __p, _Args&&... __args) {
943941 return std::__try_key_extraction<key_type>(
944942 [this , __p](const key_type& __key, _Args&&... __args2) {
945- __end_node_pointer __parent;
946943 __node_base_pointer __dummy;
947- __node_base_pointer& __child = __find_equal (__p, __parent , __dummy, __key);
948- __node_pointer __r = static_cast <__node_pointer>(__child);
949- bool __inserted = false ;
944+ auto [__parent, __child] = __find_equal (__p, __dummy, __key);
945+ __node_pointer __r = static_cast <__node_pointer>(__child);
946+ bool __inserted = false ;
950947 if (__child == nullptr ) {
951948 __node_holder __h = __construct_node (std::forward<_Args>(__args2)...);
952949 __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
@@ -957,10 +954,9 @@ public:
957954 },
958955 [this , __p](_Args&&... __args2) {
959956 __node_holder __h = __construct_node (std::forward<_Args>(__args2)...);
960- __end_node_pointer __parent;
961957 __node_base_pointer __dummy;
962- __node_base_pointer& __child = __find_equal (__p, __parent , __dummy, __h->__get_value ());
963- __node_pointer __r = static_cast <__node_pointer>(__child);
958+ auto [__parent, __child] = __find_equal (__p, __dummy, __h->__get_value ());
959+ __node_pointer __r = static_cast <__node_pointer>(__child);
964960 if (__child == nullptr ) {
965961 __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
966962 __r = __h.release ();
@@ -1112,17 +1108,15 @@ public:
11121108
11131109 template <class _Key >
11141110 _LIBCPP_HIDE_FROM_ABI iterator find (const _Key& __key) {
1115- __end_node_pointer __parent;
1116- __node_base_pointer __match = __find_equal (__parent, __key);
1111+ auto [__, __match] = __find_equal (__key);
11171112 if (__match == nullptr )
11181113 return end ();
11191114 return iterator (static_cast <__node_pointer>(__match));
11201115 }
11211116
11221117 template <class _Key >
11231118 _LIBCPP_HIDE_FROM_ABI const_iterator find (const _Key& __key) const {
1124- __end_node_pointer __parent;
1125- __node_base_pointer __match = __find_equal (__parent, __key);
1119+ auto [__, __match] = __find_equal (__key);
11261120 if (__match == nullptr )
11271121 return end ();
11281122 return const_iterator (static_cast <__node_pointer>(__match));
@@ -1177,14 +1171,16 @@ public:
11771171 // FIXME: Make this function const qualified. Unfortunately doing so
11781172 // breaks existing code which uses non-const callable comparators.
11791173 template <class _Key >
1180- _LIBCPP_HIDE_FROM_ABI __node_base_pointer& __find_equal (__end_node_pointer& __parent, const _Key& __v);
1174+ _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal (const _Key& __v);
1175+
11811176 template <class _Key >
1182- _LIBCPP_HIDE_FROM_ABI __node_base_pointer& __find_equal (__end_node_pointer& __parent, const _Key& __v) const {
1183- return const_cast <__tree*>(this )->__find_equal (__parent, __v);
1177+ _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal (const _Key& __v) const {
1178+ return const_cast <__tree*>(this )->__find_equal (__v);
11841179 }
1180+
11851181 template <class _Key >
1186- _LIBCPP_HIDE_FROM_ABI __node_base_pointer&
1187- __find_equal (const_iterator __hint, __end_node_pointer& __parent, __node_base_pointer& __dummy, const _Key& __v);
1182+ _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&>
1183+ __find_equal (const_iterator __hint, __node_base_pointer& __dummy, const _Key& __v);
11881184
11891185 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc (const __tree& __t ) {
11901186 __copy_assign_alloc (__t , integral_constant<bool , __node_traits::propagate_on_container_copy_assignment::value>());
@@ -1737,92 +1733,85 @@ typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& __tree<_Tp, _Co
17371733 return __find_leaf_low (__parent, __v);
17381734}
17391735
1740- // Find place to insert if __v doesn't exist
1741- // Set __parent to parent of null leaf
1742- // Return reference to null leaf
1743- // If __v exists, set parent to node of __v and return reference to node of __v
1736+ // Find __v
1737+ // If __v exists, return the parent of the node of __v and a reference to the pointer to the node of __v.
1738+ // If __v doesn't exist, return the parent of the null leaf and a reference to the pointer to the null leaf.
17441739template <class _Tp , class _Compare , class _Allocator >
17451740template <class _Key >
1746- typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
1747- __tree<_Tp, _Compare, _Allocator>::__find_equal(__end_node_pointer& __parent, const _Key& __v) {
1748- __node_pointer __nd = __root ();
1749- __node_base_pointer* __nd_ptr = __root_ptr ();
1750- if (__nd != nullptr ) {
1751- while (true ) {
1752- if (value_comp ()(__v, __nd->__get_value ())) {
1753- if (__nd->__left_ != nullptr ) {
1754- __nd_ptr = std::addressof (__nd->__left_ );
1755- __nd = static_cast <__node_pointer>(__nd->__left_ );
1756- } else {
1757- __parent = static_cast <__end_node_pointer>(__nd);
1758- return __parent->__left_ ;
1759- }
1760- } else if (value_comp ()(__nd->__get_value (), __v)) {
1761- if (__nd->__right_ != nullptr ) {
1762- __nd_ptr = std::addressof (__nd->__right_ );
1763- __nd = static_cast <__node_pointer>(__nd->__right_ );
1764- } else {
1765- __parent = static_cast <__end_node_pointer>(__nd);
1766- return __nd->__right_ ;
1767- }
1768- } else {
1769- __parent = static_cast <__end_node_pointer>(__nd);
1770- return *__nd_ptr;
1771- }
1741+ _LIBCPP_HIDE_FROM_ABI pair<typename __tree<_Tp, _Compare, _Allocator>::__end_node_pointer,
1742+ typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&>
1743+ __tree<_Tp, _Compare, _Allocator>::__find_equal(const _Key& __v) {
1744+ using _Pair = pair<__end_node_pointer, __node_base_pointer&>;
1745+
1746+ __node_pointer __nd = __root ();
1747+
1748+ if (__nd == nullptr ) {
1749+ auto __end = __end_node ();
1750+ return _Pair (__end, __end->__left_ );
1751+ }
1752+
1753+ __node_base_pointer* __node_ptr = __root_ptr ();
1754+ while (true ) {
1755+ if (value_comp ()(__v, __nd->__get_value ())) {
1756+ if (__nd->__left_ == nullptr )
1757+ return _Pair (static_cast <__end_node_pointer>(__nd), __nd->__left_ );
1758+
1759+ __node_ptr = std::addressof (__nd->__left_ );
1760+ __nd = static_cast <__node_pointer>(__nd->__left_ );
1761+ } else if (value_comp ()(__nd->__get_value (), __v)) {
1762+ if (__nd->__right_ == nullptr )
1763+ return _Pair (static_cast <__end_node_pointer>(__nd), __nd->__right_ );
1764+
1765+ __node_ptr = std::addressof (__nd->__right_ );
1766+ __nd = static_cast <__node_pointer>(__nd->__right_ );
1767+ } else {
1768+ return _Pair (static_cast <__end_node_pointer>(__nd), *__node_ptr);
17721769 }
17731770 }
1774- __parent = __end_node ();
1775- return __parent->__left_ ;
17761771}
17771772
1778- // Find place to insert if __v doesn't exist
1773+ // Find __v
17791774// First check prior to __hint.
17801775// Next check after __hint.
17811776// Next do O(log N) search.
1782- // Set __parent to parent of null leaf
1783- // Return reference to null leaf
1784- // If __v exists, set parent to node of __v and return reference to node of __v
1777+ // If __v exists, return the parent of the node of __v and a reference to the pointer to the node of __v.
1778+ // If __v doesn't exist, return the parent of the null leaf and a reference to the pointer to the null leaf.
17851779template <class _Tp , class _Compare , class _Allocator >
17861780template <class _Key >
1787- typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& __tree<_Tp, _Compare, _Allocator>::__find_equal(
1788- const_iterator __hint, __end_node_pointer& __parent, __node_base_pointer& __dummy, const _Key& __v) {
1789- if (__hint == end () || value_comp ()(__v, *__hint)) // check before
1790- {
1781+ _LIBCPP_HIDE_FROM_ABI pair<typename __tree<_Tp, _Compare, _Allocator>::__end_node_pointer,
1782+ typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&>
1783+ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint, __node_base_pointer& __dummy, const _Key& __v) {
1784+ using _Pair = pair<__end_node_pointer, __node_base_pointer&>;
1785+
1786+ if (__hint == end () || value_comp ()(__v, *__hint)) { // check before
17911787 // __v < *__hint
17921788 const_iterator __prior = __hint;
17931789 if (__prior == begin () || value_comp ()(*--__prior, __v)) {
17941790 // *prev(__hint) < __v < *__hint
1795- if (__hint.__ptr_ ->__left_ == nullptr ) {
1796- __parent = __hint.__ptr_ ;
1797- return __parent->__left_ ;
1798- } else {
1799- __parent = __prior.__ptr_ ;
1800- return static_cast <__node_base_pointer>(__prior.__ptr_ )->__right_ ;
1801- }
1791+ if (__hint.__ptr_ ->__left_ == nullptr )
1792+ return _Pair (__hint.__ptr_ , __hint.__ptr_ ->__left_ );
1793+ return _Pair (__prior.__ptr_ , static_cast <__node_pointer>(__prior.__ptr_ )->__right_ );
18021794 }
18031795 // __v <= *prev(__hint)
1804- return __find_equal (__parent, __v);
1805- } else if (value_comp ()(*__hint, __v)) // check after
1806- {
1796+ return __find_equal (__v);
1797+ }
1798+
1799+ if (value_comp ()(*__hint, __v)) { // check after
18071800 // *__hint < __v
18081801 const_iterator __next = std::next (__hint);
18091802 if (__next == end () || value_comp ()(__v, *__next)) {
18101803 // *__hint < __v < *std::next(__hint)
1811- if (__hint.__get_np ()->__right_ == nullptr ) {
1812- __parent = __hint.__ptr_ ;
1813- return static_cast <__node_base_pointer>(__hint.__ptr_ )->__right_ ;
1814- } else {
1815- __parent = __next.__ptr_ ;
1816- return __parent->__left_ ;
1817- }
1804+ if (__hint.__get_np ()->__right_ == nullptr )
1805+ return _Pair (__hint.__ptr_ , static_cast <__node_pointer>(__hint.__ptr_ )->__right_ );
1806+ return _Pair (__next.__ptr_ , __next.__ptr_ ->__left_ );
18181807 }
18191808 // *next(__hint) <= __v
1820- return __find_equal (__parent, __v);
1809+ return __find_equal (__v);
18211810 }
1811+
18221812 // else __v == *__hint
1823- __parent = __hint.__ptr_ ;
1824- __dummy = static_cast <__node_base_pointer>(__hint.__ptr_ );
1825- return __dummy;
1813+ __dummy = static_cast <__node_base_pointer>(__hint.__ptr_ );
1814+ return _Pair (__hint.__ptr_ , __dummy);
18261815}
18271816
18281817template <class _Tp , class _Compare , class _Allocator >
@@ -1875,10 +1864,9 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p, _Arg
18751864template <class _Tp , class _Compare , class _Allocator >
18761865pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool >
18771866__tree<_Tp, _Compare, _Allocator>::__node_assign_unique(const value_type& __v, __node_pointer __nd) {
1878- __end_node_pointer __parent;
1879- __node_base_pointer& __child = __find_equal (__parent, __v);
1880- __node_pointer __r = static_cast <__node_pointer>(__child);
1881- bool __inserted = false ;
1867+ auto [__parent, __child] = __find_equal (__v);
1868+ __node_pointer __r = static_cast <__node_pointer>(__child);
1869+ bool __inserted = false ;
18821870 if (__child == nullptr ) {
18831871 __assign_value (__nd->__get_value (), __v);
18841872 __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__nd));
@@ -1927,8 +1915,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(_NodeHandle&& __n
19271915 return _InsertReturnType{end (), false , _NodeHandle ()};
19281916
19291917 __node_pointer __ptr = __nh.__ptr_ ;
1930- __end_node_pointer __parent;
1931- __node_base_pointer& __child = __find_equal (__parent, __ptr->__get_value ());
1918+ auto [__parent, __child] = __find_equal (__ptr->__get_value ());
19321919 if (__child != nullptr )
19331920 return _InsertReturnType{iterator (static_cast <__node_pointer>(__child)), false , std::move (__nh)};
19341921
@@ -1945,10 +1932,9 @@ __tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(const_iterator __
19451932 return end ();
19461933
19471934 __node_pointer __ptr = __nh.__ptr_ ;
1948- __end_node_pointer __parent;
19491935 __node_base_pointer __dummy;
1950- __node_base_pointer& __child = __find_equal (__hint, __parent , __dummy, __ptr->__get_value ());
1951- __node_pointer __r = static_cast <__node_pointer>(__child);
1936+ auto [__parent, __child] = __find_equal (__hint, __dummy, __ptr->__get_value ());
1937+ __node_pointer __r = static_cast <__node_pointer>(__child);
19521938 if (__child == nullptr ) {
19531939 __insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__ptr));
19541940 __r = __ptr;
@@ -1981,8 +1967,7 @@ _LIBCPP_HIDE_FROM_ABI void __tree<_Tp, _Compare, _Allocator>::__node_handle_merg
19811967
19821968 for (typename _Tree::iterator __i = __source.begin (); __i != __source.end ();) {
19831969 __node_pointer __src_ptr = __i.__get_np ();
1984- __end_node_pointer __parent;
1985- __node_base_pointer& __child = __find_equal (__parent, __src_ptr->__get_value ());
1970+ auto [__parent, __child] = __find_equal (__src_ptr->__get_value ());
19861971 ++__i;
19871972 if (__child != nullptr )
19881973 continue ;
0 commit comments