8.5 局面の登録と取得 |
本節では局面情報の登録と取得処理を実装します。
また残りのHashクラスの関数も実装します。
局面情報を登録する関数Hash_Set()は以下のようになっています。
ハッシュ値からインデックスを求め、対応する領域にハッシュ値と局面情報をコピーします。
常に局面情報を上書きするので単純な実装になっています。
int Hash_Set(Hash *self, const HashValue *in_value, const HashInfo *in_info) { int i; i = in_value->Low & self->Mask; memcpy(&self->Data[i].Value, in_value, sizeof(HashValue)); memcpy(&self->Data[i].Info, in_info, sizeof(HashInfo)); return 1; }
次に局面情報取得関数Hash_Get()を実装します。
処理としては、インデックスの計算、ハッシュ値の比較、ハッシュ値が一致していたら局面情報をコピーする、の3つを行っています。
またGetNumとHitNumの更新もします。
int Hash_Get(Hash *self, const HashValue *in_value, HashInfo *out_info) { int i; i = in_value->Low & self->Mask; self->GetNum++; if (self->Data[i].Value.Low == in_value->Low && self->Data[i].Value.High == in_value->High) { memcpy(out_info, &self->Data[i].Info, sizeof(HashInfo)); self->HitNum++; return 1; } return 0; }
残りの関数も実装を行いましょう。
void Hash_ClearInfo(Hash *self) { self->GetNum = 0; self->HitNum = 0; } int Hash_CountGet(Hash *self) { return self->GetNum; } int Hash_CountHit(Hash *self) { return self->HitNum; }
どれも単純な実装です。
Hash_ClearInfo()ではGetNumとHitNumの初期化、Hash_CountGet()とHash_CountHit()は対応するメンバ変数の値を返しているだけです。
次節では、置換表を利用した探索を行います。