| 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()は対応するメンバ変数の値を返しているだけです。
次節では、置換表を利用した探索を行います。