reSIProcate/rutil  9694
testIntrusiveList.cxx
Go to the documentation of this file.
00001 #include <cassert>
00002 #include "rutil/Logger.hxx"
00003 #include "rutil/IntrusiveListElement.hxx"
00004 
00005 using namespace resip;
00006 using namespace std;
00007 
00008 #define RESIPROCATE_SUBSYSTEM Subsystem::TEST
00009 
00010 class Foo : public IntrusiveListElement<Foo*>
00011 {
00012    public:
00013       Foo(int v) : va1(v) {}
00014       int va1;
00015       int va2;
00016 };
00017 
00018 class FooFoo;
00019 
00020 typedef IntrusiveListElement<FooFoo*> FooRead;
00021 typedef IntrusiveListElement1<FooFoo*> FooWrite;
00022 
00023 
00024 class FooFoo : public FooRead, public FooWrite
00025 {
00026    public:
00027       
00028       FooFoo(int v) : va1(v) {}
00029 
00030       int va1;
00031       int va2;
00032 };
00033 
00034 int
00035 main(int argc, char* argv[])
00036 {
00037    {
00038       Foo* fooHead = new Foo(-1);
00039       Foo* foo1 = new Foo(1);
00040       Foo* foo2 = new Foo(2);
00041       Foo* foo3 = new Foo(3);
00042       Foo* foo4 = new Foo(4);
00043 
00044       Foo::makeList(fooHead);
00045       assert(fooHead->empty());
00046       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00047       {
00048          cerr << (*f)->va1 << endl;
00049       }
00050 
00051       fooHead->push_front(foo1);
00052       assert(!fooHead->empty());
00053       cerr << endl << "first" << endl;
00054       assert((*fooHead->begin())->va1 == 1);
00055       assert((*fooHead->end())->va1 == -1);
00056 
00057       Foo::iterator j = fooHead->begin();
00058       ++j;
00059       cerr << (*j)->va1 << endl;
00060       assert((*j)->va1 == -1);      
00061       assert(*j == *fooHead->end());
00062 
00063       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00064       {
00065          cerr << (*f)->va1 << endl;
00066       }
00067 
00068       fooHead->push_front(foo2);
00069       cerr << endl << "second" << endl;
00070       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00071       {
00072          cerr << (*f)->va1 << endl;
00073       }
00074 
00075       fooHead->push_front(foo3);   
00076       cerr << endl << "third" << endl;
00077       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00078       {
00079          cerr << (*f)->va1 << endl;
00080       }
00081 
00082       cerr << endl << "deleted second" << endl;
00083       delete foo2;
00084       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00085       {
00086          cerr << (*f)->va1 << endl;
00087       }
00088 
00089       cerr << endl << "fourth" << endl;
00090       fooHead->push_front(foo4);
00091       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00092       {
00093          cerr << (*f)->va1 << endl;
00094       }
00095 
00096       cerr << endl << "deleted fourth, first" << endl;
00097       delete foo1;
00098       delete foo4;
00099       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00100       {
00101          cerr << (*f)->va1 << endl;
00102       }
00103    
00104       cerr << endl << "deleted third (empty)" << endl;
00105       delete foo3;
00106       for (Foo::iterator f = fooHead->begin(); f != fooHead->end(); ++f)
00107       {
00108          cerr << (*f)->va1 << endl;
00109       }
00110    }
00111 
00112    //=============================================================================
00113    // Read version
00114    //=============================================================================
00115    cerr << endl << "READ VERSION" << endl;
00116    {
00117       FooFoo* fooFooHead = new FooFoo(-1);
00118       FooFoo* fooFoo1 = new FooFoo(1);
00119       FooFoo* fooFoo2 = new FooFoo(2);
00120       FooFoo* fooFoo3 = new FooFoo(3);
00121       FooFoo* fooFoo4 = new FooFoo(4);
00122 
00123       FooRead::makeList(fooFooHead);
00124       FooWrite::makeList(fooFooHead);
00125       assert(fooFooHead->FooRead::empty());
00126       assert(fooFooHead->FooWrite::empty());
00127       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00128       {
00129          cerr << (*f)->va1 << endl;
00130       }
00131 
00132       fooFooHead->FooRead::push_front(fooFoo1);
00133       assert(!fooFooHead->FooRead::empty());
00134       assert(fooFooHead->FooWrite::empty());
00135       cerr << endl << "first" << endl;
00136       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00137       {
00138          cerr << (*f)->va1 << endl;
00139       }
00140 
00141       fooFooHead->FooRead::push_front(fooFoo2);
00142       cerr << endl << "second" << endl;
00143       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00144       {
00145          cerr << (*f)->va1 << endl;
00146       }
00147 
00148       fooFooHead->FooRead::push_front(fooFoo3);   
00149       cerr << endl << "third" << endl;
00150       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00151       {
00152          cerr << (*f)->va1 << endl;
00153       }
00154 
00155       cerr << endl << "deleted second" << endl;
00156       delete fooFoo2;
00157       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00158       {
00159          cerr << (*f)->va1 << endl;
00160       }
00161 
00162       cerr << endl << "fourth" << endl;
00163       fooFooHead->FooRead::push_front(fooFoo4);
00164       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00165       {
00166          cerr << (*f)->va1 << endl;
00167       }
00168 
00169       cerr << endl << "deleted fourth, first" << endl;
00170       delete fooFoo1;
00171       delete fooFoo4;
00172       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00173       {
00174          cerr << (*f)->va1 << endl;
00175       }
00176    
00177       cerr << endl << "deleted third (empty)" << endl;
00178       delete fooFoo3;
00179       for (FooRead::iterator f = fooFooHead->FooRead::begin(); f != fooFooHead->FooRead::end(); ++f)
00180       {
00181          cerr << (*f)->va1 << endl;
00182       }
00183    }
00184 
00185    //=============================================================================
00186    // Write version
00187    //=============================================================================
00188    cerr << endl << "WRITE VERSION" << endl;
00189    {      
00190       FooFoo* fooFooHead = new FooFoo(-1);
00191       FooFoo* fooFoo1 = new FooFoo(1);
00192       FooFoo* fooFoo2 = new FooFoo(2);
00193       FooFoo* fooFoo3 = new FooFoo(3);
00194       FooFoo* fooFoo4 = new FooFoo(4);
00195 
00196       FooWrite::makeList(fooFooHead);
00197       FooRead::makeList(fooFooHead);
00198       assert(fooFooHead->FooWrite::empty());
00199       assert(fooFooHead->FooRead::empty());
00200       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00201       {
00202          cerr << (*f)->va1 << endl;
00203       }
00204 
00205       fooFooHead->FooWrite::push_front(fooFoo1);
00206       assert(!fooFooHead->FooWrite::empty());
00207       assert(fooFooHead->FooRead::empty());
00208       cerr << endl << "first" << endl;
00209       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00210       {
00211          cerr << (*f)->va1 << endl;
00212       }
00213 
00214       fooFooHead->FooWrite::push_front(fooFoo2);
00215       cerr << endl << "second" << endl;
00216       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00217       {
00218          cerr << (*f)->va1 << endl;
00219       }
00220 
00221       fooFooHead->FooWrite::push_front(fooFoo3);   
00222       cerr << endl << "third" << endl;
00223       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00224       {
00225          cerr << (*f)->va1 << endl;
00226       }
00227 
00228       cerr << endl << "deleted second" << endl;
00229       delete fooFoo2;
00230       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00231       {
00232          cerr << (*f)->va1 << endl;
00233       }
00234 
00235       cerr << endl << "fourth" << endl;
00236       fooFooHead->FooWrite::push_front(fooFoo4);
00237       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00238       {
00239          cerr << (*f)->va1 << endl;
00240       }
00241 
00242       cerr << endl << "deleted fourth, first" << endl;
00243       delete fooFoo1;
00244       delete fooFoo4;
00245       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00246       {
00247          cerr << (*f)->va1 << endl;
00248       }
00249    
00250       cerr << endl << "deleted third (empty)" << endl;
00251       delete fooFoo3;
00252       for (FooWrite::iterator f = fooFooHead->FooWrite::begin(); f != fooFooHead->FooWrite::end(); ++f)
00253       {
00254          cerr << (*f)->va1 << endl;
00255       }
00256    }
00257 
00258    cerr << "All OK" << endl;
00259 
00260    return 0;
00261 }
00262 
00263 /* ====================================================================
00264  * The Vovida Software License, Version 1.0 
00265  * 
00266  * Copyright (c) 2000-2005 Vovida Networks, Inc.  All rights reserved.
00267  * 
00268  * Redistribution and use in source and binary forms, with or without
00269  * modification, are permitted provided that the following conditions
00270  * are met:
00271  * 
00272  * 1. Redistributions of source code must retain the above copyright
00273  *    notice, this list of conditions and the following disclaimer.
00274  * 
00275  * 2. Redistributions in binary form must reproduce the above copyright
00276  *    notice, this list of conditions and the following disclaimer in
00277  *    the documentation and/or other materials provided with the
00278  *    distribution.
00279  * 
00280  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
00281  *    and "Vovida Open Communication Application Library (VOCAL)" must
00282  *    not be used to endorse or promote products derived from this
00283  *    software without prior written permission. For written
00284  *    permission, please contact vocal@vovida.org.
00285  *
00286  * 4. Products derived from this software may not be called "VOCAL", nor
00287  *    may "VOCAL" appear in their name, without prior written
00288  *    permission of Vovida Networks, Inc.
00289  * 
00290  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
00291  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00292  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
00293  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
00294  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
00295  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
00296  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00297  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00298  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
00299  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00300  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
00301  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
00302  * DAMAGE.
00303  * 
00304  * ====================================================================
00305  * 
00306  * This software consists of voluntary contributions made by Vovida
00307  * Networks, Inc. and many individuals on behalf of Vovida Networks,
00308  * Inc.  For more information on Vovida Networks, Inc., please see
00309  * <http://www.vovida.org/>.
00310  *
00311  */