/* 
 * @COPYRIGHT@
 *
 * Scout Version 1.0
 * 
 * Copyright 1998 Arizona Board of Regents, on behalf of
 *         The University of Arizona
 *         All Rights Reserved
 *
 * @COPYRIGHT@
 *
 * $RCSfile: map.h,v $
 *
 */
#ifndef __map_h__
#define __map_h__

#include "types.h"

typedef struct Map *		Map;
typedef struct MapEl *		MapEl;
typedef MapEl			MapBinding;
typedef struct MapWalk *	MapWalk;

struct MapEl {
    MapEl		next;		/* next element with same hash value */
    AnyType		value;		/* VALUE that KEY maps to */
    union {
	struct {
	    long	keySize;	/* key size for this element */
	    char	key[1];		/* in reality of size map->keySize */
	} var;
	struct {
	    char	key[1];		/* in reality of size map->keySize */
	} fixed;
    } u;
};

typedef struct MapBucket *	MapBucket;

struct MapBucket {
    MapEl		first;		/* first map element in this bucket */
    MapBucket		next;		/* next (non-empty) bucket */
};

struct MapWalk {
    MapWalk		nextPendingWalk;
    Map			map;
    MapBucket		bucket;
    MapEl		next;
};

extern void		mapInit (void);

extern Map		mapCreate (long nbuckets, long key_size);
extern void		mapDelete (Map m);
extern size_t		mapKeySize (Map m);

extern MapBinding	mapBind (Map m, const void * key, AnyType value);
extern long		mapUnbind (Map m, const void * key);
extern long		mapRemoveBinding (Map m, MapBinding b);

extern long		mapResolve (Map m, const void * key, long key_size,
				    AnyType * value);
extern void		mapWalkInit (MapWalk w, Map m);
extern MapEl		mapWalkNext (MapWalk w);
extern void		mapWalkDone (MapWalk w);

/*
 * Variable length keys (not very optimized).
 */
extern MapBinding	mapVarBind (Map m, const void * key, long key_size,
				    AnyType value);
extern long		mapVarResolve (Map m, const void * key, long key_size,
				       AnyType * value);

#endif /* __map_h__ */

