ScummVM API documentation
sqtable.h
1/* see copyright notice in squirrel.h */
2#ifndef _SQTABLE_H_
3#define _SQTABLE_H_
4/*
5* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
6* http://www.lua.org/copyright.html#4
7* http://www.lua.org/source/4.0.1/src_ltable.c.html
8*/
9
10#include "sqstring.h"
11
12
13#define hashptr(p) ((SQHash)(((SQInteger)p) >> 3))
14
15inline SQHash HashObj(const SQObjectPtr &key)
16{
17 switch(sq_type(key)) {
18 case OT_STRING: return _string(key)->_hash;
19 case OT_FLOAT: return (SQHash)((SQInteger)_float(key));
20 case OT_BOOL: case OT_INTEGER: return (SQHash)((SQInteger)_integer(key));
21 default: return hashptr(key._unVal.pRefCounted);
22 }
23}
24
25struct SQTable : public SQDelegable
26{
27private:
28 struct _HashNode
29 {
30 _HashNode() { next = NULL; }
31 SQObjectPtr val;
32 SQObjectPtr key;
33 _HashNode *next;
34 };
35 _HashNode *_firstfree;
36 _HashNode *_nodes;
37 SQInteger _numofnodes;
38 SQInteger _usednodes;
39
41 void AllocNodes(SQInteger nSize);
42 void Rehash(bool force);
43 SQTable(SQSharedState *ss, SQInteger nInitialSize);
44 void _ClearNodes();
45public:
46 static SQTable* Create(SQSharedState *ss,SQInteger nInitialSize)
47 {
48 SQTable *newtable = (SQTable*)SQ_MALLOC(sizeof(SQTable));
49 new (newtable) SQTable(ss, nInitialSize);
50 newtable->_delegate = NULL;
51 return newtable;
52 }
53 void Finalize();
54 SQTable *Clone();
55 ~SQTable()
56 {
57 SetDelegate(NULL);
58 REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
59 for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode();
60 SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode));
61 }
62#ifndef NO_GARBAGE_COLLECTOR
63 void Mark(SQCollectable **chain);
64 SQObjectType GetType() {return OT_TABLE;}
65#endif
66 inline _HashNode *_Get(const SQObjectPtr &key,SQHash hash)
67 {
68 _HashNode *n = &_nodes[hash];
69 do{
70 if(_rawval(n->key) == _rawval(key) && sq_type(n->key) == sq_type(key)){
71 return n;
72 }
73 }while((n = n->next));
74 return NULL;
75 }
76 //for compiler use
77 inline bool GetStr(const SQChar* key,SQInteger keylen,SQObjectPtr &val)
78 {
79 SQHash hash = _hashstr(key,keylen);
80 _HashNode *n = &_nodes[hash & (_numofnodes - 1)];
81 _HashNode *res = NULL;
82 do{
83 if(sq_type(n->key) == OT_STRING && (scstrcmp(_stringval(n->key),key) == 0)){
84 res = n;
85 break;
86 }
87 }while((n = n->next));
88 if (res) {
89 val = _realval(res->val);
90 return true;
91 }
92 return false;
93 }
94 bool Get(const SQObjectPtr &key,SQObjectPtr &val);
95 void Remove(const SQObjectPtr &key);
96 bool Set(const SQObjectPtr &key, const SQObjectPtr &val);
97 //returns true if a new slot has been created false if it was already present
98 bool NewSlot(const SQObjectPtr &key,const SQObjectPtr &val);
99 SQInteger Next(bool getweakrefs,const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
100
101 SQInteger CountUsed(){ return _usednodes;}
102 void Clear();
103 void Release()
104 {
105 sq_delete(this, SQTable);
106 }
107
108};
109
110#endif //_SQTABLE_H_
Definition: sqobject.h:313
Definition: sqobject.h:339
Definition: sqobject.h:206
Definition: sqstate.h:60
Definition: sqtable.h:26