19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers.
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *   You should not attempt to use it directly.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_LIST_IMPL_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_LIST_IMPL_H
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_algobase.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_alloc.h>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_H
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_iterator.h>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CONSTRUCT_H
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_construct.h>
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_function_base.h>
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _List_node_base {
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_node_base* _M_next;
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_node_base* _M_prev;
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Dummy>
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _List_global {
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_node_base _Node_base;
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void  _STLP_CALL _Transfer(_Node_base* __pos,
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    _Node_base* __first, _Node_base* __last);
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPORT)
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS _List_global<bool>;
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef _List_global<bool> _List_global_inst;
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _List_node : public _List_node_base {
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp _M_data;
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __TRIVIAL_STUFF(_List_node)
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _List_iterator_base {
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t                     size_type;
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t                  difference_type;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef bidirectional_iterator_tag iterator_category;
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_node_base* _M_node;
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_incr() { _M_node = _M_node->_M_next; }
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_decr() { _M_node = _M_node->_M_prev; }
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _Tp, class _Traits>
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _List_iterator : public _List_iterator_base {
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::pointer    pointer;
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::reference  reference;
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_iterator<_Tp, _Traits>         _Self;
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::_NonConstTraits    _NonConstTraits;
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_iterator<_Tp, _NonConstTraits> iterator;
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::_ConstTraits       _ConstTraits;
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_iterator<_Tp, _ConstTraits>    const_iterator;
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef bidirectional_iterator_tag iterator_category;
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_node<_Tp> _Node;
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit _List_iterator(_List_node_base* __x) : _List_iterator_base(__x) {}
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_iterator() : _List_iterator_base(0) {}
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //copy constructor for iterator and constructor from iterator for const_iterator
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_iterator(const iterator& __x) :  _List_iterator_base(__x._M_node) {}
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator*() const { return __STATIC_CAST(_Node*, this->_M_node)->_M_data; }
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEFINE_ARROW_OPERATOR
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator++() {
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_incr();
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator++(int) {
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_incr();
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator--() {
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_decr();
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator--(int) {
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_decr();
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator==(const_iterator __y ) const {
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_node == __y._M_node;
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator!=(const_iterator __y ) const {
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_node != __y._M_node;
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<_STLP_PRIV _List_iterator<_Tp, _Traits> > {
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type   has_trivial_default_constructor;
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_copy_constructor;
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_assignment_operator;
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_destructor;
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type   is_POD_type;
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp* value_type(const _STLP_PRIV _List_iterator<_Tp, _Traits>&) { return 0; }
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bidirectional_iterator_tag iterator_category(const _STLP_PRIV _List_iterator_base&) { return bidirectional_iterator_tag();}
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline ptrdiff_t* distance_type(const _STLP_PRIV _List_iterator_base&) { return 0; }
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class that encapsulates details of allocators and helps
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// to simplify EH
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _List_base {
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_node_base _Node_base;
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_node<_Tp> _Node;
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _List_base<_Tp, _Alloc> _Self;
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type _Node_allocator_type;
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_alloc_proxy<_Node_base, _Node, _Node_allocator_type> _AllocProxy;
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef _Alloc allocator_type;
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _STLP_CONVERT_ALLOCATOR((const _Node_allocator_type&)_M_node, _Tp); }
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_base(const allocator_type& __a) : _M_node(_STLP_CONVERT_ALLOCATOR(__a, _Node), _Node_base())
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_empty_initialize(); }
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _List_base(__move_source<_Self> src) :
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node(__move_source<_AllocProxy>(src.get()._M_node)) {
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (src.get().empty())
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //We force this to empty.
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_empty_initialize();
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      src.get()._M_empty_initialize();
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_node._M_data._M_prev->_M_next = _M_node._M_data._M_next->_M_prev = &_M_node._M_data;
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~_List_base()
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { clear(); }
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void clear();
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool empty() const { return _M_node._M_data._M_next == &_M_node._M_data; }
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_empty_initialize() {
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node._M_data._M_next = &_M_node._M_data;
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node._M_data._M_prev = _M_node._M_data._M_next;
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _AllocProxy _M_node;
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define list _STLP_PTR_IMPL_NAME(list)
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_DEBUG)
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define list _STLP_NON_DBG_NAME(list)
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass list;
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (list)
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// helper functions to reduce code duplication
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _Predicate>
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred);
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _BinaryPredicate>
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _StrictWeakOrdering>
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              _StrictWeakOrdering __comp);
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _StrictWeakOrdering>
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (list)
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass list : public _STLP_PRIV _List_base<_Tp, _Alloc>
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (list)
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           , public __stlport_class<list<_Tp, _Alloc> >
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _List_base<_Tp, _Alloc> _Base;
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef list<_Tp, _Alloc> _Self;
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _List_node<_Tp> _Node;
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _List_node_base _Node_base;
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type* pointer;
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type* const_pointer;
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type& reference;
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type& const_reference;
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::allocator_type allocator_type;
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef bidirectional_iterator_tag _Iterator_category;
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node_base* _M_create_node(const_reference __x = value_type()) {
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node_base* _M_create_node(const_reference __x) {
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __p = this->_M_node.allocate(1);
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(&__p->_M_data, __x);
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_node.deallocate(__p, 1))
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __p;
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_DONT_SUP_DFLT_PARAM)
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node_base* _M_create_node() {
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __p = this->_M_node.allocate(1);
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Construct(&__p->_M_data);
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_node.deallocate(__p, 1))
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __p;
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit list(size_type __n, const_reference __val = _STLP_DEFAULT_CONSTRUCTED(value_type),
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                const allocator_type& __a = allocator_type())
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit list(size_type __n)
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { this->insert(begin(), __n, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(size_type __n, const_reference __val)
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { this->insert(begin(), __n, __val); }
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(size_type __n, const_reference __val, const allocator_type& __a)
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { this->insert(begin(), __n, __val); }
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // We don't need any dispatching tricks here, because insert does all of
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // that anyway.
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(_InputIterator __first, _InputIterator __last,
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_insert(begin(), __first, __last); }
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(_InputIterator __first, _InputIterator __last)
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_insert(begin(), __first, __last); }
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(const value_type* __first, const value_type* __last,
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       const allocator_type& __a = allocator_type())
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert(begin(), __first, __last); }
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(const_iterator __first, const_iterator __last,
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       const allocator_type& __a = allocator_type())
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert(begin(), __first, __last); }
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit list(const allocator_type& __a = allocator_type())
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list()
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type()) {}
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(const allocator_type& __a)
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a) {}
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(const _Self& __x) : _STLP_PRIV _List_base<_Tp, _Alloc>(__x.get_allocator())
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_insert(begin(), __x.begin(), __x.end()); }
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  list(__move_source<_Self> src)
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _List_base<_Tp, _Alloc>(__move_source<_Base>(src.get())) {}
361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~list() {}
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator = (const _Self& __x);
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator begin()                      { return iterator(this->_M_node._M_data._M_next); }
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator begin() const          { return const_iterator(this->_M_node._M_data._M_next); }
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator end()                        { return iterator(&this->_M_node._M_data); }
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator end() const            { return const_iterator(__CONST_CAST(_Node_base*, &this->_M_node._M_data)); }
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rbegin()             { return reverse_iterator(end()); }
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rend()               { return reverse_iterator(begin()); }
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rend() const   { return const_reverse_iterator(begin()); }
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type size() const {
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __result = _STLP_STD::distance(begin(), end());
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __result;
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type max_size() const { return size_type(-1); }
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference front()             { return *begin(); }
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference front() const { return *begin(); }
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference back()              { return *(--end()); }
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference back() const  { return *(--end()); }
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_swap_aux(_Self& __x) {
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __x._M_node._M_swap_alloc(this->_M_node);
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __x._M_node._M_data._M_next = this->_M_node._M_data._M_next;
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __x._M_node._M_data._M_next->_M_prev = &__x._M_node._M_data;
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __x._M_node._M_data._M_prev = this->_M_node._M_data._M_prev;
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __x._M_node._M_data._M_prev->_M_next = &__x._M_node._M_data;
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_empty_initialize();
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void swap(_Self& __x) {
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__x.empty()) {
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (this->empty()) {
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return;
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_swap_aux(__x);
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } else if (this->empty()) {
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x._M_swap_aux(*this);
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } else {
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_node.swap(__x._M_node);
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::swap(this->_M_node._M_data._M_prev->_M_next, __x._M_node._M_data._M_prev->_M_next);
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::swap(this->_M_node._M_data._M_next->_M_prev, __x._M_node._M_data._M_next->_M_prev);
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_swap_workaround(_Self& __x) { swap(__x); }
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iterator insert(iterator __pos, const_reference __x = value_type())
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  iterator insert(iterator __pos, const_reference __x)
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __tmp = _M_create_node(__x);
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __n = __pos._M_node;
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __p = __n->_M_prev;
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __tmp->_M_next = __n;
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __tmp->_M_prev = __p;
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __p->_M_next = __tmp;
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __n->_M_prev = __tmp;
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return iterator(__tmp);
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_dispatch(__pos, __first, __last, _Integral());
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template<class _Integer>
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/) {
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_insert(__pos, __n, __x);
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos,
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIter __first, _InputIter __last,
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(iterator __pos, const value_type* __first, const value_type* __last) {
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __first != __last; ++__first)
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__pos, *__first);
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(iterator __pos, const_iterator __first, const_iterator __last) {
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //We use a temporary list to avoid the auto reference troubles (infinite loop)
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __first != __last; ++__first)
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__pos, *__first);
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_splice_insert_dispatch(__pos, __first, __last, _Integral());
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template<class _Integer>
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/) {
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_insert(__pos, __n, __x);
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_insert_dispatch(iterator __pos,
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIter __first, _InputIter __last,
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, const value_type* __first, const value_type* __last) {
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp(__first, __last, this->get_allocator());
487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_ASSERT(__tmp.get_allocator() == this->get_allocator())
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    splice(__pos, __tmp);
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, const_iterator __first, const_iterator __last) {
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //We use a temporary list to avoid the auto reference troubles (infinite loop)
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp(__first, __last, this->get_allocator());
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    splice(__pos, __tmp);
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, size_type __n, const_reference __x)
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_insert(__pos, __n, __x); }
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_insert(iterator __pos, size_type __n, const_reference __x) {
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __n > 0; --__n)
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__pos, __x);
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const_reference __x) { insert(begin(), __x); }
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back (const_reference __x) { insert(end(), __x); }
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos)
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front() {insert(begin());}
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back() {insert(end());}
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __pos) {
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __next_node = __pos._M_node->_M_next;
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __prev_node = __pos._M_node->_M_prev;
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __n = __STATIC_CAST(_Node*, __pos._M_node);
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __prev_node->_M_next = __next_node;
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __next_node->_M_prev = __prev_node;
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(&__n->_M_data);
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_node.deallocate(__n, 1);
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return iterator(__next_node);
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __first, iterator __last) {
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__first != __last)
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(__first++);
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __last;
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size, const_reference __x = value_type());
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size, const_reference __x);
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size)
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { this->resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM*/
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_front() { erase(begin()); }
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_back() {
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __tmp = end();
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    erase(--__tmp);
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // assign(), a generalized assignment member function.  Two
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // versions: one that takes a count, and one that takes a range.
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The range version is a member template, so we dispatch on whether
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // or not the type is an integer.
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(size_type __n, const_reference __val) { _M_fill_assign(__n, __val); }
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_assign(size_type __n, const_reference __val);
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(_InputIterator __first, _InputIterator __last) {
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_dispatch(__first, __last, _Integral());
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_Integer __n, _Integer __val,
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/) {
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_assign(__n, __val);
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const value_type *__first2, const value_type *__last2) {
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __first1 = begin();
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __last1 = end();
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__first1 = *__first2;
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first2 == __last2)
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(__first1, __last1);
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__last1, __first2, __last2);
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const_iterator __first2, const_iterator __last2) {
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __first1 = begin();
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __last1 = end();
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__first1 = *__first2;
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first2 == __last2)
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(__first1, __last1);
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__last1, __first2, __last2);
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice(iterator __pos, _Self& __x) {
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!__x.empty()) {
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (this->get_allocator() == __x.get_allocator()) {
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV _List_global_inst::_Transfer(__pos._M_node, __x.begin()._M_node, __x.end()._M_node);
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        insert(__pos, __x.begin(), __x.end());
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __x.clear();
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice(iterator __pos, _Self& __x, iterator __i) {
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __j = __i;
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__j;
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__pos == __i || __pos == __j) return;
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->get_allocator() == __x.get_allocator()) {
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV _List_global_inst::_Transfer(__pos._M_node, __i._M_node, __j._M_node);
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__pos, *__i);
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x.erase(__i);
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice(iterator __pos, _Self& __x, iterator __first, iterator __last) {
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last) {
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (this->get_allocator() == __x.get_allocator()) {
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV _List_global_inst::_Transfer(__pos._M_node, __first._M_node, __last._M_node);
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        insert(__pos, __first, __last);
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __x.erase(__first, __last);
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void remove(const_reference __val) {
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __first = begin();
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __last = end();
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__first != __last) {
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __next = __first;
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__next;
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__val == *__first) erase(__first);
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __first = __next;
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void unique()
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _S_unique(*this, equal_to<value_type>()); }
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void merge(_Self& __x)
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _S_merge(*this, __x, less<value_type>()); }
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void reverse() {
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __p = &this->_M_node._M_data;
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __tmp = __p;
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    do {
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::swap(__tmp->_M_next, __tmp->_M_prev);
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = __tmp->_M_prev;     // Old next node is now prev.
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } while (__tmp != __p);
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void sort()
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _S_sort(*this, less<value_type>()); }
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Predicate>
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void remove_if(_Predicate __pred)
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _S_remove_if(*this, __pred); }
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _BinaryPredicate>
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void unique(_BinaryPredicate __binary_pred)
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _S_unique(*this, __binary_pred); }
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _StrictWeakOrdering>
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void merge(_Self& __x,
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block             _StrictWeakOrdering __comp) {
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_PRIV _S_merge(*this, __x, __comp);
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _StrictWeakOrdering>
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void sort(_StrictWeakOrdering __comp)
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _S_sort(*this, __comp); }
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (list)
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef list
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_list.c>
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/pointers/_list.h>
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/debug/_list.h>
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP bool  _STLP_CALL
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y) {
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename list<_Tp,_Alloc>::const_iterator const_iterator;
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __end1 = __x.end();
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __end2 = __y.end();
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __i1 = __x.begin();
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __i2 = __y.begin();
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__i1;
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__i2;
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __i1 == __end1 && __i2 == __end2;
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_EQUAL_OPERATOR_SPECIALIZED
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_CONTAINER list<_Tp, _Alloc>
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_relops_cont.h>
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_CONTAINER
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_HEADER
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_EQUAL_OPERATOR_SPECIALIZED
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
728e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC)
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __move_traits<list<_Tp, _Alloc> > {
731e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef __true_type implemented;
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Alloc>::complete complete;
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_LIST_IMPL_H */
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
743