From d0a2fbfe6045aed56999eee4cdb65fca7b77cb31 Mon Sep 17 00:00:00 2001 From: Howard Hinnant <hhinnant@apple.com> Date: Thu, 10 Mar 2011 17:27:57 +0000 Subject: [PATCH] http://llvm.org/bugs/show_bug.cgi?id=9444 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@127412 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/__tree | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/include/__tree b/include/__tree index 7796242f..3a00e2aa 100644 --- a/include/__tree +++ b/include/__tree @@ -910,13 +910,12 @@ public: iterator __insert_multi(_V&& __v); template <class _V> iterator __insert_multi(const_iterator __p, _V&& __v); -#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES pair<iterator, bool> __insert_unique(const value_type& __v); iterator __insert_unique(const_iterator __p, const value_type& __v); iterator __insert_multi(const value_type& __v); iterator __insert_multi(const_iterator __p, const value_type& __v); -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES pair<iterator, bool> __node_insert_unique(__node_pointer __nd); iterator __node_insert_unique(const_iterator __p, @@ -1728,18 +1727,11 @@ template <class _V> pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> __tree<_Tp, _Compare, _Allocator>::__insert_unique(_V&& __v) { - __node_base_pointer __parent; - __node_base_pointer& __child = __find_equal(__parent, __v); - __node_pointer __r = static_cast<__node_pointer>(__child); - bool __inserted = false; - if (__child == nullptr) - { - __node_holder __h = __construct_node(_STD::forward<_V>(__v)); - __insert_node_at(__parent, __child, __h.get()); - __r = __h.release(); - __inserted = true; - } - return pair<iterator, bool>(iterator(__r), __inserted); + __node_holder __h = __construct_node(_STD::forward<_V>(__v)); + pair<iterator, bool> __r = __node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; } template <class _Tp, class _Compare, class _Allocator> @@ -1747,16 +1739,11 @@ template <class _V> typename __tree<_Tp, _Compare, _Allocator>::iterator __tree<_Tp, _Compare, _Allocator>::__insert_unique(const_iterator __p, _V&& __v) { - __node_base_pointer __parent; - __node_base_pointer& __child = __find_equal(__p, __parent, __v); - __node_pointer __r = static_cast<__node_pointer>(__child); - if (__child == nullptr) - { - __node_holder __h = __construct_node(_STD::forward<_V>(__v)); - __insert_node_at(__parent, __child, __h.get()); - __r = __h.release(); - } - return iterator(__r); + __node_holder __h = __construct_node(_STD::forward<_V>(__v)); + iterator __r = __node_insert_unique(__p, __h.get()); + if (__r.__ptr_ == __h.get()) + __h.release(); + return __r; } template <class _Tp, class _Compare, class _Allocator> @@ -1796,6 +1783,8 @@ __tree<_Tp, _Compare, _Allocator>::__construct_node(const value_type& __v) return _STD::move(__h); } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Tp, class _Compare, class _Allocator> pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> __tree<_Tp, _Compare, _Allocator>::__insert_unique(const value_type& __v) @@ -1852,8 +1841,6 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, const valu return iterator(__h.release()); } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES - template <class _Tp, class _Compare, class _Allocator> pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd)