stl_list.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:24k
源码类别:

3D图形编程

开发平台:

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