OSDN Git Service

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