-
Notifications
You must be signed in to change notification settings - Fork 2
/
UCIOption.h
158 lines (135 loc) · 4.32 KB
/
UCIOption.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef LIBCHESS_UCIOPTION_H
#define LIBCHESS_UCIOPTION_H
#include <functional>
#include <optional>
#include <string>
#include <unordered_map>
#include <unordered_set>
namespace libchess {
template <class T>
class UCIOption {
public:
using value_type = T;
UCIOption() = default;
UCIOption(std::string name, value_type value, std::function<void(const T&)> handler)
: name_(std::move(name)), value_(std::move(value)), handler_(std::move(handler)) {
}
[[nodiscard]] std::string name() const noexcept {
return name_;
}
[[nodiscard]] value_type value() const noexcept {
return value_;
};
void handler(std::optional<value_type> value) const noexcept {
return handler_(value);
}
virtual void set_option(const value_type& value) noexcept {
value_ = value;
handler_(value);
};
protected:
std::string name_;
value_type value_{};
std::function<void(const T&)> handler_;
};
template <>
class UCIOption<void> {
public:
using value_type = void;
UCIOption() = default;
UCIOption(std::string name, std::function<void(void)> handler) noexcept
: name_(std::move(name)), handler_(std::move(handler)) {
}
[[nodiscard]] const std::string& name() const noexcept {
return name_;
}
void handler() const noexcept {
handler_();
}
protected:
std::string name_;
std::function<void(void)> handler_;
};
class UCISpinOption : public UCIOption<int> {
public:
UCISpinOption() : min_value_(0), max_value_(0) {
}
UCISpinOption(const std::string& name,
const value_type& value,
const value_type& min_value,
const value_type& max_value,
const std::function<void(const value_type&)>& handler) noexcept
: UCIOption<value_type>(name, value, handler),
min_value_(min_value),
max_value_(max_value) {
}
[[nodiscard]] value_type min_value() const noexcept {
return min_value_;
}
[[nodiscard]] value_type max_value() const noexcept {
return max_value_;
}
void set_option(const value_type& value) noexcept override {
if (value >= min_value() && value <= max_value()) {
value_ = value;
handler_(value);
}
};
private:
value_type min_value_;
value_type max_value_;
};
class UCIComboOption : public UCIOption<std::string> {
public:
UCIComboOption() : UCIOption<std::string>() {
}
UCIComboOption(const std::string& name,
const value_type& value,
std::unordered_set<value_type> allowed_values,
const std::function<void(const value_type&)>& handler) noexcept
: UCIOption<value_type>(name, value, handler), allowed_values_(std::move(allowed_values)) {
}
[[nodiscard]] bool is_allowed(const value_type& value) const noexcept {
return allowed_values_.find(value) != allowed_values_.end();
}
[[nodiscard]] const std::unordered_set<value_type>& allowed_values() const noexcept {
return allowed_values_;
}
void set_option(const value_type& value) noexcept override {
if (is_allowed(value)) {
UCIOption<value_type>::set_option(value);
}
}
private:
std::unordered_set<value_type> allowed_values_;
};
class UCIStringOption : public UCIOption<std::string> {
public:
UCIStringOption() : UCIOption<std::string>() {
}
UCIStringOption(const std::string& name,
const value_type& value,
const std::function<void(const value_type&)>& handler)
: UCIOption<value_type>(name, value, handler) {
}
};
class UCICheckOption : public UCIOption<bool> {
public:
UCICheckOption() : UCIOption<bool>() {
}
UCICheckOption(const std::string& name,
const value_type& value,
const std::function<void(const value_type&)>& handler)
: UCIOption<value_type>(name, value, handler) {
}
};
class UCIButtonOption : public UCIOption<void> {
public:
UCIButtonOption() : UCIOption<void>() {
}
UCIButtonOption(const std::string& name, const std::function<void(void)>& handler) noexcept
: UCIOption<value_type>(name, handler) {
}
};
} // namespace libchess
#endif // LIBCHESS_UCIOPTION_H