Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/gravity
Path: blob/master/src/shared/gravity_hash.h
1218 views
1
//
2
// gravity_hash.h
3
// gravity
4
//
5
// Created by Marco Bambini on 23/04/15.
6
// Copyright (c) 2015 CreoLabs. All rights reserved.
7
//
8
9
#ifndef __GRAVITY_HASH__
10
#define __GRAVITY_HASH__
11
12
#include <stdio.h>
13
#include <stdlib.h>
14
#include <string.h>
15
#include <stdbool.h>
16
#include "gravity_value.h"
17
18
#define GRAVITYHASH_ENABLE_STATS 1 // if 0 then stats are not enabled
19
#define GRAVITYHASH_DEFAULT_SIZE 32 // default hash table size (used if 0 is passed in gravity_hash_create)
20
#define GRAVITYHASH_THRESHOLD 0.75 // threshold used to decide when re-hash the table
21
22
typedef struct gravity_hash_t gravity_hash_t; // opaque hash table struct
23
24
// CALLBACK functions
25
typedef uint32_t (*gravity_hash_compute_fn) (gravity_value_t key);
26
typedef bool (*gravity_hash_isequal_fn) (gravity_value_t v1, gravity_value_t v2);
27
typedef void (*gravity_hash_iterate_fn) (gravity_hash_t *hashtable, gravity_value_t key, gravity_value_t value, void *data);
28
typedef void (*gravity_hash_iterate2_fn) (gravity_hash_t *hashtable, gravity_value_t key, gravity_value_t value, void *data1, void *data2);
29
typedef void (*gravity_hash_transform_fn) (gravity_hash_t *hashtable, gravity_value_t key, gravity_value_t *value, void *data);
30
31
// PUBLIC functions
32
gravity_hash_t *gravity_hash_create (uint32_t size, gravity_hash_compute_fn compute, gravity_hash_isequal_fn isequal, gravity_hash_iterate_fn free, void *data);
33
void gravity_hash_free (gravity_hash_t *hashtable);
34
bool gravity_hash_isempty (gravity_hash_t *hashtable);
35
bool gravity_hash_remove (gravity_hash_t *hashtable, gravity_value_t key);
36
bool gravity_hash_insert (gravity_hash_t *hashtable, gravity_value_t key, gravity_value_t value);
37
gravity_value_t *gravity_hash_lookup (gravity_hash_t *hashtable, gravity_value_t key);
38
39
uint32_t gravity_hash_memsize (gravity_hash_t *hashtable);
40
uint32_t gravity_hash_count (gravity_hash_t *hashtable);
41
uint32_t gravity_hash_compute_buffer (const char *key, uint32_t len);
42
uint32_t gravity_hash_compute_int (gravity_int_t n);
43
uint32_t gravity_hash_compute_float (gravity_float_t f);
44
void gravity_hash_stat (gravity_hash_t *hashtable);
45
void gravity_hash_iterate (gravity_hash_t *hashtable, gravity_hash_iterate_fn iterate, void *data);
46
void gravity_hash_iterate2 (gravity_hash_t *hashtable, gravity_hash_iterate2_fn iterate, void *data1, void *data2);
47
void gravity_hash_transform (gravity_hash_t *hashtable, gravity_hash_transform_fn iterate, void *data);
48
void gravity_hash_dump (gravity_hash_t *hashtable);
49
void gravity_hash_append (gravity_hash_t *hashtable1, gravity_hash_t *hashtable2);
50
void gravity_hash_resetfree (gravity_hash_t *hashtable);
51
52
#endif
53
54