Update to Squirrel 3.0.6
[supertux.git] / external / squirrel / squirrel / sqtable.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 87f8cbf..60382fd
@@ -23,7 +23,8 @@ void SQTable::Remove(const SQObjectPtr &key)
        \r
        _HashNode *n = _Get(key, HashObj(key) & (_numofnodes - 1));\r
        if (n) {\r
-               n->val = n->key = _null_;\r
+               n->val.Null();\r
+               n->key.Null();\r
                _usednodes--;\r
                Rehash(false);\r
        }\r
@@ -33,8 +34,9 @@ void SQTable::AllocNodes(SQInteger nSize)
 {\r
        _HashNode *nodes=(_HashNode *)SQ_MALLOC(sizeof(_HashNode)*nSize);\r
        for(SQInteger i=0;i<nSize;i++){\r
-               new (&nodes[i]) _HashNode;\r
-               nodes[i].next=NULL;\r
+               _HashNode &n = nodes[i];\r
+               new (&n) _HashNode;\r
+               n.next=NULL;\r
        }\r
        _numofnodes=nSize;\r
        _nodes=nodes;\r
@@ -71,11 +73,34 @@ void SQTable::Rehash(bool force)
 SQTable *SQTable::Clone()\r
 {\r
        SQTable *nt=Create(_opt_ss(this),_numofnodes);\r
+#ifdef _FAST_CLONE\r
+       _HashNode *basesrc = _nodes;\r
+       _HashNode *basedst = nt->_nodes;\r
+       _HashNode *src = _nodes;\r
+       _HashNode *dst = nt->_nodes;\r
+       SQInteger n = 0;\r
+       for(n = 0; n < _numofnodes; n++) {\r
+               dst->key = src->key;\r
+               dst->val = src->val;\r
+               if(src->next) {\r
+                       assert(src->next > basesrc);\r
+                       dst->next = basedst + (src->next - basesrc);\r
+                       assert(dst != dst->next);\r
+               }\r
+               dst++;\r
+               src++;\r
+       }\r
+       assert(_firstfree > basesrc);\r
+       assert(_firstfree != NULL);\r
+       nt->_firstfree = basedst + (_firstfree - basesrc);\r
+       nt->_usednodes = _usednodes;\r
+#else\r
        SQInteger ridx=0;\r
        SQObjectPtr key,val;\r
        while((ridx=Next(true,ridx,key,val))!=-1){\r
                nt->NewSlot(key,val);\r
        }\r
+#endif\r
        nt->SetDelegate(_delegate);\r
        return nt;\r
 }\r
@@ -122,8 +147,8 @@ bool SQTable::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val)
                        n->key = mp->key;\r
                        n->val = mp->val;/* copy colliding node into free pos. (mp->next also goes) */\r
                        n->next = mp->next;\r
-                       mp->key = _null_;\r
-                       mp->val = _null_;\r
+                       mp->key.Null();\r
+                       mp->val.Null();\r
                        mp->next = NULL;  /* now `mp' is free */\r
                }\r
                else{\r
@@ -179,7 +204,7 @@ bool SQTable::Set(const SQObjectPtr &key, const SQObjectPtr &val)
 \r
 void SQTable::_ClearNodes()\r
 {\r
-       for(SQInteger i = 0;i < _numofnodes; i++) { _nodes[i].key = _null_; _nodes[i].val = _null_; }\r
+       for(SQInteger i = 0;i < _numofnodes; i++) { _HashNode &n = _nodes[i]; n.key.Null(); n.val.Null(); }\r
 }\r
 \r
 void SQTable::Finalize()\r