Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5134 serge 1
// List implementation -*- C++ -*-
2
 
3
// Copyright (C) 2001-2013 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// .
24
 
25
/*
26
 *
27
 * Copyright (c) 1994
28
 * Hewlett-Packard Company
29
 *
30
 * Permission to use, copy, modify, distribute and sell this software
31
 * and its documentation for any purpose is hereby granted without fee,
32
 * provided that the above copyright notice appear in all copies and
33
 * that both that copyright notice and this permission notice appear
34
 * in supporting documentation.  Hewlett-Packard Company makes no
35
 * representations about the suitability of this software for any
36
 * purpose.  It is provided "as is" without express or implied warranty.
37
 *
38
 *
39
 * Copyright (c) 1996,1997
40
 * Silicon Graphics Computer Systems, Inc.
41
 *
42
 * Permission to use, copy, modify, distribute and sell this software
43
 * and its documentation for any purpose is hereby granted without fee,
44
 * provided that the above copyright notice appear in all copies and
45
 * that both that copyright notice and this permission notice appear
46
 * in supporting documentation.  Silicon Graphics makes no
47
 * representations about the suitability of this software for any
48
 * purpose.  It is provided "as is" without express or implied warranty.
49
 */
50
 
51
/** @file bits/stl_list.h
52
 *  This is an internal header file, included by other library headers.
53
 *  Do not attempt to use it directly. @headername{list}
54
 */
55
 
56
#ifndef _STL_LIST_H
57
#define _STL_LIST_H 1
58
 
59
#include 
60
#if __cplusplus >= 201103L
61
#include 
62
#endif
63
 
