stl_slist.h
上传用户:sichengcw
上传日期:2009-02-17
资源大小:202k
文件大小:20k
源码类别:

STL

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1997
  3.  * Silicon Graphics Computer Systems, Inc.
  4.  *
  5.  * Permission to use, copy, modify, distribute and sell this software
  6.  * and its documentation for any purpose is hereby granted without fee,
  7.  * provided that the above copyright notice appear in all copies and
  8.  * that both that copyright notice and this permission notice appear
  9.  * in supporting documentation.  Silicon Graphics makes no
  10.  * representations about the suitability of this software for any
  11.  * purpose.  It is provided "as is" without express or implied warranty.
  12.  *
  13.  */
  14. /* NOTE: This is an internal header file, included by other STL headers.
  15.  *   You should not attempt to use it directly.
  16.  */
  17. #ifndef __SGI_STL_INTERNAL_SLIST_H
  18. #define __SGI_STL_INTERNAL_SLIST_H
  19. __STL_BEGIN_NAMESPACE 
  20. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  21. #pragma set woff 1174
  22. #endif
  23. struct __slist_node_base
  24. {
  25.   __slist_node_base* next;
  26. };
  27. inline __slist_node_base* __slist_make_link(__slist_node_base* prev_node,
  28.                                             __slist_node_base* new_node)
  29. {
  30.   new_node->next = prev_node->next;
  31.   prev_node->next = new_node;
  32.   return new_node;
  33. }
  34. inline __slist_node_base* __slist_previous(__slist_node_base* head,
  35.                                            const __slist_node_base* node)
  36. {
  37.   while (head && head->next != node)
  38.     head = head->next;
  39.   return head;
  40. }
  41. inline const __slist_node_base* __slist_previous(const __slist_node_base* head,
  42.                                                  const __slist_node_base* node)
  43. {
  44.   while (head && head->next != node)
  45.     head = head->next;
  46.   return head;
  47. }
  48. inline void __slist_splice_after(__slist_node_base* pos,
  49.                                  __slist_node_base* before_first,
  50.                                  __slist_node_base* before_last)
  51. {
  52.   if (pos != before_first && pos != before_last) {
  53.     __slist_node_base* first = before_first->next;
  54.     __slist_node_base* after = pos->next;
  55.     before_first->next = before_last->next;
  56.     pos->next = first;
  57.     before_last->next = after;
  58.   }
  59. }
  60. inline __slist_node_base* __slist_reverse(__slist_node_base* node)
  61. {
  62.   __slist_node_base* result = node;
  63.   node = node->next;
  64.   result->next = 0;
  65.   while(node) {
  66.     __slist_node_base* next = node->next;
  67.     node->next = result;
  68.     result = node;
  69.     node = next;
  70.   }
  71.   return result;
  72. }
  73. template <class T>
  74. struct __slist_node : public __slist_node_base
  75. {
  76.   T data;
  77. };
  78. struct __slist_iterator_base
  79. {
  80.   typedef size_t size_type;
  81.   typedef ptrdiff_t difference_type;
  82.   typedef forward_iterator_tag iterator_category;
  83.   __slist_node_base* node;
  84.   __slist_iterator_base(__slist_node_base* x) : node(x) {}
  85.   void incr() { node = node->next; }
  86.   bool operator==(const __slist_iterator_base& x) const {
  87.     return node == x.node;
  88.   }
  89.   bool operator!=(const __slist_iterator_base& x) const {
  90.     return node != x.node;
  91.   }
  92. };
  93. template <class T, class Ref, class Ptr>
  94. struct __slist_iterator : public __slist_iterator_base
  95. {
  96.   typedef __slist_iterator<T, T&, T*>             iterator;
  97.   typedef __slist_iterator<T, const T&, const T*> const_iterator;
  98.   typedef __slist_iterator<T, Ref, Ptr>           self;
  99.   typedef T value_type;
  100.   typedef Ptr pointer;
  101.   typedef Ref reference;
  102.   typedef __slist_node<T> list_node;
  103.   __slist_iterator(list_node* x) : __slist_iterator_base(x) {}
  104.   __slist_iterator() : __slist_iterator_base(0) {}
  105.   __slist_iterator(const iterator& x) : __slist_iterator_base(x.node) {}
  106.   reference operator*() const { return ((list_node*) node)->data; }
  107. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  108.   pointer operator->() const { return &(operator*()); }
  109. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  110.   self& operator++()
  111.   {
  112.     incr();
  113.     return *this;
  114.   }
  115.   self operator++(int)
  116.   {
  117.     self tmp = *this;
  118.     incr();
  119.     return tmp;
  120.   }
  121. };
  122. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  123. inline ptrdiff_t*
  124. distance_type(const __slist_iterator_base&)
  125. {
  126.   return 0;
  127. }
  128. inline forward_iterator_tag
  129. iterator_category(const __slist_iterator_base&)
  130. {
  131.   return forward_iterator_tag();
  132. }
  133. template <class T, class Ref, class Ptr> 
  134. inline T* 
  135. value_type(const __slist_iterator<T, Ref, Ptr>&) {
  136.   return 0;
  137. }
  138. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  139. inline size_t __slist_size(__slist_node_base* node)
  140. {
  141.   size_t result = 0;
  142.   for ( ; node != 0; node = node->next)
  143.     ++result;
  144.   return result;
  145. }
  146. template <class T, class Alloc = alloc>
  147. class slist
  148. {
  149. public:
  150.   typedef T value_type;
  151.   typedef value_type* pointer;
  152.   typedef const value_type* const_pointer;
  153.   typedef value_type& reference;
  154.   typedef const value_type& const_reference;
  155.   typedef size_t size_type;
  156.   typedef ptrdiff_t difference_type;
  157.   typedef __slist_iterator<T, T&, T*>             iterator;
  158.   typedef __slist_iterator<T, const T&, const T*> const_iterator;
  159. private:
  160.   typedef __slist_node<T> list_node;
  161.   typedef __slist_node_base list_node_base;
  162.   typedef __slist_iterator_base iterator_base;
  163.   typedef simple_alloc<list_node, Alloc> list_node_allocator;
  164.   static list_node* create_node(const value_type& x) {
  165.     list_node* node = list_node_allocator::allocate();
  166.     __STL_TRY {
  167.       construct(&node->data, x);
  168.       node->next = 0;
  169.     }
  170.     __STL_UNWIND(list_node_allocator::deallocate(node));
  171.     return node;
  172.   }
  173.   
  174.   static void destroy_node(list_node* node) {
  175.     destroy(&node->data);
  176.     list_node_allocator::deallocate(node);
  177.   }
  178.   void fill_initialize(size_type n, const value_type& x) {
  179.     head.next = 0;
  180.     __STL_TRY {
  181.       _insert_after_fill(&head, n, x);
  182.     }
  183.     __STL_UNWIND(clear());
  184.   }    
  185. #ifdef __STL_MEMBER_TEMPLATES
  186.   template <class InputIterator>
  187.   void range_initialize(InputIterator first, InputIterator last) {
  188.     head.next = 0;
  189.     __STL_TRY {
  190.       _insert_after_range(&head, first, last);
  191.     }
  192.     __STL_UNWIND(clear());
  193.   }
  194. #else /* __STL_MEMBER_TEMPLATES */
  195.   void range_initialize(const value_type* first, const value_type* last) {
  196.     head.next = 0;
  197.     __STL_TRY {
  198.       _insert_after_range(&head, first, last);
  199.     }
  200.     __STL_UNWIND(clear());
  201.   }
  202.   void range_initialize(const_iterator first, const_iterator last) {
  203.     head.next = 0;
  204.     __STL_TRY {
  205.       _insert_after_range(&head, first, last);
  206.     }
  207.     __STL_UNWIND(clear());
  208.   }
  209. #endif /* __STL_MEMBER_TEMPLATES */
  210. private:
  211.   list_node_base head;
  212. public:
  213.   slist() { head.next = 0; }
  214.   slist(size_type n, const value_type& x) { fill_initialize(n, x); }
  215.   slist(int n, const value_type& x) { fill_initialize(n, x); }
  216.   slist(long n, const value_type& x) { fill_initialize(n, x); }
  217.   explicit slist(size_type n) { fill_initialize(n, value_type()); }
  218. #ifdef __STL_MEMBER_TEMPLATES
  219.   template <class InputIterator>
  220.   slist(InputIterator first, InputIterator last) {
  221.     range_initialize(first, last);
  222.   }
  223. #else /* __STL_MEMBER_TEMPLATES */
  224.   slist(const_iterator first, const_iterator last) {
  225.     range_initialize(first, last);
  226.   }
  227.   slist(const value_type* first, const value_type* last) {
  228.     range_initialize(first, last);
  229.   }
  230. #endif /* __STL_MEMBER_TEMPLATES */
  231.   slist(const slist& L) { range_initialize(L.begin(), L.end()); }
  232.   slist& operator= (const slist& L);
  233.   ~slist() { clear(); }
  234. public:
  235.   iterator begin() { return iterator((list_node*)head.next); }
  236.   const_iterator begin() const { return const_iterator((list_node*)head.next);}
  237.   iterator end() { return iterator(0); }
  238.   const_iterator end() const { return const_iterator(0); }
  239.   size_type size() const { return __slist_size(head.next); }
  240.   
  241.   size_type max_size() const { return size_type(-1); }
  242.   bool empty() const { return head.next == 0; }
  243.   void swap(slist& L)
  244.   {
  245.     list_node_base* tmp = head.next;
  246.     head.next = L.head.next;
  247.     L.head.next = tmp;
  248.   }
  249. public:
  250.   friend bool operator== __STL_NULL_TMPL_ARGS(const slist<T, Alloc>& L1,
  251.                                               const slist<T, Alloc>& L2);
  252. public:
  253.   reference front() { return ((list_node*) head.next)->data; }
  254.   const_reference front() const { return ((list_node*) head.next)->data; }
  255.   void push_front(const value_type& x)   {
  256.     __slist_make_link(&head, create_node(x));
  257.   }
  258.   void pop_front() {
  259.     list_node* node = (list_node*) head.next;
  260.     head.next = node->next;
  261.     destroy_node(node);
  262.   }
  263.   iterator previous(const_iterator pos) {
  264.     return iterator((list_node*) __slist_previous(&head, pos.node));
  265.   }
  266.   const_iterator previous(const_iterator pos) const {
  267.     return const_iterator((list_node*) __slist_previous(&head, pos.node));
  268.   }
  269. private:
  270.   list_node* _insert_after(list_node_base* pos, const value_type& x) {
  271.     return (list_node*) (__slist_make_link(pos, create_node(x)));
  272.   }
  273.   void _insert_after_fill(list_node_base* pos,
  274.                           size_type n, const value_type& x) {
  275.     for (size_type i = 0; i < n; ++i)
  276.       pos = __slist_make_link(pos, create_node(x));
  277.   }
  278. #ifdef __STL_MEMBER_TEMPLATES
  279.   template <class InIter>
  280.   void _insert_after_range(list_node_base* pos, InIter first, InIter last) {
  281.     while (first != last) {
  282.       pos = __slist_make_link(pos, create_node(*first));
  283.       ++first;
  284.     }
  285.   }
  286. #else /* __STL_MEMBER_TEMPLATES */
  287.   void _insert_after_range(list_node_base* pos,
  288.                            const_iterator first, const_iterator last) {
  289.     while (first != last) {
  290.       pos = __slist_make_link(pos, create_node(*first));
  291.       ++first;
  292.     }
  293.   }
  294.   void _insert_after_range(list_node_base* pos,
  295.                            const value_type* first, const value_type* last) {
  296.     while (first != last) {
  297.       pos = __slist_make_link(pos, create_node(*first));
  298.       ++first;
  299.     }
  300.   }
  301. #endif /* __STL_MEMBER_TEMPLATES */
  302.   list_node_base* erase_after(list_node_base* pos) {
  303.     list_node* next = (list_node*) (pos->next);
  304.     list_node_base* next_next = next->next;
  305.     pos->next = next_next;
  306.     destroy_node(next);
  307.     return next_next;
  308.   }
  309.    
  310.   list_node_base* erase_after(list_node_base* before_first,
  311.                               list_node_base* last_node) {
  312.     list_node* cur = (list_node*) (before_first->next);
  313.     while (cur != last_node) {
  314.       list_node* tmp = cur;
  315.       cur = (list_node*) cur->next;
  316.       destroy_node(tmp);
  317.     }
  318.     before_first->next = last_node;
  319.     return last_node;
  320.   }
  321. public:
  322.   iterator insert_after(iterator pos, const value_type& x) {
  323.     return iterator(_insert_after(pos.node, x));
  324.   }
  325.   iterator insert_after(iterator pos) {
  326.     return insert_after(pos, value_type());
  327.   }
  328.   void insert_after(iterator pos, size_type n, const value_type& x) {
  329.     _insert_after_fill(pos.node, n, x);
  330.   }
  331.   void insert_after(iterator pos, int n, const value_type& x) {
  332.     _insert_after_fill(pos.node, (size_type) n, x);
  333.   }
  334.   void insert_after(iterator pos, long n, const value_type& x) {
  335.     _insert_after_fill(pos.node, (size_type) n, x);
  336.   }
  337. #ifdef __STL_MEMBER_TEMPLATES
  338.   template <class InIter>
  339.   void insert_after(iterator pos, InIter first, InIter last) {
  340.     _insert_after_range(pos.node, first, last);
  341.   }
  342. #else /* __STL_MEMBER_TEMPLATES */
  343.   void insert_after(iterator pos, const_iterator first, const_iterator last) {
  344.     _insert_after_range(pos.node, first, last);
  345.   }
  346.   void insert_after(iterator pos,
  347.                     const value_type* first, const value_type* last) {
  348.     _insert_after_range(pos.node, first, last);
  349.   }
  350. #endif /* __STL_MEMBER_TEMPLATES */
  351.   iterator insert(iterator pos, const value_type& x) {
  352.     return iterator(_insert_after(__slist_previous(&head, pos.node), x));
  353.   }
  354.   iterator insert(iterator pos) {
  355.     return iterator(_insert_after(__slist_previous(&head, pos.node),
  356.                                   value_type()));
  357.   }
  358.   void insert(iterator pos, size_type n, const value_type& x) {
  359.     _insert_after_fill(__slist_previous(&head, pos.node), n, x);
  360.   } 
  361.   void insert(iterator pos, int n, const value_type& x) {
  362.     _insert_after_fill(__slist_previous(&head, pos.node), (size_type) n, x);
  363.   } 
  364.   void insert(iterator pos, long n, const value_type& x) {
  365.     _insert_after_fill(__slist_previous(&head, pos.node), (size_type) n, x);
  366.   } 
  367.     
  368. #ifdef __STL_MEMBER_TEMPLATES
  369.   template <class InIter>
  370.   void insert(iterator pos, InIter first, InIter last) {
  371.     _insert_after_range(__slist_previous(&head, pos.node), first, last);
  372.   }
  373. #else /* __STL_MEMBER_TEMPLATES */
  374.   void insert(iterator pos, const_iterator first, const_iterator last) {
  375.     _insert_after_range(__slist_previous(&head, pos.node), first, last);
  376.   }
  377.   void insert(iterator pos, const value_type* first, const value_type* last) {
  378.     _insert_after_range(__slist_previous(&head, pos.node), first, last);
  379.   }
  380. #endif /* __STL_MEMBER_TEMPLATES */
  381. public:
  382.   iterator erase_after(iterator pos) {
  383.     return iterator((list_node*)erase_after(pos.node));
  384.   }
  385.   iterator erase_after(iterator before_first, iterator last) {
  386.     return iterator((list_node*)erase_after(before_first.node, last.node));
  387.   }
  388.   iterator erase(iterator pos) {
  389.     return (list_node*) erase_after(__slist_previous(&head, pos.node));
  390.   }
  391.   iterator erase(iterator first, iterator last) {
  392.     return (list_node*) erase_after(__slist_previous(&head, first.node),
  393.                                     last.node);
  394.   }
  395.   void resize(size_type new_size, const T& x);
  396.   void resize(size_type new_size) { resize(new_size, T()); }
  397.   void clear() { erase_after(&head, 0); }
  398. public:
  399.   // Moves the range [before_first + 1, before_last + 1) to *this,
  400.   //  inserting it immediately after pos.  This is constant time.
  401.   void splice_after(iterator pos, 
  402.                     iterator before_first, iterator before_last)
  403.   {
  404.     if (before_first != before_last) 
  405.       __slist_splice_after(pos.node, before_first.node, before_last.node);
  406.   }
  407.   // Moves the element that follows prev to *this, inserting it immediately
  408.   //  after pos.  This is constant time.
  409.   void splice_after(iterator pos, iterator prev)
  410.   {
  411.     __slist_splice_after(pos.node, prev.node, prev.node->next);
  412.   }
  413.   // Linear in distance(begin(), pos), and linear in L.size().
  414.   void splice(iterator pos, slist& L) {
  415.     if (L.head.next)
  416.       __slist_splice_after(__slist_previous(&head, pos.node),
  417.                            &L.head,
  418.                            __slist_previous(&L.head, 0));
  419.   }
  420.   // Linear in distance(begin(), pos), and in distance(L.begin(), i).
  421.   void splice(iterator pos, slist& L, iterator i) {
  422.     __slist_splice_after(__slist_previous(&head, pos.node),
  423.                          __slist_previous(&L.head, i.node),
  424.                          i.node);
  425.   }
  426.   // Linear in distance(begin(), pos), in distance(L.begin(), first),
  427.   // and in distance(first, last).
  428.   void splice(iterator pos, slist& L, iterator first, iterator last)
  429.   {
  430.     if (first != last)
  431.       __slist_splice_after(__slist_previous(&head, pos.node),
  432.                            __slist_previous(&L.head, first.node),
  433.                            __slist_previous(first.node, last.node));
  434.   }
  435. public:
  436.   void reverse() { if (head.next) head.next = __slist_reverse(head.next); }
  437.   void remove(const T& val); 
  438.   void unique(); 
  439.   void merge(slist& L);
  440.   void sort();     
  441. #ifdef __STL_MEMBER_TEMPLATES
  442.   template <class Predicate> void remove_if(Predicate pred);
  443.   template <class BinaryPredicate> void unique(BinaryPredicate pred); 
  444.   template <class StrictWeakOrdering> void merge(slist&, StrictWeakOrdering); 
  445.   template <class StrictWeakOrdering> void sort(StrictWeakOrdering comp); 
  446. #endif /* __STL_MEMBER_TEMPLATES */
  447. };
  448. template <class T, class Alloc>
  449. slist<T, Alloc>& slist<T,Alloc>::operator=(const slist<T, Alloc>& L)
  450. {
  451.   if (&L != this) {
  452.     list_node_base* p1 = &head;
  453.     list_node* n1 = (list_node*) head.next;
  454.     const list_node* n2 = (const list_node*) L.head.next;
  455.     while (n1 && n2) {
  456.       n1->data = n2->data;
  457.       p1 = n1;
  458.       n1 = (list_node*) n1->next;
  459.       n2 = (const list_node*) n2->next;
  460.     }
  461.     if (n2 == 0)
  462.       erase_after(p1, 0);
  463.     else
  464.       _insert_after_range(p1,
  465.                           const_iterator((list_node*)n2), const_iterator(0));
  466.   }
  467.   return *this;
  468. template <class T, class Alloc>
  469. bool operator==(const slist<T, Alloc>& L1, const slist<T, Alloc>& L2)
  470. {
  471.   typedef typename slist<T,Alloc>::list_node list_node;
  472.   list_node* n1 = (list_node*) L1.head.next;
  473.   list_node* n2 = (list_node*) L2.head.next;
  474.   while (n1 && n2 && n1->data == n2->data) {
  475.     n1 = (list_node*) n1->next;
  476.     n2 = (list_node*) n2->next;
  477.   }
  478.   return n1 == 0 && n2 == 0;
  479. }
  480. template <class T, class Alloc>
  481. inline bool operator<(const slist<T, Alloc>& L1, const slist<T, Alloc>& L2)
  482. {
  483.   return lexicographical_compare(L1.begin(), L1.end(), L2.begin(), L2.end());
  484. }
  485. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  486. template <class T, class Alloc>
  487. inline void swap(slist<T, Alloc>& x, slist<T, Alloc>& y) {
  488.   x.swap(y);
  489. }
  490. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  491. template <class T, class Alloc>
  492. void slist<T, Alloc>::resize(size_type len, const T& x)
  493. {
  494.   list_node_base* cur = &head;
  495.   while (cur->next != 0 && len > 0) {
  496.     --len;
  497.     cur = cur->next;
  498.   }
  499.   if (cur->next) 
  500.     erase_after(cur, 0);
  501.   else
  502.     _insert_after_fill(cur, len, x);
  503. }
  504. template <class T, class Alloc>
  505. void slist<T,Alloc>::remove(const T& val)
  506. {
  507.   list_node_base* cur = &head;
  508.   while (cur && cur->next) {
  509.     if (((list_node*) cur->next)->data == val)
  510.       erase_after(cur);
  511.     else
  512.       cur = cur->next;
  513.   }
  514. }
  515. template <class T, class Alloc> 
  516. void slist<T,Alloc>::unique()
  517. {
  518.   list_node_base* cur = head.next;
  519.   if (cur) {
  520.     while (cur->next) {
  521.       if (((list_node*)cur)->data == ((list_node*)(cur->next))->data)
  522.         erase_after(cur);
  523.       else
  524.         cur = cur->next;
  525.     }
  526.   }
  527. }
  528. template <class T, class Alloc>
  529. void slist<T,Alloc>::merge(slist<T,Alloc>& L)
  530. {
  531.   list_node_base* n1 = &head;
  532.   while (n1->next && L.head.next) {
  533.     if (((list_node*) L.head.next)->data < ((list_node*) n1->next)->data) 
  534.       __slist_splice_after(n1, &L.head, L.head.next);
  535.     n1 = n1->next;
  536.   }
  537.   if (L.head.next) {
  538.     n1->next = L.head.next;
  539.     L.head.next = 0;
  540.   }
  541. }
  542. template <class T, class Alloc>
  543. void slist<T,Alloc>::sort()
  544. {
  545.   if (head.next && head.next->next) {
  546.     slist carry;
  547.     slist counter[64];
  548.     int fill = 0;
  549.     while (!empty()) {
  550.       __slist_splice_after(&carry.head, &head, head.next);
  551.       int i = 0;
  552.       while (i < fill && !counter[i].empty()) {
  553.         counter[i].merge(carry);
  554.         carry.swap(counter[i]);
  555.         ++i;
  556.       }
  557.       carry.swap(counter[i]);
  558.       if (i == fill)
  559.         ++fill;
  560.     }
  561.     for (int i = 1; i < fill; ++i)
  562.       counter[i].merge(counter[i-1]);
  563.     this->swap(counter[fill-1]);
  564.   }
  565. }
  566. #ifdef __STL_MEMBER_TEMPLATES
  567. template <class T, class Alloc> 
  568. template <class Predicate> void slist<T,Alloc>::remove_if(Predicate pred)
  569. {
  570.   list_node_base* cur = &head;
  571.   while (cur->next) {
  572.     if (pred(((list_node*) cur->next)->data))
  573.       erase_after(cur);
  574.     else
  575.       cur = cur->next;
  576.   }
  577. }
  578. template <class T, class Alloc> template <class BinaryPredicate> 
  579. void slist<T,Alloc>::unique(BinaryPredicate pred)
  580. {
  581.   list_node* cur = (list_node*) head.next;
  582.   if (cur) {
  583.     while (cur->next) {
  584.       if (pred(((list_node*)cur)->data, ((list_node*)(cur->next))->data))
  585.         erase_after(cur);
  586.       else
  587.         cur = (list_node*) cur->next;
  588.     }
  589.   }
  590. }
  591. template <class T, class Alloc> template <class StrictWeakOrdering>
  592. void slist<T,Alloc>::merge(slist<T,Alloc>& L, StrictWeakOrdering comp)
  593. {
  594.   list_node_base* n1 = &head;
  595.   while (n1->next && L.head.next) {
  596.     if (comp(((list_node*) L.head.next)->data,
  597.              ((list_node*) n1->next)->data))
  598.       __slist_splice_after(n1, &L.head, L.head.next);
  599.     n1 = n1->next;
  600.   }
  601.   if (L.head.next) {
  602.     n1->next = L.head.next;
  603.     L.head.next = 0;
  604.   }
  605. }
  606. template <class T, class Alloc> template <class StrictWeakOrdering> 
  607. void slist<T,Alloc>::sort(StrictWeakOrdering comp)
  608. {
  609.   if (head.next && head.next->next) {
  610.     slist carry;
  611.     slist counter[64];
  612.     int fill = 0;
  613.     while (!empty()) {
  614.       __slist_splice_after(&carry.head, &head, head.next);
  615.       int i = 0;
  616.       while (i < fill && !counter[i].empty()) {
  617.         counter[i].merge(carry, comp);
  618.         carry.swap(counter[i]);
  619.         ++i;
  620.       }
  621.       carry.swap(counter[i]);
  622.       if (i == fill)
  623.         ++fill;
  624.     }
  625.     for (int i = 1; i < fill; ++i)
  626.       counter[i].merge(counter[i-1], comp);
  627.     this->swap(counter[fill-1]);
  628.   }
  629. }
  630. #endif /* __STL_MEMBER_TEMPLATES */
  631. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  632. #pragma reset woff 1174
  633. #endif
  634. __STL_END_NAMESPACE 
  635. #endif /* __SGI_STL_INTERNAL_SLIST_H */
  636. // Local Variables:
  637. // mode:C++
  638. // End: