summaryrefslogtreecommitdiff
path: root/ioreplay/src/datas/hmap.c
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2018-03-06 17:38:59 +0000
committerPaul Buetow <pbuetow@mimecast.com>2018-03-06 17:38:59 +0000
commit26b3b3e368a79ce29df732ea04e72a4c002ae2ce (patch)
treee3fc8d7461ab371279f7bf9c692096cd39cc92f6 /ioreplay/src/datas/hmap.c
parentae2221660f9b411fa78cdf8034f0803e9a870cde (diff)
rename into ioriot
Diffstat (limited to 'ioreplay/src/datas/hmap.c')
-rw-r--r--ioreplay/src/datas/hmap.c362
1 files changed, 0 insertions, 362 deletions
diff --git a/ioreplay/src/datas/hmap.c b/ioreplay/src/datas/hmap.c
deleted file mode 100644
index 96c373e..0000000
--- a/ioreplay/src/datas/hmap.c
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright 2018 Mimecast Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "hmap.h"
-
-#define _Using_string_keys h->keys != NULL
-
-unsigned int hmap_get_addr(hmap_s *h, char *key)
-{
- unsigned long hash = 5381;
- int len = strlen(key);
-
- for (int i = 0; i < len; ++i) {
- hash = ((hash << 5) + hash) + key[i]; /* hash * 33 + c */
- }
-
- return (unsigned int) (hash % h->size);
-}
-
-unsigned int hmap_get_addr_l(hmap_s *h, const long key)
-{
- return (unsigned int) (key % h->size);
-}
-
-hmap_s *_hmap_new(unsigned int init_size)
-{
- hmap_s *h = Malloc(hmap_s);
-
- h->size = init_size;
- h->data = Calloc(init_size, void*);
- h->l = Calloc(init_size, list_s*);
- h->data_destroy = NULL;
- h->keys = NULL;
- h->keys_l = NULL;
-
- Mset(h->data, 0, init_size, void*);
- Mset(h->l, 0, init_size, list_s*);
-
- return h;
-}
-
-hmap_s *hmap_new(unsigned int init_size)
-{
- hmap_s *h = _hmap_new(init_size);
- h->keys = Calloc(init_size, char*);
- Mset(h->keys, 0, init_size, char*);
-
- return h;
-}
-
-hmap_s *hmap_new_l(unsigned int init_size)
-{
- hmap_s *h = _hmap_new(init_size);
- h->keys_l = Calloc(init_size, int);
- Mset(h->keys_l, -1, init_size, int);
-
- return h;
-}
-
-void hmap_destroy(hmap_s *h)
-{
- for (int i = 0; i < h->size; ++i) {
- if (h->l[i]) {
- list_s *l = h->l[i];
- if (h->data_destroy)
- l->data_destroy = h->data_destroy;
- list_destroy(h->l[i]);
- }
- if (h->data[i] && h->data_destroy) {
- h->data_destroy(h->data[i]);
- }
- }
-
- free(h->data);
- if (h->keys)
- free(h->keys);
- if (h->keys_l)
- free(h->keys_l);
- free(h->l);
- free(h);
-
- return;
-}
-
-int hmap_insert(hmap_s *h, char *key, void *data)
-{
- if (data == NULL) {
- Error("insert data can not be NULL");
- }
-
- int addr = hmap_get_addr(h, key);
-
- if (h->data[addr]) {
-
- if (strcmp(key, h->keys[addr]) == 0) {
- // Key already exists
- return 0;
- }
-
- // There is already data, collision, create a linked list
- list_s *l = h->l[addr] = list_new();
- list_key_insert(l, h->keys[addr], h->data[addr]);
- list_key_insert(l, key, data);
-
- // Not needed anymore, as the elements are in the linked list now.
- free(h->keys[addr]);
- h->data[addr] = h->keys[addr] = NULL;
-
- return 1;
-
- } else if (h->l[addr]) {
- // There was a collision at this address before. Insert
- // the element to the linked list. Returns 0 if key is already
- // in the list (no additional insert made) or 1 otherwise.
- return list_key_insert(h->l[addr], key, data);
- }
-
- // New entry on a collision free address
- h->data[addr] = data;
- h->keys[addr] = Clone(key);
-
- return 1;
-}
-
-int hmap_insert_l(hmap_s *h, const long key, void *data)
-{
- if (data == NULL) {
- Error("insert data can not be NULL");
- }
-
- int addr = hmap_get_addr_l(h, key);
-
- if (h->data[addr]) {
-
- if (key == h->keys_l[addr]) {
- // Key already exists
- return 0;
- }
-
- // There is already data, collision, create a linked list
- list_s *l = h->l[addr] = list_new_l();
- list_key_insert_l(l, h->keys_l[addr], h->data[addr]);
- list_key_insert_l(l, key, data);
-
- // Not needed anymore, as the elements are in the linked list now.
- h->data[addr] = NULL;
- h->keys_l[addr] = -1;
-
- return 1;
-
- } else if (h->l[addr]) {
- // There was a collision at this address before. Insert
- // the element to the linked list. Returns 0 if key is already
- // in the list (no additional insert made) or 1 otherwise.
- return list_key_insert_l(h->l[addr], key, data);
- }
-
- // New entry on a collision free address
- h->data[addr] = data;
- h->keys_l[addr] = key;
-
- return 1;
-}
-
-void* hmap_remove(hmap_s *h, char *key)
-{
- int addr = hmap_get_addr(h, key);
-
- if (h->data[addr] != NULL) {
- void *data = h->data[addr];
- free(h->keys[addr]);
- h->data[addr] = h->keys[addr] = NULL;
- return data;
-
- } else if (h->l[addr] != NULL) {
- // There was a collision at this address before. Remove
- // the element to the linked list. Returns the object if key is
- // already in the list (no additional insert made) or NULL
- // otherwise.
- return list_key_remove(h->l[addr], key);
- }
-
- // Key is not present
- return NULL;
-}
-
-void* hmap_remove_l(hmap_s *h, const long key)
-{
- int addr = hmap_get_addr_l(h, key);
-
- if (h->data[addr] != NULL) {
- void *data = h->data[addr];
- h->data[addr] = NULL;
- h->keys_l[addr] = -1;
- return data;
-
- } else if (h->l[addr] != NULL) {
- // There was a collision at this address before. Remove
- // the element to the linked list. Returns the object if key is
- // already in the list (no additional insert made) or NULL
- // otherwise.
- return list_key_remove_l(h->l[addr], key);
- }
-
- // Key is not present
- return NULL;
-}
-
-void* hmap_get(hmap_s *h, char *key)
-{
- int addr = hmap_get_addr(h, key);
- if (h->data[addr] && strcmp(h->keys[addr], key) == 0) {
- return h->data[addr];
-
- } else if (h->l[addr]) {
- return list_key_get(h->l[addr], key);
- }
-
- return NULL;
-}
-
-void* hmap_get_l(hmap_s *h, const long key)
-{
- int addr = hmap_get_addr_l(h, key);
- if (h->data[addr] && h->keys_l[addr] == key) {
- return h->data[addr];
-
- } else if (h->l[addr]) {
- return list_key_get_l(h->l[addr], key);
- }
-
- return NULL;
-}
-
-void hmap_run_cb(hmap_s* h, void (*cb)(void *data))
-{
- for (int i = 0; i < h->size; ++i) {
- if (h->l[i]) {
- list_s *l = h->l[i];
- list_run_cb(l, cb);
- }
- if (h->data[i]) {
- cb(h->data[i]);
- }
- }
-}
-
-void hmap_run_cb2(hmap_s* h, void (*cb)(void *data, void *data2), void *data_)
-{
- for (int i = 0; i < h->size; ++i) {
- if (h->l[i]) {
- list_s *l = h->l[i];
- list_run_cb2(l, cb, data_);
- }
- if (h->data[i]) {
- cb(h->data[i], data_);
- }
- }
-}
-
-void hmap_print(hmap_s *h)
-{
- for (int i = 0; i < h->size; ++i) {
- if (h->data[i]) {
- if (_Using_string_keys) {
- Put("hmap:%p addr:%d key:'%s'", (void*)h, i, h->keys[i]);
- } else {
- Put("hmap:%p addr:%d key:%d", (void*)h, i, h->keys_l[i]);
- }
- } else if (h->l[i]) {
- Put("hmap:%p addr:%d LIST", (void*)h, i);
- list_print(h->l[i]);
- }
- }
-}
-
-static void _hmap_test(hmap_s *h)
-{
- void* somedata = (void*)h;
-
- assert(1 == hmap_insert(h, "someval", (void*)23));
- assert(1 == hmap_insert(h, "another value", (void*)123));
-
- assert(1 == hmap_insert(h, "mimecast", somedata));
- assert(0 == hmap_insert(h, "mimecast", somedata));
- assert(1 == hmap_insert(h, "is", somedata));
- assert(1 == hmap_insert(h, "hiring", somedata));
-
- assert(NULL != hmap_get(h, "mimecast"));
- assert(NULL == hmap_get(h, "Mimecast"));
-
- assert(NULL != hmap_remove(h, "mimecast"));
- assert(NULL == hmap_remove(h, "mimecast"));
-
- assert(1 == hmap_insert(h, "mimecast", somedata));
- assert(NULL != hmap_get(h, "mimecast"));
-
- assert(23 == (long)hmap_get(h, "someval"));
- assert(23 == (long)hmap_get(h, "someval"));
-
- assert(123 == (long)hmap_remove(h, "another value"));
- assert(0 == (long)hmap_remove(h, "another value"));
- assert(NULL == hmap_get(h, "another value"));
-
- //hmap_print(h);
-}
-
-static void _hmap_test_l(hmap_s *h)
-{
- void* somedata = (void*)h;
-
- assert(1 == hmap_insert_l(h, 1, (void*)23));
- assert(1 == hmap_insert_l(h, 5, (void*)123));
-
- assert(1 == hmap_insert_l(h, 3, somedata));
- assert(0 == hmap_insert_l(h, 3, somedata));
- assert(1 == hmap_insert_l(h, 4, somedata));
- assert(1 == hmap_insert_l(h, 6, somedata));
-
- assert(NULL != hmap_get_l(h, 3));
- assert(NULL == hmap_get_l(h, 7));
-
- assert(NULL != hmap_remove_l(h, 3));
- assert(NULL == hmap_remove_l(h, 3));
-
- assert(1 == hmap_insert_l(h, 3, somedata));
- assert(NULL != hmap_get_l(h, 3));
-
- assert(23 == (long)hmap_get_l(h, 1));
- assert(23 == (long)hmap_get_l(h, 1));
-
- assert(123 == (long)hmap_remove_l(h, 5));
- assert(0 == (long)hmap_remove_l(h, 5));
- assert(NULL == hmap_get_l(h, 5));
-}
-
-void hmap_test(void)
-{
- hmap_s* h = hmap_new(1024);
- _hmap_test(h);
- hmap_destroy(h);
-
- h = hmap_new(2);
- _hmap_test(h);
- hmap_destroy(h);
-
- h = hmap_new_l(1024);
- _hmap_test_l(h);
- hmap_print(h);
- hmap_destroy(h);
-}