CSTL:http://cstl.sourceforge.jp/
これはすごい。
C言語で、ヘッダだけで、STLに近いことが、STLに近い形で使える、ライブラリ。
vectorやmapが普通に使える。
C言語なのになんでヘッダだけで使えるかというと、全部マクロで書かれているから。
機能を使いたい.cファイルでマクロを展開することで関数の実体を作るから、ヘッダをインクルードして一行マクロを書くだけでmapが使える。例えば下のような使い方。
#indlude <stdio.h>
#include "cstl/map.h"
// std::map<int, int>っていう型(=IntIntMap)を定義する。IntIntMapは任意の文字列でいい。
CSTL_MAP_INTERFACE(IntIntMap, int, int)
CSTL_MAP_IMPLEMENT(IntIntMap, int, int, CSTL_LESS)
// std::map<const *char, int>っていう型(=StrStrMap)を定義する。StrStrMapは任意の文字列でいい。
CSTL_MAP_INTERFACE(StrStrMap, const char*, char *)
CSTL_MAP_IMPLEMENT(StrStrMap, const char*, char *, strcmp)
int main(int argc, char *argv[]) {
IntIntMap *iimap;
StrStrMap*ssmap;
char *fuga = "fuga";
iimap = IntIntMap_new(); // 作成
IntIntMap_insert(iimap, 1, 2); // 挿入
if (IntIntMap_find(iimap, 1) != IntIntMap_end(iimap)) { // 検索
printf("%d\n", *IntIntMap_lookup(iimap, 1)); // 参照
}
IntIntMap_delete(iimap); // 解放
ssmap = StrStrMap_new(); // 作成
StrStrMap_insert(ssmap, "hoge", fuga); // 挿入
if (StrStrMap_find(ssmap, "hoge") != StrStrMap_end(ssmap)) { // 検索
printf("%s\n", *StrStrMap_lookup(ssmap, "hoge")); // 参照
}
StrStrMap_delete(ssmap); // 解放
return 0;
}
begin()とかnext()とかも使えるし、multimapもある。
mapだけでなくstringまであるし、algorithmも一部用意されている。
これはすごい。ライセンスも修正BSDライセンスで使いやすい。
というわけで、例えば私の場合はdllのファイルサイズを小さくするためにこれを使ってみた。
という話は次のエントリにつづく。
以上