OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [include/] [bits/] [stl_tree.h] - Blame information for rev 866

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
// 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
 
68
namespace 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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.