-}
-
-
-////
-//// Functions
-////
-
-/// MaterialInfo::init() is called during program initialization. It
-/// precomputes material hash keys for a few basic endgames, in order
-/// to make it easy to recognize such endgames when they occur.
-
-void MaterialInfo::init() {
-
- // Initialize std::map access locks
- lock_init(&EEFmapLock, NULL);
- lock_init(&ESFmapLock, NULL);
-
- typedef Key ZM[2][8][16];
- const ZM& z = Position::zobMaterial;
-
- static const Color W = WHITE;
- static const Color B = BLACK;
-
- KNNKMaterialKey = z[W][KNIGHT][1] ^ z[W][KNIGHT][2];
- KKNNMaterialKey = z[B][KNIGHT][1] ^ z[B][KNIGHT][2];
-
- add(z[W][PAWN][1], &EvaluateKPK);
- add(z[B][PAWN][1], &EvaluateKKP);
-
- add(z[W][BISHOP][1] ^ z[W][KNIGHT][1], &EvaluateKBNK);
- add(z[B][BISHOP][1] ^ z[B][KNIGHT][1], &EvaluateKKBN);
- add(z[W][ROOK][1] ^ z[B][PAWN][1], &EvaluateKRKP);
- add(z[W][PAWN][1] ^ z[B][ROOK][1], &EvaluateKPKR);
- add(z[W][ROOK][1] ^ z[B][BISHOP][1], &EvaluateKRKB);
- add(z[W][BISHOP][1] ^ z[B][ROOK][1], &EvaluateKBKR);
- add(z[W][ROOK][1] ^ z[B][KNIGHT][1], &EvaluateKRKN);
- add(z[W][KNIGHT][1] ^ z[B][ROOK][1], &EvaluateKNKR);
- add(z[W][QUEEN][1] ^ z[B][ROOK][1], &EvaluateKQKR);
- add(z[W][ROOK][1] ^ z[B][QUEEN][1], &EvaluateKRKQ);
-
- add(z[W][KNIGHT][1] ^ z[W][PAWN][1], W, &ScaleKNPK);
- add(z[B][KNIGHT][1] ^ z[B][PAWN][1], B, &ScaleKKNP);
-
- add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[B][ROOK][1] , W, &ScaleKRPKR);
- add(z[W][ROOK][1] ^ z[B][ROOK][1] ^ z[B][PAWN][1] , B, &ScaleKRKRP);
- add(z[W][BISHOP][1] ^ z[W][PAWN][1] ^ z[B][BISHOP][1], W, &ScaleKBPKB);
- add(z[W][BISHOP][1] ^ z[B][BISHOP][1] ^ z[B][PAWN][1] , B, &ScaleKBKBP);
- add(z[W][BISHOP][1] ^ z[W][PAWN][1] ^ z[B][KNIGHT][1], W, &ScaleKBPKN);
- add(z[W][KNIGHT][1] ^ z[B][BISHOP][1] ^ z[B][PAWN][1] , B, &ScaleKNKBP);
-
- add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[W][PAWN][2] ^ z[B][ROOK][1] ^ z[B][PAWN][1], W, &ScaleKRPPKRP);
- add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[B][ROOK][1] ^ z[B][PAWN][1] ^ z[B][PAWN][2], B, &ScaleKRPKRPP);
-}
-
-
-/// Constructor for the MaterialInfoTable class
-
-MaterialInfoTable::MaterialInfoTable(unsigned int numOfEntries) {
-
- size = numOfEntries;
- entries = new MaterialInfo[size];
- if (!entries)
- {
- std::cerr << "Failed to allocate " << (numOfEntries * sizeof(MaterialInfo))
- << " bytes for material hash table." << std::endl;
- exit(EXIT_FAILURE);
- }
- clear();
-}
-
-
-/// Destructor for the MaterialInfoTable class
-
-MaterialInfoTable::~MaterialInfoTable() {
-
- delete [] entries;
-}
-
-
-/// MaterialInfoTable::clear() clears a material hash table by setting
-/// all entries to 0.
-
-void MaterialInfoTable::clear() {
-
- memset(entries, 0, size * sizeof(MaterialInfo));
-}