From 8eecd1d0fd16a6e051765475f667c201033a26bf Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 1 Feb 2022 11:56:43 -0500 Subject: [PATCH] common/param_package: Allow heterogenous lookup Allows the functions that only query or retrieve from the underlying map to be able to handle keys in various string formats. This means we can make these bits of the API non-allocating by default. --- src/common/param_package.cpp | 16 ++++++++-------- src/common/param_package.h | 21 ++++++++++++++++----- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index bbf20f5ebc..b0664df48b 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -73,8 +73,8 @@ std::string ParamPackage::Serialize() const { return result; } -std::string ParamPackage::Get(const std::string& key, const std::string& default_value) const { - auto pair = data.find(key); +std::string ParamPackage::Get(std::string_view key, const std::string& default_value) const { + const auto pair = data.find(key); if (pair == data.end()) { LOG_DEBUG(Common, "key '{}' not found", key); return default_value; @@ -83,8 +83,8 @@ std::string ParamPackage::Get(const std::string& key, const std::string& default return pair->second; } -int ParamPackage::Get(const std::string& key, int default_value) const { - auto pair = data.find(key); +int ParamPackage::Get(std::string_view key, int default_value) const { + const auto pair = data.find(key); if (pair == data.end()) { LOG_DEBUG(Common, "key '{}' not found", key); return default_value; @@ -98,8 +98,8 @@ int ParamPackage::Get(const std::string& key, int default_value) const { } } -float ParamPackage::Get(const std::string& key, float default_value) const { - auto pair = data.find(key); +float ParamPackage::Get(std::string_view key, float default_value) const { + const auto pair = data.find(key); if (pair == data.end()) { LOG_DEBUG(Common, "key {} not found", key); return default_value; @@ -125,8 +125,8 @@ void ParamPackage::Set(const std::string& key, float value) { data.insert_or_assign(key, std::to_string(value)); } -bool ParamPackage::Has(const std::string& key) const { - return data.find(key) != data.end(); +bool ParamPackage::Has(std::string_view key) const { + return data.contains(key); } void ParamPackage::Erase(const std::string& key) { diff --git a/src/common/param_package.h b/src/common/param_package.h index c13e454790..e6ac9b109e 100644 --- a/src/common/param_package.h +++ b/src/common/param_package.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include @@ -13,7 +14,17 @@ namespace Common { /// A string-based key-value container supporting serializing to and deserializing from a string class ParamPackage { public: - using DataType = std::unordered_map; + struct DataHash final { + using is_transparent = void; + + [[nodiscard]] size_t operator()(std::string_view view) const noexcept { + return std::hash{}(view); + } + [[nodiscard]] size_t operator()(const std::string& str) const noexcept { + return std::hash{}(str); + } + }; + using DataType = std::unordered_map>; ParamPackage() = default; explicit ParamPackage(const std::string& serialized); @@ -25,13 +36,13 @@ public: ParamPackage& operator=(ParamPackage&& other) = default; [[nodiscard]] std::string Serialize() const; - [[nodiscard]] std::string Get(const std::string& key, const std::string& default_value) const; - [[nodiscard]] int Get(const std::string& key, int default_value) const; - [[nodiscard]] float Get(const std::string& key, float default_value) const; + [[nodiscard]] std::string Get(std::string_view key, const std::string& default_value) const; + [[nodiscard]] int Get(std::string_view key, int default_value) const; + [[nodiscard]] float Get(std::string_view key, float default_value) const; void Set(const std::string& key, std::string value); void Set(const std::string& key, int value); void Set(const std::string& key, float value); - [[nodiscard]] bool Has(const std::string& key) const; + [[nodiscard]] bool Has(std::string_view key) const; void Erase(const std::string& key); void Clear();