\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
{\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
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
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
\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