nilist.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *  This product includes software developed by the Daedalus Research
  17.  *  Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  * 
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. #include <stdlib.h>
  35. /*#include <unistd.h>*/
  36. #include "nilist.h"
  37. template<class T>
  38. T Slist<T>::get()
  39. {
  40.     Tlink<T>* lnk = (Tlink<T>*) slist_base::get();
  41.     T i = lnk->info;
  42.     delete lnk;
  43.     return i;
  44. }
  45. void slist_base::insert(slink *a)
  46. {
  47.     count_++;
  48.     if (last_)
  49. a->next_ = last_->next_;
  50.     else
  51. last_ = a;
  52.     last_->next_ = a;
  53. }
  54. #include <stdio.h>
  55. void slist_base::remove(slink *a, slink *prev)
  56. {
  57.     remove_count_++; /* XXX */
  58.     count_--;
  59.     if (prev && prev->next_ != a)
  60.     printf("In remove(): Error: prev->next!=a  prev=%p  a=%pn", 
  61.    reinterpret_cast<void *>(prev),
  62.    reinterpret_cast<void *>(a) );
  63.     if (last_ == NULL) 
  64. return;
  65.     if (prev == NULL)
  66. if (last_->next_ == a)
  67.     prev = last_;
  68. else 
  69.     return;
  70.     prev->next_ = a->next_;
  71.     if (last_ == a) // a was last in list
  72. last_ = prev;
  73.     if (last_->next_ == a) // a was only one in list
  74. last_ = NULL;
  75. }
  76. void slist_base::append(slink *a)
  77. {
  78.     append_count_++; /* XXX */
  79.     count_++;
  80.     if (last_) {
  81. a->next_ = last_->next_;
  82. last_ = last_->next_ = a;
  83.     }
  84.     else
  85. last_ = a->next_ = a;
  86. }
  87. slink *slist_base::get()
  88. {
  89.     count_--;
  90.     if (last_ == 0) return NULL;
  91.     slink * f = last_->next_;
  92.     if (f == last_)
  93. last_ = 0;
  94.     else 
  95. last_->next_ = f->next_;
  96.     return f;
  97. }
  98. slink *slist_base::find(int key)
  99. {
  100.     slink *cur = last_;
  101.     
  102.     if (last_ == 0) return NULL;
  103.     do {
  104. cur = cur->next_;
  105. if (cur->key_ == key)
  106.     return cur;
  107.     } while (cur != last_);
  108.     return NULL;
  109. }
  110. slist_base_iter::slist_base_iter(slist_base &s)
  111. {
  112.     cs = &s;
  113.     ce = cs->last_;
  114. }
  115. slink *
  116. slist_base_iter::operator() ()
  117.     // return 0 to indicate end of iteration
  118. {
  119.     slink *ret = ce ? (ce=ce->next_) : 0;
  120.     if (ce == cs->last_) ce = 0;
  121.     return ret;
  122. }
  123. template<class T> T* Slist_iter<T>::operator() ()
  124. {
  125.     Tlink<T> *lnk = (Tlink<T> *) slist_base_iter::operator() ();
  126.     return lnk ? &lnk->info : 0;
  127. }