aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLexi Winter <lexi@hemlock.eden.le-fay.org>2025-03-27 15:50:17 +0000
committerLexi Winter <lexi@hemlock.eden.le-fay.org>2025-03-27 15:50:17 +0000
commit6f18003230c24cb12e365cca740d3b52a1d2455d (patch)
treec59279bbabf49cf2f073c18e7718836c41299962
parent00d8aa12d058c05c004715380a870aaa69dbcbfd (diff)
downloadlibnvxx-6f18003230c24cb12e365cca740d3b52a1d2455d.tar.gz
libnvxx-6f18003230c24cb12e365cca740d3b52a1d2455d.tar.bz2
allow schema to be specified for nv_{,de}serialize()
-rw-r--r--libnvxx/nvxx_serialize.h39
-rw-r--r--libnvxx/tests/nvxx_serialize.cc26
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)