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にされる)
戻り値は、削除されたメンバの整数値。

extern uint32 bms_hash_value(const Bitmapset *a);

aのハッシュ値を計算する。plannerでbitmapsetを使用するために適した計算が行われる。
(plannerで使用されるテーブルのインデックスが偶数か奇数に偏った時でも、ハッシュ値が分散されるようにしている)