00001 #include "cl/FileName.h" 00002 #include "cl/List.h" 00003 #include <stdlib.h> 00004 #include "cl/Hash.h" 00005 #include "cl/Heap.h" 00006 00007 #define CL_INST_RW 00008 #include "cl/InstArray.h" 00009 00010 class StringNode : public Node, public String 00011 { 00012 public: 00013 StringNode() : Node(), String() {}; 00014 StringNode(const char *s) : Node(), String() { (String&) SELF = s; }; 00015 00016 static Void *New() { return new StringNode; }; 00017 }; 00018 00019 Void TestList() 00020 { 00021 TypedList<StringNode> list; 00022 StringNode tt, *temp; 00023 00024 cout << "\nList Test" << endl; 00025 cout << "---------\n" << endl; 00026 00027 (String&) tt = "red"; 00028 cout << list << endl; 00029 list.Append(&tt); 00030 list.Append(new StringNode("orange")); 00031 temp = (StringNode*) StringNode::New(); 00032 *temp = "green"; 00033 list.Append(temp); 00034 cout << list << endl; 00035 } 00036 00037 Void MyPrint(StrConst bob) 00038 { 00039 cout << "print(StrConst): " << bob << endl; 00040 } 00041 00042 Void TestString() 00043 { 00044 String string; 00045 StrConst strconst = "strconst"; 00046 Int i; 00047 StrConstArray a; 00048 00049 string = "string"; 00050 00051 cout << "\nString Test" << endl; 00052 cout << "-----------\n" << endl; 00053 00054 cout << "sprintf test: " 00055 << String().Printf("number %d, strings '%s' '%s' '%s'", 00056 20, "cstring", strconst, string.CString()) << endl; 00057 00058 cout << "StrConst + CStr: " << strconst + "cstr" << endl; 00059 cout << "String + CStr: " << string + "cstr" << endl; 00060 cout << "CStr + String: " << ("cstr" + string) << endl; 00061 cout << "String + StrConst + CStr: " << string + strconst + "cstr" << endl; 00062 00063 MyPrint(string); 00064 MyPrint("blah-" + string + "-blah"); 00065 00066 cout << "iso for string/strconst == "; 00067 if (string == string && strconst == strconst) 00068 cout << "good" << endl; 00069 else 00070 cout << "bad" << endl; 00071 00072 cout << "string/cstr == "; 00073 if (string == "string" && "string" == string) 00074 cout << "good" << endl; 00075 else 00076 cout << "bad" << endl; 00077 00078 cout << "strconst/cstr == "; 00079 if (strconst == "strconst" && "strconst" == strconst) 00080 cout << "good" << endl; 00081 else 00082 cout << "bad" << endl; 00083 00084 string = strconst; 00085 cout << "string/strconst == "; 00086 if (strconst == string && string == strconst) 00087 cout << "good" << endl; 00088 else 00089 cout << "bad" << endl; 00090 00091 string = "abcdefgh"; 00092 00093 cout << "Suffix/Prefix test: " << string.Suffix(2) << ':' << string.Suffix(-2) << ':' 00094 << string.Prefix(2) << ':' << string.Prefix(-2) << '<' << endl; 00095 00096 cout << "Suffix/Prefix bounds test: " << string.Suffix(10) << ':' << string.Suffix(-10) << ':' 00097 << string.Prefix(10) << ':' << string.Prefix(-10) << '<' << endl; 00098 00099 cout << "SubString test: " << string.SubString(2, 4) << ':' << string.SubString(-6, 4) << '<' << endl; 00100 00101 cout << "SubString bounds test: " << string.SubString(10, 4) << ':' << string.SubString(-10, 4) 00102 << ':' << string.SubString(2, 10) << '<' << endl; 00103 00104 cout << "Find char test: " << string.FindChar('c') 00105 << ", " << string.FindCharLast('x') 00106 << ", " << strconst.FindChar('s') 00107 << ", " << strconst.FindCharLast('s') << endl; 00108 00109 cout << "Find tokens test: " << endl; 00110 string = " there is a disease that is tearing apart the lives of thousands"; 00111 cout << "string = " << string << endl; 00112 Split(string, a); 00113 for (i = 0; i < a.NumItems(); i++) 00114 cout << "token " << i << " = '" << a[i] << "'" << endl; 00115 } 00116 00117 static Void TestLoad(const FileName &fname) 00118 { 00119 cout << "exists: " << fname.GetPath() << ": " << fname.IsReadable() << endl; 00120 } 00121 00122 StrConst kExt[] = 00123 { 00124 "a", 00125 "b", 00126 0 00127 }; 00128 00129 Void TestFileName() 00130 { 00131 FileName t; 00132 00133 cout << "\nFileName Test" << endl; 00134 cout << "-------------\n" << endl; 00135 00136 t.SetPath("/one/two/three/and/wibble.sl.gz"); 00137 00138 cout << "the path is " << t.GetPath() << endl; 00139 cout << "parent: " << t.GetDir() << endl; 00140 cout << "name: " << t.GetFile() << endl; 00141 cout << "extensions: " << t.GetExtension() << endl; 00142 t.RemoveExtension(); 00143 cout << "removed extension" << endl; 00144 cout << "new name: " << t.GetFile() << endl; 00145 cout << "new ext: " << t.GetExtension() << endl; 00146 00147 TestLoad(t); 00148 TestLoad(FileName().SetPath("Makefile")); 00149 TestLoad(FileName().SetPath("Makefile.depend")); 00150 00151 FileName fname; 00152 00153 Int x; 00154 00155 x = fname.SetPath("a").FindFileExtension(kExt); 00156 cout << String().Printf("a: file %s %d [%d]\n", fname.GetPath().CString(), fname.flags, x); 00157 00158 x = fname.SetPath("a.b").FindFileExtension(kExt); 00159 cout << String().Printf("a.b.gz: file %s %d [%d]\n", fname.GetPath().CString(), fname.flags, x); 00160 00161 x = fname.SetPath("a.e").FindFileExtension(kExt); 00162 cout << String().Printf("a.e: file %s %d [%d]\n", fname.GetPath().CString(), fname.flags, x); 00163 00164 x = fname.SetPath("b").FindFileExtension(kExt); 00165 cout << String().Printf("b: file %s %d [%d]\n", fname.GetPath().CString(), fname.flags, x); 00166 } 00167 00168 Void TestEnviron() 00169 { 00170 cout << "\nEnviron Test" << endl; 00171 cout << "------------\n" << endl; 00172 00173 cout << SubstituteEnvVars("shell = $SHELL, path = $HOME/bob") << endl; 00174 } 00175 00176 Void TestInstArray() 00177 { 00178 InstArray<Int> a; 00179 Int i, sum; 00180 00181 cout << "\nInstArray Test" << endl; 00182 cout << "--------------\n" << endl; 00183 00184 a.stats.StartTrace(FileName().SetPath("trace.data")); 00185 a.SetSize(20); 00186 a.stats.accesses = new Int[a.NumItems()]; 00187 for (i = 0; i < a.NumItems(); i++) 00188 a.stats.accesses[i] = 0; 00189 00190 for (i = 0; i < a.NumItems(); i++) 00191 a[i] = i; 00192 00193 for (i = 0; i < a.NumItems(); i++) 00194 a[i] += 3; 00195 00196 for (i = 0; i < a.NumItems(); i++) 00197 sum += a[i]; 00198 00199 for (i = 0; i < 100; i++) 00200 a[rand() % 20] += 21; 00201 00202 a.stats.StopTrace(); 00203 a.stats.Dump(); 00204 for (i = 0; i < a.NumItems(); i++) 00205 cout << i << " = " << a.stats.accesses[i] << endl; 00206 } 00207 00208 class Printer : public IntHashIter 00209 { 00210 public: 00211 Void ProcessItem(StrConst s, Int a) 00212 { cout << s << " -> " << a << endl; }; 00213 }; 00214 00215 Void TestHash() 00216 { 00217 cout << "\nHash Test" << endl; 00218 cout << "---------\n" << endl; 00219 00220 IntHash hash; 00221 Printer printer; 00222 00223 hash.SetItem("bob", 20); 00224 hash.SetItem("mary", 33); 00225 hash.SetItem("peter", 21); 00226 hash.SetItem("jane", 10); 00227 00228 hash.SetItem("mary", hash.GetItem("mary") + 1); 00229 00230 hash.Iterate(printer); 00231 00232 cout << "bob exists: " << hash.ItemExists("bob") << endl; 00233 cout << "robert exists: " << hash.ItemExists("robert") << endl; 00234 } 00235 00236 Void TestHeap() 00237 { 00238 Heap heap; 00239 HeapEntry *he; 00240 Int i, n = 100; 00241 00242 srand48(20); 00243 00244 for (i = 0; i < n; i++) 00245 { 00246 he = new HeapEntry; 00247 00248 he->cost = drand48(); 00249 heap.Insert(he); 00250 } 00251 00252 for (i = 0; i < n / 5; i++) 00253 { 00254 he = heap.heap[rand() % n]; 00255 cout << "updating " << he->heapIdx << endl; 00256 he->cost = drand48(); 00257 heap.Update(he); 00258 } 00259 00260 for (i = 0; i < n / 5; i++) 00261 { 00262 he = heap.heap[rand() % heap.NumItems()]; 00263 cout << "removing " << he->heapIdx << endl; 00264 heap.Delete(he); 00265 } 00266 00267 for (i = 0; i < heap.NumItems(); i++) 00268 if (heap.heap[i]->heapIdx != i) 00269 cout << "bad heapIdx at " << i << " : " << heap.heap[i]->heapIdx << endl; 00270 00271 cout << heap.NumItems() << " items in heap:" << endl; 00272 i = 0; 00273 00274 while (he = heap.RemoveMax()) 00275 { 00276 cout << i++ << " > " << he->cost << endl; 00277 delete he; 00278 } 00279 00280 } 00281 00282 Void TestObjArray() 00283 { 00284 00285 00286 } 00287 00288 #ifdef UNFINISHED 00289 Void TestSplayTree() 00290 { 00291 /* A sample use of these functions. Start with the empty tree, */ 00292 /* insert some stuff into it, and then delete it */ 00293 Tree * root; 00294 int i; 00295 root = NULL; /* the empty tree */ 00296 size = 0; 00297 for (i = 0; i < 1024; i++) 00298 { 00299 root = insert((541 * i) & (1023), root); 00300 } 00301 for (i = 0; i < 1024; i++) 00302 { 00303 root = delete((541 * i) & (1023), root); 00304 } 00305 printf("size = %d\n", size); 00306 } 00307 #endif 00308 00309 Int main(Int argc, Char *argv[]) 00310 { 00311 FileName test; 00312 00313 TestEnviron(); 00314 TestList(); 00315 TestString(); 00316 TestInstArray(); 00317 TestHash(); 00318 TestFileName(); 00319 TestHeap(); 00320 00321 return(0); 00322 }