* SltVAライブラリのメモ -(by [[K]], 2017.10.27) ** 関数の一覧(スロット基本編) -void Slt_init(); --スロットライブラリを使うときはとにもかくにもまずこれをやる。 -void Slt_rsv(int s0, int n); --スロット番号を連番でリザーブする。スロット番号を#defineで管理するのはダサイので以下のようにするのがいいと思う。 enum { slt_ess = 0, slt_ti, slt_vq, slt_glb, slt_scp, slt_n }; Slt_rsv(0, slt_n); --alcを使わないのならリザーブしないで使い始めても平気。 -int Slt_alc(); --空いているスロット番号が得られる。 -void Slt_fre(int s); --使っていたスロットを解放できる。なお、destし忘れていれば気を利かせてdestしてからfreしてくれる。 --使っていたスロット番号を解放できる。なお、destし忘れていれば気を利かせてdestしてからfreしてくれる。 -void Slt_dest(int s); --使っていたスロットのリソースを解放する。でもスロット番号はリザーブされたままになる。 -void Slt_dump(void *fp); --fpにstdoutを指定すれば、現在のスロット状態が全部見える。超便利。 ** 関数の一覧(VA基本編) -void SltVA_init(int s, int es, const char *nam); --sはスロット番号。esはelementSizeで1以上。namは適当な名前。NULLにしてもいい。namはdump以外では使わない。 --最初はn=0になる。 --もしsが他の用途に使われていたら、destしてからinitする。だから結構安全。 -void *SltVA_p(int s, int i); --i番目の要素へのポインタを取得する。サイズを変更するまでは有効。 -int SltVA_n(int s); --現在設定されている配列の長さを返す。 -void *SltVA_size(int s, int n); --配列の長さをnに設定する。realloc回数を減らすために必要に応じてマージンも付けるが、それはnには反映されない。 //--ひとまず現在の仕様では、サイズが小さくなる分にはreallocは一切やらない。(一番大きかったn+マージン)を維持する。例外はsizeFix。 --関数は変更後の SltVA_p(s, 0) を返す。 -void *SltVA_sizeFix(int s, int n); --配列の長さをnに設定する。マージンは付けない。n=-1にすると、現在のnのままマージンだけを捨てる。 --sizeFixで確保すれば普通のmalloc/reallocみたいなものであり、サイズを変更しない用途でも十分に使える。dumpで確認できるためだけに使うのだって十分アリ。それくらいdumpは便利。 ** 関数の一覧(VA応用編1) -基本的な説明 --elementSizeが sizeof (int) 以上であれば使える。 --要素の最初の unsigned int 部分に、1以上のシリアルナンバーを付けて、使用中か未使用かを区別する。 -int SltVA_alc(int s); --未使用な要素を一つ持ってくる。 -void SltVA_fre(int s, int i); --要素を未使用に状態に戻す。未使用だったものをfreしても問題はない。 -void SltVA_rsv(int s, int i0, int n); --要素を連番でリザーブする。指定された範囲に既に使用中な部分があってもおかまいなしでシリアルナンバーを付け直す。 -int SltVA_sch(int s, unsigned int sn0); --sn0以上のシリアルナンバーを持つ要素のうち、最小のシリアルナンバーのものを返す。 ** 関数の一覧(VA応用編2) -基本的な説明 --elementSizeが sizeof (int) 以上であれば使える。 --要素の最初の int 部分をキーとして、データを登録管理するイメージ。 --データの歯抜けは想定していない。だから0~(n-1)までびっしり詰まっている。消すときには末尾から一つ持ってきて隙間を埋める想定。 -int SltVA_schKeyInt(int s, int ki); --キーがkiに等しいものを探す。もし見つからなければ SltVA_n(s) を返す。 -int SltVA_schKeyInt1(int s, int ki, void *pp, int *pi); --キーがkiに等しいものを探す。*ppには SltVA_p(s, 0) を返す。*piには SltVA_schKeyInt() の結果を返す。 --ppは本当は void ** というべきものなのだが、C言語の仕様として、void **と書いても型チェックでエラーになるので、void *としている。 --関数の戻り値としては、見つかった場合は0を、見つからなかった場合は0以外を返す。 -int SltVA_schKeyInt2(int s, int ki, void *pp, int *pi); --SltVA_schKeyInt1() とほぼ同じ挙動だが、見つからなかった場合は、勝手にサイズを1増やして、その増えた要素の先頭にkiを代入した状態にしてくれる。 * こめんと欄 #comment