nilist.cc

Go to the documentation of this file.
00001 /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
00002 /*
00003  * Copyright (c) 1997 Regents of the University of California.
00004  * All rights reserved.
00005  * 
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions
00008  * are met:
00009  * 1. Redistributions of source code must retain the above copyright
00010  *    notice, this list of conditions and the following disclaimer.
00011  * 2. Redistributions in binary form must reproduce the above copyright
00012  *    notice, this list of conditions and the following disclaimer in the
00013  *    documentation and/or other materials provided with the distribution.
00014  * 3. All advertising materials mentioning features or use of this software
00015  *    must display the following acknowledgement:
00016  *  This product includes software developed by the Daedalus Research
00017  *  Group at the University of California Berkeley.
00018  * 4. Neither the name of the University nor of the Research Group may be
00019  *    used to endorse or promote products derived from this software without
00020  *    specific prior written permission.
00021  * 
00022  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00023  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00024  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00025  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00026  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00027  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00028  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00029  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00030  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00031  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00032  * SUCH DAMAGE.
00033  */
00034 
00035 #include <stdlib.h>
00036 /*#include <unistd.h>*/
00037 #include "nilist.h"
00038 
00039 template<class T>
00040 T Slist<T>::get()
00041 {
00042     Tlink<T>* lnk = (Tlink<T>*) slist_base::get();
00043     T i = lnk->info;
00044     delete lnk;
00045     return i;
00046 }
00047 
00048 void slist_base::insert(slink *a)
00049 {
00050     count_++;
00051     if (last_)
00052     a->next_ = last_->next_;
00053     else
00054     last_ = a;
00055     last_->next_ = a;
00056 }
00057 #include <stdio.h>
00058 
00059 void slist_base::remove(slink *a, slink *prev)
00060 {
00061     remove_count_++; /* XXX */
00062     count_--;
00063     if (prev && prev->next_ != a)
00064         printf("In remove(): Error: prev->next!=a  prev=%p  a=%p\n", prev, a);
00065     if (last_ == NULL) 
00066     return;
00067     if (prev == NULL)
00068     if (last_->next_ == a)
00069         prev = last_;
00070     else 
00071         return;
00072 
00073     prev->next_ = a->next_;
00074     if (last_ == a)     // a was last in list
00075     last_ = prev;
00076     if (last_->next_ == a)  // a was only one in list
00077     last_ = NULL;
00078 }
00079 
00080 void slist_base::append(slink *a)
00081 {
00082     append_count_++; /* XXX */
00083     count_++;
00084     if (last_) {
00085     a->next_ = last_->next_;
00086     last_ = last_->next_ = a;
00087     }
00088     else
00089     last_ = a->next_ = a;
00090 }
00091 
00092 slink *slist_base::get()
00093 {
00094     count_--;
00095     if (last_ == 0) return NULL;
00096     slink * f = last_->next_;
00097     if (f == last_)
00098     last_ = 0;
00099     else 
00100     last_->next_ = f->next_;
00101     return f;
00102 }
00103 
00104 slink *slist_base::find(int key)
00105 {
00106     slink *cur = last_;
00107     
00108     if (last_ == 0) return NULL;
00109     do {
00110     cur = cur->next_;
00111     if (cur->key_ == key)
00112         return cur;
00113     } while (cur != last_);
00114     return NULL;
00115 }
00116 
00117 slist_base_iter::slist_base_iter(slist_base &s)
00118 {
00119     cs = &s;
00120     ce = cs->last_;
00121 }
00122 
00123 slink *
00124 slist_base_iter::operator() ()
00125     // return 0 to indicate end of iteration
00126 {
00127     slink *ret = ce ? (ce=ce->next_) : 0;
00128     if (ce == cs->last_) ce = 0;
00129     return ret;
00130 }
00131 
00132 template<class T> T* Slist_iter<T>::operator() ()
00133 {
00134     Tlink<T> *lnk = (Tlink<T> *) slist_base_iter::operator() ();
00135     return lnk ? &lnk->info : 0;
00136 }
00137 

Generated on Tue Mar 6 16:47:47 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6