/*
 *	clipdurc.h
 *
 *	存続カウンタ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Mon Mar 07 21:56:21 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 */
#ifndef __CLIP_DURC_H__
#define __CLIP_DURC_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	構造体
 ****************************************************************************/
typedef struct _ST_DurCnt {
	ght_hash_table_t*	ht;	//名前⇒(ST_DurCntCh*)
} ST_DurCnt;
/*--------------------------------------------------------------------------*/
typedef struct _ST_DurCntCh {
	int		bTouch;		//存続フラグ。現在のフレーム中にこのチャネルに対して一度でもDurCnt_GetVal()が呼び出されたら1にする。
	int		iVal;		//チャネル値。
} ST_DurCntCh;
/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/
ST_DurCnt* DurCnt_New();
void DurCnt_Free(ST_DurCnt* pDurCnt);
void DurCnt_Exec(ST_DurCnt* pDurCnt);
int DurCntCh_GetVal_f(ST_DurCnt* pDurCnt, const char* sFmt, ...);
int DurCntCh_GetVal_g(ST_DurCnt* pDurCnt, const char* sFmt, va_list ap);
int DurCntCh_GetVal(ST_DurCnt* pDurCnt, const char* sName);
void DurCntCh_Delete_f(ST_DurCnt* pDurCnt, const char* sFmt, ...);
void DurCntCh_Delete_g(ST_DurCnt* pDurCnt, const char* sFmt, va_list ap);
void DurCntCh_Delete(ST_DurCnt* pDurCnt, const char* sName);
/****************************************************************************
 *	ユーティリティマクロ
 ****************************************************************************/
//■注意
//│下記のマクロはあくまでも、開発中の利便性(≒手抜き)のために用意したものです。
//│濫用すると、チャネル管理が杜撰になったり、無駄に長い名前のチャネルが増えるデメリットが有るので、注意して下さい。
//│理想としては、リリース版では下記のマクロを使用しないで済むように、チャネル管理を整理する事です。
//│(もっとも、当モジュールの目的自体が、チャネル変数を定義しないで済むようにする利便性(≒手抜き)が目的なのですが…)
//□'ソースファイル上の呼び出し位置'に対してユニークなチャネルの値を返します。
// - マクロ名サフィックスの'c'は、"unique to the Callee location"の'u'です。
#define DurCntCh_GetVal_c(pDurCnt     ) DurCntCh_GetVal_f((pDurCnt),"%s(%d)"   ,__FILE__,__LINE__       )
//□'ソースファイル上の呼び出し位置'と'任意のオブジェクトポインタ'に対してユニークなチャネルの値を返します。
// - マクロ名サフィックスの'o'は、"unique to the callee location and the Object pointer"の'o'です。
#define DurCntCh_GetVal_o(pDurCnt,pObj) DurCntCh_GetVal_f((pDurCnt),"%s(%d):%p",__FILE__,__LINE__,(pObj))
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_DURC_H__
