diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-12-29 22:04:19 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-12-29 22:04:19 +0000 |
commit | 89e594cd35cc7c86f0aa7178896727f3982793bf (patch) | |
tree | ee2576a56517747a1bd1e9feacc676c0f24fa5d9 /vdslib | |
parent | 05dda3b487493495bb99aa149673e6b92d842aa5 (diff) |
- Avoid inefficient generic template.
- Add explicit implementations for the types needed.
Diffstat (limited to 'vdslib')
-rw-r--r-- | vdslib/src/vespa/vdslib/container/parameters.cpp | 37 | ||||
-rw-r--r-- | vdslib/src/vespa/vdslib/container/parameters.h | 36 | ||||
-rw-r--r-- | vdslib/src/vespa/vdslib/container/parameters.hpp | 8 |
3 files changed, 48 insertions, 33 deletions
diff --git a/vdslib/src/vespa/vdslib/container/parameters.cpp b/vdslib/src/vespa/vdslib/container/parameters.cpp index 298f4f6c0d8..236b4970396 100644 --- a/vdslib/src/vespa/vdslib/container/parameters.cpp +++ b/vdslib/src/vespa/vdslib/container/parameters.cpp @@ -7,6 +7,7 @@ #include <vespa/vespalib/util/xmlstream.h> #include <vespa/vespalib/util/growablebytebuffer.h> #include <ostream> +#include <charconv> using namespace vdslib; @@ -137,13 +138,35 @@ vespalib::string Parameters::toString() const return ret; } -template void vdslib::Parameters::set(vespalib::stringref , int32_t); -template void vdslib::Parameters::set(vespalib::stringref , int64_t); -template void vdslib::Parameters::set(vespalib::stringref , uint64_t); -template void vdslib::Parameters::set(vespalib::stringref , double); -template void vdslib::Parameters::set(vespalib::stringref , const char *); -template void vdslib::Parameters::set(vespalib::stringref , vespalib::string); -template void vdslib::Parameters::set(vespalib::stringref , std::string); +void +Parameters::set(KeyT id, int32_t value) { + char tmp[16]; + auto res = std::to_chars(tmp, tmp + sizeof(tmp), value, 10); + _parameters[id] = Value(tmp, size_t(res.ptr - tmp)); +} + +void +Parameters::set(KeyT id, int64_t value) { + char tmp[32]; + auto res = std::to_chars(tmp, tmp + sizeof(tmp), value, 10); + _parameters[id] = Value(tmp, size_t(res.ptr - tmp)); +} + +void +Parameters::set(KeyT id, uint64_t value) { + char tmp[32]; + auto res = std::to_chars(tmp, tmp + sizeof(tmp), value, 10); + _parameters[id] = Value(tmp, size_t(res.ptr - tmp)); +} + +void +Parameters::set(KeyT id, double value) { + vespalib::asciistream ost; + ost << value; + _parameters[id] = Value(ost.str()); +} + + template int32_t vdslib::Parameters::get(vespalib::stringref , int32_t) const; template int64_t vdslib::Parameters::get(vespalib::stringref , int64_t) const; template uint64_t vdslib::Parameters::get(vespalib::stringref , uint64_t) const; diff --git a/vdslib/src/vespa/vdslib/container/parameters.h b/vdslib/src/vespa/vdslib/container/parameters.h index 854aec4be20..d28e2cd9890 100644 --- a/vdslib/src/vespa/vdslib/container/parameters.h +++ b/vdslib/src/vespa/vdslib/container/parameters.h @@ -28,11 +28,11 @@ public: class Value : public vespalib::string { public: - Value() { } - Value(vespalib::stringref s) : vespalib::string(s) { } - Value(const vespalib::string & s) : vespalib::string(s) { } - Value(const void *v, size_t sz) : vespalib::string(v, sz) { } - size_t length() const { return size() - 1; } + Value() = default; + explicit Value(vespalib::stringref s) noexcept : vespalib::string(s) { } + explicit Value(const vespalib::string & s) noexcept : vespalib::string(s) { } + Value(const void *v, size_t sz) noexcept : vespalib::string(v, sz) { } + size_t length() const noexcept { return size() - 1; } }; using ValueRef = vespalib::stringref; using ParametersMap = vespalib::hash_map<vespalib::string, Value>; @@ -43,8 +43,8 @@ private: public: Parameters(); - Parameters(document::ByteBuffer& buffer); - ~Parameters(); + explicit Parameters(document::ByteBuffer& buffer); + ~Parameters() override; bool operator==(const Parameters &other) const; @@ -53,7 +53,9 @@ public: bool hasValue(KeyT id) const { return (_parameters.find(id) != _parameters.end()); } unsigned int size() const { return _parameters.size(); } bool lookup(KeyT id, ValueRef & v) const; - void set(KeyT id, const void * v, size_t sz) { _parameters[id] = Value(v, sz); } + void set(KeyT id, const void * v, size_t sz) { + _parameters[id] = Value(v, sz); + } void print(std::ostream& out, bool verbose, const std::string& indent) const; void serialize(vespalib::GrowableByteBuffer& buffer) const; @@ -63,17 +65,15 @@ public: ParametersMap::const_iterator begin() const { return _parameters.begin(); } ParametersMap::const_iterator end() const { return _parameters.end(); } /// Convenience from earlier use. - void set(KeyT id, vespalib::stringref value) { _parameters[id] = Value(value.data(), value.size()); } + void set(KeyT id, vespalib::stringref value) { + _parameters[id] = Value(value.data(), value.size()); + } + void set(KeyT id, int32_t value); + void set(KeyT id, int64_t value); + void set(KeyT id, uint64_t value); + void set(KeyT id, double value); vespalib::stringref get(KeyT id, vespalib::stringref def = "") const; - /** - * Set the value identified by the id given. This requires the type to be - * convertible by stringstreams. - * - * @param id The value to get. - * @param t The value to save. Will be converted to a string. - */ - template<typename T> - void set(KeyT id, T t); + /** * Get the value identified by the id given, as the same type as the default diff --git a/vdslib/src/vespa/vdslib/container/parameters.hpp b/vdslib/src/vespa/vdslib/container/parameters.hpp index ae5706046d4..d91612bc094 100644 --- a/vdslib/src/vespa/vdslib/container/parameters.hpp +++ b/vdslib/src/vespa/vdslib/container/parameters.hpp @@ -7,14 +7,6 @@ namespace vdslib { template<typename T> -void -Parameters::set(KeyT id, T t) { - vespalib::asciistream ost; - ost << t; - _parameters[id] = ost.str(); -} - -template<typename T> T Parameters::get(KeyT id, T def) const { vespalib::stringref ref; |