From 1355b43fd242f20d04b1250c02de355c8e80ac98 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 29 May 2019 18:42:22 -0400 Subject: [PATCH 1/4] ControllerInterface/Device: Use std::string_view where applicable In these cases, the given string is only ever compared against other string, so std::string can be turned into a std::string_view to allow non-allocating inputs. --- .../InputCommon/ControllerInterface/Device.cpp | 12 ++++++------ .../Core/InputCommon/ControllerInterface/Device.h | 15 ++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp index 38b11a932b35..9e29389dae72 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp @@ -52,7 +52,7 @@ std::string Device::GetQualifiedName() const return StringFromFormat("%s/%i/%s", this->GetSource().c_str(), GetId(), this->GetName().c_str()); } -Device::Input* Device::FindInput(const std::string& name) const +Device::Input* Device::FindInput(std::string_view name) const { for (Input* input : m_inputs) { @@ -63,7 +63,7 @@ Device::Input* Device::FindInput(const std::string& name) const return nullptr; } -Device::Output* Device::FindOutput(const std::string& name) const +Device::Output* Device::FindOutput(std::string_view name) const { for (Output* output : m_outputs) { @@ -74,7 +74,7 @@ Device::Output* Device::FindOutput(const std::string& name) const return nullptr; } -bool Device::Control::IsMatchingName(const std::string& name) const +bool Device::Control::IsMatchingName(std::string_view name) const { return GetName() == name; } @@ -90,7 +90,7 @@ std::string Device::FullAnalogSurface::GetName() const return "Full " + m_high.GetName(); } -bool Device::FullAnalogSurface::IsMatchingName(const std::string& name) const +bool Device::FullAnalogSurface::IsMatchingName(std::string_view name) const { if (Control::IsMatchingName(name)) return true; @@ -218,7 +218,7 @@ std::string DeviceContainer::GetDefaultDeviceString() const return device_qualifier.ToString(); } -Device::Input* DeviceContainer::FindInput(const std::string& name, const Device* def_dev) const +Device::Input* DeviceContainer::FindInput(std::string_view name, const Device* def_dev) const { if (def_dev) { @@ -239,7 +239,7 @@ Device::Input* DeviceContainer::FindInput(const std::string& name, const Device* return nullptr; } -Device::Output* DeviceContainer::FindOutput(const std::string& name, const Device* def_dev) const +Device::Output* DeviceContainer::FindOutput(std::string_view name, const Device* def_dev) const { return def_dev->FindOutput(name); } diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h index ac18c18803cc..828139651545 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.h +++ b/Source/Core/InputCommon/ControllerInterface/Device.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "Common/CommonTypes.h" @@ -42,14 +43,14 @@ class Device class Control // input or output { public: + virtual ~Control() = default; virtual std::string GetName() const = 0; - virtual ~Control() {} virtual Input* ToInput() { return nullptr; } virtual Output* ToOutput() { return nullptr; } // May be overridden to allow multiple valid names. // Useful for backwards-compatible configurations when names change. - virtual bool IsMatchingName(const std::string& name) const; + virtual bool IsMatchingName(std::string_view name) const; }; // @@ -111,8 +112,8 @@ class Device const std::vector& Inputs() const { return m_inputs; } const std::vector& Outputs() const { return m_outputs; } - Input* FindInput(const std::string& name) const; - Output* FindOutput(const std::string& name) const; + Input* FindInput(std::string_view name) const; + Output* FindOutput(std::string_view name) const; protected: void AddInput(Input* const i); @@ -124,7 +125,7 @@ class Device FullAnalogSurface(Input* low, Input* high) : m_low(*low), m_high(*high) {} ControlState GetState() const override; std::string GetName() const override; - bool IsMatchingName(const std::string& name) const override; + bool IsMatchingName(std::string_view name) const override; private: Input& m_low; @@ -177,8 +178,8 @@ class DeviceQualifier class DeviceContainer { public: - Device::Input* FindInput(const std::string& name, const Device* def_dev) const; - Device::Output* FindOutput(const std::string& name, const Device* def_dev) const; + Device::Input* FindInput(std::string_view name, const Device* def_dev) const; + Device::Output* FindOutput(std::string_view name, const Device* def_dev) const; std::vector GetAllDeviceStrings() const; std::string GetDefaultDeviceString() const; From 246e2a77ceb7fb5ebf05286af07f598b3db40c2b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 29 May 2019 18:46:44 -0400 Subject: [PATCH 2/4] ControllerInterface/Device: std::move strings in constructor where applicable Allows callers to move std::string values into the constructor, potentially avoiding copies. --- Source/Core/InputCommon/ControllerInterface/Device.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h index 828139651545..b5a869562977 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.h +++ b/Source/Core/InputCommon/ControllerInterface/Device.h @@ -156,8 +156,8 @@ class DeviceQualifier { public: DeviceQualifier() : cid(-1) {} - DeviceQualifier(const std::string& _source, const int _id, const std::string& _name) - : source(_source), cid(_id), name(_name) + DeviceQualifier(std::string source_, const int id_, std::string name_) + : source(std::move(source_)), cid(id_), name(std::move(name_)) { } void FromDevice(const Device* const dev); From 27346fee8a5466503f32493510da98846f2efb01 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 29 May 2019 19:10:50 -0400 Subject: [PATCH 3/4] ControllerInterface/Device: Take vector by const reference in DetectInput() The vector is only ever queryied and it's contents aren't modified, so there's no reason to take the vector by value. We can take a constant reference to it to avoid unnecessary allocating. --- Source/Core/InputCommon/ControllerInterface/Device.cpp | 4 ++-- Source/Core/InputCommon/ControllerInterface/Device.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp index 9e29389dae72..9fbeae22cf60 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp @@ -256,7 +256,7 @@ bool DeviceContainer::HasConnectedDevice(const DeviceQualifier& qualifier) const // and also properly handles detection when using "FullAnalogSurface" inputs. // Upon input, return the detected Device and Input, else return nullptrs std::pair, Device::Input*> -DeviceContainer::DetectInput(u32 wait_ms, std::vector device_strings) +DeviceContainer::DetectInput(u32 wait_ms, const std::vector& device_strings) { struct InputState { @@ -273,7 +273,7 @@ DeviceContainer::DetectInput(u32 wait_ms, std::vector device_string // Acquire devices and initial input states. std::vector device_states; - for (auto& device_string : device_strings) + for (const auto& device_string : device_strings) { DeviceQualifier dq; dq.FromString(device_string); diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h index b5a869562977..fd947ee65421 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.h +++ b/Source/Core/InputCommon/ControllerInterface/Device.h @@ -188,7 +188,7 @@ class DeviceContainer bool HasConnectedDevice(const DeviceQualifier& qualifier) const; std::pair, Device::Input*> - DetectInput(u32 wait_ms, std::vector device_strings); + DetectInput(u32 wait_ms, const std::vector& device_strings); protected: mutable std::mutex m_devices_mutex; From 02634350500bd4e7b85425cae7bb43a050b5aee4 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 29 May 2019 19:23:51 -0400 Subject: [PATCH 4/4] ControllerInterface/Device: Make DetectInput() a const member function This doesn't actually modify object instance state, so it can be made const. --- Source/Core/InputCommon/ControllerInterface/Device.cpp | 2 +- Source/Core/InputCommon/ControllerInterface/Device.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp index 9fbeae22cf60..954d933ad8e4 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp @@ -256,7 +256,7 @@ bool DeviceContainer::HasConnectedDevice(const DeviceQualifier& qualifier) const // and also properly handles detection when using "FullAnalogSurface" inputs. // Upon input, return the detected Device and Input, else return nullptrs std::pair, Device::Input*> -DeviceContainer::DetectInput(u32 wait_ms, const std::vector& device_strings) +DeviceContainer::DetectInput(u32 wait_ms, const std::vector& device_strings) const { struct InputState { diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h index fd947ee65421..a2cf0a329af2 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.h +++ b/Source/Core/InputCommon/ControllerInterface/Device.h @@ -188,7 +188,7 @@ class DeviceContainer bool HasConnectedDevice(const DeviceQualifier& qualifier) const; std::pair, Device::Input*> - DetectInput(u32 wait_ms, const std::vector& device_strings); + DetectInput(u32 wait_ms, const std::vector& device_strings) const; protected: mutable std::mutex m_devices_mutex;