/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/// structure. Currently, it only includes a middle game and an end game
/// pawn structure evaluation, and a bitboard of passed pawns. We may want
/// structure. Currently, it only includes a middle game and an end game
/// pawn structure evaluation, and a bitboard of passed pawns. We may want
-/// to add further information in the future. A lookup to the pawn hash table
-/// (performed by calling the get_pawn_info method in a PawnInfoTable object)
-/// returns a pointer to a PawnInfo object.
-class Position;
+/// to add further information in the future. A lookup to the pawn hash
+/// table (performed by calling the probe method in a PawnTable object)
+/// returns a pointer to a PawnEntry object.
Bitboard pawn_attacks(Color c) const;
Bitboard passed_pawns(Color c) const;
int file_is_half_open(Color c, File f) const;
int has_open_file_to_left(Color c, File f) const;
int has_open_file_to_right(Color c, File f) const;
Bitboard pawn_attacks(Color c) const;
Bitboard passed_pawns(Color c) const;
int file_is_half_open(Color c, File f) const;
int has_open_file_to_left(Color c, File f) const;
int has_open_file_to_right(Color c, File f) const;
- Score updateShelter(const Position& pos, Color c, Square ksq);
+ template<Color Us>
+ Score update_safety(const Position& pos, Square ksq);
+
+ template<Color Us>
+ Value shelter_storm(const Position& pos, Square ksq);
-/// The PawnInfoTable class represents a pawn hash table. It is basically
-/// just an array of PawnInfo objects and a few methods for accessing these
-/// objects. The most important method is get_pawn_info, which looks up a
-/// position in the table and returns a pointer to a PawnInfo object.
- Score evaluate_pawns(const Position& pos, Bitboard ourPawns, Bitboard theirPawns, PawnInfo* pi) const;
+ static Score evaluate_pawns(const Position& pos, Bitboard ourPawns,
+ Bitboard theirPawns, PawnEntry* e);
- template<Color Us, SideType Side>
- int evaluate_pawn_storm(Square s, Rank r, File f, Bitboard theirPawns) const;
-
- PawnInfo* entries;
+ HashTable<PawnEntry, PawnTableSize> entries;
-////
-//// Inline functions
-////
-
-inline void PawnInfoTable::prefetch(Key key) const {
-
- unsigned index = unsigned(key & (PawnTableSize - 1));
- PawnInfo* pi = entries + index;
- ::prefetch((char*) pi);
-}
-
-inline Score PawnInfo::pawns_value() const {
+inline Score PawnEntry::pawns_value() const {
-inline Value PawnInfo::kingside_storm_value(Color c) const {
- return Value(ksStormValue[c]);
-}
-
-inline Value PawnInfo::queenside_storm_value(Color c) const {
- return Value(qsStormValue[c]);
-}
-
-inline Bitboard PawnInfo::passed_pawns(Color c) const {
+inline Bitboard PawnEntry::passed_pawns(Color c) const {
-inline int PawnInfo::file_is_half_open(Color c, File f) const {
- return (halfOpenFiles[c] & (1 << int(f)));
+inline int PawnEntry::file_is_half_open(Color c, File f) const {
+ return halfOpenFiles[c] & (1 << int(f));
-inline Score PawnInfo::king_shelter(const Position& pos, Color c, Square ksq) {
- return kingSquares[c] == ksq ? kingShelters[c] : updateShelter(pos, c, ksq);
+template<Color Us>
+inline Score PawnEntry::king_safety(const Position& pos, Square ksq) {
+ return kingSquares[Us] == ksq ? kingSafety[Us] : update_safety<Us>(pos, ksq);