nilist.h
上传用户: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. #ifndef NILIST
  35. #define NILIST
  36. class slink {
  37. public:
  38.     slink *next_;
  39.     int key_;
  40.     slink(int key=0) {next_=0; key_ = key;}
  41.     slink(slink *p, int key=0) {next_ = p; key_ = key;}
  42. };
  43. class slist_base {
  44.     slink *last_;
  45.     int count_;
  46. int append_count_;
  47. int remove_count_;
  48. public:
  49.     slist_base() {last_ = 0;count_=0;append_count_=0;remove_count_=0;}
  50.     slist_base(slink *a) {last_ = a->next_ = a;}
  51.     void insert(slink *a); // add at head
  52.     void append(slink *a); // add at tail
  53.     void remove(slink *a, slink *prev);
  54.     
  55.     slink *get(); // remove from head
  56.     slink *find(int key); // return to matching key
  57.     void clear() {last_ = 0;}
  58.     int count() {return count_;}
  59.     slink *last() {return last_;}    /* XXX */
  60.     int ac() {return append_count_;} /* XXX */
  61.     int rc() {return remove_count_;} /* XXX */
  62.     friend class slist_base_iter;
  63. };
  64. template<class T> class Islist_iter;
  65. template<class T>
  66. class Islist : private slist_base {
  67. friend class Islist_iter<T>;
  68.   public:
  69. void insert(T* a) {slist_base::insert(a);}
  70. void append(T* a) {slist_base::append(a);}
  71. void remove(T* a, T* prev) {slist_base::remove(a,prev);}
  72. T *get() {return (T* ) slist_base::get();}
  73. T *find(int key) {return (T*) slist_base::find(key);}
  74. int count() {return slist_base::count();}
  75. };
  76. template<class T>
  77. struct Tlink : public slink {
  78.     T info;
  79.     Tlink(const T& a) : info(a) { }
  80. };
  81. template<class T> class Slist_iter;
  82. template<class T>
  83. class Slist: private slist_base {
  84.     friend class Slist_iter<T>;
  85. public:
  86.     void insert(const T& a)
  87.          { slist_base::insert(new Tlink<T>(a));}
  88.     void append(const T& a)
  89.          { slist_base::append(new Tlink<T>(a));}
  90.     T get();
  91. };
  92. class slist_base_iter 
  93. {
  94.     slink *ce;
  95.     slist_base *cs;
  96. public:
  97.     slist_base_iter(slist_base &s);
  98.     void set_cur(slink *cur) {ce = cur;}
  99.     slink *get_cur() {return ce;}
  100.     slink *get_last() {return cs->last_;}
  101.     slink *operator() ();
  102.     int count() {return cs->count();}
  103. };
  104. template <class T>
  105. class Islist_iter : public slist_base_iter {
  106. public:
  107.     Islist_iter(Islist<T> &s) : slist_base_iter(s) { }
  108.     T *operator() ()
  109.        { return (T *) slist_base_iter::operator() (); }
  110.     T *get_last() {return (T *) slist_base_iter::get_last(); }
  111.     T *get_cur() {return (T *) slist_base_iter::get_cur(); }
  112. };
  113. template <class T>
  114. class Slist_iter : public slist_base_iter {
  115. public:
  116.     Slist_iter(Slist<T> &s) : slist_base_iter(s) { }
  117.     inline T *operator() ();
  118. };
  119. #endif