![]() |
Beaming Scene Service
2.0
RakNet wrapper for managing data communications between multiple Beaming clients
|
00001 /* 00002 * Simple Dictionary for XVR 00003 * Emanuele Ruffaldi 2009 00004 * 00005 * TODO: dynamic 00006 * 00007 * Initial 2009/07/28 00008 * 00009 * TODO 00010 * - iterators of values and keys 00011 */ 00012 #ifndef DICTXVR_H_S3D 00013 #define DICTXVR_H_S3D 00014 00015 /* 00016 * Hashtable implemented as Chain 00017 */ 00018 class Hashtable 00019 { 00020 00021 get(key); 00022 put(key,value); 00023 del(key); 00024 contains(key); 00025 clear(); 00026 size(); 00027 00028 var xdata; // array of buckets 00029 var xsize; // size 00030 }; 00031 00032 //----------------------------------------------------- 00033 00035 function hashstr(x) 00036 { 00037 switch(valtype(x)) 00038 { 00039 case "S": 00040 { 00041 // vocong 00042 // alternative is DJBX33A starting from 5381 and then (r + (r*32)) + asc(x[i]); 00043 var r = 0; 00044 for(var i = 0; i < len(x); i++) 00045 r = r*0x63c63cd9 + 0x9c39c33d + asc(x[i]); 00046 return abs(r); 00047 } 00048 case "I": 00049 return abs(x); 00050 case "O": 00051 return x.__hash__; 00052 default: 00053 return 0; // not supported 00054 } 00055 00056 } 00057 00058 /* XVR Hash Table Bucket */ 00059 class HashtableBucket 00060 { 00061 var value; 00062 var key; 00063 var next; 00064 }; 00065 00066 function Hashtable::Hashtable() 00067 { 00068 xdata = Array(256); 00069 xsize = 0; 00070 } 00071 00072 function Hashtable::clear() 00073 { 00074 this.xdata = Array(256); 00075 this.xsize = 0; 00076 } 00077 00078 function Hashtable::get(key) 00079 { 00080 var hid = hashstr(key); 00081 var p = xdata[hid % len(xdata)]; 00082 while(p != Void) 00083 { 00084 if(p.key == key) 00085 return p.value; 00086 } 00087 return Void; 00088 } 00089 00090 function Hashtable::size() 00091 { 00092 return this.xsize; 00093 } 00094 00095 function Hashtable::contains(key) 00096 { 00097 var hid = hashstr(key)% len(xdata); 00098 var p = xdata[hid]; 00099 while(p != Void) 00100 { 00101 if(p.key == key) 00102 return true; 00103 } 00104 return false; 00105 } 00106 00107 function Hashtable::put(key,value) 00108 { 00109 var hid = hashstr(key) %len(xdata); 00110 var p = xdata[hid]; 00111 var q = HashtableBucket(); 00112 q.key = key; 00113 q.value = value; 00114 xsize++; 00115 if(p == Void) 00116 { 00117 xdata[hid] = q; 00118 } 00119 else 00120 { 00121 q.next = p; 00122 xdata[hid] = q; 00123 } 00124 return true; 00125 } 00126 00127 function Hashtable::del(key) 00128 { 00129 var hid = hashstr(key) %len(xdata); 00130 var p = xdata[hid]; 00131 if(p == Void) 00132 return false; 00133 var pre; 00134 while(true) 00135 { 00136 if(p.key == key) 00137 { 00138 if(pre == Void) 00139 xdata[hid] = p.next; 00140 else 00141 pre.next = p.next; 00142 xsize--; 00143 return true; 00144 } 00145 pre = p; 00146 p = p.next; 00147 if(p == Void) 00148 return false; 00149 } 00150 } 00151 00152 00153 #endif