2022-10-26 19:33:19 +03:00

587 lines
25 KiB
C

// Copyright (C) 2022 Check Point Software Technologies Ltd. All rights reserved.
// Licensed under the Apache License, Version 2.0 (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.
#ifndef __KISS_HASH_H__
#define __KISS_HASH_H__
#include "general_adaptor.h"
typedef struct kiss_hash *kiss_hash_t;
struct kiss_hashent {
void *key;
void *val;
struct kiss_hashent *next;
};
typedef uintptr_t (*hkeyfunc_t)(const void *key, void *info);
typedef int (*hcmpfunc_t)(const void *key1, const void *key2, void *info);
typedef void (*freefunc_t)(void *info);
// {group: API for KISS_HASH}
#define H_DESTR(destr, addr) \
if (destr && (((uintptr_t)(addr)) > 0x10)) (*destr)(addr);
// {group: API for KISS_HASH}
// Description: Create Hash Table. MT-Level: Reentrant
// Parameters:
// hsize - hash size
// keyfunc - key hashing function
// keycmp - key comparison function
// info - opaque for use of keyfunc and keycmp functions.
// Return values:
// o hash pointer
// o NULL upon failure
// See also: kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr, kiss_hash_undo_destr,
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
kiss_hash_t kiss_hash_create (size_t hsize, hkeyfunc_t keyfunc, hcmpfunc_t keycmp, void *info);
// {group: API for HASH}
// Description: Create Hash Table with Destructor. MT-Level: Reentrant
// Parameters:
// hsize - hash size
// keyfunc - key hashing function
// keycmp - key comparison function
// val_destr - destructor for the values of the hash
// key_destr - destructor for the keys of the hash
// info - opaque for use of keyfunc and keycmp functions.
// Return values:
// o hash pointer
// o NULL upon failure
// See also: kiss_hash_create, kiss_hash_set_destr, kiss_hash_dodestr, kiss_hash_undo_destr, kiss_hash_nelements,
// iss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy,
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
kiss_hash_t
kiss_hash_create_with_destr (
size_t hsize,
hkeyfunc_t keyfunc,
hcmpfunc_t keycmp,
freefunc_t val_destr,
freefunc_t key_destr,
void *info
);
#define kiss_hash_create(hsize, hkeyfunc, hcmpfunc, info) \
_kiss_hash_create (hsize, hkeyfunc, hcmpfunc, info, __FILE__, __LINE__)
#define kiss_hash_create_with_destr(hsize, hkeyfunc, hcmpfunc, freefunc1, freefunc2, info) \
_kiss_hash_create_with_destr (hsize, hkeyfunc, hcmpfunc, freefunc1, freefunc2, info, __FILE__, __LINE__)
kiss_hash_t
_kiss_hash_create_with_ksleep(size_t hsize, hkeyfunc_t, hcmpfunc_t, void *info, const char *file, int line);
#define kiss_hash_create_with_ksleep(hsize, hkeyfunc, hcmpfunc, info) \
_kiss_hash_create_with_ksleep (hsize, hkeyfunc, hcmpfunc, info, __FILE__, __LINE__)
// {group: API for HASH}
// Description: Debug single hash. MT-Level: Reentrant
//This function calculates and prints the following statistics:
//o hash pointer
//o file name and line number where kiss_hash_create or kiss_hash_create_with_destr was called
//o number of elements in kiss_hash
//o number of slots in hash - hash size
//o size in bytes of memory occupied by hash maintenance structures
//o slot utilzation - percentage of hash slots used to store elements
//o average number of lookups - average length of lists of elements
// Parameters:
// hash - pointer to hash
// Return values:
// size in bytes of memory occupied by hash maintenance structures.
// See also: hash_create, hash_create_with_destr, hash_set_destr, hash_dodestr, hash_undo_destr,
// hash_nelements, hash_findaddr, hash_lookup, hash_lookkey, hash_insert, hash_delete, hash_destroy,
// hash_find_hashent, hash_insert_at, hash_strvalue, hash_strcmp, hash_intvalue, hash_bytevalue,
// hash_bytecmp, hash_debug_all
int kiss_hash_debug(kiss_hash_t hp);
// {group: API for HASH}
// Description: Debug single hash. MT-Level: Safe
//Iterates a list of all hash tables craeted in the current process and
//for each hash calls function hash_debug. In addition the total
//memory usage of hash maintenance structures is printed.
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy,
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug
void kiss_hash_debug_all();
// {group: API for kiss_hash}
kiss_hash_t _kiss_hash_create (size_t hsize, hkeyfunc_t, hcmpfunc_t, void *info, const char *file, int line);
// {group: API for HASH}
kiss_hash_t _kiss_hash_create_with_destr (size_t hsize, hkeyfunc_t, hcmpfunc_t, freefunc_t, freefunc_t,
void *info, const char *file, int line);
// {group: API for HASH}
// Description: Set destructor for hash elements. MT-Level: ] Reentrant
//Keys and values detsructors are called for every hash key-value pair when the hash is destroyed.
// Parameters:
// hp - hash
// val_destr - destructor for the values of the hash
// key_destr - destructor for the keys of the hash
// Return values:
// hash pointer
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_dodestr, kiss_hash_undo_destr,
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
kiss_hash_t kiss_hash_set_destr (kiss_hash_t hp, freefunc_t val_destr, freefunc_t key_destr);
// {group: API for kiss_hash}
// Description: Enable hash element detsruction. MT-Level: Reentrant
//Hash is created with destruction of elements disabled by default.
//This function enables destruction upon a call to kiss_hash_destroy.
//Meaning, the hash will automaticly call destructors when an entry gets
//deleted from the hash. Usualy this is not the case !
// Parameters:
// hp - hash
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_undo_destr,
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
void kiss_hash_dodestr (kiss_hash_t hp);
// {group: API for HASH}
// Description: Disable hash element detsruction. MT-Level: Reentrant
// Parameters:
// hp - hash
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy,
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
void kiss_hash_undo_destr (kiss_hash_t hp);
// {group: API for HASH}
// Description: Number of hash elements. MT-Level: Reentrant
// Parameters:
// hash - hash table
// Return values:
// number of elements
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy,
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_kiss_hash_debug, kiss_hash_debug_all
int kiss_hash_nelements (kiss_hash_t hash);
// {group: API for HASH}
// Description: Hash size. MT-Level: Reentrant
// Parameters:
// hash - hash table
// Return values:
// Size of hash
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at,
// kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
int kiss_hash_get_size (kiss_hash_t hash);
// {group: API for HASH}
// Description: Return address of the pointer to the value in the hash table.
// Parameters:
// hp - hash pointer
// key - hash key
// Return values:
// hash entry
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy,
// kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
void **kiss_hash_findaddr (kiss_hash_t hp, const void *key);
// {group: API for HASH}
// Description: Lookup hash value. MT-Level: Reentrant
// Parameters:
// hp - hash pointer
// key - hash key
// Return values:
// o hash value
// o NULL upon failure
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookkey, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
void *kiss_hash_lookup (kiss_hash_t hp, const void *key);
// {group: API for HASH}
// Description: Lookup hash key. MT-Level: Reentrant
//Returns the key pointer as stored in the hash table.
// Parameters:
// hp - hash pointer
// key - hash key that hash a value equal to that of the key stored in the hash.
// Return values:
// o hash key
// o NULL upon failure
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_insert,
// kiss_hash_delete, kiss_hash_destroy,kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
void *kiss_hash_lookkey (kiss_hash_t hp, const void *key);
// {group: API for HASH}
// Description: Insert hash element. MT-Level: Reentrant
// Parameters:
// hp - hash pointer
// key - hash key
// val - hash val
// Return values:
// >0 - success
// 0 - upon failure
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
int kiss_hash_insert (kiss_hash_t hp, void *key, void *val);
// {group: API for HASH}
// Description: Delete hash element. MT-Level: Reentrant
//Delete hash element and return a value for the key.
// Parameters:
// hp - hash pointer
// key - hash key
// Return values:
// o hash val
// o NULL upon failure
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_insert, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
void *kiss_hash_delete (kiss_hash_t hash, const void *key);
// {group: API for HASH}
// Description: Destroy hash. MT-Level: Reentrant
//If detsructor functions were defined in the call to kiss_hash_with_create_destr or kiss_hash_set_destr
//function kiss_hash_dodestr must be called to enable element detsruction.
// Parameters:
// hp - hash pointer
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr,kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_insert, kiss_hash_delete, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug,
// kiss_hash_debug_all
void kiss_hash_destroy (kiss_hash_t hp);
// {group: API for HASH}
// Description: Find hash entry. MT-Level: Reentrant
//Used as an efficient but somewhat ugly interface for find/insert operation.
//What it does is to return an adrress of a pointer to a hashent structure containing the key/val pair if found.
//If not it returns the address of the pointer in which we can append the new val/pair
//thus avoiding an unnceccessary repeated search.
//We can check if key was found by checking whether the pointer is zero or not.
//This function is usually used with kiss_hash_insert_at.
// Parameters:
// hp - hash pointer
// key - hash key
// Return values:
// hash entry
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp,
// kiss_hash_intvalue, kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
struct kiss_hashent ** kiss_hash_find_hashent(kiss_hash_t hp, const void *key);
// {group: API for HASH}
// Description: Insert hash element at specified position. MT-Level: Reentrant
//This function should be used together with kiss_hash_find_hashent to insert
//the value in case it was not found at the hash.
// Parameters:
// hp - hash pointer
// key - hash key
// val - hash val
// hloc -
// Return values:
// o 0 upon failure
// o number of hash elements after insertion in case of success.
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
// kiss_hash_insert, kiss_hash_delete,
// kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
int kiss_hash_insert_at (kiss_hash_t hp, void *key, void *val, struct kiss_hashent**hloc);
#define kiss_hash_strcreate(sz) \
kiss_hash_create(sz, (hkeyfunc_t)kiss_hash_strvalue, (hcmpfunc_t)kiss_hash_strcmp, NULL)
#define kiss_hash_intcreate(sz) \
kiss_hash_create(sz, (hkeyfunc_t)kiss_hash_intvalue, (hcmpfunc_t)kiss_hash_intcmp, NULL)
#define kiss_hash_bytecreate(n, esz) \
kiss_hash_create(n, (hkeyfunc_t)kiss_hash_bytevalue, (hcmpfunc_t)kiss_hash_bytecmp, (void *)esz)
// The following provide hash table data type interface,
// These functions can be provided by the user,
// The default provided functions provide string hash
// {group: API for HASH}
// Description: Hashing fuction for string hash.
//This function is used by kiss_hash_strcreate().
// Parameters:
// vs - key
// info - opaque
// Return values:
// value of the hash function.
uintptr_t kiss_hash_strvalue (const void *vs, void *info);
// {group: API for HASH}
// Description: Comparison fuction for string hash.
//This function is used by kiss_hash_strcreate().
// Parameters:
// vk1 - key
// vk2 - key
// info - opaque
// Return values:
// 0 - keys are equal
// !0 - keys are different
int kiss_hash_strcmp (const void *vk1, const void *vk2, void *info);
// {group: API for HASH}
// Description: Hashing fuction for integer hash.
//This function is used by kiss_hash_intcreate().
// Parameters:
// v - key
// info - opaque
// Return values:
// value of the hash function.
uintptr_t kiss_hash_intvalue (const void* v, void *info);
// {group: API for HASH}
// Description: Comparison fuction for integer hash.
//This function is used by kiss_hash_intcreate().
// Parameters:
// vv1 - key
// vv2 - key
// info - opaque
// Return values:
// 0 - keys are equal
// !0 - keys are different
int kiss_hash_intcmp (const void* vv1, const void* vv2, void *info);
// {group: API for HASH}
// Description: Hashing fuction for byte hash.
//This function is used by kiss_hash_bytecreate().
// Parameters:
// data - key
// info - opaque
// Return values:
// value of the hash function.
uintptr_t kiss_hash_bytevalue (const void *data, void *info);
// {group: API for HASH}
// Description: Comparison fuction for byte hash.
//This function is used by kiss_hash_bytecreate().
// Parameters:
// d1 - key
// d2 - key
// info - opaque
// Return values:
// 0 - keys are equal
// !0 - keys are different
int kiss_hash_bytecmp (const void *d1, const void *d2, void *info);
// {group: API for HASH ITERATOR}
typedef struct kiss_hash_iter *kiss_hash_iterator;
// {group: API for HASH ITERATOR}
// Description: Create hash iterator. MT-Level: Reentrant
// Parameters:
// hp - hash
// Return values:
// o iterator object
// o NULL upon failure
// See also:
// kiss_hash_iterator_next, kiss_hash_iterator_next_key, kiss_hash_iterator_destroy
kiss_hash_iterator kiss_hash_iterator_create (kiss_hash_t hp);
// {group: API for HASH ITERATOR}
// Description: Return next hash value. MT-Level: Reentrant
// Parameters:
// hit - hash iterator
// Return values:
// o next hash value
// o NULL upon failure
// See also:
// kiss_hash_iterator_create, kiss_hash_iterator_next_key, kiss_hash_iterator_destroy
void *kiss_hash_iterator_next (kiss_hash_iterator hit);
// {group: API for HASH ITERATOR}
// Description: Return next hash key. MT-Level: Reentrant
// Parameters:
// hit - hash iterator
// Return values:
// o next hash key
// o NULL upon failure
// See also:
// kiss_hash_iterator_create, kiss_hash_iterator_next, kiss_hash_iterator_destroy
void *kiss_hash_iterator_next_key (kiss_hash_iterator hit);
// {group: API for HASH ITERATOR}
// Description: Destroy hash iterator. MT-Level: Reentrant
// Parameters:
// hit - hash iterator
// See also:
// kiss_hash_iterator_create, kiss_hash_iterator_next, kiss_hash_iterator_next_key
void kiss_hash_iterator_destroy (kiss_hash_iterator hit);
// {group: API for ITERATOR}
int kiss_hash_iterator_next_ent(kiss_hash_iterator hit);
// {group: API for ITERATOR}
void * kiss_hash_iterator_get_key(kiss_hash_iterator hit);
// {group: API for ITERATOR}
void * kiss_hash_iterator_get_val(kiss_hash_iterator hit);
// {group: API for ITERATOR}
struct kiss_hashent * kiss_hash_iterator_get_hashent(kiss_hash_iterator hit);
// {group: API for ITERATOR}
int kiss_hash_iterator_equal(kiss_hash_iterator hit1, kiss_hash_iterator hit2);
// {group: API for ITERATOR}
kiss_hash_iterator kiss_hash_iterator_copy(kiss_hash_iterator hit);
// {group: API for ITERATOR}
void kiss_hash_iterator_free(kiss_hash_iterator hit);
// {group: API for ITERATOR}
void kiss_hash_iterator_set_begin(kiss_hash_iterator hit);
// {group: API for ITERATOR}
void kiss_hash_iterator_set_end(kiss_hash_iterator hit);
// {group: API for HASH}
kiss_hash_iterator kiss_hash_find_hashent_new(kiss_hash_t hp, const void *key);
// {group: API for HASH ITERATOR}
void kiss_hash_delete_by_iter(kiss_hash_iterator hit);
// - - - - - - - - - - - - - - -
// Hash resize mechanism
// - - - - - - - - - - - - - - -
// {group: API for HASH RESIZE}
// Determine if hash size can increase, decrease or both.
typedef enum {
KISS_HASH_SIZE_STATIC = 0, // hash size is kept fixed
KISS_HASH_SIZE_INCREASE = 1,
KISS_HASH_SIZE_DECREASE = 2,
KISS_HASH_SIZE_INC_DEC = 3
} KissHashResizeDirection;
// {group: API for HASH RESIZE}
typedef enum {
KISS_HASH_RESIZE_METHOD_UNKNOWN = 0,
KISS_HASH_RESIZE_BY_FACTOR = 1
} KissHashResizeMethod;
// {group: API for HASH RESIZE}
// Default maximal hash size:
// Hash size will not increase beyond this value unless stated o/w by the application
#define DEFAULT_KISS_HASH_SIZE (1<<17)
// {group: API for HASH RESIZE}
// Default value for hash factorial resizing
#define DEFAULT_KISS_HASH_RESIZE_FACTOR_VALUE 4
// {group: API for HASH RESIZE}
// Default value for hash factorial resizing trigger ratio
#define DEFAULT_KISS_HASH_RESIZE_FACTOR_TRIG_RATIO 2
// {group: API for HASH RESIZE}
// Resize application callback: This callback will be invoked at every successful resize operation.
typedef int (* HashResizeCb_t) (kiss_hash_t hp, void *app_info);
// Hash resize mode object & accsess API.
// Used for setting resize parameters hash.
// {group: API for HASH RESIZE}
typedef struct _KissHashResizeMode KissHashResizeMode;
// {group: API for HASH RESIZE}
int KissHashResizeMode_create(KissHashResizeMode **resize_mode);
// {group: API for HASH RESIZE}
void KissHashResizeMode_destroy(KissHashResizeMode *resize_mode);
// {group: API for HASH RESIZE}
int KissHashResizeMode_set_method(
KissHashResizeMode *resize_mode,
KissHashResizeMethod method,
u_int value,
u_int trigger_ratio);
// {group: API for HASH RESIZE}
int KissHashResizeMode_get_method(
const KissHashResizeMode *resize_mode,
KissHashResizeMethod *method,
u_int *value,
u_int *trigger_ratio);
// {group: API for HASH RESIZE}
int KissHashResizeMode_set_direction(KissHashResizeMode *resize_mode, KissHashResizeDirection direction);
// {group: API for HASH RESIZE}
int KissHashResizeMode_get_direction(const KissHashResizeMode *resize_mode, KissHashResizeDirection *direction);
// {group: API for HASH RESIZE}
int KissHashResizeMode_set_max_size(KissHashResizeMode *resize_mode, u_int max_size);
// {group: API for HASH RESIZE}
int KissHashResizeMode_get_max_size(const KissHashResizeMode *resize_mode, u_int *max_size);
// {group: API for HASH RESIZE}
int kiss_hash_set_resize_cb(kiss_hash_t hp, HashResizeCb_t resize_callback);
// {group: API for HASH RESIZE}
// Description: Set hash dynamic size parameters.
// Parameters:
// hp - [in] pointer to hash table
// resize_mode - [in] should be created and set using the access API to the KissHashResizeMode object.
// After using the set API, this object can be destroyed.
//
int kiss_hash_set_dynamic_size(kiss_hash_t hp, const KissHashResizeMode *resize_mode);
// {group: API for HASH RESIZE}
// Description: Get hash dynamic size parameters.
// Parameters:
// hp - [in] pointer to hash table
// resize_mode - [out] a read-only parameter that should not be changed by the application.
int kiss_hash_get_dynamic_size(kiss_hash_t hp, const KissHashResizeMode **resize_mode);
// {group: API for HASH RESIZE}
// Description: This API will cause an immediate resizing of hash
// table, according to the parameters, given in the input
// KissHashResizeMode object (if NULL, the resize will be done
// according to the parameters as last set by the application).
//
// Note that the KissHashResizeMode object parameters are
// not kept on the hash handle for future resize oprations.
int kiss_hash_trigger_resize(kiss_hash_t hp, const KissHashResizeMode *resize_mode);
#endif // __KISS_HASH_H__