stl_list.h
上传用户:nizebo
上传日期:2022-05-14
资源大小:882k
文件大小:25k
源码类别:

STL

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_LIST_H
  30. #define __SGI_STL_INTERNAL_LIST_H
  31. #include <concept_checks.h>
  32. __STL_BEGIN_NAMESPACE
  33. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  34. #pragma set woff 1174
  35. #pragma set woff 1375
  36. #endif
  37. struct _List_node_base {
  38.   _List_node_base* _M_next;
  39.   _List_node_base* _M_prev;
  40. };
  41. template <class _Tp>
  42. struct _List_node : public _List_node_base {
  43.   _Tp _M_data;
  44. };
  45. struct _List_iterator_base {
  46.   typedef size_t                     size_type;
  47.   typedef ptrdiff_t                  difference_type;
  48.   typedef bidirectional_iterator_tag iterator_category;
  49.   _List_node_base* _M_node;
  50.   _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}
  51.   _List_iterator_base() {}
  52.   void _M_incr() { _M_node = _M_node->_M_next; }
  53.   void _M_decr() { _M_node = _M_node->_M_prev; }
  54.   bool operator==(const _List_iterator_base& __x) const {
  55.     return _M_node == __x._M_node;
  56.   }
  57.   bool operator!=(const _List_iterator_base& __x) const {
  58.     return _M_node != __x._M_node;
  59.   }
  60. };  
  61. template<class _Tp, class _Ref, class _Ptr>
  62. struct _List_iterator : public _List_iterator_base {
  63.   typedef _List_iterator<_Tp,_Tp&,_Tp*>             iterator;
  64.   typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;
  65.   typedef _List_iterator<_Tp,_Ref,_Ptr>             _Self;
  66.   typedef _Tp value_type;
  67.   typedef _Ptr pointer;
  68.   typedef _Ref reference;
  69.   typedef _List_node<_Tp> _Node;
  70.   _List_iterator(_Node* __x) : _List_iterator_base(__x) {}
  71.   _List_iterator() {}
  72.   _List_iterator(const iterator& __x) : _List_iterator_base(__x._M_node) {}
  73.   reference operator*() const { return ((_Node*) _M_node)->_M_data; }
  74. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  75.   pointer operator->() const { return &(operator*()); }
  76. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  77.   _Self& operator++() { 
  78.     this->_M_incr();
  79.     return *this;
  80.   }
  81.   _Self operator++(int) { 
  82.     _Self __tmp = *this;
  83.     this->_M_incr();
  84.     return __tmp;
  85.   }
  86.   _Self& operator--() { 
  87.     this->_M_decr();
  88.     return *this;
  89.   }
  90.   _Self operator--(int) { 
  91.     _Self __tmp = *this;
  92.     this->_M_decr();
  93.     return __tmp;
  94.   }
  95. };
  96. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  97. inline bidirectional_iterator_tag
  98. iterator_category(const _List_iterator_base&)
  99. {
  100.   return bidirectional_iterator_tag();
  101. }
  102. template <class _Tp, class _Ref, class _Ptr>
  103. inline _Tp*
  104. value_type(const _List_iterator<_Tp, _Ref, _Ptr>&)
  105. {
  106.   return 0;
  107. }
  108. inline ptrdiff_t*
  109. distance_type(const _List_iterator_base&)
  110. {
  111.   return 0;
  112. }
  113. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  114. // Base class that encapsulates details of allocators.  Three cases:
  115. // an ordinary standard-conforming allocator, a standard-conforming
  116. // allocator with no non-static data, and an SGI-style allocator.
  117. // This complexity is necessary only because we're worrying about backward
  118. // compatibility and because we want to avoid wasting storage on an 
  119. // allocator instance if it isn't necessary.
  120. #ifdef __STL_USE_STD_ALLOCATORS
  121. // Base for general standard-conforming allocators.
  122. template <class _Tp, class _Allocator, bool _IsStatic>
  123. class _List_alloc_base {
  124. public:
  125.   typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
  126.           allocator_type;
  127.   allocator_type get_allocator() const { return _Node_allocator; }
  128.   _List_alloc_base(const allocator_type& __a) : _Node_allocator(__a) {}
  129. protected:
  130.   _List_node<_Tp>* _M_get_node()
  131.    { return _Node_allocator.allocate(1); }
  132.   void _M_put_node(_List_node<_Tp>* __p)
  133.     { _Node_allocator.deallocate(__p, 1); }
  134. protected:
  135.   typename _Alloc_traits<_List_node<_Tp>, _Allocator>::allocator_type
  136.            _Node_allocator;
  137.   _List_node<_Tp>* _M_node;
  138. };
  139. // Specialization for instanceless allocators.
  140. template <class _Tp, class _Allocator>
  141. class _List_alloc_base<_Tp, _Allocator, true> {
  142. public:
  143.   typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
  144.           allocator_type;
  145.   allocator_type get_allocator() const { return allocator_type(); }
  146.   _List_alloc_base(const allocator_type&) {}
  147. protected:
  148.   typedef typename _Alloc_traits<_List_node<_Tp>, _Allocator>::_Alloc_type
  149.           _Alloc_type;
  150.   _List_node<_Tp>* _M_get_node() { return _Alloc_type::allocate(1); }
  151.   void _M_put_node(_List_node<_Tp>* __p) { _Alloc_type::deallocate(__p, 1); }
  152. protected:
  153.   _List_node<_Tp>* _M_node;
  154. };
  155. template <class _Tp, class _Alloc>
  156. class _List_base 
  157.   : public _List_alloc_base<_Tp, _Alloc,
  158.                             _Alloc_traits<_Tp, _Alloc>::_S_instanceless>
  159. {
  160. public:
  161.   typedef _List_alloc_base<_Tp, _Alloc,
  162.                            _Alloc_traits<_Tp, _Alloc>::_S_instanceless>
  163.           _Base; 
  164.   typedef typename _Base::allocator_type allocator_type;
  165.   _List_base(const allocator_type& __a) : _Base(__a) {
  166.     _M_node = _M_get_node();
  167.     _M_node->_M_next = _M_node;
  168.     _M_node->_M_prev = _M_node;
  169.   }
  170.   ~_List_base() {
  171.     clear();
  172.     _M_put_node(_M_node);
  173.   }
  174.   void clear();
  175. };
  176. #else /* __STL_USE_STD_ALLOCATORS */
  177. template <class _Tp, class _Alloc>
  178. class _List_base 
  179. {
  180. public:
  181.   typedef _Alloc allocator_type;
  182.   allocator_type get_allocator() const { return allocator_type(); }
  183.   _List_base(const allocator_type&) {
  184.     _M_node = _M_get_node();
  185.     _M_node->_M_next = _M_node;
  186.     _M_node->_M_prev = _M_node;
  187.   }
  188.   ~_List_base() {
  189.     clear();
  190.     _M_put_node(_M_node);
  191.   }
  192.   void clear();
  193. protected:
  194.   typedef simple_alloc<_List_node<_Tp>, _Alloc> _Alloc_type;
  195.   _List_node<_Tp>* _M_get_node() { return _Alloc_type::allocate(1); }
  196.   void _M_put_node(_List_node<_Tp>* __p) { _Alloc_type::deallocate(__p, 1); } 
  197. protected:
  198.   _List_node<_Tp>* _M_node;
  199. };
  200. #endif /* __STL_USE_STD_ALLOCATORS */
  201. template <class _Tp, class _Alloc>
  202. void 
  203. _List_base<_Tp,_Alloc>::clear() 
  204. {
  205.   _List_node<_Tp>* __cur = (_List_node<_Tp>*) _M_node->_M_next;
  206.   while (__cur != _M_node) {
  207.     _List_node<_Tp>* __tmp = __cur;
  208.     __cur = (_List_node<_Tp>*) __cur->_M_next;
  209.     _Destroy(&__tmp->_M_data);
  210.     _M_put_node(__tmp);
  211.   }
  212.   _M_node->_M_next = _M_node;
  213.   _M_node->_M_prev = _M_node;
  214. }
  215. template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
  216. class list : protected _List_base<_Tp, _Alloc> {
  217.   // requirements:
  218.   __STL_CLASS_REQUIRES(_Tp, _Assignable);
  219.   typedef _List_base<_Tp, _Alloc> _Base;
  220. protected:
  221.   typedef void* _Void_pointer;
  222. public:      
  223.   typedef _Tp value_type;
  224.   typedef value_type* pointer;
  225.   typedef const value_type* const_pointer;
  226.   typedef value_type& reference;
  227.   typedef const value_type& const_reference;
  228.   typedef _List_node<_Tp> _Node;
  229.   typedef size_t size_type;
  230.   typedef ptrdiff_t difference_type;
  231.   typedef typename _Base::allocator_type allocator_type;
  232.   allocator_type get_allocator() const { return _Base::get_allocator(); }
  233. public:
  234.   typedef _List_iterator<_Tp,_Tp&,_Tp*>             iterator;
  235.   typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;
  236. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  237.   typedef reverse_iterator<const_iterator> const_reverse_iterator;
  238.   typedef reverse_iterator<iterator>       reverse_iterator;
  239. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  240.   typedef reverse_bidirectional_iterator<const_iterator,value_type,
  241.                                          const_reference,difference_type>
  242.           const_reverse_iterator;
  243.   typedef reverse_bidirectional_iterator<iterator,value_type,reference,
  244.                                          difference_type>
  245.           reverse_iterator; 
  246. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  247. protected:
  248. #ifdef __STL_HAS_NAMESPACES
  249.   using _Base::_M_node;
  250.   using _Base::_M_put_node;
  251.   using _Base::_M_get_node;
  252. #endif /* __STL_HAS_NAMESPACES */
  253. protected:
  254.   _Node* _M_create_node(const _Tp& __x)
  255.   {
  256.     _Node* __p = _M_get_node();
  257.     __STL_TRY {
  258.       _Construct(&__p->_M_data, __x);
  259.     }
  260.     __STL_UNWIND(_M_put_node(__p));
  261.     return __p;
  262.   }
  263.   _Node* _M_create_node()
  264.   {
  265.     _Node* __p = _M_get_node();
  266.     __STL_TRY {
  267.       _Construct(&__p->_M_data);
  268.     }
  269.     __STL_UNWIND(_M_put_node(__p));
  270.     return __p;
  271.   }
  272. public:
  273.   explicit list(const allocator_type& __a = allocator_type()) : _Base(__a) {}
  274.   iterator begin()             { return (_Node*)(_M_node->_M_next); }
  275.   const_iterator begin() const { return (_Node*)(_M_node->_M_next); }
  276.   iterator end()             { return _M_node; }
  277.   const_iterator end() const { return _M_node; }
  278.   reverse_iterator rbegin() 
  279.     { return reverse_iterator(end()); }
  280.   const_reverse_iterator rbegin() const 
  281.     { return const_reverse_iterator(end()); }
  282.   reverse_iterator rend()
  283.     { return reverse_iterator(begin()); }
  284.   const_reverse_iterator rend() const
  285.     { return const_reverse_iterator(begin()); }
  286.   bool empty() const { return _M_node->_M_next == _M_node; }
  287.   size_type size() const {
  288.     size_type __result = 0;
  289.     distance(begin(), end(), __result);
  290.     return __result;
  291.   }
  292.   size_type max_size() const { return size_type(-1); }
  293.   reference front() { return *begin(); }
  294.   const_reference front() const { return *begin(); }
  295.   reference back() { return *(--end()); }
  296.   const_reference back() const { return *(--end()); }
  297.   void swap(list<_Tp, _Alloc>& __x) { __STD::swap(_M_node, __x._M_node); }
  298.   iterator insert(iterator __position, const _Tp& __x) {
  299.     _Node* __tmp = _M_create_node(__x);
  300.     __tmp->_M_next = __position._M_node;
  301.     __tmp->_M_prev = __position._M_node->_M_prev;
  302.     __position._M_node->_M_prev->_M_next = __tmp;
  303.     __position._M_node->_M_prev = __tmp;
  304.     return __tmp;
  305.   }
  306.   iterator insert(iterator __position) { return insert(__position, _Tp()); }
  307. #ifdef __STL_MEMBER_TEMPLATES
  308.   // Check whether it's an integral type.  If so, it's not an iterator.
  309.   template<class _Integer>
  310.   void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
  311.                           __true_type) {
  312.     _M_fill_insert(__pos, (size_type) __n, (_Tp) __x);
  313.   }
  314.   template <class _InputIterator>
  315.   void _M_insert_dispatch(iterator __pos,
  316.                           _InputIterator __first, _InputIterator __last,
  317.                           __false_type);
  318.   template <class _InputIterator>
  319.   void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
  320.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  321.     _M_insert_dispatch(__pos, __first, __last, _Integral());
  322.   }
  323. #else /* __STL_MEMBER_TEMPLATES */
  324.   void insert(iterator __position, const _Tp* __first, const _Tp* __last);
  325.   void insert(iterator __position,
  326.               const_iterator __first, const_iterator __last);
  327. #endif /* __STL_MEMBER_TEMPLATES */
  328.   void insert(iterator __pos, size_type __n, const _Tp& __x)
  329.     { _M_fill_insert(__pos, __n, __x); }
  330.   void _M_fill_insert(iterator __pos, size_type __n, const _Tp& __x); 
  331.   void push_front(const _Tp& __x) { insert(begin(), __x); }
  332.   void push_front() {insert(begin());}
  333.   void push_back(const _Tp& __x) { insert(end(), __x); }
  334.   void push_back() {insert(end());}
  335.   iterator erase(iterator __position) {
  336.     _List_node_base* __next_node = __position._M_node->_M_next;
  337.     _List_node_base* __prev_node = __position._M_node->_M_prev;
  338.     _Node* __n = (_Node*) __position._M_node;
  339.     __prev_node->_M_next = __next_node;
  340.     __next_node->_M_prev = __prev_node;
  341.     _Destroy(&__n->_M_data);
  342.     _M_put_node(__n);
  343.     return iterator((_Node*) __next_node);
  344.   }
  345.   iterator erase(iterator __first, iterator __last);
  346.   void clear() { _Base::clear(); }
  347.   void resize(size_type __new_size, const _Tp& __x);
  348.   void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
  349.   void pop_front() { erase(begin()); }
  350.   void pop_back() { 
  351.     iterator __tmp = end();
  352.     erase(--__tmp);
  353.   }
  354.   list(size_type __n, const _Tp& __value,
  355.        const allocator_type& __a = allocator_type())
  356.     : _Base(__a)
  357.     { insert(begin(), __n, __value); }
  358.   explicit list(size_type __n)
  359.     : _Base(allocator_type())
  360.     { insert(begin(), __n, _Tp()); }
  361. #ifdef __STL_MEMBER_TEMPLATES
  362.   // We don't need any dispatching tricks here, because insert does all of
  363.   // that anyway.  
  364.   template <class _InputIterator>
  365.   list(_InputIterator __first, _InputIterator __last,
  366.        const allocator_type& __a = allocator_type())
  367.     : _Base(__a)
  368.     { insert(begin(), __first, __last); }
  369. #else /* __STL_MEMBER_TEMPLATES */
  370.   list(const _Tp* __first, const _Tp* __last,
  371.        const allocator_type& __a = allocator_type())
  372.     : _Base(__a)
  373.     { this->insert(begin(), __first, __last); }
  374.   list(const_iterator __first, const_iterator __last,
  375.        const allocator_type& __a = allocator_type())
  376.     : _Base(__a)
  377.     { this->insert(begin(), __first, __last); }
  378. #endif /* __STL_MEMBER_TEMPLATES */
  379.   list(const list<_Tp, _Alloc>& __x) : _Base(__x.get_allocator())
  380.     { insert(begin(), __x.begin(), __x.end()); }
  381.   ~list() { }
  382.   list<_Tp, _Alloc>& operator=(const list<_Tp, _Alloc>& __x);
  383. public:
  384.   // assign(), a generalized assignment member function.  Two
  385.   // versions: one that takes a count, and one that takes a range.
  386.   // The range version is a member template, so we dispatch on whether
  387.   // or not the type is an integer.
  388.   void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
  389.   void _M_fill_assign(size_type __n, const _Tp& __val);
  390. #ifdef __STL_MEMBER_TEMPLATES
  391.   template <class _InputIterator>
  392.   void assign(_InputIterator __first, _InputIterator __last) {
  393.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  394.     _M_assign_dispatch(__first, __last, _Integral());
  395.   }
  396.   template <class _Integer>
  397.   void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
  398.     { _M_fill_assign((size_type) __n, (_Tp) __val); }
  399.   template <class _InputIterator>
  400.   void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
  401.                           __false_type);
  402. #endif /* __STL_MEMBER_TEMPLATES */
  403. protected:
  404.   void transfer(iterator __position, iterator __first, iterator __last) {
  405.     if (__position != __last) {
  406.       // Remove [first, last) from its old position.
  407.       __last._M_node->_M_prev->_M_next     = __position._M_node;
  408.       __first._M_node->_M_prev->_M_next    = __last._M_node;
  409.       __position._M_node->_M_prev->_M_next = __first._M_node; 
  410.       // Splice [first, last) into its new position.
  411.       _List_node_base* __tmp      = __position._M_node->_M_prev;
  412.       __position._M_node->_M_prev = __last._M_node->_M_prev;
  413.       __last._M_node->_M_prev     = __first._M_node->_M_prev; 
  414.       __first._M_node->_M_prev    = __tmp;
  415.     }
  416.   }
  417. public:
  418.   void splice(iterator __position, list& __x) {
  419.     if (!__x.empty()) 
  420.       this->transfer(__position, __x.begin(), __x.end());
  421.   }
  422.   void splice(iterator __position, list&, iterator __i) {
  423.     iterator __j = __i;
  424.     ++__j;
  425.     if (__position == __i || __position == __j) return;
  426.     this->transfer(__position, __i, __j);
  427.   }
  428.   void splice(iterator __position, list&, iterator __first, iterator __last) {
  429.     if (__first != __last) 
  430.       this->transfer(__position, __first, __last);
  431.   }
  432.   void remove(const _Tp& __value);
  433.   void unique();
  434.   void merge(list& __x);
  435.   void reverse();
  436.   void sort();
  437. #ifdef __STL_MEMBER_TEMPLATES
  438.   template <class _Predicate> void remove_if(_Predicate);
  439.   template <class _BinaryPredicate> void unique(_BinaryPredicate);
  440.   template <class _StrictWeakOrdering> void merge(list&, _StrictWeakOrdering);
  441.   template <class _StrictWeakOrdering> void sort(_StrictWeakOrdering);
  442. #endif /* __STL_MEMBER_TEMPLATES */
  443. };
  444. template <class _Tp, class _Alloc>
  445. inline bool 
  446. operator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y)
  447. {
  448.   typedef typename list<_Tp,_Alloc>::const_iterator const_iterator;
  449.   const_iterator __end1 = __x.end();
  450.   const_iterator __end2 = __y.end();
  451.   const_iterator __i1 = __x.begin();
  452.   const_iterator __i2 = __y.begin();
  453.   while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
  454.     ++__i1;
  455.     ++__i2;
  456.   }
  457.   return __i1 == __end1 && __i2 == __end2;
  458. }
  459. template <class _Tp, class _Alloc>
  460. inline bool operator<(const list<_Tp,_Alloc>& __x,
  461.                       const list<_Tp,_Alloc>& __y)
  462. {
  463.   return lexicographical_compare(__x.begin(), __x.end(),
  464.                                  __y.begin(), __y.end());
  465. }
  466. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  467. template <class _Tp, class _Alloc>
  468. inline bool operator!=(const list<_Tp,_Alloc>& __x,
  469.                        const list<_Tp,_Alloc>& __y) {
  470.   return !(__x == __y);
  471. }
  472. template <class _Tp, class _Alloc>
  473. inline bool operator>(const list<_Tp,_Alloc>& __x,
  474.                       const list<_Tp,_Alloc>& __y) {
  475.   return __y < __x;
  476. }
  477. template <class _Tp, class _Alloc>
  478. inline bool operator<=(const list<_Tp,_Alloc>& __x,
  479.                        const list<_Tp,_Alloc>& __y) {
  480.   return !(__y < __x);
  481. }
  482. template <class _Tp, class _Alloc>
  483. inline bool operator>=(const list<_Tp,_Alloc>& __x,
  484.                        const list<_Tp,_Alloc>& __y) {
  485.   return !(__x < __y);
  486. }
  487. template <class _Tp, class _Alloc>
  488. inline void 
  489. swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
  490. {
  491.   __x.swap(__y);
  492. }
  493. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  494. #ifdef __STL_MEMBER_TEMPLATES
  495. template <class _Tp, class _Alloc> template <class _InputIter>
  496. void 
  497. list<_Tp, _Alloc>::_M_insert_dispatch(iterator __position,
  498.                                       _InputIter __first, _InputIter __last,
  499.                                       __false_type)
  500. {
  501.   for ( ; __first != __last; ++__first)
  502.     insert(__position, *__first);
  503. }
  504. #else /* __STL_MEMBER_TEMPLATES */
  505. template <class _Tp, class _Alloc>
  506. void 
  507. list<_Tp, _Alloc>::insert(iterator __position, 
  508.                           const _Tp* __first, const _Tp* __last)
  509. {
  510.   for ( ; __first != __last; ++__first)
  511.     insert(__position, *__first);
  512. }
  513. template <class _Tp, class _Alloc>
  514. void 
  515. list<_Tp, _Alloc>::insert(iterator __position,
  516.                          const_iterator __first, const_iterator __last)
  517. {
  518.   for ( ; __first != __last; ++__first)
  519.     insert(__position, *__first);
  520. }
  521. #endif /* __STL_MEMBER_TEMPLATES */
  522. template <class _Tp, class _Alloc>
  523. void 
  524. list<_Tp, _Alloc>::_M_fill_insert(iterator __position,
  525.                                   size_type __n, const _Tp& __x)
  526. {
  527.   for ( ; __n > 0; --__n)
  528.     insert(__position, __x);
  529. }
  530. template <class _Tp, class _Alloc>
  531. typename list<_Tp,_Alloc>::iterator list<_Tp, _Alloc>::erase(iterator __first, 
  532.                                                              iterator __last)
  533. {
  534.   while (__first != __last)
  535.     erase(__first++);
  536.   return __last;
  537. }
  538. template <class _Tp, class _Alloc>
  539. void list<_Tp, _Alloc>::resize(size_type __new_size, const _Tp& __x)
  540. {
  541.   iterator __i = begin();
  542.   size_type __len = 0;
  543.   for ( ; __i != end() && __len < __new_size; ++__i, ++__len)
  544.     ;
  545.   if (__len == __new_size)
  546.     erase(__i, end());
  547.   else                          // __i == end()
  548.     insert(end(), __new_size - __len, __x);
  549. }
  550. template <class _Tp, class _Alloc>
  551. list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list<_Tp, _Alloc>& __x)
  552. {
  553.   if (this != &__x) {
  554.     iterator __first1 = begin();
  555.     iterator __last1 = end();
  556.     const_iterator __first2 = __x.begin();
  557.     const_iterator __last2 = __x.end();
  558.     while (__first1 != __last1 && __first2 != __last2) 
  559.       *__first1++ = *__first2++;
  560.     if (__first2 == __last2)
  561.       erase(__first1, __last1);
  562.     else
  563.       insert(__last1, __first2, __last2);
  564.   }
  565.   return *this;
  566. }
  567. template <class _Tp, class _Alloc>
  568. void list<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {
  569.   iterator __i = begin();
  570.   for ( ; __i != end() && __n > 0; ++__i, --__n)
  571.     *__i = __val;
  572.   if (__n > 0)
  573.     insert(end(), __n, __val);
  574.   else
  575.     erase(__i, end());
  576. }
  577. #ifdef __STL_MEMBER_TEMPLATES
  578. template <class _Tp, class _Alloc> template <class _InputIter>
  579. void
  580. list<_Tp, _Alloc>::_M_assign_dispatch(_InputIter __first2, _InputIter __last2,
  581.                                       __false_type)
  582. {
  583.   iterator __first1 = begin();
  584.   iterator __last1 = end();
  585.   for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
  586.     *__first1 = *__first2;
  587.   if (__first2 == __last2)
  588.     erase(__first1, __last1);
  589.   else
  590.     insert(__last1, __first2, __last2);
  591. }
  592. #endif /* __STL_MEMBER_TEMPLATES */
  593. template <class _Tp, class _Alloc>
  594. void list<_Tp, _Alloc>::remove(const _Tp& __value)
  595. {
  596.   iterator __first = begin();
  597.   iterator __last = end();
  598.   while (__first != __last) {
  599.     iterator __next = __first;
  600.     ++__next;
  601.     if (*__first == __value) erase(__first);
  602.     __first = __next;
  603.   }
  604. }
  605. template <class _Tp, class _Alloc>
  606. void list<_Tp, _Alloc>::unique()
  607. {
  608.   iterator __first = begin();
  609.   iterator __last = end();
  610.   if (__first == __last) return;
  611.   iterator __next = __first;
  612.   while (++__next != __last) {
  613.     if (*__first == *__next)
  614.       erase(__next);
  615.     else
  616.       __first = __next;
  617.     __next = __first;
  618.   }
  619. }
  620. template <class _Tp, class _Alloc>
  621. void list<_Tp, _Alloc>::merge(list<_Tp, _Alloc>& __x)
  622. {
  623.   iterator __first1 = begin();
  624.   iterator __last1 = end();
  625.   iterator __first2 = __x.begin();
  626.   iterator __last2 = __x.end();
  627.   while (__first1 != __last1 && __first2 != __last2)
  628.     if (*__first2 < *__first1) {
  629.       iterator __next = __first2;
  630.       transfer(__first1, __first2, ++__next);
  631.       __first2 = __next;
  632.     }
  633.     else
  634.       ++__first1;
  635.   if (__first2 != __last2) transfer(__last1, __first2, __last2);
  636. }
  637. inline void __List_base_reverse(_List_node_base* __p)
  638. {
  639.   _List_node_base* __tmp = __p;
  640.   do {
  641.     __STD::swap(__tmp->_M_next, __tmp->_M_prev);
  642.     __tmp = __tmp->_M_prev;     // Old next node is now prev.
  643.   } while (__tmp != __p);
  644. }
  645. template <class _Tp, class _Alloc>
  646. inline void list<_Tp, _Alloc>::reverse() 
  647. {
  648.   __List_base_reverse(this->_M_node);
  649. }    
  650. template <class _Tp, class _Alloc>
  651. void list<_Tp, _Alloc>::sort()
  652. {
  653.   // Do nothing if the list has length 0 or 1.
  654.   if (_M_node->_M_next != _M_node && _M_node->_M_next->_M_next != _M_node) {
  655.     list<_Tp, _Alloc> __carry;
  656.     list<_Tp, _Alloc> __counter[64];
  657.     int __fill = 0;
  658.     while (!empty()) {
  659.       __carry.splice(__carry.begin(), *this, begin());
  660.       int __i = 0;
  661.       while(__i < __fill && !__counter[__i].empty()) {
  662.         __counter[__i].merge(__carry);
  663.         __carry.swap(__counter[__i++]);
  664.       }
  665.       __carry.swap(__counter[__i]);         
  666.       if (__i == __fill) ++__fill;
  667.     } 
  668.     for (int __i = 1; __i < __fill; ++__i)
  669.       __counter[__i].merge(__counter[__i-1]);
  670.     swap(__counter[__fill-1]);
  671.   }
  672. }
  673. #ifdef __STL_MEMBER_TEMPLATES
  674. template <class _Tp, class _Alloc> template <class _Predicate>
  675. void list<_Tp, _Alloc>::remove_if(_Predicate __pred)
  676. {
  677.   iterator __first = begin();
  678.   iterator __last = end();
  679.   while (__first != __last) {
  680.     iterator __next = __first;
  681.     ++__next;
  682.     if (__pred(*__first)) erase(__first);
  683.     __first = __next;
  684.   }
  685. }
  686. template <class _Tp, class _Alloc> template <class _BinaryPredicate>
  687. void list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred)
  688. {
  689.   iterator __first = begin();
  690.   iterator __last = end();
  691.   if (__first == __last) return;
  692.   iterator __next = __first;
  693.   while (++__next != __last) {
  694.     if (__binary_pred(*__first, *__next))
  695.       erase(__next);
  696.     else
  697.       __first = __next;
  698.     __next = __first;
  699.   }
  700. }
  701. template <class _Tp, class _Alloc> template <class _StrictWeakOrdering>
  702. void list<_Tp, _Alloc>::merge(list<_Tp, _Alloc>& __x,
  703.                               _StrictWeakOrdering __comp)
  704. {
  705.   iterator __first1 = begin();
  706.   iterator __last1 = end();
  707.   iterator __first2 = __x.begin();
  708.   iterator __last2 = __x.end();
  709.   while (__first1 != __last1 && __first2 != __last2)
  710.     if (__comp(*__first2, *__first1)) {
  711.       iterator __next = __first2;
  712.       transfer(__first1, __first2, ++__next);
  713.       __first2 = __next;
  714.     }
  715.     else
  716.       ++__first1;
  717.   if (__first2 != __last2) transfer(__last1, __first2, __last2);
  718. }
  719. template <class _Tp, class _Alloc> template <class _StrictWeakOrdering>
  720. void list<_Tp, _Alloc>::sort(_StrictWeakOrdering __comp)
  721. {
  722.   // Do nothing if the list has length 0 or 1.
  723.   if (_M_node->_M_next != _M_node && _M_node->_M_next->_M_next != _M_node) {
  724.     list<_Tp, _Alloc> __carry;
  725.     list<_Tp, _Alloc> __counter[64];
  726.     int __fill = 0;
  727.     while (!empty()) {
  728.       __carry.splice(__carry.begin(), *this, begin());
  729.       int __i = 0;
  730.       while(__i < __fill && !__counter[__i].empty()) {
  731.         __counter[__i].merge(__carry, __comp);
  732.         __carry.swap(__counter[__i++]);
  733.       }
  734.       __carry.swap(__counter[__i]);         
  735.       if (__i == __fill) ++__fill;
  736.     } 
  737.     for (int __i = 1; __i < __fill; ++__i) 
  738.       __counter[__i].merge(__counter[__i-1], __comp);
  739.     swap(__counter[__fill-1]);
  740.   }
  741. }
  742. #endif /* __STL_MEMBER_TEMPLATES */
  743. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  744. #pragma reset woff 1174
  745. #pragma reset woff 1375
  746. #endif
  747. __STL_END_NAMESPACE 
  748. #endif /* __SGI_STL_INTERNAL_LIST_H */
  749. // Local Variables:
  750. // mode:C++
  751. // End: