diff options
| author | Lexi Winter <lexi@hemlock.eden.le-fay.org> | 2025-03-27 15:50:17 +0000 |
|---|---|---|
| committer | Lexi Winter <lexi@hemlock.eden.le-fay.org> | 2025-03-27 15:50:17 +0000 |
| commit | 6f18003230c24cb12e365cca740d3b52a1d2455d (patch) | |
| tree | c59279bbabf49cf2f073c18e7718836c41299962 | |
| parent | 00d8aa12d058c05c004715380a870aaa69dbcbfd (diff) | |
| download | libnvxx-6f18003230c24cb12e365cca740d3b52a1d2455d.tar.gz libnvxx-6f18003230c24cb12e365cca740d3b52a1d2455d.tar.bz2 | |
allow schema to be specified for nv_{,de}serialize()
| -rw-r--r-- | libnvxx/nvxx_serialize.h | 39 | ||||
| -rw-r--r-- | libnvxx/tests/nvxx_serialize.cc | 26 |
2 files changed, 37 insertions, 28 deletions
diff --git a/libnvxx/nvxx_serialize.h b/libnvxx/nvxx_serialize.h index e4e0e69..b0a161f 100644 --- a/libnvxx/nvxx_serialize.h +++ b/libnvxx/nvxx_serialize.h @@ -283,13 +283,13 @@ struct nv_field : __detail::__serializer_tag { { } - auto serialize(nv_list &__nvl, _Object const &__object) { + auto serialize(nv_list &__nvl, _Object const &__object) const { nv_encoder<_Member>{}.encode(__nvl, __field_name, __object.*__field_ptr); } - auto deserialize(const_nv_list const &__nvl, _Object &__object) { + auto deserialize(const_nv_list const &__nvl, _Object &__object) const { __object.*__field_ptr = nv_decoder<_Member>{} .decode(__nvl, __field_name); } @@ -315,12 +315,12 @@ struct nv_literal<std::string_view> : __detail::__serializer_tag { } template<typename _Object> - auto serialize(nv_list &__nvl, _Object const &) { + auto serialize(nv_list &__nvl, _Object const &) const { __nvl.add_string(__field_name, __field_value); } template<typename _Object> - auto deserialize(const_nv_list const &__nvl, _Object &) { + auto deserialize(const_nv_list const &__nvl, _Object &) const { auto __value = __nvl.get_string(__field_name); // TODO: possibly we could have a specific exception for this if (__value != __field_value) @@ -347,13 +347,13 @@ struct __field_sequence : __detail::__serializer_tag { } template<typename _Object> - auto serialize(nv_list &__nvl, _Object const &__object) { + auto serialize(nv_list &__nvl, _Object const &__object) const { __first.serialize(__nvl, __object); __second.serialize(__nvl, __object); } template<typename _Object> - auto deserialize(const_nv_list const &__nvl, _Object &__object) { + auto deserialize(const_nv_list const &__nvl, _Object &__object) const { __first.deserialize(__nvl, __object); __second.deserialize(__nvl, __object); } @@ -374,26 +374,39 @@ auto operator>> (__detail::__serializer auto const &__f1, template<typename _T> struct nv_schema; -template<typename _T> -auto nv_serialize(_T &&__o) -> nv_list +nv_list +nv_serialize(auto &&__o, __detail::__serializer auto const &__schema) { - using __schema_type = nv_schema<std::remove_cvref_t<_T>>; - auto __schema = __schema_type{}.get(); auto __nvl = nv_list(); - __schema.serialize(__nvl, __o); return (__nvl); } template<typename _Object> -void nv_deserialize(const_nv_list const &__nvl, _Object &__obj) +nv_list +nv_serialize(_Object &&__o) { - using __schema_type = nv_schema<std::remove_cvref_t<_Object>>; + using __schema_type = nv_schema<std::remove_cvref_t<decltype(__o)>>; auto __schema = __schema_type{}.get(); + return nv_serialize(std::forward<_Object>(__o), __schema); +} +void +nv_deserialize(const_nv_list const &__nvl, + auto &__obj, + __detail::__serializer auto const &__schema) +{ __schema.deserialize(__nvl, __obj); } +template<typename _Object> +void nv_deserialize(const_nv_list const &__nvl, _Object &__obj) +{ + using __schema_type = nv_schema<std::remove_cvref_t<_Object>>; + auto __schema = __schema_type{}.get(); + nv_deserialize(__nvl, __obj, __schema); +} + } // namespace bsd #endif /* !_NVXX_SERIALIZE_H */ diff --git a/libnvxx/tests/nvxx_serialize.cc b/libnvxx/tests/nvxx_serialize.cc index c3db5e2..e6b345d 100644 --- a/libnvxx/tests/nvxx_serialize.cc +++ b/libnvxx/tests/nvxx_serialize.cc @@ -208,22 +208,15 @@ TEST_CASE(nv_serialize) std::vector{42, 666, 1024})); } -struct test_object { - std::uint64_t value{}; -}; - -template<> -struct bsd::nv_schema<::test_object> { - auto get() { - return (bsd::nv_literal("object type", "test object") - >> bsd::nv_field("value", &::test_object::value)); - } -}; TEST_CASE(nv_serialize_literal) { - auto obj = test_object{}; - auto nvl = bsd::nv_serialize(obj); + auto test_schema = + bsd::nv_literal("object type", "test object") + >> bsd::nv_field("value", &::object::int_value); + auto obj = object{}; + + auto nvl = bsd::nv_serialize(obj, test_schema); ATF_REQUIRE_EQ("test object", nvl.get_string("object type")); } @@ -232,9 +225,12 @@ TEST_CASE(nv_deserialize_bad_literal) auto nvl = bsd::nv_list(); nvl.add_number("value", 42u); - auto obj = test_object{}; + auto test_schema = + bsd::nv_literal("object type", "test object") + >> bsd::nv_field("value", &::object::int_value); + auto obj = object{}; ATF_REQUIRE_THROW(bsd::nv_key_not_found, - bsd::nv_deserialize(nvl, obj)); + bsd::nv_deserialize(nvl, obj, test_schema)); } ATF_INIT_TEST_CASES(tcs) |
