libstdc++
stl_list.h
Go to the documentation of this file.
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 // <http://www.gnu.org/licenses/>.
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 <bits/concept_check.h>
60 #if __cplusplus >= 201103L
61 #include <initializer_list>
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.
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<typename _Tp>
107  {
108  ///< User's data.
109  _Tp _M_data;
110 
111 #if __cplusplus >= 201103L
112  template<typename... _Args>
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<typename _Tp>
126  {
127  typedef _List_iterator<_Tp> _Self;
128  typedef _List_node<_Tp> _Node;
129 
130  typedef ptrdiff_t difference_type;
132  typedef _Tp value_type;
133  typedef _Tp* pointer;
134  typedef _Tp& reference;
135 
137  : _M_node() { }
138 
139  explicit
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<typename _Tp>
201  {
203  typedef const _List_node<_Tp> _Node;
205 
206  typedef ptrdiff_t difference_type;
208  typedef _Tp value_type;
209  typedef const _Tp* pointer;
210  typedef const _Tp& reference;
211 
213  : _M_node() { }
214 
215  explicit
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<typename _Val>
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<typename _Val>
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<typename _Tp, typename _Alloc>
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<List_node<Tp>>, which according to [20.1.5]/4
296  // should probably be the same. List_node<Tp> is not the same
297  // size as Tp (it's two pointers larger), and specializations on
298  // Tp may go unused because List_node<Tp> 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  {
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 
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<const _Node_alloc_type*>(&_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 <a href="tables.html#65">container</a>, a
401  * <a href="tables.html#66">reversible container</a>, and a
402  * <a href="tables.html#67">sequence</a>, including the
403  * <a href="tables.html#68">optional sequence requirements</a> 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<Tp>:
419  *
420  * First, we never actually allocate a Tp, we allocate
421  * List_node<Tp>'s and trust [20.1.5]/4 to DTRT. This is to ensure
422  * that after elements from %list<X,Alloc1> are spliced into
423  * %list<X,Alloc2>, 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<typename _Tp, typename _Alloc = std::allocator<_Tp> >
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 
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;
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<typename... _Args>
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  */
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<value_type> __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<typename _InputIterator,
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<typename _InputIterator>
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&
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<value_type> __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<typename _InputIterator,
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<typename _InputIterator>
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<value_type> __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
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
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<typename... _Args>
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
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<typename... _Args>
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
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>(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<typename... _Args>
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<value_type> __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<typename _InputIterator,
1144  typename = std::_RequireInputIter<_InputIterator>>
1145 #else
1146  template<typename _InputIterator>
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<typename _Base::_Node_alloc_type>::
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<typename _Predicate>
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<typename _BinaryPredicate>
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<typename _StrictWeakOrdering>
1430  void
1431  merge(list&& __x, _StrictWeakOrdering __comp);
1432 
1433  template<typename _StrictWeakOrdering>
1434  void
1435  merge(list& __x, _StrictWeakOrdering __comp)
1436  { merge(std::move(__x), __comp); }
1437 #else
1438  template<typename _StrictWeakOrdering>
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<typename _StrictWeakOrdering>
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<typename _Integer>
1479  void
1480  _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1481  { _M_fill_initialize(static_cast<size_type>(__n), __x); }
1482 
1483  // Called by the range constructor to implement [23.1.1]/9
1484  template<typename _InputIterator>
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<typename _Integer>
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<typename _InputIterator>
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<typename... _Args>
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<typename _Base::_Node_alloc_type>::
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<typename _Tp, typename _Alloc>
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<typename _Tp, typename _Alloc>
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<typename _Tp, typename _Alloc>
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<typename _Tp, typename _Alloc>
1643  inline bool
1645  { return __y < __x; }
1646 
1647  /// Based on operator<
1648  template<typename _Tp, typename _Alloc>
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<typename _Tp, typename _Alloc>
1655  inline bool
1657  { return !(__x < __y); }
1658 
1659  /// See std::list::swap().
1660  template<typename _Tp, typename _Alloc>
1661  inline void
1663  { __x.swap(__y); }
1664 
1665 _GLIBCXX_END_NAMESPACE_CONTAINER
1666 } // namespace std
1667 
1668 #endif /* _STL_LIST_H */
A standard container with linear time access to elements, and fixed time insertion/deletion at any po...
Definition: stl_list.h:438
void splice(iterator __position, list &&__x, iterator __i)
Insert element from another list.
Definition: stl_list.h:1278
See bits/stl_deque.h's _Deque_base for an explanation.
Definition: stl_list.h:289
void insert(iterator __position, size_type __n, const value_type &__x)
Inserts a number of copies of given data into the list.
Definition: stl_list.h:1123
const_iterator cbegin() const noexcept
Definition: stl_list.h:831
Common part of a node in the list.
Definition: stl_list.h:77
list(initializer_list< value_type > __l, const allocator_type &__a=allocator_type())
Builds a list from an initializer_list.
Definition: stl_list.h:605
void clear() noexcept
Definition: stl_list.h:1228
size_type size() const noexcept
Definition: stl_list.h:873
list(const allocator_type &__a)
Creates a list with no elements.
Definition: stl_list.h:531
void reverse() noexcept
Reverse the elements in list.
Definition: stl_list.h:1449
void merge(list &&__x)
Merge sorted lists.
const_reverse_iterator rbegin() const noexcept
Definition: stl_list.h:803
void swap(list &__x)
Swaps data with another list.
Definition: stl_list.h:1210
_Node * _M_create_node(_Args &&...__args)
Definition: stl_list.h:500
reverse_iterator rend() noexcept
Definition: stl_list.h:812
iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
void sort()
Sort the elements.
void push_back(const value_type &__x)
Add data to the end of the list.
Definition: stl_list.h:1015
list(_InputIterator __first, _InputIterator __last, const allocator_type &__a=allocator_type())
Builds a list from a range.
Definition: stl_list.h:624
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
Definition: move.h:76
list & operator=(const list &__x)
List assignment operator.
void assign(_InputIterator __first, _InputIterator __last)
Assigns a range to a list.
Definition: stl_list.h:721
const_reference front() const
Definition: stl_list.h:935
void unique()
Remove consecutive duplicate elements.
list(size_type __n)
Creates a list with default constructed elements.
Definition: stl_list.h:543
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
Definition: move.h:47
const_iterator cend() const noexcept
Definition: stl_list.h:840
_Tp _M_data
< User's data.
Definition: stl_list.h:109
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Definition: move.h:101
const_iterator begin() const noexcept
Definition: stl_list.h:767
iterator insert(iterator __position, const value_type &__x)
Inserts given value into list before specified iterator.
bool operator>=(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Test if string doesn't precede string.
An actual node in the list.
Definition: stl_list.h:106
list(const list &__x)
List copy constructor.
Definition: stl_list.h:582
void splice(iterator __position, list &&__x, iterator __first, iterator __last)
Insert range from another list.
Definition: stl_list.h:1314
void pop_front()
Removes first element.
Definition: stl_list.h:1001
iterator begin() noexcept
Definition: stl_list.h:758
list & operator=(list &&__x)
List move assignment operator.
Definition: stl_list.h:667
ISO C++ entities toplevel namespace is std.
void assign(size_type __n, const value_type &__val)
Assigns a given value to a list.
Definition: stl_list.h:702
bool lexicographical_compare(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2, _Compare __comp)
Performs dictionary comparison on ranges.
void splice(iterator __position, list &&__x)
Insert contents of another list.
Definition: stl_list.h:1248
void resize(size_type __new_size)
Resizes the list to the specified number of elements.
bool empty() const noexcept
Definition: stl_list.h:868
list(size_type __n, const value_type &__value, const allocator_type &__a=allocator_type())
Creates a list with copies of an exemplar element.
Definition: stl_list.h:555
iterator end() noexcept
Definition: stl_list.h:776
iterator erase(iterator __position)
Remove element at given position.
iterator insert(iterator __position, value_type &&__x)
Inserts given rvalue into list before specified iterator.
Definition: stl_list.h:1089
A list::iterator.
Definition: stl_list.h:125
const_reverse_iterator crbegin() const noexcept
Definition: stl_list.h:849
iterator emplace(iterator __position, _Args &&...__args)
Constructs object in list before specified iterator.
list(list &&__x) noexcept
List move constructor.
Definition: stl_list.h:594
const_reverse_iterator crend() const noexcept
Definition: stl_list.h:858
reverse_iterator rbegin() noexcept
Definition: stl_list.h:794
void insert(iterator __p, initializer_list< value_type > __l)
Inserts the contents of an initializer_list into list before specified iterator.
Definition: stl_list.h:1106
const_reference back() const
Definition: stl_list.h:955
list()
Default constructor creates no elements.
Definition: stl_list.h:523
reference back()
Definition: stl_list.h:943
void push_front(const value_type &__x)
Add data to the front of the list.
Definition: stl_list.h:974
iterator erase(iterator __first, iterator __last)
Remove a range of elements.
Definition: stl_list.h:1193
allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object.
Definition: stl_list.h:749
void swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
Swaps two values.
Definition: move.h:166
const_reverse_iterator rend() const noexcept
Definition: stl_list.h:821
size_type max_size() const noexcept
Definition: stl_list.h:878
void insert(iterator __position, _InputIterator __first, _InputIterator __last)
Inserts a range into the list.
Definition: stl_list.h:1149
void assign(initializer_list< value_type > __l)
Assigns an initializer_list to a list.
Definition: stl_list.h:743
A list::const_iterator.
Definition: stl_list.h:200
void remove_if(_Predicate)
Remove all elements satisfying a predicate.
list & operator=(initializer_list< value_type > __l)
List initializer list assignment operator.
Definition: stl_list.h:684
void pop_back()
Removes last element.
Definition: stl_list.h:1041
const_iterator end() const noexcept
Definition: stl_list.h:785
bool operator>(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Test if string follows string.
Bidirectional iterators support a superset of forward iterator operations.
reference front()
Definition: stl_list.h:927