Beaming Scene Service  2.0
RakNet wrapper for managing data communications between multiple Beaming clients
sampleXVRclient/dictxvr.h.s3d
Go to the documentation of this file.
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
 All Classes Files Functions Variables Enumerations Enumerator Defines