summaryrefslogtreecommitdiff
path: root/src/input_common/input_engine.cpp
diff options
context:
space:
mode:
authorGravatar Lioncash2021-12-13 09:50:48 -0500
committerGravatar Lioncash2021-12-13 09:57:51 -0500
commit4d4a23447688030402dc1499db8a827065154136 (patch)
tree992c2f49a830b961016bcf54b0c925b19e220703 /src/input_common/input_engine.cpp
parentinput_engine: Remove left-over namespace qualifiers (diff)
downloadyuzu-4d4a23447688030402dc1499db8a827065154136.tar.gz
yuzu-4d4a23447688030402dc1499db8a827065154136.tar.xz
yuzu-4d4a23447688030402dc1499db8a827065154136.zip
input_engine: Avoid redundant map lookups
We can use iterators to avoid looking up into maps twice in the getter functions. At the same time we can also avoid copying the ControllerData structs, since they're 264 bytes in size.
Diffstat (limited to 'src/input_common/input_engine.cpp')
-rw-r--r--src/input_common/input_engine.cpp40
1 files changed, 24 insertions, 16 deletions
diff --git a/src/input_common/input_engine.cpp b/src/input_common/input_engine.cpp
index fce914348..a4a07d4ac 100644
--- a/src/input_common/input_engine.cpp
+++ b/src/input_common/input_engine.cpp
@@ -104,68 +104,76 @@ void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const B
104 104
105bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { 105bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const {
106 std::lock_guard lock{mutex}; 106 std::lock_guard lock{mutex};
107 if (!controller_list.contains(identifier)) { 107 const auto controller_iter = controller_list.find(identifier);
108 if (controller_iter == controller_list.cend()) {
108 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), 109 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
109 identifier.pad, identifier.port); 110 identifier.pad, identifier.port);
110 return false; 111 return false;
111 } 112 }
112 ControllerData controller = controller_list.at(identifier); 113 const ControllerData& controller = controller_iter->second;
113 if (!controller.buttons.contains(button)) { 114 const auto button_iter = controller.buttons.find(button);
115 if (button_iter == controller.buttons.cend()) {
114 LOG_ERROR(Input, "Invalid button {}", button); 116 LOG_ERROR(Input, "Invalid button {}", button);
115 return false; 117 return false;
116 } 118 }
117 return controller.buttons.at(button); 119 return button_iter->second;
118} 120}
119 121
120bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const { 122bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const {
121 std::lock_guard lock{mutex}; 123 std::lock_guard lock{mutex};
122 if (!controller_list.contains(identifier)) { 124 const auto controller_iter = controller_list.find(identifier);
125 if (controller_iter == controller_list.cend()) {
123 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), 126 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
124 identifier.pad, identifier.port); 127 identifier.pad, identifier.port);
125 return false; 128 return false;
126 } 129 }
127 ControllerData controller = controller_list.at(identifier); 130 const ControllerData& controller = controller_iter->second;
128 if (!controller.hat_buttons.contains(button)) { 131 const auto hat_iter = controller.hat_buttons.find(button);
132 if (hat_iter == controller.hat_buttons.cend()) {
129 LOG_ERROR(Input, "Invalid hat button {}", button); 133 LOG_ERROR(Input, "Invalid hat button {}", button);
130 return false; 134 return false;
131 } 135 }
132 return (controller.hat_buttons.at(button) & direction) != 0; 136 return (hat_iter->second & direction) != 0;
133} 137}
134 138
135f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { 139f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const {
136 std::lock_guard lock{mutex}; 140 std::lock_guard lock{mutex};
137 if (!controller_list.contains(identifier)) { 141 const auto controller_iter = controller_list.find(identifier);
142 if (controller_iter == controller_list.cend()) {
138 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), 143 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
139 identifier.pad, identifier.port); 144 identifier.pad, identifier.port);
140 return 0.0f; 145 return 0.0f;
141 } 146 }
142 ControllerData controller = controller_list.at(identifier); 147 const ControllerData& controller = controller_iter->second;
143 if (!controller.axes.contains(axis)) { 148 const auto axis_iter = controller.axes.find(axis);
149 if (axis_iter == controller.axes.cend()) {
144 LOG_ERROR(Input, "Invalid axis {}", axis); 150 LOG_ERROR(Input, "Invalid axis {}", axis);
145 return 0.0f; 151 return 0.0f;
146 } 152 }
147 return controller.axes.at(axis); 153 return axis_iter->second;
148} 154}
149 155
150BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const { 156BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const {
151 std::lock_guard lock{mutex}; 157 std::lock_guard lock{mutex};
152 if (!controller_list.contains(identifier)) { 158 const auto controller_iter = controller_list.find(identifier);
159 if (controller_iter == controller_list.cend()) {
153 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), 160 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
154 identifier.pad, identifier.port); 161 identifier.pad, identifier.port);
155 return BatteryLevel::Charging; 162 return BatteryLevel::Charging;
156 } 163 }
157 ControllerData controller = controller_list.at(identifier); 164 const ControllerData& controller = controller_iter->second;
158 return controller.battery; 165 return controller.battery;
159} 166}
160 167
161BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { 168BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const {
162 std::lock_guard lock{mutex}; 169 std::lock_guard lock{mutex};
163 if (!controller_list.contains(identifier)) { 170 const auto controller_iter = controller_list.find(identifier);
171 if (controller_iter == controller_list.cend()) {
164 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), 172 LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
165 identifier.pad, identifier.port); 173 identifier.pad, identifier.port);
166 return {}; 174 return {};
167 } 175 }
168 ControllerData controller = controller_list.at(identifier); 176 const ControllerData& controller = controller_iter->second;
169 return controller.motions.at(motion); 177 return controller.motions.at(motion);
170} 178}
171 179