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