From bfea0319aa07ad2c921ba29ba216e921d65f2ed1 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 9 Jan 2024 00:23:16 +0000 Subject: Integer support in persistence Splits bool and arithmatic types, pass arithmatic values as string views from JSON and parse according to the target type. --- lib/jsonParse-persistence.cpp | 8 +++++- lib/jsonParse-persistence.h | 3 ++- lib/jsonParse.h | 2 +- lib/jsonParse.ll | 2 +- lib/persistence.cpp | 4 +-- lib/persistence.h | 57 ++++++++++++++++++++++++++++--------------- 6 files changed, 50 insertions(+), 26 deletions(-) (limited to 'lib') diff --git a/lib/jsonParse-persistence.cpp b/lib/jsonParse-persistence.cpp index 5c0011a..ba61849 100644 --- a/lib/jsonParse-persistence.cpp +++ b/lib/jsonParse-persistence.cpp @@ -36,7 +36,7 @@ namespace Persistence { } void - JsonParsePersistence::pushNumber(float value) + JsonParsePersistence::pushNumber(std::string_view value) { pushValue(value); } @@ -163,6 +163,12 @@ namespace Persistence { strm << value; } + void + JsonWritePersistence::pushValue(int value) const + { + strm << value; + } + void JsonWritePersistence::pushValue(std::nullptr_t) const { diff --git a/lib/jsonParse-persistence.h b/lib/jsonParse-persistence.h index a676282..6edebc7 100644 --- a/lib/jsonParse-persistence.h +++ b/lib/jsonParse-persistence.h @@ -27,7 +27,7 @@ namespace Persistence { void beginObject() override; void beginArray() override; void pushBoolean(bool value) override; - void pushNumber(float value) override; + void pushNumber(std::string_view value) override; void pushNull() override; void pushText(std::string && value) override; void pushKey(std::string && k) override; @@ -54,6 +54,7 @@ namespace Persistence { void beginArray() const override; void pushValue(bool value) const override; void pushValue(float value) const override; + void pushValue(int value) const override; void pushValue(std::nullptr_t) const override; void pushValue(const std::string_view value) const override; void nextValue() const override; diff --git a/lib/jsonParse.h b/lib/jsonParse.h index 4205572..c776643 100644 --- a/lib/jsonParse.h +++ b/lib/jsonParse.h @@ -25,7 +25,7 @@ namespace json { virtual void beginArray() = 0; virtual void pushBoolean(bool) = 0; - virtual void pushNumber(float) = 0; + virtual void pushNumber(std::string_view) = 0; virtual void pushNull() = 0; virtual void pushText(std::string &&) = 0; virtual void pushKey(std::string &&) = 0; diff --git a/lib/jsonParse.ll b/lib/jsonParse.ll index 8029830..100bc46 100644 --- a/lib/jsonParse.ll +++ b/lib/jsonParse.ll @@ -52,7 +52,7 @@ text [^\\\"]* } {number} { - pushNumber(std::strtof(YYText(), NULL)); + pushNumber(YYText()); yy_pop_state(); } diff --git a/lib/persistence.cpp b/lib/persistence.cpp index 38e2ac6..f6f0c17 100644 --- a/lib/persistence.cpp +++ b/lib/persistence.cpp @@ -103,9 +103,9 @@ namespace Persistence { } void - Selection::setValue(float) + Selection::setValue(std::string_view) { - throw std::runtime_error("Unexpected float"); + throw std::runtime_error("Unexpected numeric"); } void diff --git a/lib/persistence.h b/lib/persistence.h index 92f3052..c53ff99 100644 --- a/lib/persistence.h +++ b/lib/persistence.h @@ -37,6 +37,7 @@ namespace Persistence { virtual void beginArray() const = 0; virtual void pushValue(bool value) const = 0; virtual void pushValue(float value) const = 0; + virtual void pushValue(int value) const = 0; virtual void pushValue(std::nullptr_t) const = 0; virtual void pushValue(std::string_view value) const = 0; virtual void nextValue() const = 0; @@ -50,7 +51,7 @@ namespace Persistence { virtual ~Selection() = default; DEFAULT_MOVE_COPY(Selection); - virtual void setValue(float); + virtual void setValue(std::string_view); virtual void setValue(bool); virtual void setValue(std::nullptr_t); virtual void setValue(std::string &&); @@ -91,34 +92,24 @@ namespace Persistence { }; template - concept Scalar = std::is_scalar_v; - template - concept NotScalar = (!Scalar); + concept Arithmatic = std::is_arithmetic_v; - template struct SelectionT : public SelectionV { - using SelectionV::SelectionV; + template<> struct SelectionT : public SelectionV { + using SelectionV::SelectionV; using Selection::setValue; void - setValue(T evalue) override + setValue(bool evalue) override { - std::swap(this->v, evalue); + this->v = evalue; } void setValue(std::string && evalue) override { - if constexpr (std::same_as) { - using namespace std::literals; - if (!(this->v = evalue == "true"sv)) { - if (evalue != "false"sv) { - throw std::runtime_error("Value conversion failure"); - } - } - } - else { - if (auto res = std::from_chars(evalue.c_str(), evalue.c_str() + evalue.length(), this->v).ec; - res != std::errc {}) { + using namespace std::literals; + if (!(this->v = evalue == "true"sv)) { + if (evalue != "false"sv) { throw std::runtime_error("Value conversion failure"); } } @@ -131,7 +122,33 @@ namespace Persistence { } }; - template struct SelectionT : public SelectionV { + template struct SelectionT : public SelectionV { + using SelectionV::SelectionV; + using Selection::setValue; + + void + setValue(std::string_view evalue) override + { + if (auto res = std::from_chars(evalue.data(), evalue.data() + evalue.length(), this->v).ec; + res != std::errc {}) { + throw std::runtime_error("Value conversion failure"); + } + } + + void + setValue(std::string && evalue) override + { + setValue(std::string_view {evalue}); + } + + void + write(const Writer & out) const override + { + out.pushValue(this->v); + } + }; + + template struct SelectionT : public SelectionV { using SelectionV::SelectionV; using Selection::setValue; -- cgit v1.2.3