depth 個のエントリを持つハッシュ・テーブル table の table[] 配列メンバに対して添え字として使用する「ハッシュ値」を、n_keys 個の文字列ポインタ配列 keys から算出して返します。
データ要素挿入量をハッシュ・テーブル生成時に決定できない場合は、create_hash_table() API にヒント情報に NULL を渡すのがよいでしょう。
- ハッシュ・テーブルを生成する create_hash_table()
Hashtable_t create_hash_table(
ssize_t depth
, ssize_t (*make_hash_value)(
char **keys
, size_t n_keys
, ssize_t depth
)
, int (*cmp_keys_element)(
char **keys
, size_t n_keys
, void *elem
)
, Hashtable_extend_hint_t *hint
)
depth 個のエントリを持つハッシュ・テーブルを生成します。呼び出し側は、cmp_keys_element に複数キー文字列とデータ要素の大小関係を比較する関数のアドレスを必ず指定する必要があります。
depth は 1 以上の正整数でなければいけません。指定できる最大値は LONG_MAX ですが、あまり大きなエントリ数を指定するとメモリ不足エラーを起こします。
比較関数は「キー文字列 < データ要素」では負整数を、「キー文字列 = データ要素」ではゼロを、「キー文字列 > データ要素」では正整数を返すように実装されている必要があります。
make_hash_value には複数キー文字列からハッシュ値を求めるハッシュ関数のアドレスを指定できます。この引数に NULL を渡した場合は、API デフォルトのハッシュ関数 simple_hash_value() 静的関数が使用されます。
hint はデータ挿入やデータ差換え操作でデータ要素ポインタ配列 (Hashtable_elem_t.elements が指すメモリ領域) をメモリ拡張する際のヒント情報を渡せます。NULL を渡した場合は、API のデフォルト設定が適用されます。
ヒント情報を指定する場合、ハッシュ・テーブルに挿入する最大データ要素数を Hashtable_extend_t 構造体の max_insert_cnt に、あるハッシュ値に対応するハッシュ・エントリに初めてデータ挿入を行う際のデータ要素配列 (Hashtable_elems_t.elements) の要素数を elems_base_cnt に、そして、データ要素配列のメモリ拡張を行う際の増分データ要素数を elems_ext_cnt に設定します。
設定するメンバそれぞれについて、API デフォルト設定を使用するには、max_insert_cnt に HASHTABLE_SYS_MAX_INSERT_CNT を、elems_base_cnt に HASHTABLE_RECOMMENDED_ELEMS_BASE_CNT を、そして elems_ext_cnt には HASHTABLE_RECOMMENDED_ELEMS_EXT_CNT を与えます。また、データ要素配列のメモリ拡張を行わないように指定するには elems_ext_cnt に HASHTABLE_NEVER_EXTEND を指定します。
生成したハッシュ・テーブルは destroy_hash_table() で破棄する必要があります。
ハッシュ・テーブルが正常に生成できた場合はそのアドレスを返します。なんらかのエラーが発生した場合は NULL を返します。エラーの詳細は errno の値として出力します (正常終了時の errno にはゼロが出力されます)。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- EINVAL (22) - 渡された引数が不正です
- ENOMEM (12) - ハッシュ・テーブルのための動的メモリが獲得できません (メモリ不足)
- 動的獲得されているメモリ量を取得する get_allocated_size_hash_table()
size_t get_allocated_size_hash_table(Hashtable_t *table)
ハッシュ・テーブルを作成しデータ挿入することで動的に獲得されたメモリのバイト数を返します。
エラーが起きた場合は戻り値にゼロが返され errno にゼロ以外の値が出力されます。正常終了時の errno には必ずゼロが出力されます。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- EINVAL (22) - 渡された引数が不正です。
(生成されていない/破壊されたハッシュ・テーブル構造のアドレスが渡された場合など)
- ハッシュ・テーブルに挿入されているデータ要素の総数を取得する get_inserted_cnt_hash_table()
size_t get_inserted_cnt_hash_table(Hashtable_t *table)
ハッシュ・テーブル table に挿入されているデータ要素の総数を返します。
エラーが起きた場合は戻り値に ULONG_MAX が返され errno にゼロ以外の値が出力されます。正常終了時の errno には必ずゼロが出力されます。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- EINVAL (22) - 渡された引数が不正です。
(生成されていない/破壊されたハッシュ・テーブル構造のアドレスが渡された場合など)
- データ要素を挿入されているハッシュ・テーブル・エントリの個数を取得する get_used_cnt_hash_table()
ssize_t get_used_cnt_hash_table(Hashtable_t *table)
ハッシュ・テーブル table でデータ要素を挿入されているエントリの数を返します。
エラーが起きた場合は戻り値に LONG_MIN が返され errno にゼロ以外の値が出力されます。正常終了時の errno には必ずゼロが出力されます。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- EINVAL (22) - 渡された引数が不正です。
(生成されていない/破壊されたハッシュ・テーブル構造のアドレスが渡された場合など)
- ハッシュ・テーブルに新規のデータ要素を挿入する insert_hash_table()
Hashtable_t *insert_hash_table(Hashtable_t *table
, char **keys
, size_t n_keys
, void *elem
)
ハッシュ・テーブル table に新たなデータ要素 elem を挿入します。挿入できた場合、戻り値に table を返します。
挿入するデータ要素のキー文字列 keys, n_keys が既にハッシュ・テーブルに挿入されている別のデータ要素と同一である (Hashtable_t の cmp_keys_element 関数がゼロを返す) 場合、挿入は行われずエラー (NULL が返され errno に ESRCH を出力) になります。
エラーが発生した場合は戻り値に NULL が返され errno にエラー内容が出力されます。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- EINVAL (22) - 渡された引数が不正です。
(生成されていない/破壊されたハッシュ・テーブル構造のアドレスが渡された場合など)
- ERANGE (34) - キー文字列 keys からハッシュ値を求めることが出来ません。
(make_hash_value 関数が負数を返している場合)
- ENOENT (2) - ハッシュ・テーブルには既に挿入最大数 ULONG_MAX のデータ要素が挿入されています。
- ENOMEM (12) - データ要素配列 elements のメモリサイズを拡張できません (メモリ不足)
あるいは、ハッシュ・テーブル作成時のヒント情報でメモリ拡張が禁止されています
- ESRCH (3) - 既にキー文字列が同一のデータ要素が挿入されているのでデータ要素 elem の挿入を中断しました。
(挿入されているデータ要素を別のもので差し替えるには replace_hash_table() を使用します)
- ハッシュ・テーブル中のデータ要素を差し替える replace_hash_table()
Hashtable_t *replace_hash_table(Hashtable_t *table
char **keys
, size_t n_keys
, void *elem
)
キー文字列 keys, n_keys が同一のデータ要素がハッシュテーブル table に挿入されている場合に、データ要素 elem で差し換えます。キー文字列が一致するデータ要素がハッシュ・テーブル中に存在していない場合は、insert_hash_table() と同様に、新規データ要素として elem をハッシュ・テーブルに挿入します。
データ要素の差し替えあるいは挿入ができた場合は、戻り値に table を返します。
エラーが起きた場合は戻り値に NULL が返され errno にエラー内容が出力されます。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- ハッシュ・テーブルに挿入されている同一のハッシュ値を持つデータ要素数を取得する get_duplicated_cnt_hash_table()
ssize_t get_duplicated_cnt_hash_table(Hashtable_t *table
, char **keys
, size_t n_keys
)
ハッシュ・テーブル table に挿入されていて、キー文字列 keys, n_keys から算出するハッシュ値が同一の挿入済みデータ要素数を返します。
エラーが起きた場合、LONG_MIN を返し errno にエラー内容を出力します。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- ハッシュ・テーブルに挿入されているデータ要素を検索する get_elem_hash_table()
void *get_elem_hash_table(Hashtable_t *table
, char **keys
, size_t n_keys
)
ハッシュ・テーブル table に挿入されているデータ要素をキー文字列 keys, n_keys で検索しそのアドレスを返します。
エラーが起きた場合、NULL を返し errno にエラー内容を出力します。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- ハッシュ・テーブルに挿入されているデータ要素を削除する delete_hash_table()
Hashtable_t *delete_hash_table(Hashtable_t *table
, char **keys
, size_t n_keys
, void *elem
)
ハッシュ・テーブル table に挿入されているデータ要素をキー文字列 keys, n_keys で検索し、elem が NULL でなければそのアドレスが検索したデータ要素と一致することを確認したうえで削除します。正常に削除できた場合、 table を返します。
エラーが起きた場合、NULL を返し errno にエラー内容を出力します。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- ハッシュ・テーブルに挿入されているすべてのデータ要素を逐次取得する get_elem_by_hashtable_cursor()
void *get_elem_by_hashtable_cursor(Hashtable_t *table
, Hashtable_cursor_t **cursor
, Hashtable_cursor_dir_t direct
)
ハッシュ・テーブルに挿入されているすべてのデータ要素を逐次取得するためのトラバース機構を提供します。この機構の実現のために、いわゆるデータ・カーソル方式をとっています。
トラバース機構を使用するには、まず NULL 値を設定したカーソル・ポインタ cursor のアドレスをトラバースするハッシュ・テーブル table とともに渡します。正常終了した場合、カーソル・ポインタに動的メモリが割り当てられ、ハッシュ・テーブルの先頭データ要素位置で初期化され、先頭データ要素のアドレスが返されます。なお、この時は direct の値は無視されます。
次いで、カーソルの位置からハッシュ・テーブルの先頭方向 (あるいは末尾方向) の次のデータ要素アドレスを取得するには、HASHTABLE_CURSOR_DIR_PREVIOUS (あるいは HASHTABLE_CURSOR_NEXT) を direct に渡します。既に先頭 (あるいは末尾) のデータ要素位置にカーソルがある場合に、前方 (あるいは後方) データ要素取得を行うとエラーとなり NULL が返ります (errno は EINVAL)。
direct に HASHTABLE_CURSOR_DIR_CURRENT を渡した場合、現在のカーソル位置にあるデータ要素アドレスが返されます。
カーソルを破棄するには direct に HASHTABLE_CURSOR_DIR_DESTROY を渡します。このとき、カーソルデータ構造のために獲得されたメモリ領域を解放します。また、この操作の正常な戻り値は table になります。
呼び出しのそれぞれの場合でエラーが発生すると NULL が返され errno にエラー内容が出力されます。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- ハッシュ・テーブルデータ構造を破棄する destroy_hash_table()
int destroy_hash_table(Hashtable_t *table)
create_hash_table() で生成したハッシュ・テーブル table に割り当てられた動的メモリを解放しハッシュ・テーブルを破棄します。破棄できたらゼロを返します。
エラーが起きた場合は -1 を返し errno にエラー内容を出力します。
エラーが起きた際の errno の値とその意味は以下のとおりです。
- ソートされた配列で二分探索を行う bsearch_array()
int bsearch_array(int (*cmp_keys_elements)(char **keys
, size_t n_keys
, void *elem
)
, void **array
, ssize_t n_array
, char **keys
, size_t n_keys
, ssize_t *pos
, int *pos_cmp_result
)
create_hash_table() に渡すものと同等の比較関数 cmp_keys_elements を使用して配列 array, n_array のキー文字列 keys, n_keys による二分探索を行います。
探索に成功した場合はゼロ以外の値を返します。探索に失敗した場合および不正な引数が渡された場合はゼロを返します。
不正な引数が渡されていた場合は errno に EINVAL を出力します。
探索できた (戻り値がゼロ以外の) 場合、pos に配列要素のインデックスを出力します。
一方、探索に失敗した (戻り値がゼロの) 場合は、pos にはデータ要素を挿入する配列要素位置を出力し、pos の直前に挿入を行う場合には pos_cmp_result に負整数を、pos の直後に挿入する場合は正整数を出力します。
エラーが起きた際の errno の値とその意味は以下のとおりです。