|
reSIProcate/rutil
9694
|
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 */
1.7.5.1