/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
- Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file)
+ Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#ifndef TUNE_H_INCLUDED
#define TUNE_H_INCLUDED
+#include <cstddef>
#include <memory>
#include <string>
-#include <type_traits>
+#include <type_traits> // IWYU pragma: keep
+#include <utility>
#include <vector>
namespace Stockfish {
+enum Value : int;
-typedef std::pair<int, int> Range; // Option's min-max values
-typedef Range (RangeFun) (int);
+using Range = std::pair<int, int>; // Option's min-max values
+using RangeFun = Range (int);
// Default Range function, to calculate Option's min-max values
inline Range default_range(int v) {
/// qualifiers from the variables you want to tune and flag them for tuning, so
/// if you have:
///
-/// const Score myScore = S(10, 15);
/// const Value myValue[][2] = { { V(100), V(20) }, { V(7), V(78) } };
///
/// If you have a my_post_update() function to run after values have been updated,
/// and a my_range() function to set custom Option's min-max values, then you just
/// remove the 'const' qualifiers and write somewhere below in the file:
///
-/// TUNE(SetRange(my_range), myScore, myValue, my_post_update);
+/// TUNE(SetRange(my_range), myValue, my_post_update);
///
/// You can also set the range directly, and restore the default at the end
///
-/// TUNE(SetRange(-100, 100), myScore, SetDefaultRange);
+/// TUNE(SetRange(-100, 100), myValue, SetDefaultRange);
///
/// In case update function is slow and you have many parameters, you can add:
///
class Tune {
- typedef void (PostUpdate) (); // Post-update function
+ using PostUpdate = void (); // Post-update function
Tune() { read_results(); }
Tune(const Tune&) = delete;
template<typename T>
struct Entry : public EntryBase {
- static_assert(!std::is_const<T>::value, "Parameter cannot be const!");
+ static_assert(!std::is_const_v<T>, "Parameter cannot be const!");
- static_assert( std::is_same<T, int>::value
- || std::is_same<T, Value>::value
- || std::is_same<T, Score>::value
- || std::is_same<T, PostUpdate>::value, "Parameter type not supported!");
+ static_assert( std::is_same_v<T, int>
+ || std::is_same_v<T, Value>
+ || std::is_same_v<T, PostUpdate>, "Parameter type not supported!");
Entry(const std::string& n, T& v, const SetRange& r) : name(n), value(v), range(r) {}
void operator=(const Entry&) = delete; // Because 'value' is a reference