/* %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.
 */

/* Key-value table exported interface routines: */

#ifndef TABLE_EXPORTS_H
#define TABLE_EXPORTS_H

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

#ifndef TABLE_TYPES_H
#include "table_types.h"
#endif

#ifndef UNIX_STDIO_H
#include "unix_stdio.h"
#endif

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

#if defined(lint)

#define TABLE_T2K(key_type, expression) \
	(Tbl_key) ((expression) == (key_type)0)
#define TABLE_T2V(value_type, expression) \
	(Tbl_value) ((expression) == (value_type)0)
#define TABLE_ROUTINE_READ(type, routine, in_file, heap, handle) \
	(Tbl_routine_read) \
		(routine(in_file, heap, handle) == ((type)0))
#define TABLE_ROUTINE_WRITE(type, routine, out_file, handle) \
	(Tbl_routine_write) (routine((type)0, out_file, handle))

#else /* defined(lint */

#define TABLE_T2K(key_type, expression) \
	(Tbl_key) (expression)
#define TABLE_T2V(value_type, expression) \
	(Tbl_value) (expression)
#define TABLE_ROUTINE_READ(type, routine, in_file, heap, handle) \
	(Tbl_routine_read) (routine)
#define TABLE_ROUTINE_WRITE(type, routine, out_file, handle) \
	(Tbl_routine_write) (routine)

#endif /* defined(lint */
#define TABLE_K2T(key_type, expression) \
	((key_type) (expression))
#define TABLE_V2T(value_type, expression) \
	((value_type) (expression))
#define TABLE_HANDLE(handle) \
	((Tbl_handle)(handle))

#define table_client_data(key_type, value_type, table) \
	TABLE_V2T(value_type, tbl_client_data(table))
#define table_create(key_type, value_type, size, equal, hash, handle, heap) \
	tbl_create(size, equal, hash, TABLE_T2V(value_type, handle), heap)
#define table_delete(key_type, value_type, table, key) \
	tbl_delete(table, TABLE_T2K(key_type, key))
#define table_destroy(key_type, value_type, table) \
	tbl_destroy(table)
#define table_erase(key_type, value_type, table) \
	tbl_erase(table)
#define table_exists(key_type, value_type, table, key) \
	tbl_exists(table, TABLE_T2V(key_type, key))
#define table_iterate(key_type, value_type, table, routine, handle) \
	tbl_iterate(table, routine, (Tbl_value)handle)
#define table_insert(key_type, value_type, table, key, value) \
	tbl_insert(table, TABLE_T2K(key_type, key), \
		   TABLE_T2V(value_type, value))
#define table_key_list_extract(key_type, value_type, table) \
	tbl_key_list_extract(table)
#define table_lookup(key_type, value_type, table, key) \
	TABLE_V2T(value_type, tbl_lookup(table, TABLE_T2K(key_type, key)))
#define table_read(key_type, value_type, table, key_read_routine, value_read_routine, in_file, heap, handle) \
	tbl_read(table, \
		 TABLE_ROUTINE_READ(key_type, key_read_routine, \
				    in_file, heap, handle), \
		 TABLE_ROUTINE_READ(value_type, value_read_routine, \
				    in_file, heap, handle), \
		 in_file, \
		 heap, \
		 TABLE_HANDLE(handle))
#define table_replace(key_type, value_type, table, key, value) \
	tbl_replace(table, TABLE_T2K(key_type, key), \
		    TABLE_T2V(value_type, value))
#define table_size(key_type, value_type, table) \
	tbl_size(table)
#define table_value_list_extract(key_type, value_type, table) \
	tbl_value_list_extract(table)
#define table_write(key_type, value_type, table, key_write_routine, value_write_routine, out_file, handle) \
	tbl_write(table, \
		  TABLE_ROUTINE_WRITE(key_type, key_write_routine, \
				      out_file, handle), \
		  TABLE_ROUTINE_WRITE(value_type, value_write_routine, \
				      out_file, handle), \
		  out_file, \
		  TABLE_HANDLE(handle))

extern Tbl_value tbl_client_data
		(Tbl);
extern Tbl tbl_create
		(int, Tbl_routine_equal, Tbl_routine_hash, Tbl_value, Heap);
extern int tbl_delete
		(Tbl, Tbl_key);
extern void tbl_destroy
		(Tbl);
extern void tbl_erase
		(Tbl);
extern int tbl_exists
		(Tbl, Tbl_key);
extern int tbl_iterate
		(Tbl, Tbl_routine_iterate, Tbl_value);
extern int tbl_insert
		(Tbl, Tbl_key, Tbl_value);
extern Vec(Tbl_key) tbl_key_list_extract
		(Tbl);
extern Tbl_value tbl_lookup
		(Tbl, Tbl_key);
extern int tbl_read
		(Tbl, Tbl_key_routine, Tbl_value_routine,
		 Stdio, Heap, Tbl_handle);
extern int tbl_replace
		(Tbl, Tbl_key, Tbl_value);
extern int tbl_size
		(Tbl);
extern Vec(Tbl_value) tbl_value_list_extract
		(Tbl);
extern void tbl_write
		(Tbl, Tbl_key_routine, Tbl_value_routine,
		 Stdio, Tbl_handle);

#endif /* TABLE_EXPORTS_H */
