- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- PostgreSQL/開発/include/nodes/bitmapset.h へ行く。
- 概要
- 定義
- 変数,エイリアス
- マクロ
- 列挙型
- 構造体
- 関数
- bms_copy
- bms_equal
- bms_make_singleton
- bms_free
- bms_union
- bms_intersect
- bms_difference
- bms_is_subset
- bms_subset_compare
- bms_is_member
- bms_overlap
- bms_nonempty_difference
- bms_singleton_member
- bms_get_singleton_member
- bms_num_members
- bms_membership
- bms_is_empty
- bms_add_member
- bms_del_member
- bms_add_members
- bms_int_members
- bms_del_members
- bms_join
- bms_first_member
- bms_next_member
- bms_hash_value
- サンプルプログラム
- 参考・関連
- コメント
概要 †
- ビットマップの機能
- 要素値は非負数のみ
- ワードサイズはutint32
定義 †
変数,エイリアス †
サンプル
// ワードの変数名 typedef uint32 bitmapword; /* must be an unsigned type */ // ワード(符号あり),LSB算出に使われる typedef int32 signedbitmapword; /* must be the matching signed type */
マクロ †
BITS_PER_BITMAPWORD †
サンプル
#define BITS_PER_BITMAPWORD 32
ワードサイズ
列挙型 †
BMS_Comparison †
定数名 | 説明 |
---|---|
BMS_EQUAL | 等しい |
BMS_SUBSET1 | 1番目最初のセットが2番目のセットのサブセットである |
BMS_SUBSET | 2番目最初のセットが1番目のセットのサブセットである |
BMS_DIFFERENT | 異なるビットマップセットである |
BMS_Membership †
BMS_EMPTY_SET | 空のセット |
BMS_SINGLETON | シングルトンセットか,メンバーが1つ |
BMS_MULTIPLE | 複数セット,メンバーが複数 |
- ビットマップセットのメンバーシップ
サンプル
void test_bitmapset() { Bitmapset *bm = bms_make_singleton(1); bms_singleton_member(bm); // 1 // 要素は1つ elog(NOTICE, "%d", bms_membership(bm) == BMS_SINGLETON); // NOTICE: 1 bm = bms_add_member(bm, 2); // 複数の要素あり elog(NOTICE, "%d", bms_membership(bm) == BMS_MULTIPLE); // NOTICE: 1 bm = bms_del_member(bm, 1); bm = bms_del_member(bm, 2); // 要素は空 elog(NOTICE, "%d", bms_membership(bm) == BMS_EMPTY_SET); // NOTICE: 1 elog(NOTICE, "%d", bms_is_empty(bm)); // NOTICE: 1 }
構造体 †
Bitmapset †
番号 | データ型 | フィールド | 説明 |
---|---|---|---|
1 | int | nwords | wordの数 |
2 | bitmapword | words[] | ビットマップ,サイズは自動拡張される |
関数 †
bms_copy †
// 引数1:コピー対象のビットマップセットのポインタ // 戻り値:コピーされたビットマップセットのポインタ extern Bitmapset *bms_copy(const Bitmapset *a);
- 説明
bms_equal †
// 引数1:比較する対象のビットマップセットのポインタ // 引数2:比較する対象のビットマップセットのポインタ // 戻り値:true:等しい,false:等しくない extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);
- 説明
bms_make_singleton †
// 引数1:ビットマップセットに格納する初期数値 // 戻り値:ビットマップセットのポインタ extern Bitmapset *bms_make_singleton(int x);
- 指定された数値を登録してビットマップセットを作成する。
サンプル
Bitmapset *bm = bms_make_singleton(1);
bms_free †
// 引数1:対象のビットマップセットのポインタ extern void bms_free(Bitmapset *a);
- ビットマップセットの領域を解放する。
bms_union †
// 引数1:対象のビットマップセットのポインタ // 引数2:対象のビットマップセットのポインタ // 戻り値:和集合のビットマップセットのポインタ // aがNULLの場合,bのコピー // bがNULLの場合は,aのコピー extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);
- 説明
bms_intersect †
void test_bitmapset_union() { Bitmapset *bm1 = bms_make_singleton(0); bm1 = bms_add_member(bm1, 1); bm1 = bms_add_member(bm1, 12); Bitmapset *bm2 = bms_make_singleton(1); bm2 = bms_add_member(bm2, 3); bm2 = bms_add_member(bm2, 5); bm2 = bms_add_member(bm2, 32); Bitmapset *new_bm = bms_union(bm1, bm2); int result = -1; while ((result = bms_first_member(bm1)) >= 0) { elog(INFO, "bm1 member: %d", result); } result = -1; while ((result = bms_first_member(bm2)) >= 0) { elog(INFO, "bm2 member: %d", result); } result = -1; while ((result = bms_first_member(new_bm)) >= 0) { elog(INFO, "new_bm member: %d", result); } } /* Output is the following: ------------------------------ INFO: bm1 member: 0 INFO: bm1 member: 1 INFO: bm1 member: 12 INFO: bm2 member: 1 INFO: bm2 member: 3 INFO: bm2 member: 5 INFO: bm2 member: 32 INFO: new_bm member: 0 INFO: new_bm member: 1 INFO: new_bm member: 3 INFO: new_bm member: 5 INFO: new_bm member: 12 INFO: new_bm member: 32 */
- 説明
bms_difference †
// 引数1:対象のビットマップセットのポインタ // 引数2:対象のビットマップセットのポインタ // 戻り値:積集合のビットマップセットのポインタ // aまたはbがNULLの場合,NULL extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b);
- 説明
bms_is_subset †
// 引数1:差集合のベースとなる対象のビットマップセットのポインタ // 引数2:差集合を計算する対象のビットマップセットのポインタ // 戻り値:差集合のビットマップセットのポインタ // aがNULLの場合,NULL // bがNULLの場合,aのコピー extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b);
- 説明
bms_subset_compare †
// 引数1:ベースとなる対象のビットマップセットのポインタ // 引数2:サブセット計算対象のビットマップセットのポインタ // 戻り値:true:サブセットである,false:サブセットでない // aがNULLの場合,true // bがNULLの場合,bms_is_empty(a) extern bool bms_is_subset(const Bitmapset *a, const Bitmapset *b);
- 説明
bms_is_member †
// 引数1:比較対象のビットマップセットのポインタ // 引数2:比較対象のビットマップセットのポインタ // 戻り値:関連を示す列挙定数 extern BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b);
- xがビットマップセットの要素であるかを確認する。
サンプル
void test_bitmapset_subset() { Bitmapset *bma = bms_make_singleton(0); bma = bms_add_member(bma, 1); bma = bms_add_member(bma, 12); Bitmapset *bmb = bms_make_singleton(0); bmb = bms_add_member(bmb, 1); bmb = bms_add_member(bmb, 12); bmb = bms_add_member(bmb, 16); bmb = bms_add_member(bmb, 32); elog(NOTICE, "Is a subset of b ? -> %d", bms_is_subset(bma, bmb)); // a ⊆ b elog(NOTICE, "Is b subset of a ? -> %d", bms_is_subset(bmb, bma)); // b ⊆ a BMS_Comparison relship = bms_subset_compare(bma, bmb); switch (relship) { case BMS_EQUAL: elog(NOTICE, "a = b"); break; case BMS_SUBSET1: elog(NOTICE, "a ⊆ b"); break; case BMS_SUBSET2: elog(NOTICE, "b ⊆ a"); break; case BMS_DIFFERENT: elog(NOTICE, "a != b"); break; default: elog(NOTICE, "not arrive here"); break; } } /* Output is the following: ------------------------------ NOTICE: Is a subset of b ? -> 1 NOTICE: Is b subset of a ? -> 0 NOTICE: a ⊆ b */
bms_overlap †
// 引数1:チェックしたい整数 // 引数2:対象のビットマップセットのポインタ // 戻り値:true:メンバーである,false:メンバーでない // xが負数の場合は,エラー // aがNULLの場合は,false extern bool bms_is_member(int x, const Bitmapset *a);
- 説明
bms_nonempty_difference †
Bitmapset *bm = bms_make_singleton(1); elog(NOTICE, "%u", bms_is_member(1, bm)); // NOTICE: 1
- 説明
bms_singleton_member †
// 引数1:対象のビットマップセットのポインタ // 引数2:対象のビットマップセットのポインタ // 戻り値:true:オーバーラップあり,false:オーバーラップなし // aまたはbがNULLの場合,false extern bool bms_overlap(const Bitmapset *a, const Bitmapset *b);
- シングルトンメンバの値を返す。
サンプル
void test_bitmapset_overlap() { Bitmapset *bma = bms_make_singleton(0); bma = bms_add_member(bma, 1); bma = bms_add_member(bma, 12); Bitmapset *bmb = bms_make_singleton(0); bmb = bms_add_member(bmb, 1); bmb = bms_add_member(bmb, 12); bmb = bms_add_member(bmb, 16); bmb = bms_add_member(bmb, 32); // 1, 12 are overlaps elog(NOTICE, "Is there a overlap between bma and bmb ? %d", bms_overlap(bma, bmb)); } /* Output is the following: ------------------------------ NOTICE: Is there a overlap between bma and bmb ? 1 */
bms_get_singleton_member †
// 引数1:対象のビットマップセットのポインタ // 引数2:対象のビットマップセットのポインタ // 戻り値:true:差分あり,false:差分なし // aがNULLの場合は,false // bがNULLに場合は,!bms_is_empty(a)の結果 extern bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b);
- ビットマップセットのシングルトンメンバの値を取得する。
サンプル
void test_bitmapset_nonempty_difference() { Bitmapset *bma = bms_make_singleton(0); bma = bms_add_member(bma, 1); bma = bms_add_member(bma, 12); bma = bms_add_member(bma, 16); Bitmapset *bmb = bms_make_singleton(0); bmb = bms_add_member(bmb, 1); bmb = bms_add_member(bmb, 12); bmb = bms_add_member(bmb, 16); bmb = bms_add_member(bmb, 32); // 32 is nonempty_difference elog(NOTICE, "Is there a diffrence between bmb and bmb ? %d", bms_nonempty_difference(bmb, bma)); } /* Output is the following: ------------------------------ NOTICE: Is there a diffrence between bmb and bmb ? 1 */
bms_num_members †
// 引数1:対象のビットマップセットのポインタ // 戻り値:シングルトンメンバの値 // aがNULLの場合,エラー // aがemptyの場合,エラー extern int bms_singleton_member(const Bitmapset *a);
- ビットマップセットの要素数をカウントする。
サンプル
Bitmapset *bm = bms_make_singleton(31); elog(NOTICE, "%d", bms_singleton_member(bm)); // NOTICE: 31
bms_membership †
// 引数1:対象のビットマップセットのポインタ // 引数2:シングルトンメンバを書き込むポインタ // 戻り値:true:取得OK,false:失敗 // aがemtpyの場合,false extern bool bms_get_singleton_member(const Bitmapset *a, int *member);
- ビットマップセットのメンバーシップを取得する。
bms_is_empty †
void test_bitmapset() { Bitmapset *bm = bms_make_singleton(31); int x = -1; if (bms_get_singleton_member(bm, &x)) { elog(NOTICE, "x = %d", x); // NOTICE: 31 } }
- ビットマップセットが空かどうか確認する。
bms_add_member †
// 引数1:対象のビットマップセットのポインタ // 戻り値:要素数 // aがNULLの場合,0 extern int bms_num_members(const Bitmapset *a);
- ビットマップセットに要素xを加える。
- Bitmapsetは指定される要素値に応じて拡張されるので,関数から戻されるビットマップのポインタを使うように注意する。
参考 bms_add_member() - on doxygen.postgresql.org
サンプル
void test_bitmapset() { Bitmapset *bm = bms_make_singleton(0); for (int i = 1; i <= 10; i++) { bm = bms_add_member(bm, i); } // nwords is extended from 1 to 2 bm = bms_add_member(bm, 32); // count members of set over words elog(NOTICE, "num = %d", bms_num_members(bm)); // NOTICE: num = 12 }
bms_del_member †
// 引数1:対象のビットマップセットのポインタ // 戻り値:メンバーシップの列挙定数 extern BMS_Membership bms_membership(const Bitmapset *a);
- ビットマップセットから要素xを削除する。
bms_add_members †
// 引数1:対象のビットマップセットのポインタ // 戻り値:true:空,false:空でない // aがNULLの場合,true extern bool bms_is_empty(const Bitmapset *a);
- 説明
bms_int_members †
// 引数1:対象のビットマップセットのポインタ // 引数2:ビットマップセットに加える要素 // 戻り値:ビットマップセットのポインタ // xが負数の場合,エラー // aがNULLの場合,bms_make_singleton(x) extern Bitmapset *bms_add_member(Bitmapset *a, int x);
- 説明
bms_del_members †
Bitmapset *bm = bms_make_singleton(0); bm = bms_add_member(bm, 32);
- 説明
bms_join †
// 引数1:対象のビットマップセットのポインタ // 引数2:削除する要素 // 戻り値:ビットマップセットのポインタ // xが負数の場合,エラー // aがNULLの場合,NULL extern Bitmapset *bms_del_member(Bitmapset *a, int x);
- 指定されたビットマップセットを結合した結果を返す。
- サイズの大きな方に統合される。
- 関数実行において,指定されたビットマップセットのいずれかのポインタがpfreeされることがあるため注意。
参考 bms_join() - on doxygen.postgresql.org
サンプル
// 引数1:対象のビットマップセットのポインタ // 引数2:対象のビットマップセットのポインタ // 戻り値:和集合演算されたビットマップセットのポインタ // aがNULLの場合,bms_copy(a) // bがNULLの場合,a // nwordsが大きい方に統合される,aは再利用される extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);
bms_first_member †
// 引数1:対象のビットマップセットのポインタ // 引数2:対象のビットマップセットのポインタ // 戻り値:積集合演算されたビットマップセットのポインタ // aがNULLの場合,NULL // bがNULLの場合,pfree(a)してNULL,aは再利用される extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);
- ビットマップセットの要素値を返す。
- ビットマップセットの取り出された要素値は,ビットマップセットから削除される(破壊的に操作されるので注意)。
参考 bms_first_member() - on doxygen.postgresql.org
サンプル
// 引数1:対象のビットマップセット1のポインタ // 引数2:対象のビットマップセット2のポインタ // 戻り値:和集合演算されたビットマップセットのポインタ // aがNULLの場合,b // bがNULLの場合,a // aもbも再利用される extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);
bms_next_member †
void test_bitmapset_join() { Bitmapset *bm1 = bms_make_singleton(1); Bitmapset *bm2 = bms_make_singleton(4); // Bitmapset *bm3 = bms_join(bm, bm2); // bms_joinでは,引数で指定したビットマップセットを再利用する(変更される) Bitmapset *bm3 = bms_join(bms_copy(bm1), bms_copy(bm2)); int result = -1; result = -1; elog(INFO, "%s", "***** bm3 *****"); while ((result = bms_first_member(bm3)) >= 0) { elog(INFO, "member: %d", result); } result = -1; elog(INFO, "%s", "***** bm1 *****"); while ((result = bms_first_member(bm1)) >= 0) { elog(INFO, "member: %d", result); } result = -1; elog(INFO, "%s", "***** bm2 *****"); while ((result = bms_first_member(bm2)) >= 0) { elog(INFO, "member: %d", result); } } /* Output is the following: ------------------------------ INFO: ***** bm3 ***** INFO: member: 1 INFO: member: 4 INFO: ***** bm1 ***** INFO: member: 1 INFO: ***** bm2 ***** INFO: member: 4 */
- 説明
bms_hash_value †
// 引数1:対象のビットマップセットのポインタ // 戻り値:ビットマップセットの最初の要素 // aがNULLの場合,-1 // aがemptyの場合,-1 extern int bms_first_member(Bitmapset *a);
- 説明
サンプルプログラム †
ビットマップセットのビットを表示する †
実験
void test_bitmapset_iterate() { Bitmapset *bm = bms_make_singleton(0); bm = bms_add_member(bm, 0); bm = bms_add_member(bm, 1); bm = bms_add_member(bm, 2); int result = -1; while ((result = bms_first_member(bm)) >= 0) { elog(INFO, "member: %d", result); } // members is already removed from bitmapset. elog(INFO, "% is member of bm ? %d", 1, bms_is_member(1, bm)); // 削除されているのでfalse } /* Output is the following: -------------------------- INFO: member: 0 INFO: member: 1 INFO: member: 2 INFO: 1s member of bm ? 0 */
参考・関連 †
- bitmapset.h - on doxygen.postgresql.org
- bitmapset.c - on doxygen.postgresql.org
関連