/*
 * Created by jiaqiang.ye@lnxall.com
 *
 * Integer and pointer hash, with string as keys
 *
 * 2022/05/27
 */

#ifndef LNXALL_HASH_INT_PTR_H
#define LNXALL_HASH_INT_PTR_H 1

#include "uthash/uthash.h"

#ifdef __cplusplus
extern "C" {
#endif

#define HASH_INTPTR_ERROR_OK            0
#define HASH_INTPTR_ERROR_ARGS          -1
#define HASH_INTPTR_ERROR_NOTFOUND      -2
#define HASH_INTPTR_ERROR_MEMORY        -3
#define HASH_INTPTR_MAXLEN              128

struct hash_intptr {
	unsigned char       hh_key[HASH_INTPTR_MAXLEN];
	unsigned int        hh_keylen;
	int                 hh_int;
	void *              hh_ptr;
	UT_hash_handle      hh;
};

int hash_intptr_addint(struct hash_intptr * * a_hash_intptr,
	const void * a_strkey, unsigned int a_strlen, int a_int_value);

int hash_intptr_addptr(struct hash_intptr * * p_hash_intptr,
	const void * p_strkey, unsigned int p_strlen, void * p_ptr_value);

int hash_intptr_findint(struct hash_intptr * f_hash_intptr,
	const void * f_strkey, unsigned int f_strlen, int * f_int_value);

int hash_intptr_findptr(struct hash_intptr * f_hash_intptr,
	const void * f_strkey, unsigned int f_strlen, void * * f_ptr_value);

int hash_intptr_remove(struct hash_intptr * * r_hash_intptr,
	const void * r_strkey, unsigned int r_strlen);

int hash_intptr_count(struct hash_intptr * c_hash_intptr);

int hash_intptr_iter(struct hash_intptr * * i_hash_intptr,
	int (* iter_func)(struct hash_intptr *, int, void *), void * whatp);

void hash_intptr_removeall(struct hash_intptr * * ra_hash_intptr);

#ifdef __cplusplus
};
#endif
#endif
