#author("2017-05-27T00:06:30+09:00","default:haikikyou","haikikyou")
#author("2017-05-27T21:24:30+09:00","default:haikikyou","haikikyou")
[[PostgreSQL/開発]]

#contents

* 概要 [#o44c23aa]

- 概要説明
- ビットマップのための機能
- 非負数の取り扱いが可能
- ワードサイズはutint32

#ref(./bitmapset_image.png,60%)
* 定義 [#y54658dc]

** 変数,エイリアス [#xbab96df]

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
// ワードの変数名
typedef uint32 bitmapword;		/* must be an unsigned type */
// ワード(符号あり),LSB算出に使われる
typedef int32 signedbitmapword; /* must be the matching signed type */
}}}


** マクロ [#z17bcdfc]

*** BITS_PER_BITMAPWORD [#j46732f4]

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
#define BITS_PER_BITMAPWORD 32
}}}

ワードサイズ
** 列挙型 [#r016dac4]

*** BMS_Comparison [#c4e1831b]
|~定数名|~説明|h
|BMS_EQUAL|等しい|
|BMS_SUBSET1|1番目最初のセットが2番目のセットのサブセットである|
|BMS_SUBSET|2番目最初のセットが1番目のセットのサブセットである|
|BMS_DIFFERENT|異なるビットマップセットである|


*** BMS_Membership [#v4e5d865]

|BMS_EMPTY_SET|空のセット|
|BMS_SINGLETON|シングルトンセットか,メンバーが1つ|
|BMS_MULTIPLE|複数セット,メンバーが複数|

- ビットマップセットのメンバーシップ

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
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
}
}}}
** 構造体 [#g3b005c3]

*** Struct [#k30f0c52]
*** Bitmapset [#w1a2c428]

|~番号|~データ型|~フィールド|~説明|h
|1|int|nwords|wordの数|
|2|bitmapword|words[]|ビットマップ,サイズは自動拡張される|
** 関数 [#x7a379c3]

*** bms_copy [#i7fb952d]

** 関数 [#x7a379c3]
#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_copy(const Bitmapset *a);
}}}
- 説明

*** 関数名 [#h66e1510]
*** bms_equal [#k7ca3a73]

#geshi(c){{
#geshi(c){{{
// 引数1:
}}
// 引数2:
// 戻り値:
extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_make_singleton [#xfe5a00d]

#geshi(c){{{
// 引数1:ビットマップセットに格納する初期数値
// 戻り値:ビットマップセットのポインタ
extern Bitmapset *bms_make_singleton(int x);
}}}

- 指定された数値を登録してビットマップセットを作成する。

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
Bitmapset *bm = bms_make_singleton(1);
}}}

*** bms_free [#x8745666]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
extern void bms_free(Bitmapset *a);
}}}

- ビットマップセットの領域を解放する。
*** bms_union [#q9a01f34]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_intersect [#t377e68f]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_difference [#r00f4def]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_is_subset [#eff4dc92]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern bool bms_is_subset(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_subset_compare [#h2821fd9]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_is_member [#acdf2980]

#geshi(c){{{
// 引数1:チェックしたい整数
// 引数2:対象のビットマップセットのポインタ
// 戻り値:true:メンバーである,false:メンバーでない
extern bool bms_is_member(int x, const Bitmapset *a);
}}}

- xがビットマップセットの要素であるかを確認する。

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
Bitmapset *bm = bms_make_singleton(1);
elog(NOTICE, "%u", bms_is_member(1, bm)); // NOTICE:  1
}}}
*** bms_overlap [#lb65755b]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern bool bms_overlap(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_nonempty_difference [#f34c0e39]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_singleton_member [#c614c16d]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 戻り値:シングルトンメンバの値
extern int bms_singleton_member(const Bitmapset *a);
}}}

- シングルトンメンバの値を返す。

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
Bitmapset *bm = bms_make_singleton(31);
elog(NOTICE, "%d", bms_singleton_member(bm)); // NOTICE:  31
}}}

*** bms_get_singleton_member [#n55ddd34]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 引数2:シングルトンメンバを書き込むポインタ
// 戻り値:true:取得OK,false:失敗
extern bool bms_get_singleton_member(const Bitmapset *a, int *member);
}}}

- ビットマップセットのシングルトンメンバの値を取得する。

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
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_num_members [#wf426c00]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 戻り値:要素数
extern int bms_num_members(const Bitmapset *a);
}}}

- ビットマップセットの要素数をカウントする。

&size(12){&color(white,#00afcc){ サンプル };};

#geshi(c){{{
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_membership [#u1d80489]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 戻り値:メンバーシップの列挙定数
extern BMS_Membership bms_membership(const Bitmapset *a);
}}}

- ビットマップセットのメンバーシップを取得する。

*** bms_is_empty [#t399eda7]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 戻り値:true:空,false:空でない
extern bool bms_is_empty(const Bitmapset *a);
}}}

- ビットマップセットが空かどうか確認する。

*** bms_add_member [#u170c17d]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 引数2:ビットマップセットに加える要素
// 戻り値:ビットマップセットのポインタ
extern Bitmapset *bms_add_member(Bitmapset *a, int x);
}}}

- ビットマップセットに要素xを加える。
- Bitmapsetは指定される要素値に応じて拡張されるので,関数から戻されるビットマップのポインタを使うように注意する。

&size(12){&color(white,#00afcc){ サンプル };};
#geshi(c){{{
Bitmapset *bm = bms_make_singleton(0);
bm = bms_add_member(bm, 32);
}}}
*** bms_del_member [#i5fea93d]

#geshi(c){{{
// 引数1:対象のビットマップセットのポインタ
// 引数2:削除する要素
// 戻り値:ビットマップセットのポインタ
extern Bitmapset *bms_del_member(Bitmapset *a, int x);
}}}

- ビットマップセットから要素xを削除する。

*** bms_add_members [#q8de13fa]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_int_members [#l59605a2]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_del_members [#d36bd21a]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_del_members(Bitmapset *a, const Bitmapset *b);
}}}
- 説明

*** bms_join [#e146e2df]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);
}}}
- 説明

*** bms_first_member [#f07f3371]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern int bms_first_member(Bitmapset *a);
}}}
- 説明

*** bms_next_member [#l584c45b]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern int bms_next_member(const Bitmapset *a, int prevbit);
}}}
- 説明

*** bms_hash_value [#e541a454]

#geshi(c){{{
// 引数1:
// 引数2:
// 戻り値:
extern uint32 bms_hash_value(const Bitmapset *a);
}}}
- 説明
* サンプルプログラム [#n657ef28]

#geshi(c){{
// sample
}}

* 参考・関連 [#g81f45e8]

- [[bitmapset.h>https://doxygen.postgresql.org/bitmapset_8h.html]] - on doxygen.postgresql.org
- [[bitmapset.c>https://doxygen.postgresql.org/bitmapset_8c.html]] - on doxygen.postgresql.org


&size(12){&color(white,orange){ 関連 };};

#related
* コメント [#m246387f]

#comment


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP