Line data Source code
1 : // RB tree implementation -*- C++ -*-
2 :
3 : // Copyright (C) 2001-2014 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /*
26 : *
27 : * Copyright (c) 1996,1997
28 : * Silicon Graphics Computer Systems, Inc.
29 : *
30 : * Permission to use, copy, modify, distribute and sell this software
31 : * and its documentation for any purpose is hereby granted without fee,
32 : * provided that the above copyright notice appear in all copies and
33 : * that both that copyright notice and this permission notice appear
34 : * in supporting documentation. Silicon Graphics makes no
35 : * representations about the suitability of this software for any
36 : * purpose. It is provided "as is" without express or implied warranty.
37 : *
38 : *
39 : * Copyright (c) 1994
40 : * Hewlett-Packard Company
41 : *
42 : * Permission to use, copy, modify, distribute and sell this software
43 : * and its documentation for any purpose is hereby granted without fee,
44 : * provided that the above copyright notice appear in all copies and
45 : * that both that copyright notice and this permission notice appear
46 : * in supporting documentation. Hewlett-Packard Company makes no
47 : * representations about the suitability of this software for any
48 : * purpose. It is provided "as is" without express or implied warranty.
49 : *
50 : *
51 : */
52 :
53 : /** @file bits/stl_tree.h
54 : * This is an internal header file, included by other library headers.
55 : * Do not attempt to use it directly. @headername{map,set}
56 : */
57 :
58 : #ifndef _STL_TREE_H
59 : #define _STL_TREE_H 1
60 :
61 : #include <bits/stl_algobase.h>
62 : #include <bits/allocator.h>
63 : #include <bits/stl_function.h>
64 : #include <bits/cpp_type_traits.h>
65 : #include <ext/alloc_traits.h>
66 : #if __cplusplus >= 201103L
67 : #include <ext/aligned_buffer.h>
68 : #endif
69 :
70 : namespace std _GLIBCXX_VISIBILITY(default)
71 : {
72 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
73 :
74 : // Red-black tree class, designed for use in implementing STL
75 : // associative containers (set, multiset, map, and multimap). The
76 : // insertion and deletion algorithms are based on those in Cormen,
77 : // Leiserson, and Rivest, Introduction to Algorithms (MIT Press,
78 : // 1990), except that
79 : //
80 : // (1) the header cell is maintained with links not only to the root
81 : // but also to the leftmost node of the tree, to enable constant
82 : // time begin(), and to the rightmost node of the tree, to enable
83 : // linear time performance when used with the generic set algorithms
84 : // (set_union, etc.)
85 : //
86 : // (2) when a node being deleted has two children its successor node
87 : // is relinked into its place, rather than copied, so that the only
88 : // iterators invalidated are those referring to the deleted node.
89 :
90 : enum _Rb_tree_color { _S_red = false, _S_black = true };
91 :
92 : struct _Rb_tree_node_base
93 : {
94 : typedef _Rb_tree_node_base* _Base_ptr;
95 : typedef const _Rb_tree_node_base* _Const_Base_ptr;
96 :
97 : _Rb_tree_color _M_color;
98 : _Base_ptr _M_parent;
99 : _Base_ptr _M_left;
100 : _Base_ptr _M_right;
101 :
102 : static _Base_ptr
103 : _S_minimum(_Base_ptr __x) _GLIBCXX_NOEXCEPT
104 : {
105 : while (__x->_M_left != 0) __x = __x->_M_left;
106 : return __x;
107 : }
108 :
109 : static _Const_Base_ptr
110 : _S_minimum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
111 : {
112 : while (__x->_M_left != 0) __x = __x->_M_left;
113 : return __x;
114 : }
115 :
116 : static _Base_ptr
117 : _S_maximum(_Base_ptr __x) _GLIBCXX_NOEXCEPT
118 : {
119 : while (__x->_M_right != 0) __x = __x->_M_right;
120 : return __x;
121 : }
122 :
123 : static _Const_Base_ptr
124 : _S_maximum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
125 : {
126 : while (__x->_M_right != 0) __x = __x->_M_right;
127 : return __x;
128 : }
129 : };
130 :
131 : template<typename _Val>
132 : struct _Rb_tree_node : public _Rb_tree_node_base
133 : {
134 : typedef _Rb_tree_node<_Val>* _Link_type;
135 :
136 : #if __cplusplus < 201103L
137 : _Val _M_value_field;
138 :
139 : _Val*
140 : _M_valptr()
141 : { return std::__addressof(_M_value_field); }
142 :
143 : const _Val*
144 : _M_valptr() const
145 : { return std::__addressof(_M_value_field); }
146 : #else
147 : __gnu_cxx::__aligned_buffer<_Val> _M_storage;
148 :
149 : _Val*
150 0 : _M_valptr()
151 0 : { return _M_storage._M_ptr(); }
152 :
153 : const _Val*
154 0 : _M_valptr() const
155 0 : { return _M_storage._M_ptr(); }
156 : #endif
157 : };
158 :
159 : _GLIBCXX_PURE _Rb_tree_node_base*
160 : _Rb_tree_increment(_Rb_tree_node_base* __x) throw ();
161 :
162 : _GLIBCXX_PURE const _Rb_tree_node_base*
163 : _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ();
164 :
165 : _GLIBCXX_PURE _Rb_tree_node_base*
166 : _Rb_tree_decrement(_Rb_tree_node_base* __x) throw ();
167 :
168 : _GLIBCXX_PURE const _Rb_tree_node_base*
169 : _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw ();
170 :
171 : template<typename _Tp>
172 : struct _Rb_tree_iterator
173 : {
174 : typedef _Tp value_type;
175 : typedef _Tp& reference;
176 : typedef _Tp* pointer;
177 :
178 : typedef bidirectional_iterator_tag iterator_category;
179 : typedef ptrdiff_t difference_type;
180 :
181 : typedef _Rb_tree_iterator<_Tp> _Self;
182 : typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
183 : typedef _Rb_tree_node<_Tp>* _Link_type;
184 :
185 : _Rb_tree_iterator() _GLIBCXX_NOEXCEPT
186 : : _M_node() { }
187 :
188 : explicit
189 0 : _Rb_tree_iterator(_Link_type __x) _GLIBCXX_NOEXCEPT
190 0 : : _M_node(__x) { }
191 :
192 : reference
193 0 : operator*() const _GLIBCXX_NOEXCEPT
194 0 : { return *static_cast<_Link_type>(_M_node)->_M_valptr(); }
195 :
196 : pointer
197 : operator->() const _GLIBCXX_NOEXCEPT
198 : { return static_cast<_Link_type> (_M_node)->_M_valptr(); }
199 :
200 : _Self&
201 0 : operator++() _GLIBCXX_NOEXCEPT
202 : {
203 0 : _M_node = _Rb_tree_increment(_M_node);
204 0 : return *this;
205 : }
206 :
207 : _Self
208 : operator++(int) _GLIBCXX_NOEXCEPT
209 : {
210 : _Self __tmp = *this;
211 : _M_node = _Rb_tree_increment(_M_node);
212 : return __tmp;
213 : }
214 :
215 : _Self&
216 0 : operator--() _GLIBCXX_NOEXCEPT
217 : {
218 0 : _M_node = _Rb_tree_decrement(_M_node);
219 0 : return *this;
220 : }
221 :
222 : _Self
223 : operator--(int) _GLIBCXX_NOEXCEPT
224 : {
225 : _Self __tmp = *this;
226 : _M_node = _Rb_tree_decrement(_M_node);
227 : return __tmp;
228 : }
229 :
230 : bool
231 0 : operator==(const _Self& __x) const _GLIBCXX_NOEXCEPT
232 0 : { return _M_node == __x._M_node; }
233 :
234 : bool
235 : operator!=(const _Self& __x) const _GLIBCXX_NOEXCEPT
236 : { return _M_node != __x._M_node; }
237 :
238 : _Base_ptr _M_node;
239 : };
240 :
241 : template<typename _Tp>
242 : struct _Rb_tree_const_iterator
243 : {
244 : typedef _Tp value_type;
245 : typedef const _Tp& reference;
246 : typedef const _Tp* pointer;
247 :
248 : typedef _Rb_tree_iterator<_Tp> iterator;
249 :
250 : typedef bidirectional_iterator_tag iterator_category;
251 : typedef ptrdiff_t difference_type;
252 :
253 : typedef _Rb_tree_const_iterator<_Tp> _Self;
254 : typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
255 : typedef const _Rb_tree_node<_Tp>* _Link_type;
256 :
257 : _Rb_tree_const_iterator() _GLIBCXX_NOEXCEPT
258 : : _M_node() { }
259 :
260 : explicit
261 0 : _Rb_tree_const_iterator(_Link_type __x) _GLIBCXX_NOEXCEPT
262 0 : : _M_node(__x) { }
263 :
264 0 : _Rb_tree_const_iterator(const iterator& __it) _GLIBCXX_NOEXCEPT
265 0 : : _M_node(__it._M_node) { }
266 :
267 : iterator
268 0 : _M_const_cast() const _GLIBCXX_NOEXCEPT
269 : { return iterator(static_cast<typename iterator::_Link_type>
270 0 : (const_cast<typename iterator::_Base_ptr>(_M_node))); }
271 :
272 : reference
273 : operator*() const _GLIBCXX_NOEXCEPT
274 : { return *static_cast<_Link_type>(_M_node)->_M_valptr(); }
275 :
276 : pointer
277 0 : operator->() const _GLIBCXX_NOEXCEPT
278 0 : { return static_cast<_Link_type>(_M_node)->_M_valptr(); }
279 :
280 : _Self&
281 : operator++() _GLIBCXX_NOEXCEPT
282 : {
283 : _M_node = _Rb_tree_increment(_M_node);
284 : return *this;
285 : }
286 :
287 : _Self
288 : operator++(int) _GLIBCXX_NOEXCEPT
289 : {
290 : _Self __tmp = *this;
291 : _M_node = _Rb_tree_increment(_M_node);
292 : return __tmp;
293 : }
294 :
295 : _Self&
296 : operator--() _GLIBCXX_NOEXCEPT
297 : {
298 : _M_node = _Rb_tree_decrement(_M_node);
299 : return *this;
300 : }
301 :
302 : _Self
303 : operator--(int) _GLIBCXX_NOEXCEPT
304 : {
305 : _Self __tmp = *this;
306 : _M_node = _Rb_tree_decrement(_M_node);
307 : return __tmp;
308 : }
309 :
310 : bool
311 0 : operator==(const _Self& __x) const _GLIBCXX_NOEXCEPT
312 0 : { return _M_node == __x._M_node; }
313 :
314 : bool
315 0 : operator!=(const _Self& __x) const _GLIBCXX_NOEXCEPT
316 0 : { return _M_node != __x._M_node; }
317 :
318 : _Base_ptr _M_node;
319 : };
320 :
321 : template<typename _Val>
322 : inline bool
323 : operator==(const _Rb_tree_iterator<_Val>& __x,
324 : const _Rb_tree_const_iterator<_Val>& __y) _GLIBCXX_NOEXCEPT
325 : { return __x._M_node == __y._M_node; }
326 :
327 : template<typename _Val>
328 : inline bool
329 : operator!=(const _Rb_tree_iterator<_Val>& __x,
330 : const _Rb_tree_const_iterator<_Val>& __y) _GLIBCXX_NOEXCEPT
331 : { return __x._M_node != __y._M_node; }
332 :
333 : void
334 : _Rb_tree_insert_and_rebalance(const bool __insert_left,
335 : _Rb_tree_node_base* __x,
336 : _Rb_tree_node_base* __p,
337 : _Rb_tree_node_base& __header) throw ();
338 :
339 : _Rb_tree_node_base*
340 : _Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z,
341 : _Rb_tree_node_base& __header) throw ();
342 :
343 :
344 : template<typename _Key, typename _Val, typename _KeyOfValue,
345 : typename _Compare, typename _Alloc = allocator<_Val> >
346 : class _Rb_tree
347 : {
348 : typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
349 : rebind<_Rb_tree_node<_Val> >::other _Node_allocator;
350 :
351 : typedef __gnu_cxx::__alloc_traits<_Node_allocator> _Alloc_traits;
352 :
353 : protected:
354 : typedef _Rb_tree_node_base* _Base_ptr;
355 : typedef const _Rb_tree_node_base* _Const_Base_ptr;
356 :
357 : public:
358 : typedef _Key key_type;
359 : typedef _Val value_type;
360 : typedef value_type* pointer;
361 : typedef const value_type* const_pointer;
362 : typedef value_type& reference;
363 : typedef const value_type& const_reference;
364 : typedef _Rb_tree_node<_Val>* _Link_type;
365 : typedef const _Rb_tree_node<_Val>* _Const_Link_type;
366 : typedef size_t size_type;
367 : typedef ptrdiff_t difference_type;
368 : typedef _Alloc allocator_type;
369 :
370 : _Node_allocator&
371 0 : _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
372 0 : { return *static_cast<_Node_allocator*>(&this->_M_impl); }
373 :
374 : const _Node_allocator&
375 : _M_get_Node_allocator() const _GLIBCXX_NOEXCEPT
376 : { return *static_cast<const _Node_allocator*>(&this->_M_impl); }
377 :
378 : allocator_type
379 : get_allocator() const _GLIBCXX_NOEXCEPT
380 : { return allocator_type(_M_get_Node_allocator()); }
381 :
382 : protected:
383 : _Link_type
384 0 : _M_get_node()
385 0 : { return _Alloc_traits::allocate(_M_get_Node_allocator(), 1); }
386 :
387 : void
388 0 : _M_put_node(_Link_type __p) _GLIBCXX_NOEXCEPT
389 0 : { _Alloc_traits::deallocate(_M_get_Node_allocator(), __p, 1); }
390 :
391 : #if __cplusplus < 201103L
392 : _Link_type
393 : _M_create_node(const value_type& __x)
394 : {
395 : _Link_type __tmp = _M_get_node();
396 : __try
397 : { get_allocator().construct(__tmp->_M_valptr(), __x); }
398 : __catch(...)
399 : {
400 : _M_put_node(__tmp);
401 : __throw_exception_again;
402 : }
403 : return __tmp;
404 : }
405 :
406 : void
407 : _M_destroy_node(_Link_type __p)
408 : {
409 : get_allocator().destroy(__p->_M_valptr());
410 : _M_put_node(__p);
411 : }
412 : #else
413 : template<typename... _Args>
414 : _Link_type
415 0 : _M_create_node(_Args&&... __args)
416 : {
417 0 : _Link_type __tmp = _M_get_node();
418 : __try
419 : {
420 0 : ::new(__tmp) _Rb_tree_node<_Val>;
421 0 : _Alloc_traits::construct(_M_get_Node_allocator(),
422 : __tmp->_M_valptr(),
423 0 : std::forward<_Args>(__args)...);
424 : }
425 0 : __catch(...)
426 : {
427 0 : _M_put_node(__tmp);
428 0 : __throw_exception_again;
429 : }
430 0 : return __tmp;
431 : }
432 :
433 : void
434 0 : _M_destroy_node(_Link_type __p) noexcept
435 : {
436 0 : _Alloc_traits::destroy(_M_get_Node_allocator(), __p->_M_valptr());
437 : __p->~_Rb_tree_node<_Val>();
438 0 : _M_put_node(__p);
439 0 : }
440 : #endif
441 :
442 : _Link_type
443 : _M_clone_node(_Const_Link_type __x)
444 : {
445 : _Link_type __tmp = _M_create_node(*__x->_M_valptr());
446 : __tmp->_M_color = __x->_M_color;
447 : __tmp->_M_left = 0;
448 : __tmp->_M_right = 0;
449 : return __tmp;
450 : }
451 :
452 : protected:
453 : template<typename _Key_compare,
454 : bool _Is_pod_comparator = __is_pod(_Key_compare)>
455 0 : struct _Rb_tree_impl : public _Node_allocator
456 : {
457 : _Key_compare _M_key_compare;
458 : _Rb_tree_node_base _M_header;
459 : size_type _M_node_count; // Keeps track of size of tree.
460 :
461 0 : _Rb_tree_impl()
462 : : _Node_allocator(), _M_key_compare(), _M_header(),
463 0 : _M_node_count(0)
464 0 : { _M_initialize(); }
465 :
466 : _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a)
467 : : _Node_allocator(__a), _M_key_compare(__comp), _M_header(),
468 : _M_node_count(0)
469 : { _M_initialize(); }
470 :
471 : #if __cplusplus >= 201103L
472 : _Rb_tree_impl(const _Key_compare& __comp, _Node_allocator&& __a)
473 : : _Node_allocator(std::move(__a)), _M_key_compare(__comp),
474 : _M_header(), _M_node_count(0)
475 : { _M_initialize(); }
476 : #endif
477 :
478 : private:
479 : void
480 0 : _M_initialize()
481 : {
482 0 : this->_M_header._M_color = _S_red;
483 0 : this->_M_header._M_parent = 0;
484 0 : this->_M_header._M_left = &this->_M_header;
485 0 : this->_M_header._M_right = &this->_M_header;
486 0 : }
487 : };
488 :
489 : _Rb_tree_impl<_Compare> _M_impl;
490 :
491 : protected:
492 : _Base_ptr&
493 : _M_root() _GLIBCXX_NOEXCEPT
494 : { return this->_M_impl._M_header._M_parent; }
495 :
496 : _Const_Base_ptr
497 : _M_root() const _GLIBCXX_NOEXCEPT
498 : { return this->_M_impl._M_header._M_parent; }
499 :
500 : _Base_ptr&
501 0 : _M_leftmost() _GLIBCXX_NOEXCEPT
502 0 : { return this->_M_impl._M_header._M_left; }
503 :
504 : _Const_Base_ptr
505 : _M_leftmost() const _GLIBCXX_NOEXCEPT
506 : { return this->_M_impl._M_header._M_left; }
507 :
508 : _Base_ptr&
509 0 : _M_rightmost() _GLIBCXX_NOEXCEPT
510 0 : { return this->_M_impl._M_header._M_right; }
511 :
512 : _Const_Base_ptr
513 : _M_rightmost() const _GLIBCXX_NOEXCEPT
514 : { return this->_M_impl._M_header._M_right; }
515 :
516 : _Link_type
517 0 : _M_begin() _GLIBCXX_NOEXCEPT
518 0 : { return static_cast<_Link_type>(this->_M_impl._M_header._M_parent); }
519 :
520 : _Const_Link_type
521 0 : _M_begin() const _GLIBCXX_NOEXCEPT
522 : {
523 : return static_cast<_Const_Link_type>
524 0 : (this->_M_impl._M_header._M_parent);
525 : }
526 :
527 : _Link_type
528 0 : _M_end() _GLIBCXX_NOEXCEPT
529 0 : { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); }
530 :
531 : _Const_Link_type
532 0 : _M_end() const _GLIBCXX_NOEXCEPT
533 0 : { return reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); }
534 :
535 : static const_reference
536 0 : _S_value(_Const_Link_type __x)
537 0 : { return *__x->_M_valptr(); }
538 :
539 : static const _Key&
540 0 : _S_key(_Const_Link_type __x)
541 0 : { return _KeyOfValue()(_S_value(__x)); }
542 :
543 : static _Link_type
544 0 : _S_left(_Base_ptr __x) _GLIBCXX_NOEXCEPT
545 0 : { return static_cast<_Link_type>(__x->_M_left); }
546 :
547 : static _Const_Link_type
548 0 : _S_left(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
549 0 : { return static_cast<_Const_Link_type>(__x->_M_left); }
550 :
551 : static _Link_type
552 0 : _S_right(_Base_ptr __x) _GLIBCXX_NOEXCEPT
553 0 : { return static_cast<_Link_type>(__x->_M_right); }
554 :
555 : static _Const_Link_type
556 0 : _S_right(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
557 0 : { return static_cast<_Const_Link_type>(__x->_M_right); }
558 :
559 : static const_reference
560 0 : _S_value(_Const_Base_ptr __x)
561 0 : { return *static_cast<_Const_Link_type>(__x)->_M_valptr(); }
562 :
563 : static const _Key&
564 0 : _S_key(_Const_Base_ptr __x)
565 0 : { return _KeyOfValue()(_S_value(__x)); }
566 :
567 : static _Base_ptr
568 : _S_minimum(_Base_ptr __x) _GLIBCXX_NOEXCEPT
569 : { return _Rb_tree_node_base::_S_minimum(__x); }
570 :
571 : static _Const_Base_ptr
572 : _S_minimum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
573 : { return _Rb_tree_node_base::_S_minimum(__x); }
574 :
575 : static _Base_ptr
576 : _S_maximum(_Base_ptr __x) _GLIBCXX_NOEXCEPT
577 : { return _Rb_tree_node_base::_S_maximum(__x); }
578 :
579 : static _Const_Base_ptr
580 : _S_maximum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
581 : { return _Rb_tree_node_base::_S_maximum(__x); }
582 :
583 : public:
584 : typedef _Rb_tree_iterator<value_type> iterator;
585 : typedef _Rb_tree_const_iterator<value_type> const_iterator;
586 :
587 : typedef std::reverse_iterator<iterator> reverse_iterator;
588 : typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
589 :
590 : private:
591 : pair<_Base_ptr, _Base_ptr>
592 : _M_get_insert_unique_pos(const key_type& __k);
593 :
594 : pair<_Base_ptr, _Base_ptr>
595 : _M_get_insert_equal_pos(const key_type& __k);
596 :
597 : pair<_Base_ptr, _Base_ptr>
598 : _M_get_insert_hint_unique_pos(const_iterator __pos,
599 : const key_type& __k);
600 :
601 : pair<_Base_ptr, _Base_ptr>
602 : _M_get_insert_hint_equal_pos(const_iterator __pos,
603 : const key_type& __k);
604 :
605 : #if __cplusplus >= 201103L
606 : template<typename _Arg>
607 : iterator
608 : _M_insert_(_Base_ptr __x, _Base_ptr __y, _Arg&& __v);
609 :
610 : iterator
611 : _M_insert_node(_Base_ptr __x, _Base_ptr __y, _Link_type __z);
612 :
613 : template<typename _Arg>
614 : iterator
615 : _M_insert_lower(_Base_ptr __y, _Arg&& __v);
616 :
617 : template<typename _Arg>
618 : iterator
619 : _M_insert_equal_lower(_Arg&& __x);
620 :
621 : iterator
622 : _M_insert_lower_node(_Base_ptr __p, _Link_type __z);
623 :
624 : iterator
625 : _M_insert_equal_lower_node(_Link_type __z);
626 : #else
627 : iterator
628 : _M_insert_(_Base_ptr __x, _Base_ptr __y,
629 : const value_type& __v);
630 :
631 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
632 : // 233. Insertion hints in associative containers.
633 : iterator
634 : _M_insert_lower(_Base_ptr __y, const value_type& __v);
635 :
636 : iterator
637 : _M_insert_equal_lower(const value_type& __x);
638 : #endif
639 :
640 : _Link_type
641 : _M_copy(_Const_Link_type __x, _Link_type __p);
642 :
643 : void
644 : _M_erase(_Link_type __x);
645 :
646 : iterator
647 : _M_lower_bound(_Link_type __x, _Link_type __y,
648 : const _Key& __k);
649 :
650 : const_iterator
651 : _M_lower_bound(_Const_Link_type __x, _Const_Link_type __y,
652 : const _Key& __k) const;
653 :
654 : iterator
655 : _M_upper_bound(_Link_type __x, _Link_type __y,
656 : const _Key& __k);
657 :
658 : const_iterator
659 : _M_upper_bound(_Const_Link_type __x, _Const_Link_type __y,
660 : const _Key& __k) const;
661 :
662 : public:
663 : // allocation/deallocation
664 0 : _Rb_tree() { }
665 :
666 : _Rb_tree(const _Compare& __comp,
667 : const allocator_type& __a = allocator_type())
668 : : _M_impl(__comp, _Node_allocator(__a)) { }
669 :
670 : _Rb_tree(const _Rb_tree& __x)
671 : : _M_impl(__x._M_impl._M_key_compare,
672 : _Alloc_traits::_S_select_on_copy(__x._M_get_Node_allocator()))
673 : {
674 : if (__x._M_root() != 0)
675 : {
676 : _M_root() = _M_copy(__x._M_begin(), _M_end());
677 : _M_leftmost() = _S_minimum(_M_root());
678 : _M_rightmost() = _S_maximum(_M_root());
679 : _M_impl._M_node_count = __x._M_impl._M_node_count;
680 : }
681 : }
682 :
683 : #if __cplusplus >= 201103L
684 : _Rb_tree(const allocator_type& __a)
685 : : _M_impl(_Compare(), _Node_allocator(__a))
686 : { }
687 :
688 : _Rb_tree(const _Rb_tree& __x, const allocator_type& __a)
689 : : _M_impl(__x._M_impl._M_key_compare, _Node_allocator(__a))
690 : {
691 : if (__x._M_root() != 0)
692 : {
693 : _M_root() = _M_copy(__x._M_begin(), _M_end());
694 : _M_leftmost() = _S_minimum(_M_root());
695 : _M_rightmost() = _S_maximum(_M_root());
696 : _M_impl._M_node_count = __x._M_impl._M_node_count;
697 : }
698 : }
699 :
700 : _Rb_tree(_Rb_tree&& __x)
701 : : _M_impl(__x._M_impl._M_key_compare, __x._M_get_Node_allocator())
702 : {
703 : if (__x._M_root() != 0)
704 : _M_move_data(__x, std::true_type());
705 : }
706 :
707 : _Rb_tree(_Rb_tree&& __x, const allocator_type& __a)
708 : : _Rb_tree(std::move(__x), _Node_allocator(__a))
709 : { }
710 :
711 : _Rb_tree(_Rb_tree&& __x, _Node_allocator&& __a);
712 : #endif
713 :
714 0 : ~_Rb_tree() _GLIBCXX_NOEXCEPT
715 0 : { _M_erase(_M_begin()); }
716 :
717 : _Rb_tree&
718 : operator=(const _Rb_tree& __x);
719 :
720 : // Accessors.
721 : _Compare
722 0 : key_comp() const
723 0 : { return _M_impl._M_key_compare; }
724 :
725 : iterator
726 0 : begin() _GLIBCXX_NOEXCEPT
727 : {
728 : return iterator(static_cast<_Link_type>
729 0 : (this->_M_impl._M_header._M_left));
730 : }
731 :
732 : const_iterator
733 : begin() const _GLIBCXX_NOEXCEPT
734 : {
735 : return const_iterator(static_cast<_Const_Link_type>
736 : (this->_M_impl._M_header._M_left));
737 : }
738 :
739 : iterator
740 0 : end() _GLIBCXX_NOEXCEPT
741 0 : { return iterator(static_cast<_Link_type>(&this->_M_impl._M_header)); }
742 :
743 : const_iterator
744 0 : end() const _GLIBCXX_NOEXCEPT
745 : {
746 : return const_iterator(static_cast<_Const_Link_type>
747 0 : (&this->_M_impl._M_header));
748 : }
749 :
750 : reverse_iterator
751 : rbegin() _GLIBCXX_NOEXCEPT
752 : { return reverse_iterator(end()); }
753 :
754 : const_reverse_iterator
755 : rbegin() const _GLIBCXX_NOEXCEPT
756 : { return const_reverse_iterator(end()); }
757 :
758 : reverse_iterator
759 : rend() _GLIBCXX_NOEXCEPT
760 : { return reverse_iterator(begin()); }
761 :
762 : const_reverse_iterator
763 : rend() const _GLIBCXX_NOEXCEPT
764 : { return const_reverse_iterator(begin()); }
765 :
766 : bool
767 : empty() const _GLIBCXX_NOEXCEPT
768 : { return _M_impl._M_node_count == 0; }
769 :
770 : size_type
771 0 : size() const _GLIBCXX_NOEXCEPT
772 0 : { return _M_impl._M_node_count; }
773 :
774 : size_type
775 : max_size() const _GLIBCXX_NOEXCEPT
776 : { return _Alloc_traits::max_size(_M_get_Node_allocator()); }
777 :
778 : void
779 : #if __cplusplus >= 201103L
780 : swap(_Rb_tree& __t) noexcept(_Alloc_traits::_S_nothrow_swap());
781 : #else
782 : swap(_Rb_tree& __t);
783 : #endif
784 :
785 : // Insert/erase.
786 : #if __cplusplus >= 201103L
787 : template<typename _Arg>
788 : pair<iterator, bool>
789 : _M_insert_unique(_Arg&& __x);
790 :
791 : template<typename _Arg>
792 : iterator
793 : _M_insert_equal(_Arg&& __x);
794 :
795 : template<typename _Arg>
796 : iterator
797 : _M_insert_unique_(const_iterator __position, _Arg&& __x);
798 :
799 : template<typename _Arg>
800 : iterator
801 : _M_insert_equal_(const_iterator __position, _Arg&& __x);
802 :
803 : template<typename... _Args>
804 : pair<iterator, bool>
805 : _M_emplace_unique(_Args&&... __args);
806 :
807 : template<typename... _Args>
808 : iterator
809 : _M_emplace_equal(_Args&&... __args);
810 :
811 : template<typename... _Args>
812 : iterator
813 : _M_emplace_hint_unique(const_iterator __pos, _Args&&... __args);
814 :
815 : template<typename... _Args>
816 : iterator
817 : _M_emplace_hint_equal(const_iterator __pos, _Args&&... __args);
818 : #else
819 : pair<iterator, bool>
820 : _M_insert_unique(const value_type& __x);
821 :
822 : iterator
823 : _M_insert_equal(const value_type& __x);
824 :
825 : iterator
826 : _M_insert_unique_(const_iterator __position, const value_type& __x);
827 :
828 : iterator
829 : _M_insert_equal_(const_iterator __position, const value_type& __x);
830 : #endif
831 :
832 : template<typename _InputIterator>
833 : void
834 : _M_insert_unique(_InputIterator __first, _InputIterator __last);
835 :
836 : template<typename _InputIterator>
837 : void
838 : _M_insert_equal(_InputIterator __first, _InputIterator __last);
839 :
840 : private:
841 : void
842 : _M_erase_aux(const_iterator __position);
843 :
844 : void
845 : _M_erase_aux(const_iterator __first, const_iterator __last);
846 :
847 : public:
848 : #if __cplusplus >= 201103L
849 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
850 : // DR 130. Associative erase should return an iterator.
851 : _GLIBCXX_ABI_TAG_CXX11
852 : iterator
853 : erase(const_iterator __position)
854 : {
855 : const_iterator __result = __position;
856 : ++__result;
857 : _M_erase_aux(__position);
858 : return __result._M_const_cast();
859 : }
860 :
861 : // LWG 2059.
862 : _GLIBCXX_ABI_TAG_CXX11
863 : iterator
864 : erase(iterator __position)
865 : {
866 : iterator __result = __position;
867 : ++__result;
868 : _M_erase_aux(__position);
869 : return __result;
870 : }
871 : #else
872 : void
873 : erase(iterator __position)
874 : { _M_erase_aux(__position); }
875 :
876 : void
877 : erase(const_iterator __position)
878 : { _M_erase_aux(__position); }
879 : #endif
880 : size_type
881 : erase(const key_type& __x);
882 :
883 : #if __cplusplus >= 201103L
884 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
885 : // DR 130. Associative erase should return an iterator.
886 : _GLIBCXX_ABI_TAG_CXX11
887 : iterator
888 : erase(const_iterator __first, const_iterator __last)
889 : {
890 : _M_erase_aux(__first, __last);
891 : return __last._M_const_cast();
892 : }
893 : #else
894 : void
895 : erase(iterator __first, iterator __last)
896 : { _M_erase_aux(__first, __last); }
897 :
898 : void
899 : erase(const_iterator __first, const_iterator __last)
900 : { _M_erase_aux(__first, __last); }
901 : #endif
902 : void
903 : erase(const key_type* __first, const key_type* __last);
904 :
905 : void
906 : clear() _GLIBCXX_NOEXCEPT
907 : {
908 : _M_erase(_M_begin());
909 : _M_leftmost() = _M_end();
910 : _M_root() = 0;
911 : _M_rightmost() = _M_end();
912 : _M_impl._M_node_count = 0;
913 : }
914 :
915 : // Set operations.
916 : iterator
917 : find(const key_type& __k);
918 :
919 : const_iterator
920 : find(const key_type& __k) const;
921 :
922 : size_type
923 : count(const key_type& __k) const;
924 :
925 : iterator
926 0 : lower_bound(const key_type& __k)
927 0 : { return _M_lower_bound(_M_begin(), _M_end(), __k); }
928 :
929 : const_iterator
930 : lower_bound(const key_type& __k) const
931 : { return _M_lower_bound(_M_begin(), _M_end(), __k); }
932 :
933 : iterator
934 : upper_bound(const key_type& __k)
935 : { return _M_upper_bound(_M_begin(), _M_end(), __k); }
936 :
937 : const_iterator
938 : upper_bound(const key_type& __k) const
939 : { return _M_upper_bound(_M_begin(), _M_end(), __k); }
940 :
941 : pair<iterator, iterator>
942 : equal_range(const key_type& __k);
943 :
944 : pair<const_iterator, const_iterator>
945 : equal_range(const key_type& __k) const;
946 :
947 : // Debugging.
948 : bool
949 : __rb_verify() const;
950 :
951 : #if __cplusplus >= 201103L
952 : bool
953 : _M_move_assign(_Rb_tree&);
954 :
955 : private:
956 : // Move elements from container with equal allocator.
957 : void
958 : _M_move_data(_Rb_tree&, std::true_type);
959 :
960 : // Move elements from container with possibly non-equal allocator,
961 : // which might result in a copy not a move.
962 : void
963 : _M_move_data(_Rb_tree&, std::false_type);
964 : #endif
965 : };
966 :
967 : template<typename _Key, typename _Val, typename _KeyOfValue,
968 : typename _Compare, typename _Alloc>
969 : inline bool
970 : operator==(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
971 : const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
972 : {
973 : return __x.size() == __y.size()
974 : && std::equal(__x.begin(), __x.end(), __y.begin());
975 : }
976 :
977 : template<typename _Key, typename _Val, typename _KeyOfValue,
978 : typename _Compare, typename _Alloc>
979 : inline bool
980 : operator<(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
981 : const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
982 : {
983 : return std::lexicographical_compare(__x.begin(), __x.end(),
984 : __y.begin(), __y.end());
985 : }
986 :
987 : template<typename _Key, typename _Val, typename _KeyOfValue,
988 : typename _Compare, typename _Alloc>
989 : inline bool
990 : operator!=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
991 : const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
992 : { return !(__x == __y); }
993 :
994 : template<typename _Key, typename _Val, typename _KeyOfValue,
995 : typename _Compare, typename _Alloc>
996 : inline bool
997 : operator>(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
998 : const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
999 : { return __y < __x; }
1000 :
1001 : template<typename _Key, typename _Val, typename _KeyOfValue,
1002 : typename _Compare, typename _Alloc>
1003 : inline bool
1004 : operator<=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
1005 : const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
1006 : { return !(__y < __x); }
1007 :
1008 : template<typename _Key, typename _Val, typename _KeyOfValue,
1009 : typename _Compare, typename _Alloc>
1010 : inline bool
1011 : operator>=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
1012 : const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
1013 : { return !(__x < __y); }
1014 :
1015 : template<typename _Key, typename _Val, typename _KeyOfValue,
1016 : typename _Compare, typename _Alloc>
1017 : inline void
1018 : swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
1019 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
1020 : { __x.swap(__y); }
1021 :
1022 : #if __cplusplus >= 201103L
1023 : template<typename _Key, typename _Val, typename _KeyOfValue,
1024 : typename _Compare, typename _Alloc>
1025 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1026 : _Rb_tree(_Rb_tree&& __x, _Node_allocator&& __a)
1027 : : _M_impl(__x._M_impl._M_key_compare, std::move(__a))
1028 : {
1029 : using __eq = integral_constant<bool, _Alloc_traits::_S_always_equal()>;
1030 : if (__x._M_root() != 0)
1031 : _M_move_data(__x, __eq());
1032 : }
1033 :
1034 : template<typename _Key, typename _Val, typename _KeyOfValue,
1035 : typename _Compare, typename _Alloc>
1036 : void
1037 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1038 : _M_move_data(_Rb_tree& __x, std::true_type)
1039 : {
1040 : _M_root() = __x._M_root();
1041 : _M_leftmost() = __x._M_leftmost();
1042 : _M_rightmost() = __x._M_rightmost();
1043 : _M_root()->_M_parent = _M_end();
1044 :
1045 : __x._M_root() = 0;
1046 : __x._M_leftmost() = __x._M_end();
1047 : __x._M_rightmost() = __x._M_end();
1048 :
1049 : this->_M_impl._M_node_count = __x._M_impl._M_node_count;
1050 : __x._M_impl._M_node_count = 0;
1051 : }
1052 :
1053 : template<typename _Key, typename _Val, typename _KeyOfValue,
1054 : typename _Compare, typename _Alloc>
1055 : void
1056 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1057 : _M_move_data(_Rb_tree& __x, std::false_type)
1058 : {
1059 : if (_M_get_Node_allocator() == __x._M_get_Node_allocator())
1060 : _M_move_data(__x, std::true_type());
1061 : else
1062 : {
1063 : _M_root() = _M_copy(__x._M_begin(), _M_end());
1064 : _M_leftmost() = _S_minimum(_M_root());
1065 : _M_rightmost() = _S_maximum(_M_root());
1066 : _M_impl._M_node_count = __x._M_impl._M_node_count;
1067 : }
1068 : }
1069 :
1070 : template<typename _Key, typename _Val, typename _KeyOfValue,
1071 : typename _Compare, typename _Alloc>
1072 : bool
1073 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1074 : _M_move_assign(_Rb_tree& __x)
1075 : {
1076 : _M_impl._M_key_compare = __x._M_impl._M_key_compare;
1077 : if (_Alloc_traits::_S_propagate_on_move_assign()
1078 : || _Alloc_traits::_S_always_equal()
1079 : || _M_get_Node_allocator() == __x._M_get_Node_allocator())
1080 : {
1081 : clear();
1082 : if (__x._M_root() != 0)
1083 : _M_move_data(__x, std::true_type());
1084 : std::__alloc_on_move(_M_get_Node_allocator(),
1085 : __x._M_get_Node_allocator());
1086 : return true;
1087 : }
1088 : return false;
1089 : }
1090 : #endif
1091 :
1092 : template<typename _Key, typename _Val, typename _KeyOfValue,
1093 : typename _Compare, typename _Alloc>
1094 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&
1095 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1096 : operator=(const _Rb_tree& __x)
1097 : {
1098 : if (this != &__x)
1099 : {
1100 : // Note that _Key may be a constant type.
1101 : clear();
1102 : #if __cplusplus >= 201103L
1103 : if (_Alloc_traits::_S_propagate_on_copy_assign())
1104 : {
1105 : auto& __this_alloc = this->_M_get_Node_allocator();
1106 : auto& __that_alloc = __x._M_get_Node_allocator();
1107 : if (!_Alloc_traits::_S_always_equal()
1108 : && __this_alloc != __that_alloc)
1109 : {
1110 : std::__alloc_on_copy(__this_alloc, __that_alloc);
1111 : }
1112 : }
1113 : #endif
1114 : _M_impl._M_key_compare = __x._M_impl._M_key_compare;
1115 : if (__x._M_root() != 0)
1116 : {
1117 : _M_root() = _M_copy(__x._M_begin(), _M_end());
1118 : _M_leftmost() = _S_minimum(_M_root());
1119 : _M_rightmost() = _S_maximum(_M_root());
1120 : _M_impl._M_node_count = __x._M_impl._M_node_count;
1121 : }
1122 : }
1123 : return *this;
1124 : }
1125 :
1126 : template<typename _Key, typename _Val, typename _KeyOfValue,
1127 : typename _Compare, typename _Alloc>
1128 : #if __cplusplus >= 201103L
1129 : template<typename _Arg>
1130 : #endif
1131 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1132 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1133 : #if __cplusplus >= 201103L
1134 : _M_insert_(_Base_ptr __x, _Base_ptr __p, _Arg&& __v)
1135 : #else
1136 : _M_insert_(_Base_ptr __x, _Base_ptr __p, const _Val& __v)
1137 : #endif
1138 : {
1139 : bool __insert_left = (__x != 0 || __p == _M_end()
1140 : || _M_impl._M_key_compare(_KeyOfValue()(__v),
1141 : _S_key(__p)));
1142 :
1143 : _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v));
1144 :
1145 : _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1146 : this->_M_impl._M_header);
1147 : ++_M_impl._M_node_count;
1148 : return iterator(__z);
1149 : }
1150 :
1151 : template<typename _Key, typename _Val, typename _KeyOfValue,
1152 : typename _Compare, typename _Alloc>
1153 : #if __cplusplus >= 201103L
1154 : template<typename _Arg>
1155 : #endif
1156 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1157 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1158 : #if __cplusplus >= 201103L
1159 : _M_insert_lower(_Base_ptr __p, _Arg&& __v)
1160 : #else
1161 : _M_insert_lower(_Base_ptr __p, const _Val& __v)
1162 : #endif
1163 : {
1164 : bool __insert_left = (__p == _M_end()
1165 : || !_M_impl._M_key_compare(_S_key(__p),
1166 : _KeyOfValue()(__v)));
1167 :
1168 : _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v));
1169 :
1170 : _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1171 : this->_M_impl._M_header);
1172 : ++_M_impl._M_node_count;
1173 : return iterator(__z);
1174 : }
1175 :
1176 : template<typename _Key, typename _Val, typename _KeyOfValue,
1177 : typename _Compare, typename _Alloc>
1178 : #if __cplusplus >= 201103L
1179 : template<typename _Arg>
1180 : #endif
1181 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1182 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1183 : #if __cplusplus >= 201103L
1184 : _M_insert_equal_lower(_Arg&& __v)
1185 : #else
1186 : _M_insert_equal_lower(const _Val& __v)
1187 : #endif
1188 : {
1189 : _Link_type __x = _M_begin();
1190 : _Link_type __y = _M_end();
1191 : while (__x != 0)
1192 : {
1193 : __y = __x;
1194 : __x = !_M_impl._M_key_compare(_S_key(__x), _KeyOfValue()(__v)) ?
1195 : _S_left(__x) : _S_right(__x);
1196 : }
1197 : return _M_insert_lower(__y, _GLIBCXX_FORWARD(_Arg, __v));
1198 : }
1199 :
1200 : template<typename _Key, typename _Val, typename _KoV,
1201 : typename _Compare, typename _Alloc>
1202 : typename _Rb_tree<_Key, _Val, _KoV, _Compare, _Alloc>::_Link_type
1203 : _Rb_tree<_Key, _Val, _KoV, _Compare, _Alloc>::
1204 : _M_copy(_Const_Link_type __x, _Link_type __p)
1205 : {
1206 : // Structural copy. __x and __p must be non-null.
1207 : _Link_type __top = _M_clone_node(__x);
1208 : __top->_M_parent = __p;
1209 :
1210 : __try
1211 : {
1212 : if (__x->_M_right)
1213 : __top->_M_right = _M_copy(_S_right(__x), __top);
1214 : __p = __top;
1215 : __x = _S_left(__x);
1216 :
1217 : while (__x != 0)
1218 : {
1219 : _Link_type __y = _M_clone_node(__x);
1220 : __p->_M_left = __y;
1221 : __y->_M_parent = __p;
1222 : if (__x->_M_right)
1223 : __y->_M_right = _M_copy(_S_right(__x), __y);
1224 : __p = __y;
1225 : __x = _S_left(__x);
1226 : }
1227 : }
1228 : __catch(...)
1229 : {
1230 : _M_erase(__top);
1231 : __throw_exception_again;
1232 : }
1233 : return __top;
1234 : }
1235 :
1236 : template<typename _Key, typename _Val, typename _KeyOfValue,
1237 : typename _Compare, typename _Alloc>
1238 : void
1239 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1240 : _M_erase(_Link_type __x)
1241 : {
1242 : // Erase without rebalancing.
1243 0 : while (__x != 0)
1244 : {
1245 0 : _M_erase(_S_right(__x));
1246 0 : _Link_type __y = _S_left(__x);
1247 0 : _M_destroy_node(__x);
1248 0 : __x = __y;
1249 : }
1250 0 : }
1251 :
1252 : template<typename _Key, typename _Val, typename _KeyOfValue,
1253 : typename _Compare, typename _Alloc>
1254 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1255 : _Compare, _Alloc>::iterator
1256 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1257 : _M_lower_bound(_Link_type __x, _Link_type __y,
1258 : const _Key& __k)
1259 : {
1260 0 : while (__x != 0)
1261 0 : if (!_M_impl._M_key_compare(_S_key(__x), __k))
1262 0 : __y = __x, __x = _S_left(__x);
1263 : else
1264 0 : __x = _S_right(__x);
1265 0 : return iterator(__y);
1266 : }
1267 :
1268 : template<typename _Key, typename _Val, typename _KeyOfValue,
1269 : typename _Compare, typename _Alloc>
1270 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1271 : _Compare, _Alloc>::const_iterator
1272 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1273 : _M_lower_bound(_Const_Link_type __x, _Const_Link_type __y,
1274 : const _Key& __k) const
1275 : {
1276 0 : while (__x != 0)
1277 0 : if (!_M_impl._M_key_compare(_S_key(__x), __k))
1278 0 : __y = __x, __x = _S_left(__x);
1279 : else
1280 0 : __x = _S_right(__x);
1281 0 : return const_iterator(__y);
1282 : }
1283 :
1284 : template<typename _Key, typename _Val, typename _KeyOfValue,
1285 : typename _Compare, typename _Alloc>
1286 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1287 : _Compare, _Alloc>::iterator
1288 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1289 : _M_upper_bound(_Link_type __x, _Link_type __y,
1290 : const _Key& __k)
1291 : {
1292 : while (__x != 0)
1293 : if (_M_impl._M_key_compare(__k, _S_key(__x)))
1294 : __y = __x, __x = _S_left(__x);
1295 : else
1296 : __x = _S_right(__x);
1297 : return iterator(__y);
1298 : }
1299 :
1300 : template<typename _Key, typename _Val, typename _KeyOfValue,
1301 : typename _Compare, typename _Alloc>
1302 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1303 : _Compare, _Alloc>::const_iterator
1304 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1305 : _M_upper_bound(_Const_Link_type __x, _Const_Link_type __y,
1306 : const _Key& __k) const
1307 : {
1308 : while (__x != 0)
1309 : if (_M_impl._M_key_compare(__k, _S_key(__x)))
1310 : __y = __x, __x = _S_left(__x);
1311 : else
1312 : __x = _S_right(__x);
1313 : return const_iterator(__y);
1314 : }
1315 :
1316 : template<typename _Key, typename _Val, typename _KeyOfValue,
1317 : typename _Compare, typename _Alloc>
1318 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1319 : _Compare, _Alloc>::iterator,
1320 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1321 : _Compare, _Alloc>::iterator>
1322 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1323 : equal_range(const _Key& __k)
1324 : {
1325 : _Link_type __x = _M_begin();
1326 : _Link_type __y = _M_end();
1327 : while (__x != 0)
1328 : {
1329 : if (_M_impl._M_key_compare(_S_key(__x), __k))
1330 : __x = _S_right(__x);
1331 : else if (_M_impl._M_key_compare(__k, _S_key(__x)))
1332 : __y = __x, __x = _S_left(__x);
1333 : else
1334 : {
1335 : _Link_type __xu(__x), __yu(__y);
1336 : __y = __x, __x = _S_left(__x);
1337 : __xu = _S_right(__xu);
1338 : return pair<iterator,
1339 : iterator>(_M_lower_bound(__x, __y, __k),
1340 : _M_upper_bound(__xu, __yu, __k));
1341 : }
1342 : }
1343 : return pair<iterator, iterator>(iterator(__y),
1344 : iterator(__y));
1345 : }
1346 :
1347 : template<typename _Key, typename _Val, typename _KeyOfValue,
1348 : typename _Compare, typename _Alloc>
1349 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1350 : _Compare, _Alloc>::const_iterator,
1351 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1352 : _Compare, _Alloc>::const_iterator>
1353 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1354 : equal_range(const _Key& __k) const
1355 : {
1356 : _Const_Link_type __x = _M_begin();
1357 : _Const_Link_type __y = _M_end();
1358 : while (__x != 0)
1359 : {
1360 : if (_M_impl._M_key_compare(_S_key(__x), __k))
1361 : __x = _S_right(__x);
1362 : else if (_M_impl._M_key_compare(__k, _S_key(__x)))
1363 : __y = __x, __x = _S_left(__x);
1364 : else
1365 : {
1366 : _Const_Link_type __xu(__x), __yu(__y);
1367 : __y = __x, __x = _S_left(__x);
1368 : __xu = _S_right(__xu);
1369 : return pair<const_iterator,
1370 : const_iterator>(_M_lower_bound(__x, __y, __k),
1371 : _M_upper_bound(__xu, __yu, __k));
1372 : }
1373 : }
1374 : return pair<const_iterator, const_iterator>(const_iterator(__y),
1375 : const_iterator(__y));
1376 : }
1377 :
1378 : template<typename _Key, typename _Val, typename _KeyOfValue,
1379 : typename _Compare, typename _Alloc>
1380 : void
1381 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1382 : swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __t)
1383 : #if __cplusplus >= 201103L
1384 : noexcept(_Alloc_traits::_S_nothrow_swap())
1385 : #endif
1386 : {
1387 : if (_M_root() == 0)
1388 : {
1389 : if (__t._M_root() != 0)
1390 : {
1391 : _M_root() = __t._M_root();
1392 : _M_leftmost() = __t._M_leftmost();
1393 : _M_rightmost() = __t._M_rightmost();
1394 : _M_root()->_M_parent = _M_end();
1395 :
1396 : __t._M_root() = 0;
1397 : __t._M_leftmost() = __t._M_end();
1398 : __t._M_rightmost() = __t._M_end();
1399 : }
1400 : }
1401 : else if (__t._M_root() == 0)
1402 : {
1403 : __t._M_root() = _M_root();
1404 : __t._M_leftmost() = _M_leftmost();
1405 : __t._M_rightmost() = _M_rightmost();
1406 : __t._M_root()->_M_parent = __t._M_end();
1407 :
1408 : _M_root() = 0;
1409 : _M_leftmost() = _M_end();
1410 : _M_rightmost() = _M_end();
1411 : }
1412 : else
1413 : {
1414 : std::swap(_M_root(),__t._M_root());
1415 : std::swap(_M_leftmost(),__t._M_leftmost());
1416 : std::swap(_M_rightmost(),__t._M_rightmost());
1417 :
1418 : _M_root()->_M_parent = _M_end();
1419 : __t._M_root()->_M_parent = __t._M_end();
1420 : }
1421 : // No need to swap header's color as it does not change.
1422 : std::swap(this->_M_impl._M_node_count, __t._M_impl._M_node_count);
1423 : std::swap(this->_M_impl._M_key_compare, __t._M_impl._M_key_compare);
1424 :
1425 : _Alloc_traits::_S_on_swap(_M_get_Node_allocator(),
1426 : __t._M_get_Node_allocator());
1427 : }
1428 :
1429 : template<typename _Key, typename _Val, typename _KeyOfValue,
1430 : typename _Compare, typename _Alloc>
1431 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1432 : _Compare, _Alloc>::_Base_ptr,
1433 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1434 : _Compare, _Alloc>::_Base_ptr>
1435 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1436 : _M_get_insert_unique_pos(const key_type& __k)
1437 : {
1438 : typedef pair<_Base_ptr, _Base_ptr> _Res;
1439 0 : _Link_type __x = _M_begin();
1440 0 : _Link_type __y = _M_end();
1441 0 : bool __comp = true;
1442 0 : while (__x != 0)
1443 : {
1444 0 : __y = __x;
1445 0 : __comp = _M_impl._M_key_compare(__k, _S_key(__x));
1446 0 : __x = __comp ? _S_left(__x) : _S_right(__x);
1447 : }
1448 0 : iterator __j = iterator(__y);
1449 0 : if (__comp)
1450 : {
1451 0 : if (__j == begin())
1452 0 : return _Res(__x, __y);
1453 : else
1454 0 : --__j;
1455 : }
1456 0 : if (_M_impl._M_key_compare(_S_key(__j._M_node), __k))
1457 0 : return _Res(__x, __y);
1458 0 : return _Res(__j._M_node, 0);
1459 : }
1460 :
1461 : template<typename _Key, typename _Val, typename _KeyOfValue,
1462 : typename _Compare, typename _Alloc>
1463 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1464 : _Compare, _Alloc>::_Base_ptr,
1465 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1466 : _Compare, _Alloc>::_Base_ptr>
1467 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1468 : _M_get_insert_equal_pos(const key_type& __k)
1469 : {
1470 : typedef pair<_Base_ptr, _Base_ptr> _Res;
1471 : _Link_type __x = _M_begin();
1472 : _Link_type __y = _M_end();
1473 : while (__x != 0)
1474 : {
1475 : __y = __x;
1476 : __x = _M_impl._M_key_compare(__k, _S_key(__x)) ?
1477 : _S_left(__x) : _S_right(__x);
1478 : }
1479 : return _Res(__x, __y);
1480 : }
1481 :
1482 : template<typename _Key, typename _Val, typename _KeyOfValue,
1483 : typename _Compare, typename _Alloc>
1484 : #if __cplusplus >= 201103L
1485 : template<typename _Arg>
1486 : #endif
1487 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1488 : _Compare, _Alloc>::iterator, bool>
1489 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1490 : #if __cplusplus >= 201103L
1491 : _M_insert_unique(_Arg&& __v)
1492 : #else
1493 : _M_insert_unique(const _Val& __v)
1494 : #endif
1495 : {
1496 : typedef pair<iterator, bool> _Res;
1497 : pair<_Base_ptr, _Base_ptr> __res
1498 : = _M_get_insert_unique_pos(_KeyOfValue()(__v));
1499 :
1500 : if (__res.second)
1501 : return _Res(_M_insert_(__res.first, __res.second,
1502 : _GLIBCXX_FORWARD(_Arg, __v)),
1503 : true);
1504 :
1505 : return _Res(iterator(static_cast<_Link_type>(__res.first)), false);
1506 : }
1507 :
1508 : template<typename _Key, typename _Val, typename _KeyOfValue,
1509 : typename _Compare, typename _Alloc>
1510 : #if __cplusplus >= 201103L
1511 : template<typename _Arg>
1512 : #endif
1513 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1514 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1515 : #if __cplusplus >= 201103L
1516 : _M_insert_equal(_Arg&& __v)
1517 : #else
1518 : _M_insert_equal(const _Val& __v)
1519 : #endif
1520 : {
1521 : pair<_Base_ptr, _Base_ptr> __res
1522 : = _M_get_insert_equal_pos(_KeyOfValue()(__v));
1523 : return _M_insert_(__res.first, __res.second, _GLIBCXX_FORWARD(_Arg, __v));
1524 : }
1525 :
1526 : template<typename _Key, typename _Val, typename _KeyOfValue,
1527 : typename _Compare, typename _Alloc>
1528 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1529 : _Compare, _Alloc>::_Base_ptr,
1530 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1531 : _Compare, _Alloc>::_Base_ptr>
1532 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1533 : _M_get_insert_hint_unique_pos(const_iterator __position,
1534 : const key_type& __k)
1535 : {
1536 0 : iterator __pos = __position._M_const_cast();
1537 : typedef pair<_Base_ptr, _Base_ptr> _Res;
1538 :
1539 : // end()
1540 0 : if (__pos._M_node == _M_end())
1541 : {
1542 0 : if (size() > 0
1543 0 : && _M_impl._M_key_compare(_S_key(_M_rightmost()), __k))
1544 0 : return _Res(0, _M_rightmost());
1545 : else
1546 0 : return _M_get_insert_unique_pos(__k);
1547 : }
1548 0 : else if (_M_impl._M_key_compare(__k, _S_key(__pos._M_node)))
1549 : {
1550 : // First, try before...
1551 0 : iterator __before = __pos;
1552 0 : if (__pos._M_node == _M_leftmost()) // begin()
1553 0 : return _Res(_M_leftmost(), _M_leftmost());
1554 0 : else if (_M_impl._M_key_compare(_S_key((--__before)._M_node), __k))
1555 : {
1556 0 : if (_S_right(__before._M_node) == 0)
1557 0 : return _Res(0, __before._M_node);
1558 : else
1559 0 : return _Res(__pos._M_node, __pos._M_node);
1560 : }
1561 : else
1562 0 : return _M_get_insert_unique_pos(__k);
1563 : }
1564 0 : else if (_M_impl._M_key_compare(_S_key(__pos._M_node), __k))
1565 : {
1566 : // ... then try after.
1567 0 : iterator __after = __pos;
1568 0 : if (__pos._M_node == _M_rightmost())
1569 0 : return _Res(0, _M_rightmost());
1570 0 : else if (_M_impl._M_key_compare(__k, _S_key((++__after)._M_node)))
1571 : {
1572 0 : if (_S_right(__pos._M_node) == 0)
1573 0 : return _Res(0, __pos._M_node);
1574 : else
1575 0 : return _Res(__after._M_node, __after._M_node);
1576 : }
1577 : else
1578 0 : return _M_get_insert_unique_pos(__k);
1579 : }
1580 : else
1581 : // Equivalent keys.
1582 0 : return _Res(__pos._M_node, 0);
1583 : }
1584 :
1585 : template<typename _Key, typename _Val, typename _KeyOfValue,
1586 : typename _Compare, typename _Alloc>
1587 : #if __cplusplus >= 201103L
1588 : template<typename _Arg>
1589 : #endif
1590 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1591 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1592 : #if __cplusplus >= 201103L
1593 : _M_insert_unique_(const_iterator __position, _Arg&& __v)
1594 : #else
1595 : _M_insert_unique_(const_iterator __position, const _Val& __v)
1596 : #endif
1597 : {
1598 : pair<_Base_ptr, _Base_ptr> __res
1599 : = _M_get_insert_hint_unique_pos(__position, _KeyOfValue()(__v));
1600 :
1601 : if (__res.second)
1602 : return _M_insert_(__res.first, __res.second,
1603 : _GLIBCXX_FORWARD(_Arg, __v));
1604 : return iterator(static_cast<_Link_type>(__res.first));
1605 : }
1606 :
1607 : template<typename _Key, typename _Val, typename _KeyOfValue,
1608 : typename _Compare, typename _Alloc>
1609 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1610 : _Compare, _Alloc>::_Base_ptr,
1611 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1612 : _Compare, _Alloc>::_Base_ptr>
1613 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1614 : _M_get_insert_hint_equal_pos(const_iterator __position, const key_type& __k)
1615 : {
1616 : iterator __pos = __position._M_const_cast();
1617 : typedef pair<_Base_ptr, _Base_ptr> _Res;
1618 :
1619 : // end()
1620 : if (__pos._M_node == _M_end())
1621 : {
1622 : if (size() > 0
1623 : && !_M_impl._M_key_compare(__k, _S_key(_M_rightmost())))
1624 : return _Res(0, _M_rightmost());
1625 : else
1626 : return _M_get_insert_equal_pos(__k);
1627 : }
1628 : else if (!_M_impl._M_key_compare(_S_key(__pos._M_node), __k))
1629 : {
1630 : // First, try before...
1631 : iterator __before = __pos;
1632 : if (__pos._M_node == _M_leftmost()) // begin()
1633 : return _Res(_M_leftmost(), _M_leftmost());
1634 : else if (!_M_impl._M_key_compare(__k, _S_key((--__before)._M_node)))
1635 : {
1636 : if (_S_right(__before._M_node) == 0)
1637 : return _Res(0, __before._M_node);
1638 : else
1639 : return _Res(__pos._M_node, __pos._M_node);
1640 : }
1641 : else
1642 : return _M_get_insert_equal_pos(__k);
1643 : }
1644 : else
1645 : {
1646 : // ... then try after.
1647 : iterator __after = __pos;
1648 : if (__pos._M_node == _M_rightmost())
1649 : return _Res(0, _M_rightmost());
1650 : else if (!_M_impl._M_key_compare(_S_key((++__after)._M_node), __k))
1651 : {
1652 : if (_S_right(__pos._M_node) == 0)
1653 : return _Res(0, __pos._M_node);
1654 : else
1655 : return _Res(__after._M_node, __after._M_node);
1656 : }
1657 : else
1658 : return _Res(0, 0);
1659 : }
1660 : }
1661 :
1662 : template<typename _Key, typename _Val, typename _KeyOfValue,
1663 : typename _Compare, typename _Alloc>
1664 : #if __cplusplus >= 201103L
1665 : template<typename _Arg>
1666 : #endif
1667 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1668 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1669 : #if __cplusplus >= 201103L
1670 : _M_insert_equal_(const_iterator __position, _Arg&& __v)
1671 : #else
1672 : _M_insert_equal_(const_iterator __position, const _Val& __v)
1673 : #endif
1674 : {
1675 : pair<_Base_ptr, _Base_ptr> __res
1676 : = _M_get_insert_hint_equal_pos(__position, _KeyOfValue()(__v));
1677 :
1678 : if (__res.second)
1679 : return _M_insert_(__res.first, __res.second,
1680 : _GLIBCXX_FORWARD(_Arg, __v));
1681 :
1682 : return _M_insert_equal_lower(_GLIBCXX_FORWARD(_Arg, __v));
1683 : }
1684 :
1685 : #if __cplusplus >= 201103L
1686 : template<typename _Key, typename _Val, typename _KeyOfValue,
1687 : typename _Compare, typename _Alloc>
1688 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1689 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1690 : _M_insert_node(_Base_ptr __x, _Base_ptr __p, _Link_type __z)
1691 : {
1692 0 : bool __insert_left = (__x != 0 || __p == _M_end()
1693 0 : || _M_impl._M_key_compare(_S_key(__z),
1694 0 : _S_key(__p)));
1695 :
1696 0 : _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1697 0 : this->_M_impl._M_header);
1698 0 : ++_M_impl._M_node_count;
1699 0 : return iterator(__z);
1700 : }
1701 :
1702 : template<typename _Key, typename _Val, typename _KeyOfValue,
1703 : typename _Compare, typename _Alloc>
1704 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1705 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1706 : _M_insert_lower_node(_Base_ptr __p, _Link_type __z)
1707 : {
1708 : bool __insert_left = (__p == _M_end()
1709 : || !_M_impl._M_key_compare(_S_key(__p),
1710 : _S_key(__z)));
1711 :
1712 : _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1713 : this->_M_impl._M_header);
1714 : ++_M_impl._M_node_count;
1715 : return iterator(__z);
1716 : }
1717 :
1718 : template<typename _Key, typename _Val, typename _KeyOfValue,
1719 : typename _Compare, typename _Alloc>
1720 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1721 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1722 : _M_insert_equal_lower_node(_Link_type __z)
1723 : {
1724 : _Link_type __x = _M_begin();
1725 : _Link_type __y = _M_end();
1726 : while (__x != 0)
1727 : {
1728 : __y = __x;
1729 : __x = !_M_impl._M_key_compare(_S_key(__x), _S_key(__z)) ?
1730 : _S_left(__x) : _S_right(__x);
1731 : }
1732 : return _M_insert_lower_node(__y, __z);
1733 : }
1734 :
1735 : template<typename _Key, typename _Val, typename _KeyOfValue,
1736 : typename _Compare, typename _Alloc>
1737 : template<typename... _Args>
1738 : pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1739 : _Compare, _Alloc>::iterator, bool>
1740 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1741 : _M_emplace_unique(_Args&&... __args)
1742 : {
1743 : _Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1744 :
1745 : __try
1746 : {
1747 : typedef pair<iterator, bool> _Res;
1748 : auto __res = _M_get_insert_unique_pos(_S_key(__z));
1749 : if (__res.second)
1750 : return _Res(_M_insert_node(__res.first, __res.second, __z), true);
1751 :
1752 : _M_destroy_node(__z);
1753 : return _Res(iterator(static_cast<_Link_type>(__res.first)), false);
1754 : }
1755 : __catch(...)
1756 : {
1757 : _M_destroy_node(__z);
1758 : __throw_exception_again;
1759 : }
1760 : }
1761 :
1762 : template<typename _Key, typename _Val, typename _KeyOfValue,
1763 : typename _Compare, typename _Alloc>
1764 : template<typename... _Args>
1765 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1766 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1767 : _M_emplace_equal(_Args&&... __args)
1768 : {
1769 : _Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1770 :
1771 : __try
1772 : {
1773 : auto __res = _M_get_insert_equal_pos(_S_key(__z));
1774 : return _M_insert_node(__res.first, __res.second, __z);
1775 : }
1776 : __catch(...)
1777 : {
1778 : _M_destroy_node(__z);
1779 : __throw_exception_again;
1780 : }
1781 : }
1782 :
1783 : template<typename _Key, typename _Val, typename _KeyOfValue,
1784 : typename _Compare, typename _Alloc>
1785 : template<typename... _Args>
1786 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1787 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1788 : _M_emplace_hint_unique(const_iterator __pos, _Args&&... __args)
1789 : {
1790 0 : _Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1791 :
1792 : __try
1793 : {
1794 0 : auto __res = _M_get_insert_hint_unique_pos(__pos, _S_key(__z));
1795 :
1796 0 : if (__res.second)
1797 0 : return _M_insert_node(__res.first, __res.second, __z);
1798 :
1799 0 : _M_destroy_node(__z);
1800 0 : return iterator(static_cast<_Link_type>(__res.first));
1801 : }
1802 0 : __catch(...)
1803 : {
1804 0 : _M_destroy_node(__z);
1805 0 : __throw_exception_again;
1806 : }
1807 : }
1808 :
1809 : template<typename _Key, typename _Val, typename _KeyOfValue,
1810 : typename _Compare, typename _Alloc>
1811 : template<typename... _Args>
1812 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1813 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1814 : _M_emplace_hint_equal(const_iterator __pos, _Args&&... __args)
1815 : {
1816 : _Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1817 :
1818 : __try
1819 : {
1820 : auto __res = _M_get_insert_hint_equal_pos(__pos, _S_key(__z));
1821 :
1822 : if (__res.second)
1823 : return _M_insert_node(__res.first, __res.second, __z);
1824 :
1825 : return _M_insert_equal_lower_node(__z);
1826 : }
1827 : __catch(...)
1828 : {
1829 : _M_destroy_node(__z);
1830 : __throw_exception_again;
1831 : }
1832 : }
1833 : #endif
1834 :
1835 : template<typename _Key, typename _Val, typename _KoV,
1836 : typename _Cmp, typename _Alloc>
1837 : template<class _II>
1838 : void
1839 : _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>::
1840 : _M_insert_unique(_II __first, _II __last)
1841 : {
1842 : for (; __first != __last; ++__first)
1843 : _M_insert_unique_(end(), *__first);
1844 : }
1845 :
1846 : template<typename _Key, typename _Val, typename _KoV,
1847 : typename _Cmp, typename _Alloc>
1848 : template<class _II>
1849 : void
1850 : _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>::
1851 : _M_insert_equal(_II __first, _II __last)
1852 : {
1853 : for (; __first != __last; ++__first)
1854 : _M_insert_equal_(end(), *__first);
1855 : }
1856 :
1857 : template<typename _Key, typename _Val, typename _KeyOfValue,
1858 : typename _Compare, typename _Alloc>
1859 : void
1860 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1861 : _M_erase_aux(const_iterator __position)
1862 : {
1863 : _Link_type __y =
1864 : static_cast<_Link_type>(_Rb_tree_rebalance_for_erase
1865 : (const_cast<_Base_ptr>(__position._M_node),
1866 : this->_M_impl._M_header));
1867 : _M_destroy_node(__y);
1868 : --_M_impl._M_node_count;
1869 : }
1870 :
1871 : template<typename _Key, typename _Val, typename _KeyOfValue,
1872 : typename _Compare, typename _Alloc>
1873 : void
1874 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1875 : _M_erase_aux(const_iterator __first, const_iterator __last)
1876 : {
1877 : if (__first == begin() && __last == end())
1878 : clear();
1879 : else
1880 : while (__first != __last)
1881 : erase(__first++);
1882 : }
1883 :
1884 : template<typename _Key, typename _Val, typename _KeyOfValue,
1885 : typename _Compare, typename _Alloc>
1886 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type
1887 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1888 : erase(const _Key& __x)
1889 : {
1890 : pair<iterator, iterator> __p = equal_range(__x);
1891 : const size_type __old_size = size();
1892 : erase(__p.first, __p.second);
1893 : return __old_size - size();
1894 : }
1895 :
1896 : template<typename _Key, typename _Val, typename _KeyOfValue,
1897 : typename _Compare, typename _Alloc>
1898 : void
1899 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1900 : erase(const _Key* __first, const _Key* __last)
1901 : {
1902 : while (__first != __last)
1903 : erase(*__first++);
1904 : }
1905 :
1906 : template<typename _Key, typename _Val, typename _KeyOfValue,
1907 : typename _Compare, typename _Alloc>
1908 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1909 : _Compare, _Alloc>::iterator
1910 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1911 : find(const _Key& __k)
1912 : {
1913 : iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
1914 : return (__j == end()
1915 : || _M_impl._M_key_compare(__k,
1916 : _S_key(__j._M_node))) ? end() : __j;
1917 : }
1918 :
1919 : template<typename _Key, typename _Val, typename _KeyOfValue,
1920 : typename _Compare, typename _Alloc>
1921 : typename _Rb_tree<_Key, _Val, _KeyOfValue,
1922 : _Compare, _Alloc>::const_iterator
1923 0 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1924 : find(const _Key& __k) const
1925 : {
1926 0 : const_iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
1927 0 : return (__j == end()
1928 0 : || _M_impl._M_key_compare(__k,
1929 0 : _S_key(__j._M_node))) ? end() : __j;
1930 : }
1931 :
1932 : template<typename _Key, typename _Val, typename _KeyOfValue,
1933 : typename _Compare, typename _Alloc>
1934 : typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type
1935 : _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1936 : count(const _Key& __k) const
1937 : {
1938 : pair<const_iterator, const_iterator> __p = equal_range(__k);
1939 : const size_type __n = std::distance(__p.first, __p.second);
1940 : return __n;
1941 : }
1942 :
1943 : _GLIBCXX_PURE unsigned int
1944 : _Rb_tree_black_count(const _Rb_tree_node_base* __node,
1945 : const _Rb_tree_node_base* __root) throw ();
1946 :
1947 : template<typename _Key, typename _Val, typename _KeyOfValue,
1948 : typename _Compare, typename _Alloc>
1949 : bool
1950 : _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const
1951 : {
1952 : if (_M_impl._M_node_count == 0 || begin() == end())
1953 : return _M_impl._M_node_count == 0 && begin() == end()
1954 : && this->_M_impl._M_header._M_left == _M_end()
1955 : && this->_M_impl._M_header._M_right == _M_end();
1956 :
1957 : unsigned int __len = _Rb_tree_black_count(_M_leftmost(), _M_root());
1958 : for (const_iterator __it = begin(); __it != end(); ++__it)
1959 : {
1960 : _Const_Link_type __x = static_cast<_Const_Link_type>(__it._M_node);
1961 : _Const_Link_type __L = _S_left(__x);
1962 : _Const_Link_type __R = _S_right(__x);
1963 :
1964 : if (__x->_M_color == _S_red)
1965 : if ((__L && __L->_M_color == _S_red)
1966 : || (__R && __R->_M_color == _S_red))
1967 : return false;
1968 :
1969 : if (__L && _M_impl._M_key_compare(_S_key(__x), _S_key(__L)))
1970 : return false;
1971 : if (__R && _M_impl._M_key_compare(_S_key(__R), _S_key(__x)))
1972 : return false;
1973 :
1974 : if (!__L && !__R && _Rb_tree_black_count(__x, _M_root()) != __len)
1975 : return false;
1976 : }
1977 :
1978 : if (_M_leftmost() != _Rb_tree_node_base::_S_minimum(_M_root()))
1979 : return false;
1980 : if (_M_rightmost() != _Rb_tree_node_base::_S_maximum(_M_root()))
1981 : return false;
1982 : return true;
1983 : }
1984 :
1985 : _GLIBCXX_END_NAMESPACE_VERSION
1986 : } // namespace
1987 :
1988 : #endif
|