void MovePicker::generate_next() { cur = moves; switch (++phase) { case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6: end = generate<CAPTURES>(pos, moves); score_captures(); return; case KILLERS_S1: cur = killers; end = cur + 2; return; case QUIETS_1_S1: endQuiets = end = generate<QUIETS>(pos, moves); score_noncaptures(); end = std::partition(cur, end, has_positive_score); sort<MoveStack>(cur, end); return; case QUIETS_2_S1: cur = end; end = endQuiets; if (depth >= 3 * ONE_PLY) sort<MoveStack>(cur, end); return; case BAD_CAPTURES_S1: // Just pick them in reverse order to get MVV/LVA ordering cur = moves + MAX_MOVES - 1; end = endBadCaptures; return; case EVASIONS_S2: end = generate<EVASIONS>(pos, moves); score_evasions(); return; case QUIET_CHECKS_S3: end = generate<QUIET_CHECKS>(pos, moves); return; case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE: phase = STOP; case STOP: end = cur + 1; // Avoid another next_phase() call return; default: assert(false); } }
void MovePicker::generate_next() { curMove = moves; switch (++phase) { case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6: lastMove = generate<MV_CAPTURE>(pos, moves); score_captures(); return; case KILLERS_S1: curMove = killers; lastMove = curMove + 2; return; case QUIETS_1_S1: lastQuiet = lastMove = generate<MV_QUIET>(pos, moves); score_noncaptures(); lastMove = std::partition(curMove, lastMove, has_positive_score); sort<MoveStack>(curMove, lastMove); return; case QUIETS_2_S1: curMove = lastMove; lastMove = lastQuiet; if (depth >= 3 * ONE_PLY) sort<MoveStack>(curMove, lastMove); return; case BAD_CAPTURES_S1: // Just pick them in reverse order to get MVV/LVA ordering curMove = moves + MAX_MOVES - 1; lastMove = lastBadCapture; return; case EVASIONS_S2: lastMove = generate<MV_EVASION>(pos, moves); score_evasions(); return; case QUIET_CHECKS_S3: lastMove = generate<MV_QUIET_CHECK>(pos, moves); return; case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE: phase = STOP; case STOP: lastMove = curMove + 1; // Avoid another next_phase() call return; default: assert(false); } }
void MovePicker::go_next_phase() { curMove = moves; phase = *(++phasePtr); switch (phase) { case PH_TT_MOVE: lastMove = curMove + 1; return; case PH_GOOD_CAPTURES: case PH_GOOD_PROBCUT: lastMove = generate<MV_CAPTURE>(pos, moves); score_captures(); return; case PH_KILLERS: curMove = killers; lastMove = curMove + 2; return; case PH_NONCAPTURES_1: lastNonCapture = lastMove = generate<MV_NON_CAPTURE>(pos, moves); score_noncaptures(); lastMove = std::partition(curMove, lastMove, has_positive_score); sort<MoveStack>(curMove, lastMove); return; case PH_NONCAPTURES_2: curMove = lastMove; lastMove = lastNonCapture; if (depth >= 3 * ONE_PLY) sort<MoveStack>(curMove, lastMove); return; case PH_BAD_CAPTURES: // Bad captures SEE value is already calculated so just pick // them in order to get SEE move ordering. curMove = badCaptures; lastMove = moves + MAX_MOVES; return; case PH_EVASIONS: assert(pos.in_check()); lastMove = generate<MV_EVASION>(pos, moves); score_evasions(); return; case PH_QCAPTURES: lastMove = generate<MV_CAPTURE>(pos, moves); score_captures(); return; case PH_QRECAPTURES: lastMove = generate<MV_CAPTURE>(pos, moves); return; case PH_QCHECKS: lastMove = generate<MV_NON_CAPTURE_CHECK>(pos, moves); return; case PH_STOP: lastMove = curMove + 1; // Avoid another go_next_phase() call return; default: assert(false); return; } }