using Eval::evaluate;
using namespace Search;
-// For some reason argument-dependent lookup (ADL) doesn't work for Android's
-// STLPort, so explicitly qualify following functions.
-using std::count;
-using std::find;
-
namespace {
// Set to true to force running with one thread. Used for debugging
Move do_skill_level();
string uci_pv(const Position& pos, int depth, Value alpha, Value beta);
- // MovePickerExt class template extends MovePicker and allows to choose at
- // compile time the proper moves source according to the type of node. In the
- // default case we simply create and use a standard MovePicker object.
- template<bool SpNode> struct MovePickerExt : public MovePicker {
-
- MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, Stack* ss, Value b)
- : MovePicker(p, ttm, d, h, ss, b) {}
- };
-
- // In case of a SpNode we use split point's shared MovePicker object as moves source
- template<> struct MovePickerExt<true> : public MovePicker {
-
- MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, Stack* ss, Value b)
- : MovePicker(p, ttm, d, h, ss, b), mp(ss->sp->mp) {}
-
- Move next_move() { return mp->next_move(); }
- MovePicker* mp;
- };
-
// is_dangerous() checks whether a move belongs to some classes of known
// 'dangerous' moves so that we avoid to prune it.
FORCE_INLINE bool is_dangerous(const Position& pos, Move m, bool captureOrPromotion) {
{
Move bookMove = book.probe(pos, Options["Book File"], Options["Best Book Move"]);
- if (bookMove && count(RootMoves.begin(), RootMoves.end(), bookMove))
+ if (bookMove && std::count(RootMoves.begin(), RootMoves.end(), bookMove))
{
- std::swap(RootMoves[0], *find(RootMoves.begin(), RootMoves.end(), bookMove));
+ std::swap(RootMoves[0], *std::find(RootMoves.begin(), RootMoves.end(), bookMove));
goto finalize;
}
}
if (skillBest == MOVE_NONE) // Still unassigned ?
skillBest = do_skill_level();
- std::swap(RootMoves[0], *find(RootMoves.begin(), RootMoves.end(), skillBest));
+ std::swap(RootMoves[0], *std::find(RootMoves.begin(), RootMoves.end(), skillBest));
}
}
MovePicker mp(pos, ttMove, H, pos.captured_piece_type());
CheckInfo ci(pos);
- while ((move = mp.next_move()) != MOVE_NONE)
+ while ((move = mp.next_move<false>()) != MOVE_NONE)
if (pos.pl_move_is_legal(move, ci.pinned))
{
ss->currentMove = move;
split_point_start: // At split points actual search starts from here
- MovePickerExt<SpNode> mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
+ MovePicker mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
CheckInfo ci(pos);
futilityBase = ss->eval + ss->evalMargin;
singularExtensionNode = !RootNode
// Step 11. Loop through moves
// Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
while ( bestValue < beta
- && (move = mp.next_move()) != MOVE_NONE
+ && (move = mp.next_move<SpNode>()) != MOVE_NONE
&& !thisThread->cutoff_occurred()
&& !Signals.stop)
{
// At root obey the "searchmoves" option and skip moves not listed in Root
// Move List, as a consequence any illegal move is also skipped. In MultiPV
// mode we also skip PV moves which have been already searched.
- if (RootNode && !count(RootMoves.begin() + PVIdx, RootMoves.end(), move))
+ if (RootNode && !std::count(RootMoves.begin() + PVIdx, RootMoves.end(), move))
continue;
// At PV and SpNode nodes we want all moves to be legal since the beginning
// be trusted, and we don't update the best move and/or PV.
if (RootNode && !Signals.stop)
{
- RootMove& rm = *find(RootMoves.begin(), RootMoves.end(), move);
+ RootMove& rm = *std::find(RootMoves.begin(), RootMoves.end(), move);
// PV move or new best move ?
if (isPvMove || value > alpha)
// Loop through the moves until no moves remain or a beta cutoff occurs
while ( bestValue < beta
- && (move = mp.next_move()) != MOVE_NONE)
+ && (move = mp.next_move<false>()) != MOVE_NONE)
{
assert(is_ok(move));