91 lines
2.8 KiB
C++
Executable File
91 lines
2.8 KiB
C++
Executable File
/*
|
|
* HashTable.h - HashTable class for MAXScript
|
|
*
|
|
* Copyright © John Wainwright 1996
|
|
*
|
|
*/
|
|
|
|
#ifndef _H_HASHTABLE
|
|
#define _H_HASHTABLE
|
|
|
|
typedef struct
|
|
{
|
|
void* key;
|
|
void* value;
|
|
} binding;
|
|
|
|
typedef struct /* secondary extent struct */
|
|
{
|
|
size_t size; /* size of secondary extent */
|
|
binding* bindings; /* table of bindings */
|
|
} secondary;
|
|
|
|
#define KEY_IS_OBJECT 0x0001 /* init flags that indicate whether keys & values are full MXS collectable objects */
|
|
#define VALUE_IS_OBJECT 0x0002
|
|
|
|
int default_eq_fn(void* key1, void* key2); /* default comparator & hash fns */
|
|
INT_PTR default_hash_fn(void* key);
|
|
|
|
class HashTabMapper;
|
|
|
|
visible_class (HashTable)
|
|
|
|
class HashTable : public Value
|
|
{
|
|
secondary **table; /* primary extent: tbl of second's */
|
|
size_t size; /* table size */
|
|
int n_entries; /* no. entries in primary extent */
|
|
int (*eq_fn)(void*, void*); /* key equivalence function */
|
|
INT_PTR (*hash_fn)(void*); /* key hgashing function */
|
|
// Win64 Cleanup: Shuler
|
|
int cursor; /* cursors used for sequencing... */
|
|
int secondCursor;
|
|
short flags;
|
|
HashTable* inner; /* links to next & prev tables when */
|
|
HashTable* outer; /* used as a lexical scope table */
|
|
int level; // scope nesting level
|
|
|
|
static CRITICAL_SECTION hash_update; // for syncing allocation hashtable updates
|
|
|
|
public:
|
|
ScripterExport HashTable(size_t primary_size, int (*key_eq_fn)(void*, void*), INT_PTR (*key_hash_fn)(void*), int flags);
|
|
// Win64 Cleanup: Shuler
|
|
HashTable() { init(17, default_eq_fn, default_hash_fn, KEY_IS_OBJECT + VALUE_IS_OBJECT); }
|
|
HashTable(size_t primary_size) { init(primary_size, default_eq_fn, default_hash_fn, KEY_IS_OBJECT + VALUE_IS_OBJECT); }
|
|
~HashTable();
|
|
ScripterExport void init(size_t primary_size, int (*key_eq_fn)(void*, void*), INT_PTR (*key_hash_fn)(void*), int flags);
|
|
// Win64 Cleanup: Shuler
|
|
|
|
static void setup();
|
|
|
|
classof_methods (HashTable, Value);
|
|
void collect() { delete this;}
|
|
void gc_trace();
|
|
|
|
ScripterExport Value* get(void* key);
|
|
ScripterExport Value* put(void* key, void* val);
|
|
ScripterExport Value* put_new(void* key, void* val);
|
|
ScripterExport Value* find_key(void *val);
|
|
ScripterExport Value* set(void* key, void* val);
|
|
ScripterExport void remove(void* key);
|
|
ScripterExport void map_keys_and_vals(void (*fn)(void* key, void* val, void* arg), void* arg);
|
|
ScripterExport void map_keys_and_vals(HashTabMapper* mapper);
|
|
ScripterExport int num_entries() { return n_entries; }
|
|
|
|
|
|
HashTable* enter_scope();
|
|
HashTable* leave_scope();
|
|
HashTable* next_scope();
|
|
int scope_level() { return level; }
|
|
};
|
|
|
|
class HashTabMapper
|
|
{
|
|
public:
|
|
virtual void map(void* key, void* val)=0;
|
|
};
|
|
|
|
#define SECONDARY_BUCKET 5
|
|
|
|
#endif
|