-
-/// Book::get_move() gets a book move for a given position. Returns
-/// MOVE_NONE if no book move is found.
-
-Move Book::get_move(const Position& pos) {
-
- if (!is_open() || bookSize == 0)
- return MOVE_NONE;
-
- int bookMove = 0, scoresSum = 0;
- uint64_t key = book_key(pos);
- BookEntry entry;
-
- // Choose a book move among the possible moves for the given position
- for (int idx = find_key(key); idx < bookSize; idx++)
- {
- read_entry(entry, idx);
- if (entry.key != key)
- break;
-
- int score = entry.count;
-
- assert(score > 0);
-
- // Choose book move according to its score. If a move has a very
- // high score it has more probability to be choosen then a one with
- // lower score. Note that first entry is always chosen.
- scoresSum += score;
- if (int(genrand_int32() % scoresSum) < score)
- bookMove = entry.move;
- }
- if (!bookMove)
- return MOVE_NONE;
-
- MoveStack moves[256];
- int n = generate_legal_moves(pos, moves);
- for (int j = 0; j < n; j++)
- if ((int(moves[j].move) & 07777) == bookMove)
- return moves[j].move;
-
- return MOVE_NONE;
+template<> PolyglotBook& PolyglotBook::operator>>(Entry& e) {
+ return *this >> e.key >> e.move >> e.count >> e.learn;