19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers.
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *   You should not attempt to use it directly.
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_SLIST_H
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_SLIST_H
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_algobase.h>
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_alloc.h>
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_H
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_iterator.h>
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CONSTRUCT_H
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_construct.h>
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_function_base.h>
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_SLIST_BASE_H
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_slist_base.h>
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Slist_node : public _Slist_node_base {
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp _M_data;
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __TRIVIAL_STUFF(_Slist_node)
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Slist_iterator_base {
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t               size_type;
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t            difference_type;
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef forward_iterator_tag iterator_category;
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_node_base *_M_node;
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_iterator_base(_Slist_node_base *__x) : _M_node(__x) {}
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_incr() {
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node = _M_node->_M_next;
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Slist_iterator : public _Slist_iterator_base {
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::value_type value_type;
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::pointer    pointer;
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::reference  reference;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef forward_iterator_tag iterator_category;
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Slist_iterator<_Tp, _Traits>         _Self;
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::_NonConstTraits     _NonConstTraits;
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Slist_iterator<_Tp, _NonConstTraits> iterator;
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::_ConstTraits        _ConstTraits;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Slist_iterator<_Tp, _ConstTraits>    const_iterator;
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Slist_node<value_type> _Node;
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit _Slist_iterator(_Slist_node_base *__x) : _Slist_iterator_base(__x) {}
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_iterator() : _Slist_iterator_base(0) {}
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //copy constructor for iterator and constructor from iterator for const_iterator
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_iterator(const iterator& __x) : _Slist_iterator_base(__x._M_node) {}
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator*() const { return __STATIC_CAST(_Node*, this->_M_node)->_M_data; }
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEFINE_ARROW_OPERATOR
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator++() {
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_incr();
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator++(int) {
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_incr();
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator==(const_iterator __y ) const {
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_node == __y._M_node;
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator!=(const_iterator __y ) const {
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_node != __y._M_node;
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<_STLP_PRIV _Slist_iterator<_Tp, _Traits> > {
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type   has_trivial_default_constructor;
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_copy_constructor;
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_assignment_operator;
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_destructor;
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type   is_POD_type;
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp* _STLP_CALL value_type(const _STLP_PRIV _Slist_iterator<_Tp, _Traits>&) { return __STATIC_CAST(_Tp*, 0); }
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline ptrdiff_t* _STLP_CALL distance_type(const _STLP_PRIV _Slist_iterator_base&) { return 0; }
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline forward_iterator_tag _STLP_CALL iterator_category(const _STLP_PRIV _Slist_iterator_base&) { return forward_iterator_tag(); }
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* OLD_QUERIES */
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class that encapsulates details of allocators and simplifies EH
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Slist_base {
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Slist_node<_Tp> _Node;
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Alloc_traits<_Node,_Alloc>::allocator_type _M_node_allocator_type;
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Slist_base<_Tp, _Alloc> _Self;
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_alloc_proxy<_Slist_node_base, _Node, _M_node_allocator_type> _AllocProxy;
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef _Alloc allocator_type;
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_base(const allocator_type& __a) :
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_head(_STLP_CONVERT_ALLOCATOR(__a, _Node), _Slist_node_base() )
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { _M_head._M_data._M_next = 0; }
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_base(__move_source<_Self> src) :
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_head(__move_source<_AllocProxy>(src.get()._M_head))
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { src.get()._M_head._M_data._M_next = 0; }
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~_Slist_base() { _M_erase_after(&_M_head._M_data, 0); }
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_node_base* _M_erase_after(_Slist_node_base* __pos) {
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __next = __STATIC_CAST(_Node*, __pos->_M_next);
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Slist_node_base* __next_next = __next->_M_next;
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos->_M_next = __next_next;
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(&__next->_M_data);
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_head.deallocate(__next,1);
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __next_next;
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*);
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _STLP_CONVERT_ALLOCATOR((const _M_node_allocator_type&)_M_head, _Tp); }
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _AllocProxy _M_head;
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define slist _STLP_PTR_IMPL_NAME(slist)
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_DEBUG)
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define slist _STLP_NON_DBG_NAME(slist)
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass slist;
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (slist)
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// helper functions to reduce code duplication
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _BinaryPredicate>
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Slist_unique(slist<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _StrictWeakOrdering>
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Slist_merge(slist<_Tp, _Alloc>& __that, slist<_Tp, _Alloc>& __x,
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _StrictWeakOrdering __comp);
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc, class _StrictWeakOrdering>
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Slist_sort(slist<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (slist)
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass slist : protected _STLP_PRIV _Slist_base<_Tp,_Alloc>
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (slist)
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            , public __stlport_class<slist<_Tp, _Alloc> >
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Slist_base<_Tp,_Alloc> _Base;
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef slist<_Tp,_Alloc> _Self;
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp                value_type;
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type*       pointer;
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type* const_pointer;
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type&       reference;
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type& const_reference;
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t            size_type;
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t         difference_type;
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef forward_iterator_tag _Iterator_category;
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Slist_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Slist_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::allocator_type allocator_type;
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Slist_node<_Tp> _Node;
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Slist_node_base _Node_base;
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined(_STLP_DONT_SUP_DFLT_PARAM)
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node* _M_create_node(const value_type& __x = _Tp()) {
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node* _M_create_node(const value_type& __x) {
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __node = this->_M_head.allocate(1);
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(&__node->_M_data, __x);
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __node->_M_next = 0;
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_head.deallocate(__node, 1))
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __node;
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_DONT_SUP_DFLT_PARAM)
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node* _M_create_node() {
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __node = this->_M_head.allocate(1);
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Construct(&__node->_M_data);
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __node->_M_next = 0;
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_head.deallocate(__node, 1))
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __node;
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const { return _Base::get_allocator(); }
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit slist(const allocator_type& __a = allocator_type())
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist()
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type()) {}
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(const allocator_type& __a)
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a) {}
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit slist(size_type __n, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp),
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const allocator_type& __a =  allocator_type())
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit slist(size_type __n)
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type())
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_fill(&this->_M_head._M_data, __n, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(size_type __n, const value_type& __x)
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type())
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_fill(&this->_M_head._M_data, __n, __x); }
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(size_type __n, const value_type& __x, const allocator_type& __a)
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a)
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_fill(&this->_M_head._M_data, __n, __x); }
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // We don't need any dispatching tricks here, because _M_insert_after_range
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // already does them.
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(_InputIterator __first, _InputIterator __last,
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a)
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // VC++ needs this crazyness
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(_InputIterator __first, _InputIterator __last)
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type())
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(const_iterator __first, const_iterator __last,
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a =  allocator_type() )
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a)
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(const value_type* __first, const value_type* __last,
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a =  allocator_type())
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a)
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(const _Self& __x)
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__x.get_allocator())
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_insert_after_range(&this->_M_head._M_data, __x.begin(), __x.end()); }
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  slist(__move_source<_Self> src)
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Slist_base<_Tp, _Alloc>(__move_source<_Base>(src.get())) {}
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (const _Self& __x);
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~slist() {}
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // assign(), a generalized assignment member function.  Two
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // versions: one that takes a count, and one that takes a range.
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The range version is a member template, so we dispatch on whether
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // or not the type is an integer.
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_assign(size_type __n, const _Tp& __val);
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(_InputIterator __first, _InputIterator __last) {
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_dispatch(__first, __last, _Integral());
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_Integer __n, _Integer __val,
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/) {
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_assign((size_type) __n, (_Tp) __val);
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_InputIter __first, _InputIter __last,
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const_pointer __first, const_pointer __last) {
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __prev = &this->_M_head._M_data;
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __node = this->_M_head._M_data._M_next;
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__node != 0 && __first != __last) {
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __STATIC_CAST(_Node*, __node)->_M_data = *__first;
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __prev = __node;
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __node = __node->_M_next;
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last)
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_insert_after_range(__prev, __first, __last);
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_erase_after(__prev, 0);
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const_iterator __first, const_iterator __last) {
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __prev = &this->_M_head._M_data;
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __node = this->_M_head._M_data._M_next;
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__node != 0 && __first != __last) {
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __STATIC_CAST(_Node*, __node)->_M_data = *__first;
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __prev = __node;
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __node = __node->_M_next;
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last)
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_insert_after_range(__prev, __first, __last);
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_erase_after(__prev, 0);
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Experimental new feature: before_begin() returns a
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // non-dereferenceable iterator that, when incremented, yields
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // begin().  This iterator may be used as the argument to
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // insert_after, erase_after, etc.  Note that even for an empty
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // slist, before_begin() is not the same iterator as end().  It
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // is always necessary to increment before_begin() at least once to
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // obtain end().
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator before_begin() { return iterator(&this->_M_head._M_data); }
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator before_begin() const
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return const_iterator(__CONST_CAST(_Node_base*, &this->_M_head._M_data)); }
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator begin() { return iterator(this->_M_head._M_data._M_next); }
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator begin() const
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return const_iterator(this->_M_head._M_data._M_next);}
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator end() { return iterator(); }
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator end() const { return const_iterator(); }
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type size() const
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _STLP_PRIV _Sl_global_inst::size(this->_M_head._M_data._M_next); }
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type max_size() const { return size_type(-1); }
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool empty() const { return this->_M_head._M_data._M_next == 0; }
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void swap(_Self& __x)
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { this->_M_head.swap(__x._M_head); }
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_swap_workaround(_Self& __x) { swap(__x); }
434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference front()             { return *begin(); }
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference front() const { return *begin(); }
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const value_type& __x = _Tp())   {
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const value_type& __x)   {
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_PRIV __slist_make_link(&this->_M_head._M_data, _M_create_node(__x));
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front() { _STLP_PRIV __slist_make_link(&this->_M_head._M_data, _M_create_node());}
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_front() {
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node* __node = __STATIC_CAST(_Node*, this->_M_head._M_data._M_next);
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_head._M_data._M_next = __node->_M_next;
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(&__node->_M_data);
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_head.deallocate(__node, 1);
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator previous(const_iterator __pos) {
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return iterator(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node));
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator previous(const_iterator __pos) const {
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return const_iterator(__CONST_CAST(_Node_base*,
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data,
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                                               __pos._M_node)));
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node* _M_insert_after(_Node_base* __pos, const value_type& __x = _Tp()) {
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node* _M_insert_after(_Node_base* __pos, const value_type& __x) {
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __STATIC_CAST(_Node*, _STLP_PRIV __slist_make_link(__pos, _M_create_node(__x)));
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Node* _M_insert_after(_Node_base* __pos) {
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __STATIC_CAST(_Node*, _STLP_PRIV __slist_make_link(__pos, _M_create_node()));
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_after_fill(_Node_base* __pos,
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            size_type __n, const value_type& __x) {
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (size_type __i = 0; __i < __n; ++__i)
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(__x));
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_after_range(_Node_base* __pos,
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InIter __first, _InIter __last) {
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InIter>::_Ret _Integral;
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_range(__pos, __first, __last, _Integral());
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x,
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const __true_type&) {
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_fill(__pos, __n, __x);
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_after_range(_Node_base* __pos,
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InIter __first, _InIter __last,
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const __false_type&) {
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_after_range(_Node_base* __pos,
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const value_type* __first,
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const value_type* __last) {
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__first != __last) {
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first));
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_after_range(_Node_base* __pos,
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const_iterator __first, const_iterator __last) {
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__first != __last) {
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first));
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_after_range(_Node_base* __pos,
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InIter __first, _InIter __last) {
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InIter>::_Ret _Integral;
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_splice_after_range(__pos, __first, __last, _Integral());
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_after_range(_Node_base* __pos, _Integer __n, _Integer __x,
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const __true_type&) {
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_fill(__pos, __n, __x);
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_after_range(_Node_base* __pos,
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InIter __first, _InIter __last,
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const __false_type&) {
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_after_range(_Node_base* __pos,
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const value_type* __first,
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const value_type* __last) {
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__first != __last) {
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first));
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_after_range(_Node_base* __pos,
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             const_iterator __first, const_iterator __last) {
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //We use a temporary slist to avoid the auto reference troubles (infinite loop)
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp(__first, __last, this->get_allocator());
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    splice_after(iterator(__pos), __tmp);
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_range(_Node_base* __pos,
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       _InIter __first, _InIter __last) {
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InIter>::_Ret _Integral;
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_splice_range(__pos, __first, __last, _Integral());
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_range(_Node_base* __pos, _Integer __n, _Integer __x,
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const __true_type&) {
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_fill(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos),
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                         __n, __x);
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_range(_Node_base* __pos,
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       _InIter __first, _InIter __last,
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const __false_type&) {
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_range(_Node_base* __pos,
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const value_type* __first,
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const value_type* __last) {
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__first != __last) {
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = _STLP_PRIV __slist_make_link(__pos, _M_create_node(*__first));
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_splice_range(_Node_base* __pos,
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const_iterator __first, const_iterator __last) {
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //We use a temporary slist to avoid the auto reference troubles (infinite loop)
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp(__first, __last, this->get_allocator());
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    splice(iterator(__pos), __tmp);
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert_after(iterator __pos, const value_type& __x = _Tp()) {
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert_after(iterator __pos, const value_type& __x) {
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return iterator(_M_insert_after(__pos._M_node, __x));
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert_after(iterator __pos) {
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return insert_after(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp));
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert_after(iterator __pos, size_type __n, const value_type& __x) {
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_fill(__pos._M_node, __n, __x);
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // We don't need any dispatching tricks here, because _M_insert_after_range
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // already does them.
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert_after(iterator __pos, _InIter __first, _InIter __last) {
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert_after(iterator __pos,
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const value_type* __first, const value_type* __last) {
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_range(__pos._M_node, __first, __last);
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert_after(iterator __pos,
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const_iterator __first, const_iterator __last) {
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_splice_after_range(__pos._M_node, __first, __last);
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const value_type& __x = _Tp()) {
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const value_type& __x) {
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return iterator(_M_insert_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    __x));
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos) {
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return iterator(_M_insert_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    _STLP_DEFAULT_CONSTRUCTED(_Tp)));
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, size_type __n, const value_type& __x) {
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_fill(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __n, __x);
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // We don't need any dispatching tricks here, because _M_insert_after_range
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // already does them.
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InIter>
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, _InIter __first, _InIter __last) {
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, const value_type* __first,
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const value_type* __last) {
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_after_range(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          __first, __last);
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, const_iterator __first, const_iterator __last) {
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_splice_range(__pos._M_node, __first, __last);
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase_after(iterator __pos)
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return iterator(this->_M_erase_after(__pos._M_node)); }
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase_after(iterator __before_first, iterator __last)
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return iterator(this->_M_erase_after(__before_first._M_node, __last._M_node)); }
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __pos)
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return iterator(this->_M_erase_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node))); }
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __first, iterator __last)
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return iterator(this->_M_erase_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __first._M_node), __last._M_node)); }
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type new_size, const value_type& __x = _Tp());
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type new_size, const value_type& __x);
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type new_size) { resize(new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void clear()
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { this->_M_erase_after(&this->_M_head._M_data, 0); }
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Moves the range [__before_first + 1, __before_last + 1) to *this,
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  inserting it immediately after __pos.  This is constant time.
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice_after(iterator __pos, _Self& __x,
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    iterator __before_first, iterator __before_last) {
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__before_first != __before_last) {
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (this->get_allocator() == __x.get_allocator()) {
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV _Sl_global_inst::__splice_after(__pos._M_node,
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   __before_first._M_node, __before_last._M_node);
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->insert_after(__pos, iterator(__before_first._M_node->_M_next), iterator(__before_last._M_node->_M_next));
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __x.erase_after(__before_first, ++__before_last);
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Moves the element that follows __prev to *this, inserting it immediately
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  after __pos.  This is constant time.
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice_after(iterator __pos, _Self& __x, iterator __prev) {
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->get_allocator() == __x.get_allocator()) {
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV _Sl_global_inst::__splice_after(__pos._M_node,
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                 __prev._M_node, __prev._M_node->_M_next);
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->insert_after(__pos, __STATIC_CAST(_Node*, __prev._M_node->_M_next)->_M_data);
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x.erase_after(__prev);
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Removes all of the elements from the list __x to *this, inserting
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // them immediately after __pos.  __x must not be *this.  Complexity:
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // linear in __x.size().
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice_after(iterator __pos, _Self& __x) {
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->get_allocator() == __x.get_allocator())
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV _Sl_global_inst::__splice_after(__pos._M_node, &__x._M_head._M_data);
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->insert_after(__pos, __x.begin(), __x.end());
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x.clear();
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Linear in distance(begin(), __pos), and linear in __x.size().
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice(iterator __pos, _Self& __x) {
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__x._M_head._M_data._M_next) {
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (this->get_allocator() == __x.get_allocator()) {
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV _Sl_global_inst::__splice_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   &__x._M_head._M_data,
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   _STLP_PRIV _Sl_global_inst::__previous(&__x._M_head._M_data, 0));
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        insert(__pos, __x.begin(), __x.end());
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __x.clear();
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i).
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice(iterator __pos, _Self& __x, iterator __i) {
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->get_allocator() == __x.get_allocator()) {
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV _Sl_global_inst::__splice_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                 _STLP_PRIV _Sl_global_inst::__previous(&__x._M_head._M_data, __i._M_node),
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                 __i._M_node);
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(__pos, *__i);
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x.erase(__i);
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Linear in distance(begin(), __pos), in distance(__x.begin(), __first),
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // and in distance(__first, __last).
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void splice(iterator __pos, _Self& __x, iterator __first, iterator __last) {
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last) {
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (this->get_allocator() == __x.get_allocator()) {
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV _Sl_global_inst::__splice_after(_STLP_PRIV _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   _STLP_PRIV _Sl_global_inst::__previous(&__x._M_head._M_data, __first._M_node),
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   _STLP_PRIV _Sl_global_inst::__previous(__first._M_node, __last._M_node));
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        insert(__pos, __first, __last);
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __x.erase(__first, __last);
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void reverse() {
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_head._M_data._M_next)
7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_head._M_data._M_next = _STLP_PRIV _Sl_global_inst::__reverse(this->_M_head._M_data._M_next);
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void remove(const _Tp& __val);
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void unique() { _STLP_PRIV _Slist_unique(*this, equal_to<value_type>()); }
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void merge(_Self& __x) { _STLP_PRIV _Slist_merge(*this, __x, less<value_type>()); }
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void sort() { _STLP_PRIV _Slist_sort(*this, less<value_type>()); }
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Predicate>
7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void remove_if(_Predicate __pred) {
7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Node_base* __cur = &this->_M_head._M_data;
7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__cur->_M_next) {
7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__pred(__STATIC_CAST(_Node*, __cur->_M_next)->_M_data))
7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_erase_after(__cur);
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __cur = __cur->_M_next;
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _BinaryPredicate>
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void unique(_BinaryPredicate __pred)
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _Slist_unique(*this, __pred); }
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _StrictWeakOrdering>
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void merge(_Self& __x, _StrictWeakOrdering __comp)
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _Slist_merge(*this, __x, __comp); }
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _StrictWeakOrdering>
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void sort(_StrictWeakOrdering __comp)
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV _Slist_sort(*this, __comp); }
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (slist)
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef slist
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_slist.c>
8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/pointers/_slist.h>
8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/debug/_slist.h>
8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL
8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator == (const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2) {
8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename slist<_Tp,_Alloc>::const_iterator const_iterator;
8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __end1 = _SL1.end();
8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __end2 = _SL2.end();
8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __i1 = _SL1.begin();
8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator __i2 = _SL2.begin();
8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__i1;
8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__i2;
8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __i1 == __end1 && __i2 == __end2;
8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_EQUAL_OPERATOR_SPECIALIZED
8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_CONTAINER slist<_Tp, _Alloc>
8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_relops_cont.h>
8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_CONTAINER
8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_HEADER
8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_EQUAL_OPERATOR_SPECIALIZED
8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
864e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_NO_MOVE_SEMANTIC)
8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __move_traits<slist<_Tp, _Alloc> > {
867e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef __true_type implemented;
8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Alloc>::complete complete;
8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
870e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specialization of insert_iterator so that insertions will be constant
8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// time rather than linear time.
8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass insert_iterator<slist<_Tp, _Alloc> > {
8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef slist<_Tp, _Alloc> _Container;
8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Container* _M_container;
8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename _Container::iterator _M_iter;
8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Container          container_type;
8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef output_iterator_tag iterator_category;
8839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef void                value_type;
8849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef void                difference_type;
8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef void                pointer;
8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef void                reference;
8879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  insert_iterator(_Container& __x, typename _Container::iterator __i)
8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_container(&__x) {
8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__i == __x.begin())
8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_iter = __x.before_begin();
8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_iter = __x.previous(__i);
8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  insert_iterator<_Container>&
8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator = (const typename _Container::value_type& __val) {
8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_iter = _M_container->insert_after(_M_iter, __val);
8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  insert_iterator<_Container>& operator*() { return *this; }
9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  insert_iterator<_Container>& operator++() { return *this; }
9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  insert_iterator<_Container>& operator++(int) { return *this; }
9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_SLIST_H */
9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
9139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
915