64
namespace std _GLIBCXX_VISIBILITY(default)
65
{
66
  namespace __detail
67
  {
68
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
69
 
70
    // Supporting structures are split into common and templated
71
    // types; the latter publicly inherits from the former in an
72
    // effort to reduce code duplication.  This results in some
73
    // "needless" static_cast'ing later on, but it's all safe
74
    // downcasting.
75
 
76
    /// Common part of a node in the %list.
77
    struct _List_node_base
78
    {
79
      _List_node_base* _M_next;
80
      _List_node_base* _M_prev;
81
 
82
      static void
83
      swap(_List_node_base& __x, _List_node_base& __y) _GLIBCXX_USE_NOEXCEPT;
84
 
85
      void
86
      _M_transfer(_List_node_base* const __first,
87
		  _List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT;
88
 
89
      void
90
      _M_reverse() _GLIBCXX_USE_NOEXCEPT;
91
 
92
      void
93
      _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT;
94
 
95
      void
96
      _M_unhook() _GLIBCXX_USE_NOEXCEPT;
97
    };
98
 
99
  _GLIBCXX_END_NAMESPACE_VERSION
100
  } // namespace detail
101
 
102
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
103
 
104
  /// An actual node in the %list.
105
  template
106
    struct _List_node : public __detail::_List_node_base
107
    {
108
      ///< User's data.
109
      _Tp _M_data;
110
 
111
#if __cplusplus >= 201103L
112
      template
113
        _List_node(_Args&&... __args)
114
	: __detail::_List_node_base(), _M_data(std::forward<_Args>(__args)...)
115
        { }
116
#endif
117
    };
118
 
119
  /**
120
   *  @brief A list::iterator.
121
   *
122
   *  All the functions are op overloads.
123
  */
124
  template
125
    struct _List_iterator
126
    {
127
      typedef _List_iterator<_Tp>                _Self;
128
      typedef _List_node<_Tp>                    _Node;
129
 
130
      typedef ptrdiff_t                          difference_type;
131
      typedef std::bidirectional_iterator_tag    iterator_category;
132
      typedef _Tp                                value_type;
133
      typedef _Tp*                               pointer;
134
      typedef _Tp&                               reference;
135
 
136
      _List_iterator()
137
      : _M_node() { }
138
 
139
      explicit
140
      _List_iterator(__detail::_List_node_base* __x)
141
      : _M_node(__x) { }
142
 
143
      // Must downcast from _List_node_base to _List_node to get to _M_data.
144
      reference
145
      operator*() const
146
      { return static_cast<_Node*>(_M_node)->_M_data; }
147
 
148
      pointer
149
      operator->() const
150
      { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
151
 
152
      _Self&
153
      operator++()
154
      {
155
	_M_node = _M_node->_M_next;
156
	return *this;
157
      }
158
 
159
      _Self
160
      operator++(int)
161
      {
162
	_Self __tmp = *this;
163
	_M_node = _M_node->_M_next;
164
	return __tmp;
165
      }
166
 
167
      _Self&
168
      operator--()
169
      {
170
	_M_node = _M_node->_M_prev;
171
	return *this;
172
      }
173
 
174
      _Self
175
      operator--(int)
176
      {
177
	_Self __tmp = *this;
178
	_M_node = _M_node->_M_prev;
179
	return __tmp;
180
      }
181
 
182
      bool
183
      operator==(const _Self& __x) const
184
      { return _M_node == __x._M_node; }
185
 
186
      bool
187
      operator!=(const _Self& __x) const
188
      { return _M_node != __x._M_node; }
189
 
190
      // The only member points to the %list element.
191
      __detail::_List_node_base* _M_node;
192
    };
193
 
194
  /**
195
   *  @brief A list::const_iterator.
196
   *
197
   *  All the functions are op overloads.
198
  */
199
  template
200
    struct _List_const_iterator
201
    {
202
      typedef _List_const_iterator<_Tp>          _Self;
203
      typedef const _List_node<_Tp>              _Node;
204
      typedef _List_iterator<_Tp>                iterator;
205
 
206
      typedef ptrdiff_t                          difference_type;
207
      typedef std::bidirectional_iterator_tag    iterator_category;
208
      typedef _Tp                                value_type;
209
      typedef const _Tp*                         pointer;
210
      typedef const _Tp&                         reference;
211
 
212
      _List_const_iterator()
213
      : _M_node() { }
214
 
215
      explicit
216
      _List_const_iterator(const __detail::_List_node_base* __x)
217
      : _M_node(__x) { }
218
 
219
      _List_const_iterator(const iterator& __x)
220
      : _M_node(__x._M_node) { }
221
 
222
      // Must downcast from List_node_base to _List_node to get to
223
      // _M_data.
224
      reference
225
      operator*() const
226
      { return static_cast<_Node*>(_M_node)->_M_data; }
227
 
228
      pointer
229
      operator->() const
230
      { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
231
 
232
      _Self&
233
      operator++()
234
      {
235
	_M_node = _M_node->_M_next;
236
	return *this;
237
      }
238
 
239
      _Self
240
      operator++(int)
241
      {
242
	_Self __tmp = *this;
243
	_M_node = _M_node->_M_next;
244
	return __tmp;
245
      }
246
 
247
      _Self&
248
      operator--()
249
      {
250
	_M_node = _M_node->_M_prev;
251
	return *this;
252
      }
253
 
254
      _Self
255
      operator--(int)
256
      {
257
	_Self __tmp = *this;
258
	_M_node = _M_node->_M_prev;
259
	return __tmp;
260
      }
261
 
262
      bool
263
      operator==(const _Self& __x) const
264
      { return _M_node == __x._M_node; }
265
 
266
      bool
267
      operator!=(const _Self& __x) const
268
      { return _M_node != __x._M_node; }
269
 
270
      // The only member points to the %list element.
271
      const __detail::_List_node_base* _M_node;
272
    };
273
 
274
  template
275
    inline bool
276
    operator==(const _List_iterator<_Val>& __x,
277
	       const _List_const_iterator<_Val>& __y)
278
    { return __x._M_node == __y._M_node; }
279
 
280
  template
281
    inline bool
282
    operator!=(const _List_iterator<_Val>& __x,
283
               const _List_const_iterator<_Val>& __y)
284
    { return __x._M_node != __y._M_node; }
285
 
286
 
287
  /// See bits/stl_deque.h's _Deque_base for an explanation.
288
  template
289
    class _List_base
290
    {
291
    protected:
292
      // NOTA BENE
293
      // The stored instance is not actually of "allocator_type"'s
294
      // type.  Instead we rebind the type to
295
      // Allocator>, which according to [20.1.5]/4
296
      // should probably be the same.  List_node is not the same
297
      // size as Tp (it's two pointers larger), and specializations on
298
      // Tp may go unused because List_node is being bound
299
      // instead.
300
      //
301
      // We put this to the test in the constructors and in
302
      // get_allocator, where we use conversions between
303
      // allocator_type and _Node_alloc_type. The conversion is
304
      // required by table 32 in [20.1.5].
305
      typedef typename _Alloc::template rebind<_List_node<_Tp> >::other
306
        _Node_alloc_type;
307
 
308
      typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
309
 
310
      struct _List_impl
311
      : public _Node_alloc_type
312
      {
313
	__detail::_List_node_base _M_node;
314
 
315
	_List_impl()
316
	: _Node_alloc_type(), _M_node()
317
	{ }
318
 
319
	_List_impl(const _Node_alloc_type& __a)
320
	: _Node_alloc_type(__a), _M_node()
321
	{ }
322
 
323
#if __cplusplus >= 201103L
324
	_List_impl(_Node_alloc_type&& __a)
325
	: _Node_alloc_type(std::move(__a)), _M_node()
326
	{ }
327
#endif
328
      };
329
 
330
      _List_impl _M_impl;
331
 
332
      _List_node<_Tp>*
333
      _M_get_node()
334
      { return _M_impl._Node_alloc_type::allocate(1); }
335
 
336
      void
337
      _M_put_node(_List_node<_Tp>* __p)
338
      { _M_impl._Node_alloc_type::deallocate(__p, 1); }
339
 
340
  public:
341
      typedef _Alloc allocator_type;
342
 
343
      _Node_alloc_type&
344
      _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
345
      { return *static_cast<_Node_alloc_type*>(&_M_impl); }
346
 
347
      const _Node_alloc_type&
348
      _M_get_Node_allocator() const _GLIBCXX_NOEXCEPT
349
      { return *static_cast(&_M_impl); }
350
 
351
      _Tp_alloc_type
352
      _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
353
      { return _Tp_alloc_type(_M_get_Node_allocator()); }
354
 
355
      allocator_type
356
      get_allocator() const _GLIBCXX_NOEXCEPT
357
      { return allocator_type(_M_get_Node_allocator()); }
358
 
359
      _List_base()
360
      : _M_impl()
361
      { _M_init(); }
362
 
363
      _List_base(const _Node_alloc_type& __a)
364
      : _M_impl(__a)
365
      { _M_init(); }
366
 
367
#if __cplusplus >= 201103L
368
      _List_base(_List_base&& __x)
369
      : _M_impl(std::move(__x._M_get_Node_allocator()))
370
      {
371
	_M_init();
372
	__detail::_List_node_base::swap(_M_impl._M_node, __x._M_impl._M_node);
373
      }
374
#endif
375
 
376
      // This is what actually destroys the list.
377
      ~_List_base() _GLIBCXX_NOEXCEPT
378
      { _M_clear(); }
379
 
380
      void
381
      _M_clear();
382
 
383
      void
384
      _M_init()
385
      {
386
        this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
387
        this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
388
      }
389
    };
390
 
391
  /**
392
   *  @brief A standard container with linear time access to elements,
393
   *  and fixed time insertion/deletion at any point in the sequence.
394
   *
395
   *  @ingroup sequences
396
   *
397
   *  @tparam _Tp  Type of element.
398
   *  @tparam _Alloc  Allocator type, defaults to allocator<_Tp>.
399
   *
400
   *  Meets the requirements of a container, a
401
   *  reversible container, and a
402
   *  sequence, including the
403
   *  optional sequence requirements with the
404
   *  %exception of @c at and @c operator[].
405
   *
406
   *  This is a @e doubly @e linked %list.  Traversal up and down the
407
   *  %list requires linear time, but adding and removing elements (or
408
   *  @e nodes) is done in constant time, regardless of where the
409
   *  change takes place.  Unlike std::vector and std::deque,
410
   *  random-access iterators are not provided, so subscripting ( @c
411
   *  [] ) access is not allowed.  For algorithms which only need
412
   *  sequential access, this lack makes no difference.
413
   *
414
   *  Also unlike the other standard containers, std::list provides
415
   *  specialized algorithms %unique to linked lists, such as
416
   *  splicing, sorting, and in-place reversal.
417
   *
418
   *  A couple points on memory allocation for list:
419
   *
420
   *  First, we never actually allocate a Tp, we allocate
421
   *  List_node's and trust [20.1.5]/4 to DTRT.  This is to ensure
422
   *  that after elements from %list are spliced into
423
   *  %list, destroying the memory of the second %list is a
424
   *  valid operation, i.e., Alloc1 giveth and Alloc2 taketh away.
425
   *
426
   *  Second, a %list conceptually represented as
427
   *  @code
428
   *    A <---> B <---> C <---> D
429
   *  @endcode
430
   *  is actually circular; a link exists between A and D.  The %list
431
   *  class holds (as its only data member) a private list::iterator
432
   *  pointing to @e D, not to @e A!  To get to the head of the %list,
433
   *  we start at the tail and move forward by one.  When this member
434
   *  iterator's next/previous pointers refer to itself, the %list is
435
   *  %empty.
436
  */
437
  template >
438
    class list : protected _List_base<_Tp, _Alloc>
439
    {
440
      // concept requirements
441
      typedef typename _Alloc::value_type                _Alloc_value_type;
442
      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
443
      __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
444
 
445
      typedef _List_base<_Tp, _Alloc>                    _Base;
446
      typedef typename _Base::_Tp_alloc_type		 _Tp_alloc_type;
447
      typedef typename _Base::_Node_alloc_type		 _Node_alloc_type;
448
 
449
    public:
450
      typedef _Tp                                        value_type;
451
      typedef typename _Tp_alloc_type::pointer           pointer;
452
      typedef typename _Tp_alloc_type::const_pointer     const_pointer;
453
      typedef typename _Tp_alloc_type::reference         reference;
454
      typedef typename _Tp_alloc_type::const_reference   const_reference;
455
      typedef _List_iterator<_Tp>                        iterator;
456
      typedef _List_const_iterator<_Tp>                  const_iterator;
457
      typedef std::reverse_iterator      const_reverse_iterator;
458
      typedef std::reverse_iterator            reverse_iterator;
459
      typedef size_t                                     size_type;
460
      typedef ptrdiff_t                                  difference_type;
461
      typedef _Alloc                                     allocator_type;
462
 
463
    protected:
464
      // Note that pointers-to-_Node's can be ctor-converted to
465
      // iterator types.
466
      typedef _List_node<_Tp>				 _Node;
467
 
468
      using _Base::_M_impl;
469
      using _Base::_M_put_node;
470
      using _Base::_M_get_node;
471
      using _Base::_M_get_Tp_allocator;
472
      using _Base::_M_get_Node_allocator;
473
 
474
      /**
475
       *  @param  __args  An instance of user data.
476
       *
477
       *  Allocates space for a new node and constructs a copy of
478
       *  @a __args in it.
479
       */
480
#if __cplusplus < 201103L
481
      _Node*
482
      _M_create_node(const value_type& __x)
483
      {
484
	_Node* __p = this->_M_get_node();
485
	__try
486
	  {
487
	    _M_get_Tp_allocator().construct
488
	      (std::__addressof(__p->_M_data), __x);
489
	  }
490
	__catch(...)
491
	  {
492
	    _M_put_node(__p);
493
	    __throw_exception_again;
494
	  }
495
	return __p;
496
      }
497
#else
498
      template
499
        _Node*
500
        _M_create_node(_Args&&... __args)
501
	{
502
	  _Node* __p = this->_M_get_node();
503
	  __try
504
	    {
505
	      _M_get_Node_allocator().construct(__p,
506
						std::forward<_Args>(__args)...);
507
	    }
508
	  __catch(...)
509
	    {
510
	      _M_put_node(__p);
511
	      __throw_exception_again;
512
	    }
513
	  return __p;
514
	}
515
#endif
516
 
517
    public:
518
      // [23.2.2.1] construct/copy/destroy
519
      // (assign() and get_allocator() are also listed in this section)
520
      /**
521
       *  @brief  Default constructor creates no elements.
522
       */
523
      list()
524
      : _Base() { }
525
 
526
      /**
527
       *  @brief  Creates a %list with no elements.
528
       *  @param  __a  An allocator object.
529
       */
530
      explicit
531
      list(const allocator_type& __a)
532
      : _Base(_Node_alloc_type(__a)) { }
533
 
534
#if __cplusplus >= 201103L
535
      /**
536
       *  @brief  Creates a %list with default constructed elements.
537
       *  @param  __n  The number of elements to initially create.
538
       *
539
       *  This constructor fills the %list with @a __n default
540
       *  constructed elements.
541
       */
542
      explicit
543
      list(size_type __n)
544
      : _Base()
545
      { _M_default_initialize(__n); }
546
 
547
      /**
548
       *  @brief  Creates a %list with copies of an exemplar element.
549
       *  @param  __n  The number of elements to initially create.
550
       *  @param  __value  An element to copy.
551
       *  @param  __a  An allocator object.
552
       *
553
       *  This constructor fills the %list with @a __n copies of @a __value.
554
       */
555
      list(size_type __n, const value_type& __value,
556
	   const allocator_type& __a = allocator_type())
557
      : _Base(_Node_alloc_type(__a))
558
      { _M_fill_initialize(__n, __value); }
559
#else
560
      /**
561
       *  @brief  Creates a %list with copies of an exemplar element.
562
       *  @param  __n  The number of elements to initially create.
563
       *  @param  __value  An element to copy.
564
       *  @param  __a  An allocator object.
565
       *
566
       *  This constructor fills the %list with @a __n copies of @a __value.
567
       */
568
      explicit
569
      list(size_type __n, const value_type& __value = value_type(),
570
	   const allocator_type& __a = allocator_type())
571
      : _Base(_Node_alloc_type(__a))
572
      { _M_fill_initialize(__n, __value); }
573
#endif
574
 
575
      /**
576
       *  @brief  %List copy constructor.
577
       *  @param  __x  A %list of identical element and allocator types.
578
       *
579
       *  The newly-created %list uses a copy of the allocation object used
580
       *  by @a __x.
581
       */
582
      list(const list& __x)
583
      : _Base(__x._M_get_Node_allocator())
584
      { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
585
 
586
#if __cplusplus >= 201103L
587
      /**
588
       *  @brief  %List move constructor.
589
       *  @param  __x  A %list of identical element and allocator types.
590
       *
591
       *  The newly-created %list contains the exact contents of @a __x.
592
       *  The contents of @a __x are a valid, but unspecified %list.
593
       */
594
      list(list&& __x) noexcept
595
      : _Base(std::move(__x)) { }
596
 
597
      /**
598
       *  @brief  Builds a %list from an initializer_list
599
       *  @param  __l  An initializer_list of value_type.
600
       *  @param  __a  An allocator object.
601
       *
602
       *  Create a %list consisting of copies of the elements in the
603
       *  initializer_list @a __l.  This is linear in __l.size().
604
       */
605
      list(initializer_list __l,
606
           const allocator_type& __a = allocator_type())
607
      : _Base(_Node_alloc_type(__a))
608
      { _M_initialize_dispatch(__l.begin(), __l.end(), __false_type()); }
609
#endif
610
 
611
      /**
612
       *  @brief  Builds a %list from a range.
613
       *  @param  __first  An input iterator.
614
       *  @param  __last  An input iterator.
615
       *  @param  __a  An allocator object.
616
       *
617
       *  Create a %list consisting of copies of the elements from
618
       *  [@a __first,@a __last).  This is linear in N (where N is
619
       *  distance(@a __first,@a __last)).
620
       */
621
#if __cplusplus >= 201103L
622
      template
623
	       typename = std::_RequireInputIter<_InputIterator>>
624
        list(_InputIterator __first, _InputIterator __last,
625
	     const allocator_type& __a = allocator_type())
626
	: _Base(_Node_alloc_type(__a))
627
        { _M_initialize_dispatch(__first, __last, __false_type()); }
628
#else
629
      template
630
        list(_InputIterator __first, _InputIterator __last,
631
	     const allocator_type& __a = allocator_type())
632
	: _Base(_Node_alloc_type(__a))
633
        {
634
	  // Check whether it's an integral type.  If so, it's not an iterator.
635
	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
636
	  _M_initialize_dispatch(__first, __last, _Integral());
637
	}
638
#endif
639
 
640
      /**
641
       *  No explicit dtor needed as the _Base dtor takes care of
642
       *  things.  The _Base dtor only erases the elements, and note
643
       *  that if the elements themselves are pointers, the pointed-to
644
       *  memory is not touched in any way.  Managing the pointer is
645
       *  the user's responsibility.
646
       */
647
 
648
      /**
649
       *  @brief  %List assignment operator.
650
       *  @param  __x  A %list of identical element and allocator types.
651
       *
652
       *  All the elements of @a __x are copied, but unlike the copy
653
       *  constructor, the allocator object is not copied.
654
       */
655
      list&
656
      operator=(const list& __x);
657
 
658
#if __cplusplus >= 201103L
659
      /**
660
       *  @brief  %List move assignment operator.
661
       *  @param  __x  A %list of identical element and allocator types.
662
       *
663
       *  The contents of @a __x are moved into this %list (without copying).
664
       *  @a __x is a valid, but unspecified %list
665
       */
666
      list&
667
      operator=(list&& __x)
668
      {
669
	// NB: DR 1204.
670
	// NB: DR 675.
671
	this->clear();
672
	this->swap(__x);
673
	return *this;
674
      }
675
 
676
      /**
677
       *  @brief  %List initializer list assignment operator.
678
       *  @param  __l  An initializer_list of value_type.
679
       *
680
       *  Replace the contents of the %list with copies of the elements
681
       *  in the initializer_list @a __l.  This is linear in l.size().
682
       */
683
      list&
684
      operator=(initializer_list __l)
685
      {
686
	this->assign(__l.begin(), __l.end());
687
	return *this;
688
      }
689
#endif
690
 
691
      /**
692
       *  @brief  Assigns a given value to a %list.
693
       *  @param  __n  Number of elements to be assigned.
694
       *  @param  __val  Value to be assigned.
695
       *
696
       *  This function fills a %list with @a __n copies of the given
697
       *  value.  Note that the assignment completely changes the %list
698
       *  and that the resulting %list's size is the same as the number
699
       *  of elements assigned.  Old data may be lost.
700
       */
701
      void
702
      assign(size_type __n, const value_type& __val)
703
      { _M_fill_assign(__n, __val); }
704
 
705
      /**
706
       *  @brief  Assigns a range to a %list.
707
       *  @param  __first  An input iterator.
708
       *  @param  __last   An input iterator.
709
       *
710
       *  This function fills a %list with copies of the elements in the
711
       *  range [@a __first,@a __last).
712
       *
713
       *  Note that the assignment completely changes the %list and
714
       *  that the resulting %list's size is the same as the number of
715
       *  elements assigned.  Old data may be lost.
716
       */
717
#if __cplusplus >= 201103L
718
      template
719
	       typename = std::_RequireInputIter<_InputIterator>>
720
        void
721
        assign(_InputIterator __first, _InputIterator __last)
722
        { _M_assign_dispatch(__first, __last, __false_type()); }
723
#else
724
      template
725
        void
726
        assign(_InputIterator __first, _InputIterator __last)
727
        {
728
	  // Check whether it's an integral type.  If so, it's not an iterator.
729
	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
730
	  _M_assign_dispatch(__first, __last, _Integral());
731
	}
732
#endif
733
 
734
#if __cplusplus >= 201103L
735
      /**
736
       *  @brief  Assigns an initializer_list to a %list.
737
       *  @param  __l  An initializer_list of value_type.
738
       *
739
       *  Replace the contents of the %list with copies of the elements
740
       *  in the initializer_list @a __l.  This is linear in __l.size().
741
       */
742
      void
743
      assign(initializer_list __l)
744
      { this->assign(__l.begin(), __l.end()); }
745
#endif
746
 
747
      /// Get a copy of the memory allocation object.
748
      allocator_type
749
      get_allocator() const _GLIBCXX_NOEXCEPT
750
      { return _Base::get_allocator(); }
751
 
752
      // iterators
753
      /**
754
       *  Returns a read/write iterator that points to the first element in the
755
       *  %list.  Iteration is done in ordinary element order.
756
       */
757
      iterator
758
      begin() _GLIBCXX_NOEXCEPT
759
      { return iterator(this->_M_impl._M_node._M_next); }
760
 
761
      /**
762
       *  Returns a read-only (constant) iterator that points to the
763
       *  first element in the %list.  Iteration is done in ordinary
764
       *  element order.
765
       */
766
      const_iterator
767
      begin() const _GLIBCXX_NOEXCEPT
768
      { return const_iterator(this->_M_impl._M_node._M_next); }
769
 
770
      /**
771
       *  Returns a read/write iterator that points one past the last
772
       *  element in the %list.  Iteration is done in ordinary element
773
       *  order.
774
       */
775
      iterator
776
      end() _GLIBCXX_NOEXCEPT
777
      { return iterator(&this->_M_impl._M_node); }
778
 
779
      /**
780
       *  Returns a read-only (constant) iterator that points one past
781
       *  the last element in the %list.  Iteration is done in ordinary
782
       *  element order.
783
       */
784
      const_iterator
785
      end() const _GLIBCXX_NOEXCEPT
786
      { return const_iterator(&this->_M_impl._M_node); }
787
 
788
      /**
789
       *  Returns a read/write reverse iterator that points to the last
790
       *  element in the %list.  Iteration is done in reverse element
791
       *  order.
792
       */
793
      reverse_iterator
794
      rbegin() _GLIBCXX_NOEXCEPT
795
      { return reverse_iterator(end()); }
796
 
797
      /**
798
       *  Returns a read-only (constant) reverse iterator that points to
799
       *  the last element in the %list.  Iteration is done in reverse
800
       *  element order.
801
       */
802
      const_reverse_iterator
803
      rbegin() const _GLIBCXX_NOEXCEPT
804
      { return const_reverse_iterator(end()); }
805
 
806
      /**
807
       *  Returns a read/write reverse iterator that points to one
808
       *  before the first element in the %list.  Iteration is done in
809
       *  reverse element order.
810
       */
811
      reverse_iterator
812
      rend() _GLIBCXX_NOEXCEPT
813
      { return reverse_iterator(begin()); }
814
 
815
      /**
816
       *  Returns a read-only (constant) reverse iterator that points to one
817
       *  before the first element in the %list.  Iteration is done in reverse
818
       *  element order.
819
       */
820
      const_reverse_iterator
821
      rend() const _GLIBCXX_NOEXCEPT
822
      { return const_reverse_iterator(begin()); }
823
 
824
#if __cplusplus >= 201103L
825
      /**
826
       *  Returns a read-only (constant) iterator that points to the
827
       *  first element in the %list.  Iteration is done in ordinary
828
       *  element order.
829
       */
830
      const_iterator
831
      cbegin() const noexcept
832
      { return const_iterator(this->_M_impl._M_node._M_next); }
833
 
834
      /**
835
       *  Returns a read-only (constant) iterator that points one past
836
       *  the last element in the %list.  Iteration is done in ordinary
837
       *  element order.
838
       */
839
      const_iterator
840
      cend() const noexcept
841
      { return const_iterator(&this->_M_impl._M_node); }
842
 
843
      /**
844
       *  Returns a read-only (constant) reverse iterator that points to
845
       *  the last element in the %list.  Iteration is done in reverse
846
       *  element order.
847
       */
848
      const_reverse_iterator
849
      crbegin() const noexcept
850
      { return const_reverse_iterator(end()); }
851
 
852
      /**
853
       *  Returns a read-only (constant) reverse iterator that points to one
854
       *  before the first element in the %list.  Iteration is done in reverse
855
       *  element order.
856
       */
857
      const_reverse_iterator
858
      crend() const noexcept
859
      { return const_reverse_iterator(begin()); }
860
#endif
861
 
862
      // [23.2.2.2] capacity
863
      /**
864
       *  Returns true if the %list is empty.  (Thus begin() would equal
865
       *  end().)
866
       */
867
      bool
868
      empty() const _GLIBCXX_NOEXCEPT
869
      { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
870
 
871
      /**  Returns the number of elements in the %list.  */
872
      size_type
873
      size() const _GLIBCXX_NOEXCEPT
874
      { return std::distance(begin(), end()); }
875
 
876
      /**  Returns the size() of the largest possible %list.  */
877
      size_type
878
      max_size() const _GLIBCXX_NOEXCEPT
879
      { return _M_get_Node_allocator().max_size(); }
880
 
881
#if __cplusplus >= 201103L
882
      /**
883
       *  @brief Resizes the %list to the specified number of elements.
884
       *  @param __new_size Number of elements the %list should contain.
885
       *
886
       *  This function will %resize the %list to the specified number
887
       *  of elements.  If the number is smaller than the %list's
888
       *  current size the %list is truncated, otherwise default
889
       *  constructed elements are appended.
890
       */
891
      void
892
      resize(size_type __new_size);
893
 
894
      /**
895
       *  @brief Resizes the %list to the specified number of elements.
896
       *  @param __new_size Number of elements the %list should contain.
897
       *  @param __x Data with which new elements should be populated.
898
       *
899
       *  This function will %resize the %list to the specified number
900
       *  of elements.  If the number is smaller than the %list's
901
       *  current size the %list is truncated, otherwise the %list is
902
       *  extended and new elements are populated with given data.
903
       */
904
      void
905
      resize(size_type __new_size, const value_type& __x);
906
#else
907
      /**
908
       *  @brief Resizes the %list to the specified number of elements.
909
       *  @param __new_size Number of elements the %list should contain.
910
       *  @param __x Data with which new elements should be populated.
911
       *
912
       *  This function will %resize the %list to the specified number
913
       *  of elements.  If the number is smaller than the %list's
914
       *  current size the %list is truncated, otherwise the %list is
915
       *  extended and new elements are populated with given data.
916
       */
917
      void
918
      resize(size_type __new_size, value_type __x = value_type());
919
#endif
920
 
921
      // element access
922
      /**
923
       *  Returns a read/write reference to the data at the first
924
       *  element of the %list.
925
       */
926
      reference
927
      front()
928
      { return *begin(); }
929
 
930
      /**
931
       *  Returns a read-only (constant) reference to the data at the first
932
       *  element of the %list.
933
       */
934
      const_reference
935
      front() const
936
      { return *begin(); }
937
 
938
      /**
939
       *  Returns a read/write reference to the data at the last element
940
       *  of the %list.
941
       */
942
      reference
943
      back()
944
      {
945
	iterator __tmp = end();
946
	--__tmp;
947
	return *__tmp;
948
      }
949
 
950
      /**
951
       *  Returns a read-only (constant) reference to the data at the last
952
       *  element of the %list.
953
       */
954
      const_reference
955
      back() const
956
      {
957
	const_iterator __tmp = end();
958
	--__tmp;
959
	return *__tmp;
960
      }
961
 
962
      // [23.2.2.3] modifiers
963
      /**
964
       *  @brief  Add data to the front of the %list.
965
       *  @param  __x  Data to be added.
966
       *
967
       *  This is a typical stack operation.  The function creates an
968
       *  element at the front of the %list and assigns the given data
969
       *  to it.  Due to the nature of a %list this operation can be
970
       *  done in constant time, and does not invalidate iterators and
971
       *  references.
972
       */
973
      void
974
      push_front(const value_type& __x)
975
      { this->_M_insert(begin(), __x); }
976
 
977
#if __cplusplus >= 201103L
978
      void
979
      push_front(value_type&& __x)
980
      { this->_M_insert(begin(), std::move(__x)); }
981
 
982
      template
983
        void
984
        emplace_front(_Args&&... __args)
985
        { this->_M_insert(begin(), std::forward<_Args>(__args)...); }
986
#endif
987
 
988
      /**
989
       *  @brief  Removes first element.
990
       *
991
       *  This is a typical stack operation.  It shrinks the %list by
992
       *  one.  Due to the nature of a %list this operation can be done
993
       *  in constant time, and only invalidates iterators/references to
994
       *  the element being removed.
995
       *
996
       *  Note that no data is returned, and if the first element's data
997
       *  is needed, it should be retrieved before pop_front() is
998
       *  called.
999
       */
1000
      void
1001
      pop_front()
1002
      { this->_M_erase(begin()); }
1003
 
1004
      /**
1005
       *  @brief  Add data to the end of the %list.
1006
       *  @param  __x  Data to be added.
1007
       *
1008
       *  This is a typical stack operation.  The function creates an
1009
       *  element at the end of the %list and assigns the given data to
1010
       *  it.  Due to the nature of a %list this operation can be done
1011
       *  in constant time, and does not invalidate iterators and
1012
       *  references.
1013
       */
1014
      void
1015
      push_back(const value_type& __x)
1016
      { this->_M_insert(end(), __x); }
1017
 
1018
#if __cplusplus >= 201103L
1019
      void
1020
      push_back(value_type&& __x)
1021
      { this->_M_insert(end(), std::move(__x)); }
1022
 
1023
      template
1024
        void
1025
        emplace_back(_Args&&... __args)
1026
        { this->_M_insert(end(), std::forward<_Args>(__args)...); }
1027
#endif
1028
 
1029
      /**
1030
       *  @brief  Removes last element.
1031
       *
1032
       *  This is a typical stack operation.  It shrinks the %list by
1033
       *  one.  Due to the nature of a %list this operation can be done
1034
       *  in constant time, and only invalidates iterators/references to
1035
       *  the element being removed.
1036
       *
1037
       *  Note that no data is returned, and if the last element's data
1038
       *  is needed, it should be retrieved before pop_back() is called.
1039
       */
1040
      void
1041
      pop_back()
1042
      { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
1043
 
1044
#if __cplusplus >= 201103L
1045
      /**
1046
       *  @brief  Constructs object in %list before specified iterator.
1047
       *  @param  __position  A const_iterator into the %list.
1048
       *  @param  __args  Arguments.
1049
       *  @return  An iterator that points to the inserted data.
1050
       *
1051
       *  This function will insert an object of type T constructed
1052
       *  with T(std::forward(args)...) before the specified
1053
       *  location.  Due to the nature of a %list this operation can
1054
       *  be done in constant time, and does not invalidate iterators
1055
       *  and references.
1056
       */
1057
      template
1058
        iterator
1059
        emplace(iterator __position, _Args&&... __args);
1060
#endif
1061
 
1062
      /**
1063
       *  @brief  Inserts given value into %list before specified iterator.
1064
       *  @param  __position  An iterator into the %list.
1065
       *  @param  __x  Data to be inserted.
1066
       *  @return  An iterator that points to the inserted data.
1067
       *
1068
       *  This function will insert a copy of the given value before
1069
       *  the specified location.  Due to the nature of a %list this
1070
       *  operation can be done in constant time, and does not
1071
       *  invalidate iterators and references.
1072
       */
1073
      iterator
1074
      insert(iterator __position, const value_type& __x);
1075
 
1076
#if __cplusplus >= 201103L
1077
      /**
1078
       *  @brief  Inserts given rvalue into %list before specified iterator.
1079
       *  @param  __position  An iterator into the %list.
1080
       *  @param  __x  Data to be inserted.
1081
       *  @return  An iterator that points to the inserted data.
1082
       *
1083
       *  This function will insert a copy of the given rvalue before
1084
       *  the specified location.  Due to the nature of a %list this
1085
       *  operation can be done in constant time, and does not
1086
       *  invalidate iterators and references.
1087
        */
1088
      iterator
1089
      insert(iterator __position, value_type&& __x)
1090
      { return emplace(__position, std::move(__x)); }
1091
 
1092
      /**
1093
       *  @brief  Inserts the contents of an initializer_list into %list
1094
       *          before specified iterator.
1095
       *  @param  __p  An iterator into the %list.
1096
       *  @param  __l  An initializer_list of value_type.
1097
       *
1098
       *  This function will insert copies of the data in the
1099
       *  initializer_list @a l into the %list before the location
1100
       *  specified by @a p.
1101
       *
1102
       *  This operation is linear in the number of elements inserted and
1103
       *  does not invalidate iterators and references.
1104
       */
1105
      void
1106
      insert(iterator __p, initializer_list __l)
1107
      { this->insert(__p, __l.begin(), __l.end()); }
1108
#endif
1109
 
1110
      /**
1111
       *  @brief  Inserts a number of copies of given data into the %list.
1112
       *  @param  __position  An iterator into the %list.
1113
       *  @param  __n  Number of elements to be inserted.
1114
       *  @param  __x  Data to be inserted.
1115
       *
1116
       *  This function will insert a specified number of copies of the
1117
       *  given data before the location specified by @a position.
1118
       *
1119
       *  This operation is linear in the number of elements inserted and
1120
       *  does not invalidate iterators and references.
1121
       */
1122
      void
1123
      insert(iterator __position, size_type __n, const value_type& __x)
1124
      {
1125
	list __tmp(__n, __x, get_allocator());
1126
	splice(__position, __tmp);
1127
      }
1128
 
1129
      /**
1130
       *  @brief  Inserts a range into the %list.
1131
       *  @param  __position  An iterator into the %list.
1132
       *  @param  __first  An input iterator.
1133
       *  @param  __last   An input iterator.
1134
       *
1135
       *  This function will insert copies of the data in the range [@a
1136
       *  first,@a last) into the %list before the location specified by
1137
       *  @a position.
1138
       *
1139
       *  This operation is linear in the number of elements inserted and
1140
       *  does not invalidate iterators and references.
1141
       */
1142
#if __cplusplus >= 201103L
1143
      template
1144
	       typename = std::_RequireInputIter<_InputIterator>>
1145
#else
1146
      template
1147
#endif
1148
        void
1149
        insert(iterator __position, _InputIterator __first,
1150
	       _InputIterator __last)
1151
        {
1152
	  list __tmp(__first, __last, get_allocator());
1153
	  splice(__position, __tmp);
1154
	}
1155
 
1156
      /**
1157
       *  @brief  Remove element at given position.
1158
       *  @param  __position  Iterator pointing to element to be erased.
1159
       *  @return  An iterator pointing to the next element (or end()).
1160
       *
1161
       *  This function will erase the element at the given position and thus
1162
       *  shorten the %list by one.
1163
       *
1164
       *  Due to the nature of a %list this operation can be done in
1165
       *  constant time, and only invalidates iterators/references to
1166
       *  the element being removed.  The user is also cautioned that
1167
       *  this function only erases the element, and that if the element
1168
       *  is itself a pointer, the pointed-to memory is not touched in
1169
       *  any way.  Managing the pointer is the user's responsibility.
1170
       */
1171
      iterator
1172
      erase(iterator __position);
1173
 
1174
      /**
1175
       *  @brief  Remove a range of elements.
1176
       *  @param  __first  Iterator pointing to the first element to be erased.
1177
       *  @param  __last  Iterator pointing to one past the last element to be
1178
       *                erased.
1179
       *  @return  An iterator pointing to the element pointed to by @a last
1180
       *           prior to erasing (or end()).
1181
       *
1182
       *  This function will erase the elements in the range @a
1183
       *  [first,last) and shorten the %list accordingly.
1184
       *
1185
       *  This operation is linear time in the size of the range and only
1186
       *  invalidates iterators/references to the element being removed.
1187
       *  The user is also cautioned that this function only erases the
1188
       *  elements, and that if the elements themselves are pointers, the
1189
       *  pointed-to memory is not touched in any way.  Managing the pointer
1190
       *  is the user's responsibility.
1191
       */
1192
      iterator
1193
      erase(iterator __first, iterator __last)
1194
      {
1195
	while (__first != __last)
1196
	  __first = erase(__first);
1197
	return __last;
1198
      }
1199
 
1200
      /**
1201
       *  @brief  Swaps data with another %list.
1202
       *  @param  __x  A %list of the same element and allocator types.
1203
       *
1204
       *  This exchanges the elements between two lists in constant
1205
       *  time.  Note that the global std::swap() function is
1206
       *  specialized such that std::swap(l1,l2) will feed to this
1207
       *  function.
1208
       */
1209
      void
1210
      swap(list& __x)
1211
      {
1212
	__detail::_List_node_base::swap(this->_M_impl._M_node,
1213
					__x._M_impl._M_node);
1214
 
1215
	// _GLIBCXX_RESOLVE_LIB_DEFECTS
1216
	// 431. Swapping containers with unequal allocators.
1217
	std::__alloc_swap::
1218
	  _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator());
1219
      }
1220
 
1221
      /**
1222
       *  Erases all the elements.  Note that this function only erases
1223
       *  the elements, and that if the elements themselves are
1224
       *  pointers, the pointed-to memory is not touched in any way.
1225
       *  Managing the pointer is the user's responsibility.
1226
       */
1227
      void
1228
      clear() _GLIBCXX_NOEXCEPT
1229
      {
1230
        _Base::_M_clear();
1231
        _Base::_M_init();
1232
      }
1233
 
1234
      // [23.2.2.4] list operations
1235
      /**
1236
       *  @brief  Insert contents of another %list.
1237
       *  @param  __position  Iterator referencing the element to insert before.
1238
       *  @param  __x  Source list.
1239
       *
1240
       *  The elements of @a __x are inserted in constant time in front of
1241
       *  the element referenced by @a __position.  @a __x becomes an empty
1242
       *  list.
1243
       *
1244
       *  Requires this != @a __x.
1245
       */
1246
      void
1247
#if __cplusplus >= 201103L
1248
      splice(iterator __position, list&& __x)
1249
#else
1250
      splice(iterator __position, list& __x)
1251
#endif
1252
      {
1253
	if (!__x.empty())
1254
	  {
1255
	    _M_check_equal_allocators(__x);
1256
 
1257
	    this->_M_transfer(__position, __x.begin(), __x.end());
1258
	  }
1259
      }
1260
 
1261
#if __cplusplus >= 201103L
1262
      void
1263
      splice(iterator __position, list& __x)
1264
      { splice(__position, std::move(__x)); }
1265
#endif
1266
 
1267
      /**
1268
       *  @brief  Insert element from another %list.
1269
       *  @param  __position  Iterator referencing the element to insert before.
1270
       *  @param  __x  Source list.
1271
       *  @param  __i  Iterator referencing the element to move.
1272
       *
1273
       *  Removes the element in list @a __x referenced by @a __i and
1274
       *  inserts it into the current list before @a __position.
1275
       */
1276
      void
1277
#if __cplusplus >= 201103L
1278
      splice(iterator __position, list&& __x, iterator __i)
1279
#else
1280
      splice(iterator __position, list& __x, iterator __i)
1281
#endif
1282
      {
1283
	iterator __j = __i;
1284
	++__j;
1285
	if (__position == __i || __position == __j)
1286
	  return;
1287
 
1288
	if (this != &__x)
1289
	  _M_check_equal_allocators(__x);
1290
 
1291
	this->_M_transfer(__position, __i, __j);
1292
      }
1293
 
1294
#if __cplusplus >= 201103L
1295
      void
1296
      splice(iterator __position, list& __x, iterator __i)
1297
      { splice(__position, std::move(__x), __i); }
1298
#endif
1299
 
1300
      /**
1301
       *  @brief  Insert range from another %list.
1302
       *  @param  __position  Iterator referencing the element to insert before.
1303
       *  @param  __x  Source list.
1304
       *  @param  __first  Iterator referencing the start of range in x.
1305
       *  @param  __last  Iterator referencing the end of range in x.
1306
       *
1307
       *  Removes elements in the range [__first,__last) and inserts them
1308
       *  before @a __position in constant time.
1309
       *
1310
       *  Undefined if @a __position is in [__first,__last).
1311
       */
1312
      void
1313
#if __cplusplus >= 201103L
1314
      splice(iterator __position, list&& __x, iterator __first,
1315
	     iterator __last)
1316
#else
1317
      splice(iterator __position, list& __x, iterator __first,
1318
	     iterator __last)
1319
#endif
1320
      {
1321
	if (__first != __last)
1322
	  {
1323
	    if (this != &__x)
1324
	      _M_check_equal_allocators(__x);
1325
 
1326
	    this->_M_transfer(__position, __first, __last);
1327
	  }
1328
      }
1329
 
1330
#if __cplusplus >= 201103L
1331
      void
1332
      splice(iterator __position, list& __x, iterator __first, iterator __last)
1333
      { splice(__position, std::move(__x), __first, __last); }
1334
#endif
1335
 
1336
      /**
1337
       *  @brief  Remove all elements equal to value.
1338
       *  @param  __value  The value to remove.
1339
       *
1340
       *  Removes every element in the list equal to @a value.
1341
       *  Remaining elements stay in list order.  Note that this
1342
       *  function only erases the elements, and that if the elements
1343
       *  themselves are pointers, the pointed-to memory is not
1344
       *  touched in any way.  Managing the pointer is the user's
1345
       *  responsibility.
1346
       */
1347
      void
1348
      remove(const _Tp& __value);
1349
 
1350
      /**
1351
       *  @brief  Remove all elements satisfying a predicate.
1352
       *  @tparam  _Predicate  Unary predicate function or object.
1353
       *
1354
       *  Removes every element in the list for which the predicate
1355
       *  returns true.  Remaining elements stay in list order.  Note
1356
       *  that this function only erases the elements, and that if the
1357
       *  elements themselves are pointers, the pointed-to memory is
1358
       *  not touched in any way.  Managing the pointer is the user's
1359
       *  responsibility.
1360
       */
1361
      template
1362
        void
1363
        remove_if(_Predicate);
1364
 
1365
      /**
1366
       *  @brief  Remove consecutive duplicate elements.
1367
       *
1368
       *  For each consecutive set of elements with the same value,
1369
       *  remove all but the first one.  Remaining elements stay in
1370
       *  list order.  Note that this function only erases the
1371
       *  elements, and that if the elements themselves are pointers,
1372
       *  the pointed-to memory is not touched in any way.  Managing
1373
       *  the pointer is the user's responsibility.
1374
       */
1375
      void
1376
      unique();
1377
 
1378
      /**
1379
       *  @brief  Remove consecutive elements satisfying a predicate.
1380
       *  @tparam _BinaryPredicate  Binary predicate function or object.
1381
       *
1382
       *  For each consecutive set of elements [first,last) that
1383
       *  satisfy predicate(first,i) where i is an iterator in
1384
       *  [first,last), remove all but the first one.  Remaining
1385
       *  elements stay in list order.  Note that this function only
1386
       *  erases the elements, and that if the elements themselves are
1387
       *  pointers, the pointed-to memory is not touched in any way.
1388
       *  Managing the pointer is the user's responsibility.
1389
       */
1390
      template
1391
        void
1392
        unique(_BinaryPredicate);
1393
 
1394
      /**
1395
       *  @brief  Merge sorted lists.
1396
       *  @param  __x  Sorted list to merge.
1397
       *
1398
       *  Assumes that both @a __x and this list are sorted according to
1399
       *  operator<().  Merges elements of @a __x into this list in
1400
       *  sorted order, leaving @a __x empty when complete.  Elements in
1401
       *  this list precede elements in @a __x that are equal.
1402
       */
1403
#if __cplusplus >= 201103L
1404
      void
1405
      merge(list&& __x);
1406
 
1407
      void
1408
      merge(list& __x)
1409
      { merge(std::move(__x)); }
1410
#else
1411
      void
1412
      merge(list& __x);
1413
#endif
1414
 
1415
      /**
1416
       *  @brief  Merge sorted lists according to comparison function.
1417
       *  @tparam _StrictWeakOrdering Comparison function defining
1418
       *  sort order.
1419
       *  @param  __x  Sorted list to merge.
1420
       *  @param  __comp  Comparison functor.
1421
       *
1422
       *  Assumes that both @a __x and this list are sorted according to
1423
       *  StrictWeakOrdering.  Merges elements of @a __x into this list
1424
       *  in sorted order, leaving @a __x empty when complete.  Elements
1425
       *  in this list precede elements in @a __x that are equivalent
1426
       *  according to StrictWeakOrdering().
1427
       */
1428
#if __cplusplus >= 201103L
1429
      template
1430
        void
1431
        merge(list&& __x, _StrictWeakOrdering __comp);
1432
 
1433
      template
1434
        void
1435
        merge(list& __x, _StrictWeakOrdering __comp)
1436
        { merge(std::move(__x), __comp); }
1437
#else
1438
      template
1439
        void
1440
        merge(list& __x, _StrictWeakOrdering __comp);
1441
#endif
1442
 
1443
      /**
1444
       *  @brief  Reverse the elements in list.
1445
       *
1446
       *  Reverse the order of elements in the list in linear time.
1447
       */
1448
      void
1449
      reverse() _GLIBCXX_NOEXCEPT
1450
      { this->_M_impl._M_node._M_reverse(); }
1451
 
1452
      /**
1453
       *  @brief  Sort the elements.
1454
       *
1455
       *  Sorts the elements of this list in NlogN time.  Equivalent
1456
       *  elements remain in list order.
1457
       */
1458
      void
1459
      sort();
1460
 
1461
      /**
1462
       *  @brief  Sort the elements according to comparison function.
1463
       *
1464
       *  Sorts the elements of this list in NlogN time.  Equivalent
1465
       *  elements remain in list order.
1466
       */
1467
      template
1468
        void
1469
        sort(_StrictWeakOrdering);
1470
 
1471
    protected:
1472
      // Internal constructor functions follow.
1473
 
1474
      // Called by the range constructor to implement [23.1.1]/9
1475
 
1476
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1477
      // 438. Ambiguity in the "do the right thing" clause
1478
      template
1479
        void
1480
        _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1481
        { _M_fill_initialize(static_cast(__n), __x); }
1482
 
1483
      // Called by the range constructor to implement [23.1.1]/9
1484
      template
1485
        void
1486
        _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1487
			       __false_type)
1488
        {
1489
	  for (; __first != __last; ++__first)
1490
#if __cplusplus >= 201103L
1491
	    emplace_back(*__first);
1492
#else
1493
	    push_back(*__first);
1494
#endif
1495
	}
1496
 
1497
      // Called by list(n,v,a), and the range constructor when it turns out
1498
      // to be the same thing.
1499
      void
1500
      _M_fill_initialize(size_type __n, const value_type& __x)
1501
      {
1502
	for (; __n; --__n)
1503
	  push_back(__x);
1504
      }
1505
 
1506
#if __cplusplus >= 201103L
1507
      // Called by list(n).
1508
      void
1509
      _M_default_initialize(size_type __n)
1510
      {
1511
	for (; __n; --__n)
1512
	  emplace_back();
1513
      }
1514
 
1515
      // Called by resize(sz).
1516
      void
1517
      _M_default_append(size_type __n);
1518
#endif
1519
 
1520
      // Internal assign functions follow.
1521
 
1522
      // Called by the range assign to implement [23.1.1]/9
1523
 
1524
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1525
      // 438. Ambiguity in the "do the right thing" clause
1526
      template
1527
        void
1528
        _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1529
        { _M_fill_assign(__n, __val); }
1530
 
1531
      // Called by the range assign to implement [23.1.1]/9
1532
      template
1533
        void
1534
        _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1535
			   __false_type);
1536
 
1537
      // Called by assign(n,t), and the range assign when it turns out
1538
      // to be the same thing.
1539
      void
1540
      _M_fill_assign(size_type __n, const value_type& __val);
1541
 
1542
 
1543
      // Moves the elements from [first,last) before position.
1544
      void
1545
      _M_transfer(iterator __position, iterator __first, iterator __last)
1546
      { __position._M_node->_M_transfer(__first._M_node, __last._M_node); }
1547
 
1548
      // Inserts new element at position given and with value given.
1549
#if __cplusplus < 201103L
1550
      void
1551
      _M_insert(iterator __position, const value_type& __x)
1552
      {
1553
        _Node* __tmp = _M_create_node(__x);
1554
        __tmp->_M_hook(__position._M_node);
1555
      }
1556
#else
1557
     template
1558
       void
1559
       _M_insert(iterator __position, _Args&&... __args)
1560
       {
1561
	 _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
1562
	 __tmp->_M_hook(__position._M_node);
1563
       }
1564
#endif
1565
 
1566
      // Erases element at position given.
1567
      void
1568
      _M_erase(iterator __position)
1569
      {
1570
        __position._M_node->_M_unhook();
1571
        _Node* __n = static_cast<_Node*>(__position._M_node);
1572
#if __cplusplus >= 201103L
1573
        _M_get_Node_allocator().destroy(__n);
1574
#else
1575
	_M_get_Tp_allocator().destroy(std::__addressof(__n->_M_data));
1576
#endif
1577
        _M_put_node(__n);
1578
      }
1579
 
1580
      // To implement the splice (and merge) bits of N1599.
1581
      void
1582
      _M_check_equal_allocators(list& __x)
1583
      {
1584
	if (std::__alloc_neq::
1585
	    _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator()))
1586
	  __throw_runtime_error(__N("list::_M_check_equal_allocators"));
1587
      }
1588
    };
1589
 
1590
  /**
1591
   *  @brief  List equality comparison.
1592
   *  @param  __x  A %list.
1593
   *  @param  __y  A %list of the same type as @a __x.
1594
   *  @return  True iff the size and elements of the lists are equal.
1595
   *
1596
   *  This is an equivalence relation.  It is linear in the size of
1597
   *  the lists.  Lists are considered equivalent if their sizes are
1598
   *  equal, and if corresponding elements compare equal.
1599
  */
1600
  template
1601
    inline bool
1602
    operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1603
    {
1604
      typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
1605
      const_iterator __end1 = __x.end();
1606
      const_iterator __end2 = __y.end();
1607
 
1608
      const_iterator __i1 = __x.begin();
1609
      const_iterator __i2 = __y.begin();
1610
      while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2)
1611
	{
1612
	  ++__i1;
1613
	  ++__i2;
1614
	}
1615
      return __i1 == __end1 && __i2 == __end2;
1616
    }
1617
 
1618
  /**
1619
   *  @brief  List ordering relation.
1620
   *  @param  __x  A %list.
1621
   *  @param  __y  A %list of the same type as @a __x.
1622
   *  @return  True iff @a __x is lexicographically less than @a __y.
1623
   *
1624
   *  This is a total ordering relation.  It is linear in the size of the
1625
   *  lists.  The elements must be comparable with @c <.
1626
   *
1627
   *  See std::lexicographical_compare() for how the determination is made.
1628
  */
1629
  template
1630
    inline bool
1631
    operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1632
    { return std::lexicographical_compare(__x.begin(), __x.end(),
1633
					  __y.begin(), __y.end()); }
1634
 
1635
  /// Based on operator==
1636
  template
1637
    inline bool
1638
    operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1639
    { return !(__x == __y); }
1640
 
1641
  /// Based on operator<
1642
  template
1643
    inline bool
1644
    operator>(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1645
    { return __y < __x; }
1646
 
1647
  /// Based on operator<
1648
  template
1649
    inline bool
1650
    operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1651
    { return !(__y < __x); }
1652
 
1653
  /// Based on operator<
1654
  template
1655
    inline bool
1656
    operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1657
    { return !(__x < __y); }
1658
 
1659
  /// See std::list::swap().
1660
  template
1661
    inline void
1662
    swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
1663
    { __x.swap(__y); }
1664
 
1665
_GLIBCXX_END_NAMESPACE_CONTAINER
1666
} // namespace std
1667
 
1668
#endif /* _STL_LIST_H */