From 375652641509b75e93a284deea44f6f1be13e7b3 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 20 Feb 2023 18:24:54 +0000 Subject: Swap @ prefix for p. prefix for special value names --- test/fixtures/json/abs.json | 2 +- test/fixtures/json/bad/empty_abs.json | 2 +- test/fixtures/json/bad/implicit_abs.json | 2 +- test/fixtures/json/bad/late_type.json | 2 +- test/fixtures/json/bad/wrong_type.json | 2 +- test/fixtures/json/bad_type.json | 2 +- test/fixtures/json/empty.json | 2 +- test/fixtures/json/implicit.json | 2 +- test/fixtures/json/load_object.json | 4 ++-- test/fixtures/json/nested.json | 8 ++++---- test/fixtures/json/shared_ptr_diff.json | 10 +++++----- test/fixtures/json/shared_ptr_diff_default.json | 6 +++--- test/fixtures/json/shared_ptr_null.json | 6 +++--- test/fixtures/json/shared_ptr_same.json | 6 +++--- test/fixtures/json/shared_ptr_wrong_type.json | 6 +++--- test/fixtures/json/vector_ptr.json | 2 +- 16 files changed, 32 insertions(+), 32 deletions(-) (limited to 'test/fixtures/json') diff --git a/test/fixtures/json/abs.json b/test/fixtures/json/abs.json index 8492df3..1b489ef 100644 --- a/test/fixtures/json/abs.json +++ b/test/fixtures/json/abs.json @@ -1,6 +1,6 @@ { "aptr": { - "@typeid": "SubObject", + "p.typeid": "SubObject", "base": "set base", "sub": "set sub" } diff --git a/test/fixtures/json/bad/empty_abs.json b/test/fixtures/json/bad/empty_abs.json index 7d22001..5cc3598 100644 --- a/test/fixtures/json/bad/empty_abs.json +++ b/test/fixtures/json/bad/empty_abs.json @@ -1,5 +1,5 @@ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 1, "aptr": {}, "str": "after" diff --git a/test/fixtures/json/bad/implicit_abs.json b/test/fixtures/json/bad/implicit_abs.json index 573b323..bf81ee4 100644 --- a/test/fixtures/json/bad/implicit_abs.json +++ b/test/fixtures/json/bad/implicit_abs.json @@ -1,5 +1,5 @@ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 1, "aptr": { "str": "trigger" diff --git a/test/fixtures/json/bad/late_type.json b/test/fixtures/json/bad/late_type.json index 171575a..d1d6f6c 100644 --- a/test/fixtures/json/bad/late_type.json +++ b/test/fixtures/json/bad/late_type.json @@ -1,4 +1,4 @@ { "str": "trigger", - "@typeid": "doesn't matter" + "p.typeid": "doesn't matter" } diff --git a/test/fixtures/json/bad/wrong_type.json b/test/fixtures/json/bad/wrong_type.json index 777d791..4f19033 100644 --- a/test/fixtures/json/bad/wrong_type.json +++ b/test/fixtures/json/bad/wrong_type.json @@ -1,5 +1,5 @@ { "ptr": { - "@typeid": "SubObject" + "p.typeid": "SubObject" } } diff --git a/test/fixtures/json/bad_type.json b/test/fixtures/json/bad_type.json index f316bd1..70b9d1a 100644 --- a/test/fixtures/json/bad_type.json +++ b/test/fixtures/json/bad_type.json @@ -1,3 +1,3 @@ { - "@typeid": "no such type" + "p.typeid": "no such type" } diff --git a/test/fixtures/json/empty.json b/test/fixtures/json/empty.json index a9193a3..9575565 100644 --- a/test/fixtures/json/empty.json +++ b/test/fixtures/json/empty.json @@ -1,5 +1,5 @@ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 1, "ptr": {}, "str": "after" diff --git a/test/fixtures/json/implicit.json b/test/fixtures/json/implicit.json index 478cec6..6efc2ba 100644 --- a/test/fixtures/json/implicit.json +++ b/test/fixtures/json/implicit.json @@ -1,5 +1,5 @@ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 1, "ptr": { "str": "trigger", diff --git a/test/fixtures/json/load_object.json b/test/fixtures/json/load_object.json index bb32298..c622885 100644 --- a/test/fixtures/json/load_object.json +++ b/test/fixtures/json/load_object.json @@ -1,5 +1,5 @@ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 3.14, "str": "Lovely string", "bl": true, @@ -48,7 +48,7 @@ [] ], "ptr": { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 3.14, "str": "Lovely string" } diff --git a/test/fixtures/json/nested.json b/test/fixtures/json/nested.json index 98951fc..1e271e3 100644 --- a/test/fixtures/json/nested.json +++ b/test/fixtures/json/nested.json @@ -1,14 +1,14 @@ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 1, "ptr": { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 2, "ptr": { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 3, "ptr": { - "@typeid": "TestObject", + "p.typeid": "TestObject", "flt": 4, "ptr": null, "str": "four" diff --git a/test/fixtures/json/shared_ptr_diff.json b/test/fixtures/json/shared_ptr_diff.json index bb18e33..043be4a 100644 --- a/test/fixtures/json/shared_ptr_diff.json +++ b/test/fixtures/json/shared_ptr_diff.json @@ -1,11 +1,11 @@ { - "@typeid": "SharedTestObject", + "p.typeid": "SharedTestObject", "sptr": { - "@typeid": "SubObject", - "@id": "someid" + "p.typeid": "SubObject", + "p.id": "someid" }, "ssptr": { - "@typeid": "SubObject", - "@id": "some other id" + "p.typeid": "SubObject", + "p.id": "some other id" } } diff --git a/test/fixtures/json/shared_ptr_diff_default.json b/test/fixtures/json/shared_ptr_diff_default.json index 69f5e85..c78bc12 100644 --- a/test/fixtures/json/shared_ptr_diff_default.json +++ b/test/fixtures/json/shared_ptr_diff_default.json @@ -1,8 +1,8 @@ { - "@typeid": "SharedTestObject", + "p.typeid": "SharedTestObject", "sptr": { - "@typeid": "SubObject", - "@id": "someid" + "p.typeid": "SubObject", + "p.id": "someid" }, "ssptr": {} } diff --git a/test/fixtures/json/shared_ptr_null.json b/test/fixtures/json/shared_ptr_null.json index c2461e8..8669bf2 100644 --- a/test/fixtures/json/shared_ptr_null.json +++ b/test/fixtures/json/shared_ptr_null.json @@ -1,8 +1,8 @@ { - "@typeid": "SharedTestObject", + "p.typeid": "SharedTestObject", "sptr": { - "@typeid": "SubObject", - "@id": "someid" + "p.typeid": "SubObject", + "p.id": "someid" }, "ssptr": null } diff --git a/test/fixtures/json/shared_ptr_same.json b/test/fixtures/json/shared_ptr_same.json index 4115493..2838e82 100644 --- a/test/fixtures/json/shared_ptr_same.json +++ b/test/fixtures/json/shared_ptr_same.json @@ -1,8 +1,8 @@ { - "@typeid": "SharedTestObject", + "p.typeid": "SharedTestObject", "sptr": { - "@typeid": "SubObject", - "@id": "someid" + "p.typeid": "SubObject", + "p.id": "someid" }, "ssptr": "someid" } diff --git a/test/fixtures/json/shared_ptr_wrong_type.json b/test/fixtures/json/shared_ptr_wrong_type.json index 68f7533..5d4e655 100644 --- a/test/fixtures/json/shared_ptr_wrong_type.json +++ b/test/fixtures/json/shared_ptr_wrong_type.json @@ -1,8 +1,8 @@ { - "@typeid": "SharedTestObject", + "p.typeid": "SharedTestObject", "sptr": { - "@typeid": "SubObject2", - "@id": "someid" + "p.typeid": "SubObject2", + "p.id": "someid" }, "ssptr": "someid" } diff --git a/test/fixtures/json/vector_ptr.json b/test/fixtures/json/vector_ptr.json index 8a07a2e..654bd6c 100644 --- a/test/fixtures/json/vector_ptr.json +++ b/test/fixtures/json/vector_ptr.json @@ -1,7 +1,7 @@ { "vptr": [ { - "@typeid": "TestObject", + "p.typeid": "TestObject", "str": "type" }, { -- cgit v1.2.3 From b59ba638083122456bfeab0ff1fc7e3f3af99423 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 23 Feb 2023 00:39:06 +0000 Subject: Support parsing string values in persistence read --- lib/persistence.h | 47 +++++++++++++++++++++++++++++++++++++++++--- test/fixtures/json/conv.json | 4 ++++ test/test-persistence.cpp | 8 ++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/json/conv.json (limited to 'test/fixtures/json') diff --git a/lib/persistence.h b/lib/persistence.h index 0fc0200..bfd27f0 100644 --- a/lib/persistence.h +++ b/lib/persistence.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -87,13 +88,53 @@ namespace Persistence { T & v; }; - template struct SelectionT : public SelectionV { + template + concept Scalar = std::is_scalar_v; + template + concept NotScalar = (!Scalar); + + template struct SelectionT : public SelectionV { + using SelectionV::SelectionV; + using Selection::setValue; + + void + setValue(T evalue) override + { + std::swap(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 {}) { + throw std::runtime_error("Value conversion failure"); + } + } + } + + void + write(const Writer & out) const override + { + out.pushValue(this->v); + } + }; + + template struct SelectionT : public SelectionV { using SelectionV::SelectionV; using Selection::setValue; - using P = std::conditional_t, T, T &&>; void - setValue(P evalue) override + setValue(T && evalue) override { std::swap(this->v, evalue); } diff --git a/test/fixtures/json/conv.json b/test/fixtures/json/conv.json new file mode 100644 index 0000000..1b690d5 --- /dev/null +++ b/test/fixtures/json/conv.json @@ -0,0 +1,4 @@ +{ + "bl": "true", + "flt": "3.14" +} diff --git a/test/test-persistence.cpp b/test/test-persistence.cpp index faa0d19..6bee010 100644 --- a/test/test-persistence.cpp +++ b/test/test-persistence.cpp @@ -208,6 +208,14 @@ BOOST_FIXTURE_TEST_CASE(load_vector_ptr, JPP) BOOST_CHECK(to->vptr.at(3)->str.empty()); } +BOOST_FIXTURE_TEST_CASE(test_conversion, JPP) +{ + auto to = load_json>(FIXTURESDIR "json/conv.json"); + BOOST_REQUIRE(to); + BOOST_CHECK_EQUAL(to->bl, true); + BOOST_CHECK_EQUAL(to->flt, 3.14F); +} + struct SharedTestObject : public Persistence::Persistable { SharedTestObject() = default; -- cgit v1.2.3