blob: d20f2db214452a5c0e528520c570e849d975c510 (
plain)
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
|
#pragma once
#include <memory>
union SDL_Event;
enum ModeSecondClick { Unset, Reset, NoAction };
template<typename Target, ModeSecondClick msc = ModeSecondClick::Unset> class Mode {
public:
explicit Mode(Target & t) : target {t} { }
Target & target;
template<typename Mode, typename... Params>
auto
toggle(Params &&... params)
{
return [params..., this](const SDL_Event &) {
toggleSetMode<Mode>(std::forward<Params>(params)...);
};
}
private:
template<typename Mode, typename... Params>
void
toggleSetMode(Params &&... params)
{
if (dynamic_cast<Mode *>(target.get())) {
if constexpr (msc == ModeSecondClick::Unset) {
target.reset();
}
if constexpr (msc == ModeSecondClick::Reset) {
target = std::make_unique<Mode>(std::forward<Params>(params)...);
}
}
else {
target = std::make_unique<Mode>(std::forward<Params>(params)...);
}
}
};
|