]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Revert "Replace MyEventReceiver KeyList with std::unordered_set" (#10622)
authorSmallJoker <SmallJoker@users.noreply.github.com>
Thu, 12 Nov 2020 18:16:02 +0000 (19:16 +0100)
committerGitHub <noreply@github.com>
Thu, 12 Nov 2020 18:16:02 +0000 (19:16 +0100)
This reverts commit 787561b29afdbc78769f68c2f5c4f2cff1b32340.

src/client/inputhandler.cpp
src/client/inputhandler.h
src/client/keycode.h

index ee3e37ae911da0666ebed00bb6ec03af780603ea..608a405a8a9baae21fc378a03ace302b557f757b 100644 (file)
@@ -112,7 +112,7 @@ bool MyEventReceiver::OnEvent(const SEvent &event)
        // Remember whether each key is down or up
        if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
                const KeyPress &keyCode = event.KeyInput;
-               if (keysListenedFor.count(keyCode)) {
+               if (keysListenedFor[keyCode]) {
                                // If the key is being held down then the OS may
                                // send a continuous stream of keydown events.
                                // In this case, we don't want to let this
@@ -120,15 +120,15 @@ bool MyEventReceiver::OnEvent(const SEvent &event)
                                // certain actions to repeat constantly.
                        if (event.KeyInput.PressedDown) {
                                if (!IsKeyDown(keyCode)) {
-                                       keyWasDown.insert(keyCode);
-                                       keyWasPressed.insert(keyCode);
+                                       keyWasDown.set(keyCode);
+                                       keyWasPressed.set(keyCode);
                                }
-                               keyIsDown.insert(keyCode);
+                               keyIsDown.set(keyCode);
                        } else {
                                if (IsKeyDown(keyCode))
-                                       keyWasReleased.insert(keyCode);
+                                       keyWasReleased.set(keyCode);
 
-                               keyIsDown.erase(keyCode);
+                               keyIsDown.unset(keyCode);
                        }
 
                        return true;
@@ -153,36 +153,36 @@ bool MyEventReceiver::OnEvent(const SEvent &event)
                switch (event.MouseInput.Event) {
                case EMIE_LMOUSE_PRESSED_DOWN:
                        key = "KEY_LBUTTON";
-                       keyIsDown.insert(key);
-                       keyWasDown.insert(key);
-                       keyWasPressed.insert(key);
+                       keyIsDown.set(key);
+                       keyWasDown.set(key);
+                       keyWasPressed.set(key);
                        break;
                case EMIE_MMOUSE_PRESSED_DOWN:
                        key = "KEY_MBUTTON";
-                       keyIsDown.insert(key);
-                       keyWasDown.insert(key);
-                       keyWasPressed.insert(key);
+                       keyIsDown.set(key);
+                       keyWasDown.set(key);
+                       keyWasPressed.set(key);
                        break;
                case EMIE_RMOUSE_PRESSED_DOWN:
                        key = "KEY_RBUTTON";
-                       keyIsDown.insert(key);
-                       keyWasDown.insert(key);
-                       keyWasPressed.insert(key);
+                       keyIsDown.set(key);
+                       keyWasDown.set(key);
+                       keyWasPressed.set(key);
                        break;
                case EMIE_LMOUSE_LEFT_UP:
                        key = "KEY_LBUTTON";
-                       keyIsDown.erase(key);
-                       keyWasReleased.insert(key);
+                       keyIsDown.unset(key);
+                       keyWasReleased.set(key);
                        break;
                case EMIE_MMOUSE_LEFT_UP:
                        key = "KEY_MBUTTON";
-                       keyIsDown.erase(key);
-                       keyWasReleased.insert(key);
+                       keyIsDown.unset(key);
+                       keyWasReleased.set(key);
                        break;
                case EMIE_RMOUSE_LEFT_UP:
                        key = "KEY_RBUTTON";
-                       keyIsDown.erase(key);
-                       keyWasReleased.insert(key);
+                       keyIsDown.unset(key);
+                       keyWasReleased.set(key);
                        break;
                case EMIE_MOUSE_WHEEL:
                        mouse_wheel += event.MouseInput.Wheel;
@@ -235,11 +235,7 @@ void RandomInputHandler::step(float dtime)
                i.counter -= dtime;
                if (i.counter < 0.0) {
                        i.counter = 0.1 * Rand(1, i.time_max);
-                       KeyPress k = getKeySetting(i.key.c_str());
-                       if (keydown.count(k))
-                               keydown.erase(k);
-                       else
-                               keydown.insert(k);
+                       keydown.toggle(getKeySetting(i.key.c_str()));
                }
        }
        {
index 885f34e05dfd9f402e7022290488a452c8c3133e..def147a822728bfae7f8d56ac5d00c51ac59ffe1 100644 (file)
@@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "irrlichttypes_extrabloated.h"
 #include "joystick_controller.h"
+#include <list>
 #include "keycode.h"
 #include "renderingengine.h"
-#include <unordered_set>
 
 #ifdef HAVE_TOUCHSCREENGUI
 #include "gui/touchscreengui.h"
@@ -61,32 +61,98 @@ struct KeyCache
        InputHandler *handler;
 };
 
+class KeyList : private std::list<KeyPress>
+{
+       typedef std::list<KeyPress> super;
+       typedef super::iterator iterator;
+       typedef super::const_iterator const_iterator;
+
+       virtual const_iterator find(const KeyPress &key) const
+       {
+               const_iterator f(begin());
+               const_iterator e(end());
+
+               while (f != e) {
+                       if (*f == key)
+                               return f;
+
+                       ++f;
+               }
+
+               return e;
+       }
+
+       virtual iterator find(const KeyPress &key)
+       {
+               iterator f(begin());
+               iterator e(end());
+
+               while (f != e) {
+                       if (*f == key)
+                               return f;
+
+                       ++f;
+               }
+
+               return e;
+       }
+
+public:
+       void clear() { super::clear(); }
+
+       void set(const KeyPress &key)
+       {
+               if (find(key) == end())
+                       push_back(key);
+       }
+
+       void unset(const KeyPress &key)
+       {
+               iterator p(find(key));
+
+               if (p != end())
+                       erase(p);
+       }
+
+       void toggle(const KeyPress &key)
+       {
+               iterator p(this->find(key));
+
+               if (p != end())
+                       erase(p);
+               else
+                       push_back(key);
+       }
+
+       bool operator[](const KeyPress &key) const { return find(key) != end(); }
+};
+
 class MyEventReceiver : public IEventReceiver
 {
 public:
        // This is the one method that we have to implement
        virtual bool OnEvent(const SEvent &event);
 
-       bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown.count(keyCode); }
+       bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; }
 
        // Checks whether a key was down and resets the state
        bool WasKeyDown(const KeyPress &keyCode)
        {
-               bool b = keyWasDown.count(keyCode);
+               bool b = keyWasDown[keyCode];
                if (b)
-                       keyWasDown.erase(keyCode);
+                       keyWasDown.unset(keyCode);
                return b;
        }
 
        // Checks whether a key was just pressed. State will be cleared
        // in the subsequent iteration of Game::processPlayerInteraction
-       bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed.count(keycode); }
+       bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[keycode]; }
 
        // Checks whether a key was just released. State will be cleared
        // in the subsequent iteration of Game::processPlayerInteraction
