this shouldn't be in svn
[supertux.git] / src / squirrel / squirrel / sqtable.h
index b27b7d3..be66843 100644 (file)
@@ -9,28 +9,40 @@
 \r
 #include "sqstring.h"\r
 \r
-#define hashptr(p)  (((unsigned long)(p)) >> 3)\r
+\r
+#define hashptr(p)  ((SQHash)(((SQInteger)p) >> 3))\r
+\r
+inline SQHash HashObj(const SQObjectPtr &key)\r
+{\r
+       switch(type(key)) {\r
+               case OT_STRING:         return _string(key)->_hash;\r
+               case OT_FLOAT:          return (SQHash)((SQInteger)_float(key));\r
+               case OT_BOOL: case OT_INTEGER:  return (SQHash)((SQInteger)_integer(key));\r
+               default:                        return hashptr(key._unVal.pRefCounted);\r
+       }\r
+}\r
 \r
 struct SQTable : public SQDelegable \r
 {\r
 private:\r
        struct _HashNode\r
        {\r
+               _HashNode() { next = NULL; }\r
                SQObjectPtr val;\r
                SQObjectPtr key;\r
                _HashNode *next;\r
        };\r
        _HashNode *_firstfree;\r
        _HashNode *_nodes;\r
-       int _numofnodes;\r
-       int _usednodes;\r
+       SQInteger _numofnodes;\r
+       SQInteger _usednodes;\r
        \r
 ///////////////////////////\r
-       void AllocNodes(int nSize);\r
+       void AllocNodes(SQInteger nSize);\r
        void Rehash(bool force);\r
-       SQTable(SQSharedState *ss, int nInitialSize);\r
+       SQTable(SQSharedState *ss, SQInteger nInitialSize);\r
 public:\r
-       static SQTable* Create(SQSharedState *ss,int nInitialSize)\r
+       static SQTable* Create(SQSharedState *ss,SQInteger nInitialSize)\r
        {\r
                SQTable *newtable = (SQTable*)SQ_MALLOC(sizeof(SQTable));\r
                new (newtable) SQTable(ss, nInitialSize);\r
@@ -43,29 +55,20 @@ public:
        {\r
                SetDelegate(NULL);\r
                REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);\r
-               for (int i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode();\r
+               for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode();\r
                SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode));\r
        }\r
 #ifndef NO_GARBAGE_COLLECTOR \r
        void Mark(SQCollectable **chain);\r
 #endif\r
-       inline unsigned long HashKey(const SQObjectPtr &key)\r
-       {\r
-               switch(type(key)){\r
-                       case OT_STRING:         return _string(key)->_hash;\r
-                       case OT_FLOAT:          return (unsigned long)((long)_float(key));\r
-                       case OT_INTEGER:        return (unsigned long)((long)_integer(key));\r
-                       default:                        return hashptr(key._unVal.pRefCounted);\r
-               }\r
-       }\r
-       _HashNode *_Get(const SQObjectPtr &key,unsigned long hash)\r
+       inline _HashNode *_Get(const SQObjectPtr &key,SQHash hash)\r
        {\r
                _HashNode *n = &_nodes[hash];\r
                do{\r
                        if(_rawval(n->key) == _rawval(key) && type(n->key) == type(key)){\r
                                return n;\r
                        }\r
-               }while(n = n->next);\r
+               }while((n = n->next));\r
                return NULL;\r
        }\r
        bool Get(const SQObjectPtr &key,SQObjectPtr &val);\r
@@ -73,16 +76,14 @@ public:
        bool Set(const SQObjectPtr &key, const SQObjectPtr &val);\r
        //returns true if a new slot has been created false if it was already present\r
        bool NewSlot(const SQObjectPtr &key,const SQObjectPtr &val);\r
-       int Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);\r
+       SQInteger Next(bool getweakrefs,const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);\r
        \r
-       int CountUsed();\r
+       SQInteger CountUsed(){ return _usednodes;}\r
        void Release()\r
        {\r
                sq_delete(this, SQTable);\r
        }\r
-       bool SetDelegate(SQTable *mt);\r
        \r
-\r
 };\r
 \r
 #endif //_SQTABLE_H_\r