Skip to content

Commit f2f7df1

Browse files
committed
remove union from ControlSettings
1 parent e93562f commit f2f7df1

File tree

5 files changed

+64
-63
lines changed

5 files changed

+64
-63
lines changed

include/gf2/core/ControlSettings.h

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include <cstdint>
77

8+
#include <variant>
9+
810
#include "CoreApi.h"
911
#include "GamepadTypes.h"
1012
#include "Keycode.h"
@@ -71,76 +73,94 @@ namespace gf {
7173
}
7274

7375
enum class ControlType : uint8_t {
76+
None,
7477
Keycode,
7578
Scancode,
7679
MouseButton,
7780
GamepadButton,
7881
GamepadAxis,
7982
};
8083

81-
struct GF_CORE_API ControlSettings {
84+
class GF_CORE_API ControlSettings {
85+
public:
8286
ControlSettings() = default;
8387

8488
constexpr ControlSettings(Keycode keycode, Flags<Modifier> modifiers = None)
85-
: type(ControlType::Keycode)
86-
, keycode({ keycode, modifiers })
89+
: m_data(KeycodeControlSettings{ keycode, modifiers })
8790
{
8891
}
8992

9093
constexpr ControlSettings(Scancode scancode, Flags<Modifier> modifiers = None)
91-
: type(ControlType::Scancode)
92-
, scancode({ scancode, modifiers })
94+
: m_data(ScancodeControlSettings{ scancode, modifiers })
9395
{
9496
}
9597

9698
constexpr ControlSettings(MouseButton button)
97-
: type(ControlType::MouseButton)
98-
, mouse_button({ button })
99+
: m_data(MouseButtonControlSettings{ button })
99100
{
100101
}
101102

102103
constexpr ControlSettings(GamepadId gamepad_id, GamepadButton button)
103-
: type(ControlType::GamepadButton)
104-
, gamepad_button({ gamepad_id, button })
104+
: m_data(GamepadButtonControlSettings{ gamepad_id, button })
105105
{
106106
}
107107

108108
constexpr ControlSettings(GamepadId gamepad_id, GamepadAxis axis, GamepadAxisDirection direction)
109-
: type(ControlType::GamepadAxis)
110-
, gamepad_axis({ gamepad_id, axis, direction })
109+
: m_data(GamepadAxisControlSettings{ gamepad_id, axis, direction })
110+
{
111+
}
112+
113+
constexpr ControlType type() const
111114
{
115+
return static_cast<ControlType>(m_data.index());
112116
}
113117

114-
ControlType type;
115-
union {
116-
KeycodeControlSettings keycode;
117-
ScancodeControlSettings scancode;
118-
MouseButtonControlSettings mouse_button;
119-
GamepadButtonControlSettings gamepad_button;
120-
GamepadAxisControlSettings gamepad_axis;
121-
};
118+
template<typename T>
119+
constexpr T& as()
120+
{
121+
return std::get<T>(m_data);
122+
}
123+
124+
template<typename T>
125+
constexpr const T& as() const
126+
{
127+
return std::get<T>(m_data);
128+
}
129+
130+
private:
131+
std::variant<
132+
std::monostate,
133+
KeycodeControlSettings,
134+
ScancodeControlSettings,
135+
MouseButtonControlSettings,
136+
GamepadButtonControlSettings,
137+
GamepadAxisControlSettings
138+
> m_data;
122139
};
123140

124141
template<typename Archive>
125142
inline Archive& operator|(Archive& ar, MaybeConst<ControlSettings, Archive>& settings)
126143
{
127-
ar | settings.type;
144+
ControlType type = settings.type();
145+
ar | type;
128146

129-
switch (settings.type) {
147+
switch (type) {
148+
case ControlType::None:
149+
break;
130150
case ControlType::Keycode:
131-
ar | settings.keycode;
151+
ar | settings.template as<KeycodeControlSettings>();
132152
break;
133153
case ControlType::Scancode:
134-
ar | settings.scancode;
154+
ar | settings.template as<ScancodeControlSettings>();
135155
break;
136156
case ControlType::MouseButton:
137-
ar | settings.mouse_button;
157+
ar | settings.template as<MouseButtonControlSettings>();
138158
break;
139159
case ControlType::GamepadButton:
140-
ar | settings.gamepad_button;
160+
ar | settings.template as<GamepadButtonControlSettings>();
141161
break;
142162
case ControlType::GamepadAxis:
143-
ar | settings.gamepad_axis;
163+
ar | settings.template as<GamepadAxisControlSettings>();
144164
break;
145165
}
146166

include/gf2/graphics/Action.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace gf {
3030
void add_gamepad_axis_control(GamepadId gamepad_id, GamepadAxis axis, GamepadAxisDirection direction);
3131

3232
void add_control(const Control& control);
33-
void add_control(const ControlSettings& settings);
33+
void add_control_settings(const ControlSettings& settings);
3434

3535
const Control* begin() const
3636
{

include/gf2/graphics/Control.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace gf {
3232
void process_gamepad_button_control(const Event& event, const GamepadButtonControlSettings& settings);
3333
void process_gamepad_axis_control(const Event& event, const GamepadAxisControlSettings& settings);
3434

35-
ControlSettings m_settings = {};
35+
ControlSettings m_settings;
3636
bool m_active = false;
3737
bool m_repeated = false;
3838
};

library/graphics/Action.cc

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ namespace gf {
1616
Action::Action(const ActionSettings& settings)
1717
: m_type(settings.type)
1818
{
19-
for (const auto& control : settings.controls) {
20-
add_control(control);
19+
for (const auto& control_settings : settings.controls) {
20+
add_control_settings(control_settings);
2121
}
2222
}
2323

@@ -43,50 +43,30 @@ namespace gf {
4343

4444
void Action::add_keycode_control(Keycode keycode, Flags<Modifier> modifiers)
4545
{
46-
ControlSettings settings = {};
47-
settings.type = ControlType::Keycode;
48-
settings.keycode.keycode = keycode;
49-
settings.keycode.modifiers = modifiers;
50-
add_control(settings);
46+
add_control_settings({ keycode, modifiers });
5147
}
5248

5349
void Action::add_scancode_control(Scancode scancode, Flags<Modifier> modifiers)
5450
{
55-
ControlSettings settings = {};
56-
settings.type = ControlType::Scancode;
57-
settings.scancode.scancode = scancode;
58-
settings.scancode.modifiers = modifiers;
59-
add_control(settings);
51+
add_control_settings({ scancode, modifiers });
6052
}
6153

6254
void Action::add_mouse_button_control(MouseButton button)
6355
{
64-
ControlSettings settings = {};
65-
settings.type = ControlType::MouseButton;
66-
settings.mouse_button.button = button;
67-
add_control(settings);
56+
add_control_settings({ button });
6857
}
6958

7059
void Action::add_gamepad_button_control(GamepadId gamepad_id, GamepadButton button)
7160
{
72-
ControlSettings settings = {};
73-
settings.type = ControlType::GamepadButton;
74-
settings.gamepad_button.gamepad_id = gamepad_id;
75-
settings.gamepad_button.button = button;
76-
add_control(settings);
61+
add_control_settings({ gamepad_id, button });
7762
}
7863

7964
void Action::add_gamepad_axis_control(GamepadId gamepad_id, GamepadAxis axis, GamepadAxisDirection direction)
8065
{
81-
ControlSettings settings = {};
82-
settings.type = ControlType::GamepadAxis;
83-
settings.gamepad_axis.gamepad_id = gamepad_id;
84-
settings.gamepad_axis.axis = axis;
85-
settings.gamepad_axis.direction = direction;
86-
add_control(settings);
66+
add_control_settings({ gamepad_id, axis, direction });
8767
}
8868

89-
void Action::add_control(const ControlSettings& settings)
69+
void Action::add_control_settings(const ControlSettings& settings)
9070
{
9171
add_control(Control(settings));
9272
}

library/graphics/Control.cc

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,28 +38,29 @@ namespace gf {
3838

3939
void Control::process_event(const Event& event)
4040
{
41-
switch (m_settings.type) {
41+
switch (m_settings.type()) {
42+
case gf::ControlType::None:
43+
break;
4244
case gf::ControlType::Keycode:
43-
process_keycode_control(event, m_settings.keycode);
45+
process_keycode_control(event, m_settings.as<KeycodeControlSettings>());
4446
break;
4547
case gf::ControlType::Scancode:
46-
process_scancode_control(event, m_settings.scancode);
48+
process_scancode_control(event, m_settings.as<ScancodeControlSettings>());
4749
break;
4850
case gf::ControlType::MouseButton:
49-
process_mouse_button_control(event, m_settings.mouse_button);
51+
process_mouse_button_control(event, m_settings.as<MouseButtonControlSettings>());
5052
break;
5153
case gf::ControlType::GamepadButton:
52-
process_gamepad_button_control(event, m_settings.gamepad_button);
54+
process_gamepad_button_control(event, m_settings.as<GamepadButtonControlSettings>());
5355
break;
5456
case gf::ControlType::GamepadAxis:
55-
process_gamepad_axis_control(event, m_settings.gamepad_axis);
57+
process_gamepad_axis_control(event, m_settings.as<GamepadAxisControlSettings>());
5658
break;
5759
}
5860
}
5961

6062
void Control::process_keycode_control(const Event& event, const KeycodeControlSettings& settings)
6163
{
62-
6364
if (event.type() == EventType::KeyPressed) {
6465
const auto& key_pressed_event = event.from<EventType::KeyPressed>();
6566
auto event_modifiers = key_pressed_event.modifiers & ~SpecialModifiers;

0 commit comments

Comments
 (0)