-       bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased.count(keycode); }
+       bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; }
 
-       void listenForKey(const KeyPress &keyCode) { keysListenedFor.insert(keyCode); }
+       void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); }
        void dontListenForKeys() { keysListenedFor.clear(); }
 
        s32 getMouseWheel()
@@ -132,20 +198,24 @@ class MyEventReceiver : public IEventReceiver
 #endif
 
 private:
-       //! The current state of keys
-       std::unordered_set<KeyPress> keyIsDown;
+       // The current state of keys
+       KeyList keyIsDown;
 
-       //! Whether a key was down
-       std::unordered_set<KeyPress> keyWasDown;
+       // Whether a key was down
+       KeyList keyWasDown;
 
-       //! Whether a key has just been pressed
-       std::unordered_set<KeyPress> keyWasPressed;
+       // Whether a key has just been pressed
+       KeyList keyWasPressed;
 
-       //! Whether a key has just been released
-       std::unordered_set<KeyPress> keyWasReleased;
+       // Whether a key has just been released
+       KeyList keyWasReleased;
 
-       //! List of keys we listen for
-       std::unordered_set<KeyPress> keysListenedFor;
+       // List of keys we listen for
+       // TODO perhaps the type of this is not really
+       // performant as KeyList is designed for few but
+       // often changing keys, and keysListenedFor is expected
+       // to change seldomly but contain lots of keys.
+       KeyList keysListenedFor;
 };
 
 class InputHandler
@@ -277,7 +347,7 @@ class RandomInputHandler : public InputHandler
                return true;
        }
 
-       virtual bool isKeyDown(GameKeyType k) { return keydown.count(keycache.key[k]); }
+       virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; }
        virtual bool wasKeyDown(GameKeyType k) { return false; }
        virtual bool wasKeyPressed(GameKeyType k) { return false; }
        virtual bool wasKeyReleased(GameKeyType k) { return false; }
@@ -292,7 +362,7 @@ class RandomInputHandler : public InputHandler
        s32 Rand(s32 min, s32 max);
 
 private:
-       std::unordered_set<KeyPress> keydown;
+       KeyList keydown;
        v2s32 mousepos;
        v2s32 mousespeed;
 };
index 263b722c72869c82b5f8426a719fe0f5069abd08..7036705d16a486dcf8d0673b386b11c27001c3d8 100644 (file)
@@ -24,20 +24,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <IEventReceiver.h>
 #include <string>
 
-class KeyPress;
-namespace std
-{
-       template <> struct hash<KeyPress>;
-}
-
 /* A key press, consisting of either an Irrlicht keycode
    or an actual char */
 
 class KeyPress
 {
 public:
-       friend struct std::hash<KeyPress>;
-
        KeyPress() = default;
 
        KeyPress(const char *name);
@@ -63,17 +55,6 @@ class KeyPress
        std::string m_name = "";
 };
 
-namespace std
-{
-       template <> struct hash<KeyPress>
-       {
-               size_t operator()(const KeyPress &key) const
-               {
-                       return key.Key;
-               }
-       };
-}
-
 extern const KeyPress EscapeKey;
 extern const KeyPress CancelKey;