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