====== khashの構造 ====== mrubyでは、hashの基本実装としてkhash (include/mruby/khash.h) というものが使われている。 「xxxのためのハッシュ構造」を扱うための宣言や定義がマクロKHASH_DEFINE(xxx)等で生成される仕組み。 xxxに入るキーワードはいろいろあるが、内部構造的には全部同じ。 ===== データ構造 ===== typedef uint32_t khint_t; #define KHASH_DECLARE(name, khkey_t, khval_t, kh_is_map) \ typedef struct kh_##name { \ khint_t n_buckets; /* keysやvalsの容量(2の冪乗かつ8以上) */ \ khint_t size; /* 登録されている要素の数 */ \ khint_t n_occupied; /* 不明 */ \ khint_t upper_bound; /* 不明 */ \ uint8_t *e_flags; /* 空きフラグ */ \ uint8_t *d_flags; /* 削除済みフラグ */ \ khkey_t *keys; /* キーの配列(n_buckets個分の領域)*/ \ khval_t *vals; /* 値の配列(n_buckets個分の領域)*/ \ khint_t mask; /* 不明 */ \ khint_t inc; /* 不明 */ \ mrb_state *mrb; \ } kh_##name##_t; \ /* 続き省略 */