diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/jsonParse-persistence.cpp | 8 | ||||
-rw-r--r-- | lib/jsonParse-persistence.h | 3 | ||||
-rw-r--r-- | lib/jsonParse.h | 2 | ||||
-rw-r--r-- | lib/jsonParse.ll | 2 | ||||
-rw-r--r-- | lib/persistence.cpp | 4 | ||||
-rw-r--r-- | lib/persistence.h | 57 |
6 files changed, 50 insertions, 26 deletions
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); } @@ -164,6 +164,12 @@ namespace Persistence { } void + JsonWritePersistence::pushValue(int value) const + { + strm << value; + } + + void JsonWritePersistence::pushValue(std::nullptr_t) const { strm << "null"; 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 [^\\\"]* } <ARRAY_ITEM,INITIAL>{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<typename T> - concept Scalar = std::is_scalar_v<T>; - template<typename T> - concept NotScalar = (!Scalar<T>); + concept Arithmatic = std::is_arithmetic_v<T>; - template<Scalar T> struct SelectionT<T> : public SelectionV<T> { - using SelectionV<T>::SelectionV; + template<> struct SelectionT<bool> : public SelectionV<bool> { + using SelectionV<bool>::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<T, bool>) { - 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<NotScalar T> struct SelectionT<T> : public SelectionV<T> { + template<Arithmatic T> struct SelectionT<T> : public SelectionV<T> { + using SelectionV<T>::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<typename T> struct SelectionT : public SelectionV<T> { using SelectionV<T>::SelectionV; using Selection::setValue; |