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