From 7c414e14430ca651162ed573fb06f37bbd7c8b98 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 14 Nov 2011 15:36:27 +0100 Subject: [PATCH] first creation of simple string indexed hash --- bigpoint_hash.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++ bigpoint_hash.h | 32 +++++++++++ 2 files changed, 178 insertions(+) create mode 100644 bigpoint_hash.c create mode 100644 bigpoint_hash.h diff --git a/bigpoint_hash.c b/bigpoint_hash.c new file mode 100644 index 0000000..154269b --- /dev/null +++ b/bigpoint_hash.c @@ -0,0 +1,146 @@ +#include +#include +#include + +#include "bigpoint_hash.h" + + +#define HASH_ENTRY_CHUNK_SIZE 128 + + +static +void +__construct(struct BIGPOINT_HASH * _this, va_list * params) +{ + _this->size = 0; + _this->used = 0; + _updateHashSize(_this); +} + +static +void +__jsonConst(struct BIGPOINT_HASH * _this, struct json_object * json) +{ +} + +static +void +__destruct(struct BIGPOINT_HASH * _this) +{ + size_t index; + + for (index = 0; index < _this->used; index ++) { + free(_this->keys[index]); + } + + free(_this->keys); + free(_this->values); +} + +static +struct json_object * +__toJson(struct BIGPOINT_HASH * _this) +{ +} + +static const +struct BIGPOINT_CCLASS _bigpoint_hash = { + sizeof(struct BIGPOINT_HASH), + (ctor)__construct, + (jCtor)__jsonConst, + (dtor)__destruct, + (jTo)__toJson +}; + +const struct BIGPOINT_CCLASS * const BIGPOINT_HASH = &_bigpoint_hash; + +static +void +_updateHashSize(struct BIGPOINT_HASH * _this) +{ + if (_this->used == _this->size) { + _this->size += HASH_ENTRY_CHUNK_SIZE; + + _this->keys = realloc(_this->keys, sizeof(char*) * _this->size); + memset(_this->keys + (_this->used * sizeof(char*)), + HASH_ENTRY_CHUNK_SIZE * sizeof(char*), + 0); + + _this->values = realloc( + _this->values, + sizeof(struct BIGPOINT_DYNTYPE *) * _this->size, + 0); + memset(_this->values + (_this->used * sizeof(struct BIGPOINT_DYNTYPE *)), + HASH_ENTRY_CHUNK_SIZE * sizeof(struct BIGPOINT_DYNTYPE *), + 0); + } +} + +static +size_t +_getHashIdx(struct BIGPOINT_HASH * _this, const char * key) +{ + size_t index; + + for (index = 0; + index < _this->used && strcmp(_this->key[index], key); + index++); + + return index; +} + +void +bigpoint_hash_set(struct BIGPOINT_HASH * _this, + const char * key, + struct BIGPOINT_DYNTYPE * value) +{ + size_t index = _getHashIdx(_this, key); + + if (index == _this->used) { + index = _this->used = index + 1; + } + + _this->keys[index] = calloc(strlen(key) + 1, sizeof(char)); + memcpy(_this->keys[index], key, strlen(key)); + + _this->values[index] = value; + + _updateHashSize(_this); +} + +struct BIGPOINT_DYNTYPE * +bigpoint_hash_get(struct BIGPOINT_HASH * _this, const char * key) +{ + size_t index = _getHashIdx(_this, key); + + if (index == _this->used) { + return NULL; + } + + return _this->value[index]; +} + +struct BIGPOINT_DYNTYPE * +bigpoint_hash_del(struct BIGPOINT_HASH * _this, const char * key) +{ + struct BIGPOINT_DYNTYPE * found = NULL; + size_t index = _getHashIdx(_this, key); + + if (index == _this->used) { + return NULL; + } + + free(_this->key[index]); + + memmove(_this->key + index + 1, + _this->key + index, + (_this->size - index) * sizeof(char*)); + + memmove(_this->value + index + 1, + _this->value + index, + (_this->size - index) * sizeof(struct BIGPOINT_DYNTYPE *)); + + _this->used -= 1; +} + +// vim: set et ts=4 sw=4: diff --git a/bigpoint_hash.h b/bigpoint_hash.h new file mode 100644 index 0000000..bf44116 --- /dev/null +++ b/bigpoint_hash.h @@ -0,0 +1,32 @@ +#ifndef __BIGPOINT_HASH_H__ +#define __BIGPOINT_HASH_H__ + +#include + +#include "bigpoint_cclass.h" +#include "bigpoint_dyntype.h" + + +struct BIGPOINT_HASH { + const struct BIGPOINT_CCLASS * const class; + char ** keys; + struct BIGPOINT_DYNTYPE ** values; + size_t size; + size_t used; +}; + +extern const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE; + +void bigpoint_hash_set(struct BIGPOINT_HASH * _this, + const char * key, + struct BIGPOINT_DYNTYPE * value); + +struct BIGPOINT_DYNTYPE * +bigpoint_hash_get(struct BIGPOINT_HASH * _this, const char * key); + +struct BIGPOINT_DYNTYPE * +bigpoint_hash_del(struct BIGPOINT_HASH * _this, const char * key); + +#endif//__BIGPOINT_HASH_H__ + +// vim: set et ts=4 sw=4: