/*	
 *	clipwkst.h
 *
 *	ワークシート(多階層ハッシュテーブル)
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015 Naoyuki Sawa
 *
 *	* Mon Jul 13 21:22:16 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Jul 15 01:12:55 JST 2015 Naoyuki Sawa
 *	- Worksheet_ref_l(),Worksheet_ref_a(),Worksheet_ref_v()を追加しました。
 *	- Worksheet_sum_l(),Worksheet_sum_a(),Worksheet_sum_v()を追加しました。
 *	* Thu Jul 16 22:21:18 JST 2015 Naoyuki Sawa
 *	- Worksheet_sort(),Worksheet_sort_l(),Worksheet_sort_a(),Worksheet_sort_v()を追加しました。
 *	* Sun Jul 19 12:59:05 JST 2015 Naoyuki Sawa
 *	- コメントのみ追記:
 *	  当モジュールの関数は、キーや値に指定できるのは数値のみで、文字列は指定できません。
 *	  キーや値に文字列を指定したい場合は、本日clipstr.cモジュールに追加した、quark_from_string(),quark_to_string()を併用してください。
 *	  <例>
 *	  │Worksheet_set_l(ws,quark_from_string("Value"),quark_from_string("Key"),-1);
 *	  │iVal=Worksheet_get_l(ws,quark_from_string("Key"),-1);
 *	  │if(iVal!=-1){puts(quark_to_string(iVal));}
 */
#ifndef __CLIP_WKST_H__
#define __CLIP_WKST_H__
/****************************************************************************
 *	
 ****************************************************************************/
//集計表の単一階層
typedef struct _ST_Worksheet {
	int			iVal;		//この階層のセルの値
	ght_hash_table_t*	tKey;		//子階層のハッシュテーブル
} ST_Worksheet;
/*--------------------------------------------------------------------------*/
//集計表のイテレータ
typedef struct _ST_Worksheet_Iterator {
	ght_hash_table_t*	p_ht;		//走査中のハッシュテーブル
	ght_iterator_t		it;		//ハッシュテーブルのイテレータ
} ST_Worksheet_Iterator;
/****************************************************************************
 *	
 ****************************************************************************/
//作成/開放
ST_Worksheet* Worksheet_new();
void Worksheet_free(ST_Worksheet* ws);
/*--------------------------------------------------------------------------*/
//参照
ST_Worksheet* Worksheet_ref_l(ST_Worksheet* ws, ... /*,(-1)*/);
ST_Worksheet* Worksheet_ref_a(ST_Worksheet* ws, va_list ap);
ST_Worksheet* Worksheet_ref_v(ST_Worksheet* ws, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//取得
int Worksheet_get_l(ST_Worksheet* ws, ... /*,(-1)*/);
int Worksheet_get_a(ST_Worksheet* ws, va_list ap);
int Worksheet_get_v(ST_Worksheet* ws, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//合計
int Worksheet_sum_l(ST_Worksheet* ws, ... /*,(-1)*/);
int Worksheet_sum_a(ST_Worksheet* ws, va_list ap);
int Worksheet_sum_v(ST_Worksheet* ws, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//設定
void Worksheet_set_l(ST_Worksheet* ws, int iVal, ... /*,(-1)*/);
void Worksheet_set_a(ST_Worksheet* ws, int iVal, va_list ap);
void Worksheet_set_v(ST_Worksheet* ws, int iVal, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//削除
void Worksheet_unset_l(ST_Worksheet* ws, ... /*,(-1)*/);
void Worksheet_unset_a(ST_Worksheet* ws, va_list ap);
void Worksheet_unset_v(ST_Worksheet* ws, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//計数
void Worksheet_incr_l(ST_Worksheet* ws, ... /*,(-1)*/);
void Worksheet_incr_a(ST_Worksheet* ws, va_list ap);
void Worksheet_incr_v(ST_Worksheet* ws, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//走査開始
int Worksheet_first_l(ST_Worksheet* ws, ST_Worksheet_Iterator* it, ... /*,(-1)*/);
int Worksheet_first_a(ST_Worksheet* ws, ST_Worksheet_Iterator* it, va_list ap);
int Worksheet_first_v(ST_Worksheet* ws, ST_Worksheet_Iterator* it, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//走査継続
int Worksheet_next(ST_Worksheet_Iterator* it);
/*--------------------------------------------------------------------------*/
//ソート
void Worksheet_sort(ST_Worksheet* ws);
void Worksheet_sort_l(ST_Worksheet* ws, ... /*,(-1)*/);
void Worksheet_sort_a(ST_Worksheet* ws, va_list ap);
void Worksheet_sort_v(ST_Worksheet* ws, const int* aKey/*={key,key,...,key,-1}*/);
/*--------------------------------------------------------------------------*/
//ダンプ
void Worksheet_dump(ST_Worksheet* ws);
#endif//__CLIP_WKST_H__
