#ifndef __HASH_SET__
#define __HASH_SET__

#define DEFAULT_HASH_SET_CAPACITY 1 << 10

typedef struct
{
    unsigned capacity;
    unsigned length;
    void **values;
    void **keys;
} hash_set_t;

extern hash_set_t *init_hash_set();

extern unsigned add(hash_set_t *set, void *value);

unsigned put(hash_set_t *set, long long hash, void *value);

extern int contains(hash_set_t *set, void *value);

int contains_hash(hash_set_t *set, long long hash);

extern void delete (hash_set_t *set, void *value);

extern long long hash(void *value);

extern unsigned retrieve_index_from_hash(const long long hash,
                                         const unsigned capacity);

extern void resize(hash_set_t *set);

#endif

Hash Set