/* %Z%%M% %I% %E% */

/*
 * Copyright (c) 1990, 1991, 1995 by Wayne C. Gramlich.
 * All rights reserved.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * for any purpose is hereby granted without fee provided that the above
 * copyright notice and this permission are retained.  The author makes
 * no representations about the suitability of this software for any purpose.
 * It is provided "as is" without express or implied warranty.
 */

/* Hash table exported interface routines: */

#ifndef HASH_EXPORTS_H
#define HASH_EXPORTS_H

#ifndef HASH_TYPES_H
#include "hash_types.h"
#endif

#ifndef HEAP_TYPES_H
#include "heap_types.h"
#endif

#ifndef VECTOR_TYPES_H
#include "vector_types.h"
#endif

#if defined(lint)

#define HASH_T2V(type, expression) \
	(Hsh_value) ((expression) == (type)0)

#else /* defined(lint */

#define HASH_T2V(type, expression) \
	(Hsh_value) (expression)

#endif /* defined(lint */


#define HASH_V2T(type, expression) \
	((type) (expression))

#define Hash(type)	Hsh
#define hash_client_data(type, hash) \
	HASH_V2T(type, hsh_client_data(hash))
#define hash_create(type, size, routine_equal, routine_hash, handle, heap) \
	hsh_create(size, routine_equal, routine_hash, \
		   HASH_T2V(type, handle), heap)
#define hash_delete(type, hash, value) \
	hsh_delete(hash, HASH_T2V(type, value))
#define hash_destroy(type, hash) \
	hsh_destroy(hash)
#define hash_erase(type, hash) \
	hsh_erase(hash)
#define hash_exists(type, hash, value) \
	hsh_exists(hash, HASH_T2V(type, value))
#define hash_iterate(type, hash, routine, handle) \
	hsh_iterate(hash, routine, (Hsh_value)handle)
#define hash_insert(type, hash, value) \
	hsh_insert(hash, HASH_T2V(type, value))
#define hash_lookup(type, hash, value) \
	HASH_V2T(type, hsh_lookup(hash, HASH_T2V(type, value)))
#define hash_replace(type, hash, value) \
	hsh_replace(hash, HASH_T2V(type, value))
#define hash_size(type, hash) \
	hsh_size(hash)
#define hash_vector_extract(type, hash, vector) \
	hsh_vector_extract(hash, vector)
#define hash_vector_insert(type, hash, vector) \
	hsh_vector_insert(hash, vector)
#define hash_vector_replace(type, hash, vector) \
	hsh_vector_replace(hash, vector)

extern Hsh_value hsh_client_data
		(Hsh);
extern Hsh hsh_create
		(int, Hsh_routine_hash, Hsh_routine_equal, Hsh_value, Heap);
extern int hsh_delete
		(Hsh, Hsh_value);
extern void hsh_destroy
		(Hsh);
extern void hsh_erase
		(Hsh);
extern int hsh_exists
		(Hsh, Hsh_value);
extern int hsh_iterate
		(Hsh, Hsh_routine_iterate, Hsh_value);
extern int hsh_insert
		(Hsh, Hsh_value);
extern Hsh_value hsh_lookup
		(Hsh, Hsh_value);
extern int hsh_replace
		(Hsh, Hsh_value);
extern int hsh_size
		(Hsh);
extern int hsh_vector_extract
		(Hsh, Vektor);
extern int hsh_vector_insert
		(Hsh, Vektor);
extern int hsh_vector_replace
		(Hsh, Vektor);

#endif /* HASH_EXPORTS_H */
