OSDN Git Service

39c25322817fe55bbd431bed9e815838694c7c53
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / forward_list.h
1 // <forward_list.h> -*- C++ -*-
2
3 // Copyright (C) 2008, 2009, 2010, 2011 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 /** @file bits/forward_list.h
26  *  This is an internal header file, included by other library headers.
27  *  Do not attempt to use it directly. @headername{forward_list}
28  */
29
30 #ifndef _FORWARD_LIST_H
31 #define _FORWARD_LIST_H 1
32
33 #pragma GCC system_header
34
35 #include <memory>
36 #include <initializer_list>
37
38 namespace std _GLIBCXX_VISIBILITY(default)
39 {
40 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
41
42   /**
43    *  @brief  A helper basic node class for %forward_list.
44    *          This is just a linked list with nothing inside it.
45    *          There are purely list shuffling utility methods here.
46    */
47   struct _Fwd_list_node_base
48   {
49     _Fwd_list_node_base() : _M_next(0) { }
50
51     _Fwd_list_node_base* _M_next;
52
53     _Fwd_list_node_base*
54     _M_transfer_after(_Fwd_list_node_base* __begin)
55     {
56       _Fwd_list_node_base* __end = __begin;
57       while (__end && __end->_M_next)
58         __end = __end->_M_next;
59       return _M_transfer_after(__begin, __end);
60     }
61
62     _Fwd_list_node_base*
63     _M_transfer_after(_Fwd_list_node_base* __begin,
64                       _Fwd_list_node_base* __end)
65     {
66       _Fwd_list_node_base* __keep = __begin->_M_next;
67       if (__end)
68         {
69           __begin->_M_next = __end->_M_next;
70           __end->_M_next = _M_next;
71         }
72       else
73         __begin->_M_next = 0;
74       _M_next = __keep;
75       return __end;
76     }
77
78     void
79     _M_reverse_after()
80     {
81       _Fwd_list_node_base* __tail = _M_next;
82       if (!__tail)
83         return;
84       while (_Fwd_list_node_base* __temp = __tail->_M_next)
85         {
86           _Fwd_list_node_base* __keep = _M_next;
87           _M_next = __temp;
88           __tail->_M_next = __temp->_M_next;
89           _M_next->_M_next = __keep;
90         }
91     }
92   };
93
94   /**
95    *  @brief  A helper node class for %forward_list.
96    *          This is just a linked list with a data value in each node.
97    *          There is a sorting utility method.
98    */
99   template<typename _Tp>
100     struct _Fwd_list_node
101     : public _Fwd_list_node_base
102     {
103       template<typename... _Args>
104         _Fwd_list_node(_Args&&... __args)
105         : _Fwd_list_node_base(), 
106           _M_value(std::forward<_Args>(__args)...) { }
107
108       _Tp _M_value;
109     };
110
111   /**
112    *   @brief A forward_list::iterator.
113    * 
114    *   All the functions are op overloads.
115    */
116   template<typename _Tp>
117     struct _Fwd_list_iterator
118     {
119       typedef _Fwd_list_iterator<_Tp>            _Self;
120       typedef _Fwd_list_node<_Tp>                _Node;
121
122       typedef _Tp                                value_type;
123       typedef _Tp*                               pointer;
124       typedef _Tp&                               reference;
125       typedef ptrdiff_t                          difference_type;
126       typedef std::forward_iterator_tag          iterator_category;
127
128       _Fwd_list_iterator()
129       : _M_node() { }
130
131       explicit
132       _Fwd_list_iterator(_Fwd_list_node_base* __n) 
133       : _M_node(__n) { }
134
135       reference
136       operator*() const
137       { return static_cast<_Node*>(this->_M_node)->_M_value; }
138
139       pointer
140       operator->() const
141       { return std::__addressof(static_cast<_Node*>
142                                 (this->_M_node)->_M_value); }
143
144       _Self&
145       operator++()
146       {
147         _M_node = _M_node->_M_next;
148         return *this;
149       }
150
151       _Self
152       operator++(int)
153       {
154         _Self __tmp(*this);
155         _M_node = _M_node->_M_next;
156         return __tmp;
157       }
158
159       bool
160       operator==(const _Self& __x) const
161       { return _M_node == __x._M_node; }
162
163       bool
164       operator!=(const _Self& __x) const
165       { return _M_node != __x._M_node; }
166
167       _Self
168       _M_next() const
169       {
170         if (_M_node)
171           return _Fwd_list_iterator(_M_node->_M_next);
172         else
173           return _Fwd_list_iterator(0);
174       }
175
176       _Fwd_list_node_base* _M_node;
177     };
178
179   /**
180    *   @brief A forward_list::const_iterator.
181    * 
182    *   All the functions are op overloads.
183    */
184   template<typename _Tp>
185     struct _Fwd_list_const_iterator
186     {
187       typedef _Fwd_list_const_iterator<_Tp>      _Self;
188       typedef const _Fwd_list_node<_Tp>          _Node;
189       typedef _Fwd_list_iterator<_Tp>            iterator;
190
191       typedef _Tp                                value_type;
192       typedef const _Tp*                         pointer;
193       typedef const _Tp&                         reference;
194       typedef ptrdiff_t                          difference_type;
195       typedef std::forward_iterator_tag          iterator_category;
196
197       _Fwd_list_const_iterator()
198       : _M_node() { }
199
200       explicit
201       _Fwd_list_const_iterator(const _Fwd_list_node_base* __n) 
202       : _M_node(__n) { }
203
204       _Fwd_list_const_iterator(const iterator& __iter)
205       : _M_node(__iter._M_node) { }
206
207       reference
208       operator*() const
209       { return static_cast<_Node*>(this->_M_node)->_M_value; }
210
211       pointer
212       operator->() const
213       { return std::__addressof(static_cast<_Node*>
214                                 (this->_M_node)->_M_value); }
215
216       _Self&
217       operator++()
218       {
219         _M_node = _M_node->_M_next;
220         return *this;
221       }
222
223       _Self
224       operator++(int)
225       {
226         _Self __tmp(*this);
227         _M_node = _M_node->_M_next;
228         return __tmp;
229       }
230
231       bool
232       operator==(const _Self& __x) const
233       { return _M_node == __x._M_node; }
234
235       bool
236       operator!=(const _Self& __x) const
237       { return _M_node != __x._M_node; }
238
239       _Self
240       _M_next() const
241       {
242         if (this->_M_node)
243           return _Fwd_list_const_iterator(_M_node->_M_next);
244         else
245           return _Fwd_list_const_iterator(0);
246       }
247
248       const _Fwd_list_node_base* _M_node;
249     };
250
251   /**
252    *  @brief  Forward list iterator equality comparison.
253    */
254   template<typename _Tp>
255     inline bool
256     operator==(const _Fwd_list_iterator<_Tp>& __x,
257                const _Fwd_list_const_iterator<_Tp>& __y)
258     { return __x._M_node == __y._M_node; }
259
260   /**
261    *  @brief  Forward list iterator inequality comparison.
262    */
263   template<typename _Tp>
264     inline bool
265     operator!=(const _Fwd_list_iterator<_Tp>& __x,
266                const _Fwd_list_const_iterator<_Tp>& __y)
267     { return __x._M_node != __y._M_node; }
268
269   /**
270    *  @brief  Base class for %forward_list.
271    */
272   template<typename _Tp, typename _Alloc>
273     struct _Fwd_list_base
274     {
275     protected:
276       typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
277
278       typedef typename _Alloc::template 
279         rebind<_Fwd_list_node<_Tp>>::other _Node_alloc_type;
280
281       struct _Fwd_list_impl 
282       : public _Node_alloc_type
283       {
284         _Fwd_list_node_base _M_head;
285
286         _Fwd_list_impl()
287         : _Node_alloc_type(), _M_head()
288         { }
289
290         _Fwd_list_impl(const _Node_alloc_type& __a)
291         : _Node_alloc_type(__a), _M_head()
292         { }
293       };
294
295       _Fwd_list_impl _M_impl;
296
297     public:
298       typedef _Fwd_list_iterator<_Tp>                 iterator;
299       typedef _Fwd_list_const_iterator<_Tp>           const_iterator;
300       typedef _Fwd_list_node<_Tp>                     _Node;
301
302       _Node_alloc_type&
303       _M_get_Node_allocator()
304       { return *static_cast<_Node_alloc_type*>(&this->_M_impl); }
305
306       const _Node_alloc_type&
307       _M_get_Node_allocator() const
308       { return *static_cast<const _Node_alloc_type*>(&this->_M_impl); }
309
310       _Fwd_list_base()
311       : _M_impl() { }
312
313       _Fwd_list_base(const _Alloc& __a)
314       : _M_impl(__a) { }
315
316       _Fwd_list_base(const _Fwd_list_base& __lst, const _Alloc& __a);
317
318       _Fwd_list_base(_Fwd_list_base&& __lst, const _Alloc& __a)
319       : _M_impl(__a)
320       {
321         this->_M_impl._M_head._M_next = __lst._M_impl._M_head._M_next;
322         __lst._M_impl._M_head._M_next = 0;
323       }
324
325       _Fwd_list_base(_Fwd_list_base&& __lst)
326       : _M_impl(__lst._M_get_Node_allocator())
327       {
328         this->_M_impl._M_head._M_next = __lst._M_impl._M_head._M_next;
329         __lst._M_impl._M_head._M_next = 0;
330       }
331
332       ~_Fwd_list_base()
333       { _M_erase_after(&_M_impl._M_head, 0); }
334
335     protected:
336
337       _Node*
338       _M_get_node()
339       { return _M_get_Node_allocator().allocate(1); }
340
341       template<typename... _Args>
342         _Node*
343         _M_create_node(_Args&&... __args)
344         {
345           _Node* __node = this->_M_get_node();
346           __try
347             {
348               _M_get_Node_allocator().construct(__node,
349                                               std::forward<_Args>(__args)...);
350               __node->_M_next = 0;
351             }
352           __catch(...)
353             {
354               this->_M_put_node(__node);
355               __throw_exception_again;
356             }
357           return __node;
358         }
359
360       template<typename... _Args>
361         _Fwd_list_node_base*
362         _M_insert_after(const_iterator __pos, _Args&&... __args);
363
364       void
365       _M_put_node(_Node* __p)
366       { _M_get_Node_allocator().deallocate(__p, 1); }
367
368       _Fwd_list_node_base*
369       _M_erase_after(_Fwd_list_node_base* __pos);
370
371       _Fwd_list_node_base*
372       _M_erase_after(_Fwd_list_node_base* __pos, 
373                      _Fwd_list_node_base* __last);
374     };
375
376   /**
377    *  @brief A standard container with linear time access to elements,
378    *  and fixed time insertion/deletion at any point in the sequence.
379    *
380    *  @ingroup sequences
381    *
382    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
383    *  <a href="tables.html#67">sequence</a>, including the
384    *  <a href="tables.html#68">optional sequence requirements</a> with the
385    *  %exception of @c at and @c operator[].
386    *
387    *  This is a @e singly @e linked %list.  Traversal up the
388    *  %list requires linear time, but adding and removing elements (or
389    *  @e nodes) is done in constant time, regardless of where the
390    *  change takes place.  Unlike std::vector and std::deque,
391    *  random-access iterators are not provided, so subscripting ( @c
392    *  [] ) access is not allowed.  For algorithms which only need
393    *  sequential access, this lack makes no difference.
394    *
395    *  Also unlike the other standard containers, std::forward_list provides
396    *  specialized algorithms %unique to linked lists, such as
397    *  splicing, sorting, and in-place reversal.
398    *
399    *  A couple points on memory allocation for forward_list<Tp>:
400    *
401    *  First, we never actually allocate a Tp, we allocate
402    *  Fwd_list_node<Tp>'s and trust [20.1.5]/4 to DTRT.  This is to ensure
403    *  that after elements from %forward_list<X,Alloc1> are spliced into
404    *  %forward_list<X,Alloc2>, destroying the memory of the second %list is a
405    *  valid operation, i.e., Alloc1 giveth and Alloc2 taketh away.
406    */
407   template<typename _Tp, typename _Alloc = allocator<_Tp> >
408     class forward_list : private _Fwd_list_base<_Tp, _Alloc>
409     {
410     private:
411       typedef _Fwd_list_base<_Tp, _Alloc>                  _Base;
412       typedef _Fwd_list_node<_Tp>                          _Node;
413       typedef _Fwd_list_node_base                          _Node_base;
414       typedef typename _Base::_Tp_alloc_type               _Tp_alloc_type;
415
416     public:
417       // types:
418       typedef _Tp                                          value_type;
419       typedef typename _Tp_alloc_type::pointer             pointer;
420       typedef typename _Tp_alloc_type::const_pointer       const_pointer;
421       typedef typename _Tp_alloc_type::reference           reference;
422       typedef typename _Tp_alloc_type::const_reference     const_reference;
423  
424       typedef _Fwd_list_iterator<_Tp>                      iterator;
425       typedef _Fwd_list_const_iterator<_Tp>                const_iterator;
426       typedef std::size_t                                  size_type;
427       typedef std::ptrdiff_t                               difference_type;
428       typedef _Alloc                                       allocator_type;
429
430       // 23.2.3.1 construct/copy/destroy:
431
432       /**
433        *  @brief  Creates a %forward_list with no elements.
434        *  @param  al  An allocator object.
435        */
436       explicit
437       forward_list(const _Alloc& __al = _Alloc())
438       : _Base(__al)
439       { }
440
441       /**
442        *  @brief  Copy constructor with allocator argument.
443        *  @param  list  Input list to copy.
444        *  @param  al    An allocator object.
445        */
446       forward_list(const forward_list& __list, const _Alloc& __al)
447       : _Base(__list, __al)
448       { }
449
450       /**
451        *  @brief  Move constructor with allocator argument.
452        *  @param  list  Input list to move.
453        *  @param  al    An allocator object.
454        */
455       forward_list(forward_list&& __list, const _Alloc& __al)
456       : _Base(std::move(__list), __al)
457       { }
458
459       /**
460        *  @brief  Creates a %forward_list with default constructed elements.
461        *  @param  n  The number of elements to initially create.
462        *
463        *  This constructor creates the %forward_list with @a n default
464        *  constructed elements.
465        */
466       explicit
467       forward_list(size_type __n)
468       : _Base()
469       { _M_default_initialize(__n); }
470
471       /**
472        *  @brief  Creates a %forward_list with copies of an exemplar element.
473        *  @param  n      The number of elements to initially create.
474        *  @param  value  An element to copy.
475        *  @param  al     An allocator object.
476        *
477        *  This constructor fills the %forward_list with @a n copies of @a
478        *  value.
479        */
480       forward_list(size_type __n, const _Tp& __value,
481                    const _Alloc& __al = _Alloc())
482       : _Base(__al)
483       { _M_fill_initialize(__n, __value); }
484
485       /**
486        *  @brief  Builds a %forward_list from a range.
487        *  @param  first  An input iterator.
488        *  @param  last   An input iterator.
489        *  @param  al     An allocator object.
490        *
491        *  Create a %forward_list consisting of copies of the elements from
492        *  [@a first,@a last).  This is linear in N (where N is
493        *  distance(@a first,@a last)).
494        */
495       template<typename _InputIterator>
496         forward_list(_InputIterator __first, _InputIterator __last,
497                      const _Alloc& __al = _Alloc())
498         : _Base(__al)
499         {
500           // Check whether it's an integral type.  If so, it's not an iterator.
501           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
502           _M_initialize_dispatch(__first, __last, _Integral());
503         }
504
505       /**
506        *  @brief  The %forward_list copy constructor.
507        *  @param  list  A %forward_list of identical element and allocator
508        *                types.
509        *
510        *  The newly-created %forward_list uses a copy of the allocation
511        *  object used by @a list.
512        */
513       forward_list(const forward_list& __list)
514       : _Base(__list._M_get_Node_allocator())
515       { _M_initialize_dispatch(__list.begin(), __list.end(), __false_type()); }
516
517       /**
518        *  @brief  The %forward_list move constructor.
519        *  @param  list  A %forward_list of identical element and allocator
520        *                types.
521        *
522        *  The newly-created %forward_list contains the exact contents of @a
523        *  forward_list. The contents of @a list are a valid, but unspecified
524        *  %forward_list.
525        */
526       forward_list(forward_list&& __list)
527       : _Base(std::move(__list)) { }
528
529       /**
530        *  @brief  Builds a %forward_list from an initializer_list
531        *  @param  il  An initializer_list of value_type.
532        *  @param  al  An allocator object.
533        *
534        *  Create a %forward_list consisting of copies of the elements
535        *  in the initializer_list @a il.  This is linear in il.size().
536        */
537       forward_list(std::initializer_list<_Tp> __il,
538                    const _Alloc& __al = _Alloc())
539       : _Base(__al)
540       { _M_initialize_dispatch(__il.begin(), __il.end(), __false_type()); }
541
542       /**
543        *  @brief  The forward_list dtor.
544        */
545       ~forward_list()
546       { }
547
548       /**
549        *  @brief  The %forward_list assignment operator.
550        *  @param  list  A %forward_list of identical element and allocator
551        *                types.
552        *
553        *  All the elements of @a list are copied, but unlike the copy
554        *  constructor, the allocator object is not copied.
555        */
556       forward_list&
557       operator=(const forward_list& __list);
558
559       /**
560        *  @brief  The %forward_list move assignment operator.
561        *  @param  list  A %forward_list of identical element and allocator
562        *                types.
563        *
564        *  The contents of @a list are moved into this %forward_list
565        *  (without copying). @a list is a valid, but unspecified
566        *  %forward_list
567        */
568       forward_list&
569       operator=(forward_list&& __list)
570       {
571         // NB: DR 1204.
572         // NB: DR 675.
573         this->clear();
574         this->swap(__list);
575         return *this;
576       }
577
578       /**
579        *  @brief  The %forward_list initializer list assignment operator.
580        *  @param  il  An initializer_list of value_type.
581        *
582        *  Replace the contents of the %forward_list with copies of the
583        *  elements in the initializer_list @a il.  This is linear in
584        *  il.size().
585        */
586       forward_list&
587       operator=(std::initializer_list<_Tp> __il)
588       {
589         assign(__il);
590         return *this;
591       }
592
593       /**
594        *  @brief  Assigns a range to a %forward_list.
595        *  @param  first  An input iterator.
596        *  @param  last   An input iterator.
597        *
598        *  This function fills a %forward_list with copies of the elements
599        *  in the range [@a first,@a last).
600        *
601        *  Note that the assignment completely changes the %forward_list and
602        *  that the resulting %forward_list's size is the same as the number
603        *  of elements assigned.  Old data may be lost.
604        */
605       template<typename _InputIterator>
606         void
607         assign(_InputIterator __first, _InputIterator __last)
608         {
609           clear();
610           insert_after(cbefore_begin(), __first, __last);
611         }
612
613       /**
614        *  @brief  Assigns a given value to a %forward_list.
615        *  @param  n  Number of elements to be assigned.
616        *  @param  val  Value to be assigned.
617        *
618        *  This function fills a %forward_list with @a n copies of the given
619        *  value.  Note that the assignment completely changes the
620        *  %forward_list and that the resulting %forward_list's size is the
621        *  same as the number of elements assigned.  Old data may be lost.
622        */
623       void
624       assign(size_type __n, const _Tp& __val)
625       {
626         clear();
627         insert_after(cbefore_begin(), __n, __val);
628       }
629
630       /**
631        *  @brief  Assigns an initializer_list to a %forward_list.
632        *  @param  il  An initializer_list of value_type.
633        *
634        *  Replace the contents of the %forward_list with copies of the
635        *  elements in the initializer_list @a il.  This is linear in
636        *  il.size().
637        */
638       void
639       assign(std::initializer_list<_Tp> __il)
640       {
641         clear();
642         insert_after(cbefore_begin(), __il);
643       }
644
645       /// Get a copy of the memory allocation object.
646       allocator_type
647       get_allocator() const
648       { return this->_M_get_Node_allocator(); }
649
650       // 23.2.3.2 iterators:
651
652       /**
653        *  Returns a read/write iterator that points before the first element
654        *  in the %forward_list.  Iteration is done in ordinary element order.
655        */
656       iterator
657       before_begin()
658       { return iterator(&this->_M_impl._M_head); }
659
660       /**
661        *  Returns a read-only (constant) iterator that points before the
662        *  first element in the %forward_list.  Iteration is done in ordinary
663        *  element order.
664        */
665       const_iterator
666       before_begin() const
667       { return const_iterator(&this->_M_impl._M_head); }
668
669       /**
670        *  Returns a read/write iterator that points to the first element
671        *  in the %forward_list.  Iteration is done in ordinary element order.
672        */
673       iterator
674       begin()
675       { return iterator(this->_M_impl._M_head._M_next); }
676
677       /**
678        *  Returns a read-only (constant) iterator that points to the first
679        *  element in the %forward_list.  Iteration is done in ordinary
680        *  element order.
681        */
682       const_iterator
683       begin() const
684       { return const_iterator(this->_M_impl._M_head._M_next); }
685
686       /**
687        *  Returns a read/write iterator that points one past the last
688        *  element in the %forward_list.  Iteration is done in ordinary
689        *  element order.
690        */
691       iterator
692       end()
693       { return iterator(0); }
694
695       /**
696        *  Returns a read-only iterator that points one past the last
697        *  element in the %forward_list.  Iteration is done in ordinary
698        *  element order.
699        */
700       const_iterator
701       end() const
702       { return const_iterator(0); }
703
704       /**
705        *  Returns a read-only (constant) iterator that points to the
706        *  first element in the %forward_list.  Iteration is done in ordinary
707        *  element order.
708        */
709       const_iterator
710       cbegin() const
711       { return const_iterator(this->_M_impl._M_head._M_next); }
712
713       /**
714        *  Returns a read-only (constant) iterator that points before the
715        *  first element in the %forward_list.  Iteration is done in ordinary
716        *  element order.
717        */
718       const_iterator
719       cbefore_begin() const
720       { return const_iterator(&this->_M_impl._M_head); }
721
722       /**
723        *  Returns a read-only (constant) iterator that points one past
724        *  the last element in the %forward_list.  Iteration is done in
725        *  ordinary element order.
726        */
727       const_iterator
728       cend() const
729       { return const_iterator(0); }
730
731       /**
732        *  Returns true if the %forward_list is empty.  (Thus begin() would
733        *  equal end().)
734        */
735       bool
736       empty() const
737       { return this->_M_impl._M_head._M_next == 0; }
738
739       /**
740        *  Returns the largest possible size of %forward_list.
741        */
742       size_type
743       max_size() const
744       { return this->_M_get_Node_allocator().max_size(); }
745
746       // 23.2.3.3 element access:
747
748       /**
749        *  Returns a read/write reference to the data at the first
750        *  element of the %forward_list.
751        */
752       reference
753       front()
754       {
755         _Node* __front = static_cast<_Node*>(this->_M_impl._M_head._M_next);
756         return __front->_M_value;
757       }
758
759       /**
760        *  Returns a read-only (constant) reference to the data at the first
761        *  element of the %forward_list.
762        */
763       const_reference
764       front() const
765       {
766         _Node* __front = static_cast<_Node*>(this->_M_impl._M_head._M_next);
767         return __front->_M_value;
768       }
769
770       // 23.2.3.4 modifiers:
771
772       /**
773        *  @brief  Constructs object in %forward_list at the front of the
774        *          list.
775        *  @param  args  Arguments.
776        *
777        *  This function will insert an object of type Tp constructed
778        *  with Tp(std::forward<Args>(args)...) at the front of the list
779        *  Due to the nature of a %forward_list this operation can
780        *  be done in constant time, and does not invalidate iterators
781        *  and references.
782        */
783       template<typename... _Args>
784         void
785         emplace_front(_Args&&... __args)
786         { this->_M_insert_after(cbefore_begin(),
787                                 std::forward<_Args>(__args)...); }
788
789       /**
790        *  @brief  Add data to the front of the %forward_list.
791        *  @param  val  Data to be added.
792        *
793        *  This is a typical stack operation.  The function creates an
794        *  element at the front of the %forward_list and assigns the given
795        *  data to it.  Due to the nature of a %forward_list this operation
796        *  can be done in constant time, and does not invalidate iterators
797        *  and references.
798        */
799       void
800       push_front(const _Tp& __val)
801       { this->_M_insert_after(cbefore_begin(), __val); }
802
803       /**
804        *
805        */
806       void
807       push_front(_Tp&& __val)
808       { this->_M_insert_after(cbefore_begin(), std::move(__val)); }
809
810       /**
811        *  @brief  Removes first element.
812        *
813        *  This is a typical stack operation.  It shrinks the %forward_list
814        *  by one.  Due to the nature of a %forward_list this operation can
815        *  be done in constant time, and only invalidates iterators/references
816        *  to the element being removed.
817        *
818        *  Note that no data is returned, and if the first element's data
819        *  is needed, it should be retrieved before pop_front() is
820        *  called.
821        */
822       void
823       pop_front()
824       { this->_M_erase_after(&this->_M_impl._M_head); }
825
826       /**
827        *  @brief  Constructs object in %forward_list after the specified
828        *          iterator.
829        *  @param  pos  A const_iterator into the %forward_list.
830        *  @param  args  Arguments.
831        *  @return  An iterator that points to the inserted data.
832        *
833        *  This function will insert an object of type T constructed
834        *  with T(std::forward<Args>(args)...) after the specified
835        *  location.  Due to the nature of a %forward_list this operation can
836        *  be done in constant time, and does not invalidate iterators
837        *  and references.
838        */
839       template<typename... _Args>
840         iterator
841         emplace_after(const_iterator __pos, _Args&&... __args)
842         { return iterator(this->_M_insert_after(__pos,
843                                           std::forward<_Args>(__args)...)); }
844
845       /**
846        *  @brief  Inserts given value into %forward_list after specified
847        *          iterator.
848        *  @param  pos  An iterator into the %forward_list.
849        *  @param  val  Data to be inserted.
850        *  @return  An iterator that points to the inserted data.
851        *
852        *  This function will insert a copy of the given value after
853        *  the specified location.  Due to the nature of a %forward_list this
854        *  operation can be done in constant time, and does not
855        *  invalidate iterators and references.
856        */
857       iterator
858       insert_after(const_iterator __pos, const _Tp& __val)
859       { return iterator(this->_M_insert_after(__pos, __val)); }
860
861       /**
862        *
863        */
864       iterator
865       insert_after(const_iterator __pos, _Tp&& __val)
866       { return iterator(this->_M_insert_after(__pos, std::move(__val))); }
867
868       /**
869        *  @brief  Inserts a number of copies of given data into the
870        *          %forward_list.
871        *  @param  pos  An iterator into the %forward_list.
872        *  @param  n  Number of elements to be inserted.
873        *  @param  val  Data to be inserted.
874        *  @return  An iterator pointing to the last inserted copy of
875        *           @a val or @a pos if @a n == 0.
876        *
877        *  This function will insert a specified number of copies of the
878        *  given data after the location specified by @a pos.
879        *
880        *  This operation is linear in the number of elements inserted and
881        *  does not invalidate iterators and references.
882        */
883       iterator
884       insert_after(const_iterator __pos, size_type __n, const _Tp& __val);
885
886       /**
887        *  @brief  Inserts a range into the %forward_list.
888        *  @param  position  An iterator into the %forward_list.
889        *  @param  first  An input iterator.
890        *  @param  last   An input iterator.
891        *  @return  An iterator pointing to the last inserted element or
892        *           @a pos if @a first == @a last.
893        *
894        *  This function will insert copies of the data in the range [@a
895        *  first,@a last) into the %forward_list after the location specified
896        *  by @a pos.
897        *
898        *  This operation is linear in the number of elements inserted and
899        *  does not invalidate iterators and references.
900        */
901       template<typename _InputIterator>
902         iterator
903         insert_after(const_iterator __pos,
904                      _InputIterator __first, _InputIterator __last);
905
906       /**
907        *  @brief  Inserts the contents of an initializer_list into
908        *          %forward_list after the specified iterator.
909        *  @param  pos  An iterator into the %forward_list.
910        *  @param  il  An initializer_list of value_type.
911        *  @return  An iterator pointing to the last inserted element
912        *           or @a pos if @a il is empty.
913        *
914        *  This function will insert copies of the data in the
915        *  initializer_list @a il into the %forward_list before the location
916        *  specified by @a pos.
917        *
918        *  This operation is linear in the number of elements inserted and
919        *  does not invalidate iterators and references.
920        */
921       iterator
922       insert_after(const_iterator __pos, std::initializer_list<_Tp> __il);
923
924       /**
925        *  @brief  Removes the element pointed to by the iterator following
926        *          @c pos.
927        *  @param  pos  Iterator pointing before element to be erased.
928        *  @return  An iterator pointing to the element following the one
929        *           that was erased, or end() if no such element exists.
930        *
931        *  This function will erase the element at the given position and
932        *  thus shorten the %forward_list by one.
933        *
934        *  Due to the nature of a %forward_list this operation can be done
935        *  in constant time, and only invalidates iterators/references to
936        *  the element being removed.  The user is also cautioned that
937        *  this function only erases the element, and that if the element
938        *  is itself a pointer, the pointed-to memory is not touched in
939        *  any way.  Managing the pointer is the user's responsibility.
940        */
941       iterator
942       erase_after(const_iterator __pos)
943       { return iterator(this->_M_erase_after(const_cast<_Node_base*>
944                                              (__pos._M_node))); }
945
946       /**
947        *  @brief  Remove a range of elements.
948        *  @param  pos  Iterator pointing before the first element to be
949        *               erased.
950        *  @param  last  Iterator pointing to one past the last element to be
951        *                erased.
952        *  @return  @last.
953        *
954        *  This function will erase the elements in the range @a
955        *  (pos,last) and shorten the %forward_list accordingly.
956        *
957        *  This operation is linear time in the size of the range and only
958        *  invalidates iterators/references to the element being removed.
959        *  The user is also cautioned that this function only erases the
960        *  elements, and that if the elements themselves are pointers, the
961        *  pointed-to memory is not touched in any way.  Managing the pointer
962        *  is the user's responsibility.
963        */
964       iterator
965       erase_after(const_iterator __pos, const_iterator __last)
966       { return iterator(this->_M_erase_after(const_cast<_Node_base*>
967                                              (__pos._M_node),
968                                              const_cast<_Node_base*>
969                                              (__last._M_node))); }
970
971       /**
972        *  @brief  Swaps data with another %forward_list.
973        *  @param  list  A %forward_list of the same element and allocator
974        *                types.
975        *
976        *  This exchanges the elements between two lists in constant
977        *  time.  Note that the global std::swap() function is
978        *  specialized such that std::swap(l1,l2) will feed to this
979        *  function.
980        */
981       void
982       swap(forward_list& __list)
983       { std::swap(this->_M_impl._M_head._M_next,
984                   __list._M_impl._M_head._M_next); }
985
986       /**
987        *  @brief Resizes the %forward_list to the specified number of
988        *         elements.
989        *  @param sz Number of elements the %forward_list should contain.
990        *
991        *  This function will %resize the %forward_list to the specified
992        *  number of elements.  If the number is smaller than the
993        *  %forward_list's current size the %forward_list is truncated,
994        *  otherwise the %forward_list is extended and the new elements
995        *  are default constructed.
996        */
997       void
998       resize(size_type __sz);
999
1000       /**
1001        *  @brief Resizes the %forward_list to the specified number of
1002        *         elements.
1003        *  @param sz Number of elements the %forward_list should contain.
1004        *  @param val Data with which new elements should be populated.
1005        *
1006        *  This function will %resize the %forward_list to the specified
1007        *  number of elements.  If the number is smaller than the
1008        *  %forward_list's current size the %forward_list is truncated,
1009        *  otherwise the %forward_list is extended and new elements are
1010        *  populated with given data.
1011        */
1012       void
1013       resize(size_type __sz, const value_type& __val);
1014
1015       /**
1016        *  @brief  Erases all the elements.
1017        *
1018        *  Note that this function only erases
1019        *  the elements, and that if the elements themselves are
1020        *  pointers, the pointed-to memory is not touched in any way.
1021        *  Managing the pointer is the user's responsibility.
1022        */
1023       void
1024       clear()
1025       { this->_M_erase_after(&this->_M_impl._M_head, 0); }
1026
1027       // 23.2.3.5 forward_list operations:
1028
1029       /**
1030        *  @brief  Insert contents of another %forward_list.
1031        *  @param  pos  Iterator referencing the element to insert after.
1032        *  @param  list  Source list.
1033        *
1034        *  The elements of @a list are inserted in constant time after
1035        *  the element referenced by @a pos.  @a list becomes an empty
1036        *  list.
1037        *
1038        *  Requires this != @a x.
1039        */
1040       void
1041       splice_after(const_iterator __pos, forward_list&& __list)
1042       {
1043         if (!__list.empty())
1044           _M_splice_after(__pos, std::move(__list));
1045       }
1046
1047       /**
1048        *  @brief  Insert element from another %forward_list.
1049        *  @param  pos  Iterator referencing the element to insert after.
1050        *  @param  list  Source list.
1051        *  @param  i   Iterator referencing the element before the element
1052        *              to move.
1053        *
1054        *  Removes the element in list @a list referenced by @a i and
1055        *  inserts it into the current list after @a pos.
1056        */
1057       void
1058       splice_after(const_iterator __pos, forward_list&& __list,
1059                    const_iterator __i)
1060       {
1061         const_iterator __j = __i;
1062         ++__j;
1063         if (__pos == __i || __pos == __j)
1064           return;
1065
1066         splice_after(__pos, std::move(__list), __i, __j);
1067       }
1068
1069       /**
1070        *  @brief  Insert range from another %forward_list.
1071        *  @param  pos  Iterator referencing the element to insert after.
1072        *  @param  list  Source list.
1073        *  @param  before  Iterator referencing before the start of range
1074        *                  in list.
1075        *  @param  last  Iterator referencing the end of range in list.
1076        *
1077        *  Removes elements in the range (before,last) and inserts them
1078        *  after @a pos in constant time.
1079        *
1080        *  Undefined if @a pos is in (before,last).
1081        */
1082       void
1083       splice_after(const_iterator __pos, forward_list&& __list,
1084                    const_iterator __before, const_iterator __last);
1085
1086       /**
1087        *  @brief  Remove all elements equal to value.
1088        *  @param  val  The value to remove.
1089        *
1090        *  Removes every element in the list equal to @a value.
1091        *  Remaining elements stay in list order.  Note that this
1092        *  function only erases the elements, and that if the elements
1093        *  themselves are pointers, the pointed-to memory is not
1094        *  touched in any way.  Managing the pointer is the user's
1095        *  responsibility.
1096        */
1097       void
1098       remove(const _Tp& __val);
1099
1100       /**
1101        *  @brief  Remove all elements satisfying a predicate.
1102        *  @param  pred  Unary predicate function or object.
1103        *
1104        *  Removes every element in the list for which the predicate
1105        *  returns true.  Remaining elements stay in list order.  Note
1106        *  that this function only erases the elements, and that if the
1107        *  elements themselves are pointers, the pointed-to memory is
1108        *  not touched in any way.  Managing the pointer is the user's
1109        *  responsibility.
1110        */
1111       template<typename _Pred>
1112         void
1113         remove_if(_Pred __pred);
1114
1115       /**
1116        *  @brief  Remove consecutive duplicate elements.
1117        *
1118        *  For each consecutive set of elements with the same value,
1119        *  remove all but the first one.  Remaining elements stay in
1120        *  list order.  Note that this function only erases the
1121        *  elements, and that if the elements themselves are pointers,
1122        *  the pointed-to memory is not touched in any way.  Managing
1123        *  the pointer is the user's responsibility.
1124        */
1125       void
1126       unique()
1127       { this->unique(std::equal_to<_Tp>()); }
1128
1129       /**
1130        *  @brief  Remove consecutive elements satisfying a predicate.
1131        *  @param  binary_pred  Binary predicate function or object.
1132        *
1133        *  For each consecutive set of elements [first,last) that
1134        *  satisfy predicate(first,i) where i is an iterator in
1135        *  [first,last), remove all but the first one.  Remaining
1136        *  elements stay in list order.  Note that this function only
1137        *  erases the elements, and that if the elements themselves are
1138        *  pointers, the pointed-to memory is not touched in any way.
1139        *  Managing the pointer is the user's responsibility.
1140        */
1141       template<typename _BinPred>
1142         void
1143         unique(_BinPred __binary_pred);
1144
1145       /**
1146        *  @brief  Merge sorted lists.
1147        *  @param  list  Sorted list to merge.
1148        *
1149        *  Assumes that both @a list and this list are sorted according to
1150        *  operator<().  Merges elements of @a list into this list in
1151        *  sorted order, leaving @a list empty when complete.  Elements in
1152        *  this list precede elements in @a list that are equal.
1153        */
1154       void
1155       merge(forward_list&& __list)
1156       { this->merge(std::move(__list), std::less<_Tp>()); }
1157
1158       /**
1159        *  @brief  Merge sorted lists according to comparison function.
1160        *  @param  list  Sorted list to merge.
1161        *  @param  comp Comparison function defining sort order.
1162        *
1163        *  Assumes that both @a list and this list are sorted according to
1164        *  comp.  Merges elements of @a list into this list
1165        *  in sorted order, leaving @a list empty when complete.  Elements
1166        *  in this list precede elements in @a list that are equivalent
1167        *  according to comp().
1168        */
1169       template<typename _Comp>
1170         void
1171         merge(forward_list&& __list, _Comp __comp);
1172
1173       /**
1174        *  @brief  Sort the elements of the list.
1175        *
1176        *  Sorts the elements of this list in NlogN time.  Equivalent
1177        *  elements remain in list order.
1178        */
1179       void
1180       sort()
1181       { this->sort(std::less<_Tp>()); }
1182
1183       /**
1184        *  @brief  Sort the forward_list using a comparison function.
1185        *
1186        *  Sorts the elements of this list in NlogN time.  Equivalent
1187        *  elements remain in list order.
1188        */
1189       template<typename _Comp>
1190         void
1191         sort(_Comp __comp);
1192
1193       /**
1194        *  @brief  Reverse the elements in list.
1195        *
1196        *  Reverse the order of elements in the list in linear time.
1197        */
1198       void
1199       reverse()
1200       { this->_M_impl._M_head._M_reverse_after(); }
1201
1202     private:
1203       template<typename _Integer>
1204         void
1205         _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1206         { _M_fill_initialize(static_cast<size_type>(__n), __x); }
1207
1208       // Called by the range constructor to implement [23.1.1]/9
1209       template<typename _InputIterator>
1210         void
1211         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1212                                __false_type);
1213
1214       // Called by forward_list(n,v,a), and the range constructor when it
1215       // turns out to be the same thing.
1216       void
1217       _M_fill_initialize(size_type __n, const value_type& __value);
1218
1219       // Called by splice_after and insert_after.
1220       iterator
1221       _M_splice_after(const_iterator __pos, forward_list&& __list);
1222
1223       // Called by forward_list(n).
1224       void
1225       _M_default_initialize(size_type __n);
1226
1227       // Called by resize(sz).
1228       void
1229       _M_default_insert_after(const_iterator __pos, size_type __n);
1230     };
1231
1232   /**
1233    *  @brief  Forward list equality comparison.
1234    *  @param  lx  A %forward_list
1235    *  @param  ly  A %forward_list of the same type as @a lx.
1236    *  @return  True iff the size and elements of the forward lists are equal.
1237    *
1238    *  This is an equivalence relation.  It is linear in the size of the
1239    *  forward lists.  Deques are considered equivalent if corresponding
1240    *  elements compare equal.
1241    */
1242   template<typename _Tp, typename _Alloc>
1243     bool
1244     operator==(const forward_list<_Tp, _Alloc>& __lx,
1245                const forward_list<_Tp, _Alloc>& __ly);
1246
1247   /**
1248    *  @brief  Forward list ordering relation.
1249    *  @param  lx  A %forward_list.
1250    *  @param  ly  A %forward_list of the same type as @a lx.
1251    *  @return  True iff @a lx is lexicographically less than @a ly.
1252    *
1253    *  This is a total ordering relation.  It is linear in the size of the
1254    *  forward lists.  The elements must be comparable with @c <.
1255    *
1256    *  See std::lexicographical_compare() for how the determination is made.
1257    */
1258   template<typename _Tp, typename _Alloc>
1259     inline bool
1260     operator<(const forward_list<_Tp, _Alloc>& __lx,
1261               const forward_list<_Tp, _Alloc>& __ly)
1262     { return std::lexicographical_compare(__lx.cbegin(), __lx.cend(),
1263                                           __ly.cbegin(), __ly.cend()); }
1264
1265   /// Based on operator==
1266   template<typename _Tp, typename _Alloc>
1267     inline bool
1268     operator!=(const forward_list<_Tp, _Alloc>& __lx,
1269                const forward_list<_Tp, _Alloc>& __ly)
1270     { return !(__lx == __ly); }
1271
1272   /// Based on operator<
1273   template<typename _Tp, typename _Alloc>
1274     inline bool
1275     operator>(const forward_list<_Tp, _Alloc>& __lx,
1276               const forward_list<_Tp, _Alloc>& __ly)
1277     { return (__ly < __lx); }
1278
1279   /// Based on operator<
1280   template<typename _Tp, typename _Alloc>
1281     inline bool
1282     operator>=(const forward_list<_Tp, _Alloc>& __lx,
1283                const forward_list<_Tp, _Alloc>& __ly)
1284     { return !(__lx < __ly); }
1285
1286   /// Based on operator<
1287   template<typename _Tp, typename _Alloc>
1288     inline bool
1289     operator<=(const forward_list<_Tp, _Alloc>& __lx,
1290                const forward_list<_Tp, _Alloc>& __ly)
1291     { return !(__ly < __lx); }
1292
1293   /// See std::forward_list::swap().
1294   template<typename _Tp, typename _Alloc>
1295     inline void
1296     swap(forward_list<_Tp, _Alloc>& __lx,
1297          forward_list<_Tp, _Alloc>& __ly)
1298     { __lx.swap(__ly); }
1299
1300 _GLIBCXX_END_NAMESPACE_CONTAINER
1301 } // namespace std
1302
1303 #endif // _FORWARD_LIST_H