#include <stddef.h>
#include <pthread.h>
#include "atomics.h"
#ifndef HASHTYPE
# define HASHTYPE unsigned long int
#endif
#ifndef RESIZE_BLOCK_SIZE
# define RESIZE_BLOCK_SIZE 256
#endif
extern size_t next_prime (size_t seed);
#define _DYNHASHCONENTTYPE(name) \
typedef struct name##_ent \
{ \
_Atomic(HASHTYPE) hashval; \
atomic_uintptr_t val_ptr; \
} name##_ent
#define DYNHASHENTTYPE(name) _DYNHASHCONENTTYPE (name)
DYNHASHENTTYPE (NAME);
#define _DYNHASHCONTYPE(name) \
typedef struct \
{ \
size_t size; \
size_t old_size; \
atomic_size_t filled; \
name##_ent *table; \
name##_ent *old_table; \
atomic_size_t resizing_state; \
atomic_size_t next_init_block; \
atomic_size_t num_initialized_blocks; \
atomic_size_t next_move_block; \
atomic_size_t num_moved_blocks; \
pthread_rwlock_t resize_rwl; \
} name
#define DYNHASHTYPE(name) _DYNHASHCONTYPE (name)
DYNHASHTYPE (NAME);
#define _FUNCTIONS(name) \
\
extern int name##_init (name *htab, size_t init_size); \
\
\
extern int name##_free (name *htab); \
\
\
extern int name##_insert (name *htab, HASHTYPE hval, TYPE data); \
\
\
extern TYPE name##_find (name *htab, HASHTYPE hval);
#define FUNCTIONS(name) _FUNCTIONS (name)
FUNCTIONS (NAME)
#ifndef NO_UNDEF
# undef DYNHASHENTTYPE
# undef DYNHASHTYPE
# undef FUNCTIONS
# undef _FUNCTIONS
# undef XFUNCTIONS
# undef _XFUNCTIONS
# undef NAME
# undef TYPE
# undef ITERATE
# undef COMPARE
# undef FIRST
# undef NEXT
#endif