aboutsummaryrefslogtreecommitdiffstats
path: root/vdslib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-12-29 22:04:19 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-12-29 22:04:19 +0000
commit89e594cd35cc7c86f0aa7178896727f3982793bf (patch)
treeee2576a56517747a1bd1e9feacc676c0f24fa5d9 /vdslib
parent05dda3b487493495bb99aa149673e6b92d842aa5 (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.cpp37
-rw-r--r--vdslib/src/vespa/vdslib/container/parameters.h36
-rw-r--r--vdslib/src/vespa/vdslib/container/parameters.hpp8
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;