bitmapsetのAPI
extern Bitmapset *bms_copy(const Bitmapset *a);
aをコピーする。
extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);
aとbを比較する。一致した場合はtrueを返す。
extern Bitmapset *bms_make_singleton(int x);
xで指定した整数からBitmapsetを作成する。
例: xに5を指定したとき、Bitmapsetは00010000になる。
extern void bms_free(Bitmapset *a);
aを開放する。
extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);
aとbのorをとる。
例:
a = 00001001
b = 00100001
結果は 00101001
extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b);
aとbのandをとる。
例:
a = 00001001
b = 00100001
結果は 00000001
extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b);
aとbの差をとる。(aに有ってbに無いbitを取得する)
例:
a = 00001001
b = 00100001
結果は 00001000
extern bool bms_is_subset(const Bitmapset *a, const Bitmapset *b);
aがbのsubsetか調べる。(aで立っているbitが全てbにも立っていたらtrue)
extern bool bms_is_member(int x, const Bitmapset *a);
xがaに含まれているか調べる。(整数xのbitがaに含まれていたらtrue)
extern bool bms_overlap(const Bitmapset *a, const Bitmapset *b);
aとbが重なっているか。(aとbでひとつでも同じbitが立っていたらtrue)
extern bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b);
aで立っているbitがbで立っていなければtrue。
extern int bms_singleton_member(const Bitmapset *a);
aが表している整数を返す。aのbitが1つだけ立っていない場合はエラー。
extern int bms_num_members(const Bitmapset *a);
aに登録されている整数の数を返す。(立っているbitの数を返す)
extern BMS_Membership bms_membership(const Bitmapset *a);
aに登録されている整数の状態を返す。結果は以下の値のどれかになる。
BMS_EMPTY_SET: 0
BMS_SINGLETON: 1
BMS_MULTIPLE: 2以上
extern bool bms_is_empty(const Bitmapset *a);
aが空か調べる。(aがNULLか、全てのbitがoffだったらtrue)
bms_membershipとbms_is_emptyは、bms_num_membersでも同様のことが
調べられるが、これらの関数のほうが動作が速い。
以降の関数では、constでないBitmapsetのデータは書き換えられたり、メモリが開放されて新しいBitmapsetが作成されたりする。
extern Bitmapset *bms_add_member(Bitmapset *a, int x);
aにxを登録する。
例:a = 00010001のとき、x = 3を足すと、a = 00010101になる
extern Bitmapset *bms_del_member(Bitmapset *a, int x);
aからxを削除する。
例:a = 00010001のとき、x = 5を削除すると、a = 00000001になる
(登録されていないxを指定してもエラーにならない)
extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);
aにbを追加する(orを計算)。bms_unionと同じ計算を行うが、aが上書きされるところが違う。bms_int_members, dms_del_membersも同様。
extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);
aとbのandを計算する。
extern Bitmapset *bms_del_members(Bitmapset *a, const Bitmapset *b);
aからbを削除する。
extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);
aとbを合成する(or操作)。aかbの片方が上書きされ、もう片方はbms_freeで開放される。
extern int bms_first_member(Bitmapset *a);
aに登録されている最小のメンバを削除する。(一番右のbitがoffにされる)
戻り値は、削除されたメンバの整数値。