/* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
 * =====================================================================
 *  sc_map.h
 *  Copyright (c)  2003 - 2011  sys0tem
 *  LICENSE :
 *	LGPL (GNU Lesser General Public License - Version 3,29 June 2007)
 *	http://www.gnu.org/copyleft/lesser.html
 *	or
 *	EPL (Eclipse Public License - v1.0)
 *	http://www.eclipse.org/legal/epl-v10.html
 * =====================================================================
 */
#ifndef __SC_MAP_H__
#define __SC_MAP_H__

#include <stddef.h>

#include <sc_stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * マップエントリ.
 */
typedef struct SC_Map_Entry_ {
	char*					key;	/*< キー						*/
	void*					value;	/*< 値							*/
	size_t					size;	/*< 値のサイズ					*/
	struct SC_Map_Entry_*	next;	/*< 次のエントリへのポインタ	*/
} SC_Map_Entry;


/**
 * マップ.
 * <pre>
 * [使用方法]
 * char* val;
 * SC_Map* map = SC_Map_new(256);
 * map->putStr(map, "key1", "value1");
 * map->putStr(map, "key2", "value2");
 *    .
 *    .
 * val = map->getStr(map, "key1");
 *    .
 *    .
 * SC_Map_delete(map);
 * </pre>
 */
typedef struct SC_Map_
{
	size_t size;
	void*  (*put   )(struct SC_Map_*, const char* key, const void* obj, size_t size);
	void*  (*get   )(struct SC_Map_*, const char* key, size_t* size);
	char*  (*putStr)(struct SC_Map_*, const char* key, const char* val);
	char*  (*getStr)(struct SC_Map_*, const char* key);
	void   (*remove)(struct SC_Map_*, const char* key);
	void   (*clear )(struct SC_Map_*);
	void   (*entries)(struct SC_Map_*, bool (*handler)(char* key, void* val, size_t size));
	SC_Map_Entry** _table;
	size_t         _tblSize;
} SC_Map;

SC_Map* SC_Map_new(size_t cap);
void    SC_Map_delete(SC_Map* map);
int     SC_Map_hashCode(const char* key);


#ifdef __cplusplus
}
#endif

#endif	/* __SC_MAP_H__ */

