/* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
 * =====================================================================
 *  sc_list.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_LIST_H__
#define __SC_LIST_H__

#include <stddef.h>

#include <sc_iterator.h>


#ifdef __cplusplus
extern "C" {
#endif

/**
 * リストエントリ.
 */
typedef struct SC_List_Entry_ {
	void*					value;	/*< 値							*/
	size_t					size;	/*< 値のサイズ					*/
	struct SC_List_Entry_*	next;	/*< 次のエントリ				*/
	struct SC_List_Entry_*	prev;	/*< 前のエントリ				*/
} SC_List_Entry;


/**
 * リスト.
 * <pre>
 * [使用方法]
 * char* val;
 * SC_List* list = SC_List_new();
 * list->addStr(list, -1, "val1");
 * list->addStr(list, -1, "val2");
 *    .
 *    .
 * val = map->getStr(list, 0);
 *    .
 *    .
 * SC_List_delete(list);
 * </pre>
 */
typedef struct SC_List_
{
	size_t size;
	void* (*add    )(struct SC_List_*, int index, const void* obj, size_t size);
	char* (*addStr )(struct SC_List_*, int index, const char* obj);
	void* (*get    )(struct SC_List_*, int index, size_t* size);
	char* (*getStr )(struct SC_List_*, int index);
	void  (*remove )(struct SC_List_*, int index);
	void  (*clear  )(struct SC_List_*);
	SC_List_Entry* _head;
	SC_List_Entry* _tail;
} SC_List;

SC_List* SC_List_new(void);
void     SC_List_delete(SC_List* list);


#ifdef __cplusplus
}
#endif

#endif	/* __SC_LIST_H__ */

