diff options
| -rw-r--r-- | libnvxx/nvxx.3 | 22 | ||||
| -rw-r--r-- | libnvxx/nvxx_base.h | 214 | ||||
| -rw-r--r-- | libnvxx/nvxx_serialize.h | 67 | ||||
| -rw-r--r-- | libnvxx/tests/nvxx_basic.cc | 10 |
4 files changed, 91 insertions, 222 deletions
diff --git a/libnvxx/nvxx.3 b/libnvxx/nvxx.3 index 970e707..71af6af 100644 --- a/libnvxx/nvxx.3 +++ b/libnvxx/nvxx.3 @@ -139,6 +139,7 @@ struct nv_list : <unspecified> { void add_descriptor(std::string_view key, int); void add_nvlist(std::string_view key, const_nv_list const &); void add_binary(std::string_view key, std::span<std::byte const>); + void add_binary_range(std::string_view key, std::ranges::range auto &&); void move_string(std::string_view key, char *); void move_descriptor(std::string_view key, int); @@ -187,22 +188,11 @@ struct nv_list : <unspecified> { void add_nvlist_array(std::string_view key, std::span<const_nv_list const>); void add_nvlist_array(std::string_view key, std::span<nv_list const>); - // exposition only - - template<std::ranges::range Range> - void add_bool_range(std::string_view key, Range &&); - - template<std::ranges::range Range> - void add_number_range(std::string_view key, Range &&); - - template<std::ranges::range Range> - void add_binary_range(std::string_view key, Range &&); - - template<std::ranges::range Range> - void add_string_range(std::string_view key, _Range &&); - - template<std::ranges::range Range> - void add_descriptor_range(std::string_view key, _Range &&); + void add_bool_range(std::string_view key, std::ranges::range auto &&); + void add_number_range(std::string_view key, std::ranges::range auto &&); + void add_string_range(std::string_view key, std::ranges::range auto &&); + void add_descriptor_range(std::string_view key, std::ranges::range auto &&); + void add_nvlist_range(std::string_view key, std::ranges::range auto &&); // exposition only auto take_bool_array(std::string_view key) -> container-type<bool>; diff --git a/libnvxx/nvxx_base.h b/libnvxx/nvxx_base.h index c925c2c..d76a612 100644 --- a/libnvxx/nvxx_base.h +++ b/libnvxx/nvxx_base.h @@ -328,168 +328,6 @@ struct __nv_list : virtual __nv_list_base { void append_string_array(std::string_view __key, std::string_view); void append_nvlist_array(std::string_view __key, const_nv_list const &); void append_descriptor_array(std::string_view __key, int); - - /* add_bool_range */ - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<bool, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_bool_range(std::string_view __key, _Range &&__value) - { - add_bool_array(__key, std::span(__value)); - } - - template<std::ranges::range _Range> - requires (!std::ranges::contiguous_range<_Range> - && std::is_same_v<bool, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_bool_range(std::string_view __key, _Range &&__value) - { - /* - * since vector<bool> is not a contiguous_range, - * we need to do two copies here. - */ - - auto __v = std::vector(std::from_range, __value); - auto __p = std::make_unique<bool[]>(__v.size()); - std::ranges::copy(__v, __p.get()); - add_bool_array(__key, std::span(__p.get(), __v.size())); - } - - /* add_number_range */ - - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<std::uint64_t, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_number_range(std::string_view __key, _Range &&__value) - { - add_number_array(__key, std::span(__value)); - } - - template<std::ranges::range _Range> - requires ( - !std::ranges::contiguous_range<_Range> - && std::is_same_v<std::uint64_t, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_number_range(std::string_view __key, _Range &&__value) - { - auto __arr = std::vector(std::from_range, __value); - add_number_range(__key, __arr); - } - - /* add_descriptor_range */ - - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<int, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_descriptor_range(std::string_view __key, _Range &&__value) - { - add_descriptor_array(__key, std::span(__value)); - } - - template<std::ranges::range _Range> - requires ( - !std::ranges::contiguous_range<_Range> - && std::is_same_v<int, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_descriptor_range(std::string_view __key, _Range &&__value) - { - auto __arr = std::vector(std::from_range, __value); - add_descriptor_range(__key, __arr); - } - - /* add_string_range */ - - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<std::string_view, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_string_range(std::string_view __key, _Range &&__value) - { - add_string_array(__key, std::span(__value)); - } - - template<std::ranges::range _Range> - requires (!std::ranges::contiguous_range<_Range> - && std::is_same_v<std::string_view, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_string_range(std::string_view __key, _Range &&__value) - { - auto __arr = std::vector(std::from_range, __value); - add_string_range(__key, __arr); - } - - /* add_binary_range */ - - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<std::byte, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_binary_range(std::string const &__name, _Range &&__value) - { - auto __span = std::span(__value); - add_binary(__name, __span); - } - - template<std::ranges::range _Range> - requires ( - !std::ranges::contiguous_range<_Range> - && std::is_same_v<std::byte, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_binary_range(std::string_view __key, _Range &&__value) - { - auto __arr = std::vector(std::from_range, __value); - add_number_range(__key, __arr); - } - - /* add_nvlist_range */ - - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<nv_list, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_nvlist_range(std::string_view __key, _Range &&__value) - { - add_nvlist_array(__key, std::span(__value)); - } - - template<std::ranges::range _Range> - requires (!std::ranges::contiguous_range<_Range> - && std::is_same_v<nv_list, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_nvlist_range(std::string_view __key, _Range &&__value) - { - auto __arr = std::vector(std::from_range, __value); - add_nvlist_range(__key, __arr); - } - - template<std::ranges::contiguous_range _Range> - requires std::is_same_v<const_nv_list, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>> - void add_nvlist_range(std::string_view __key, _Range &&__value) - { - add_nvlist_array(__key, std::span(__value)); - } - - template<std::ranges::range _Range> - requires (!std::ranges::contiguous_range<_Range> - && std::is_same_v<const_nv_list, - std::remove_cvref_t< - std::ranges::range_value_t<_Range>>>) - void add_nvlist_range(std::string_view __key, _Range &&__value) - { - auto __arr = std::vector(std::from_range, __value); - add_nvlist_range(__key, __arr); - } }; } // namespace bsd::__detail @@ -649,6 +487,58 @@ struct nv_list final [[nodiscard]] static nv_list xfer(int __fd, nv_list &&__source, int __flags); + + void add_bool_range(std::string_view __key, + std::ranges::range auto &&__value) + { + /* + * since vector<bool> is not a contiguous_range, + * we need to do two copies here. + */ + + auto __v = std::vector<bool>(std::from_range, __value); + auto __p = std::make_unique<bool[]>(__v.size()); + std::ranges::copy(__v, __p.get()); + add_bool_array(__key, std::span(__p.get(), __v.size())); + } + + void add_number_range(std::string_view __key, + std::ranges::range auto &&__value) + { + auto __arr = std::vector<std::uint64_t>( + std::from_range, __value); + add_number_array(__key, __arr); + } + + void add_descriptor_range(std::string_view __key, + std::ranges::range auto &&__value) + { + auto __arr = std::vector<int>(std::from_range, __value); + add_descriptor_array(__key, __arr); + } + + void add_string_range(std::string_view __key, + std::ranges::range auto &&__value) + { + auto __arr = std::vector<std::string_view>( + std::from_range, __value); + add_string_array(__key, __arr); + } + + void add_binary_range(std::string_view __key, + std::ranges::range auto &&__value) + { + auto __arr = std::vector<std::byte>(std::from_range, __value); + add_binary(__key, __arr); + } + + void add_nvlist_range(std::string_view __key, + std::ranges::range auto &&__value) + { + auto __arr = std::vector<const_nv_list>( + std::from_range, __value); + add_nvlist_array(__key, __arr); + } }; } // namespace bsd diff --git a/libnvxx/nvxx_serialize.h b/libnvxx/nvxx_serialize.h index dd2f22b..d4e2609 100644 --- a/libnvxx/nvxx_serialize.h +++ b/libnvxx/nvxx_serialize.h @@ -45,6 +45,16 @@ concept __push_back_container_of = __c.push_back(__value); }; +struct __serializer_tag { + using __serializer_tag_t = int; +}; + +template<typename _T> +concept __serializer = + requires(_T __t) { + typename _T::__serializer_tag_t; + }; + } // namespace __detail /* @@ -69,9 +79,9 @@ struct nv_encoder<bool> { template<__detail::__from_range_container_of<bool> _C> struct nv_encoder<_C> { - template<typename _U> - void encode(nv_list &__nvl, std::string_view __key, _U &&__range) { - __nvl.add_bool_range(__key, std::forward<_U>(__range)); + void encode(nv_list &__nvl, std::string_view __key, auto &&__range) { + __nvl.add_bool_range(__key, + std::forward<decltype(__range)>(__range)); } auto decode(const_nv_list const &__nvl, std::string_view __key) -> _C { @@ -97,9 +107,9 @@ struct nv_encoder<std::uint64_t> { template<__detail::__from_range_container_of<std::uint64_t> _C> struct nv_encoder<_C> { - template<typename _U> - void encode(nv_list &__nvl, std::string_view __key, _U &&__range) { - __nvl.add_number_range(__key, std::forward<_U>(__range)); + void encode(nv_list &__nvl, std::string_view __key, auto &&__range) { + __nvl.add_number_range( + __key, std::forward<decltype(__range)>(__range)); } auto decode(const_nv_list const &__nvl, std::string_view __key) -> _C { @@ -125,8 +135,7 @@ struct nv_encoder<std::string> { template<__detail::__from_range_container_of<std::string> _C> struct nv_encoder<_C> { - template<typename _U> - void encode(nv_list &__nvl, std::string_view __key, _U &&__range) { + void encode(nv_list &__nvl, std::string_view __key, auto &&__range) { __nvl.add_string_range(__key, __range | std::views::transform([] (auto const &__s) { return (std::string_view(__s)); @@ -161,9 +170,9 @@ struct nv_encoder<std::string_view> { template<__detail::__from_range_container_of<std::string_view> _C> struct nv_encoder<_C> { - template<typename _U> - void encode(nv_list &__nvl, std::string_view __key, _U &&__range) { - __nvl.add_string_range(__key, std::forward<_U>(__range)); + void encode(nv_list &__nvl, std::string_view __key, auto &&__range) { + __nvl.add_string_range( + __key, std::forward<decltype(__range)>(__range)); } _C decode(const_nv_list const &__nvl, std::string_view __key) { @@ -259,20 +268,6 @@ struct nv_encoder<std::optional<_T>> { * object (de)serialization */ -namespace __detail { - -struct __serializer_tag { - using __serializer_tag_t = int; -}; - -template<typename _T> -concept __serializer = - requires(_T __t) { - typename _T::__serializer_tag_t; - }; - -} // namespace detail - template<typename _T> struct nv_schema; @@ -340,13 +335,11 @@ struct nv_literal<std::string_view> : __detail::__serializer_tag { { } - template<typename _Object> - auto serialize(nv_list &__nvl, _Object const &) const { + auto serialize(nv_list &__nvl, auto const &) const { __nvl.add_string(__field_name, __field_value); } - template<typename _Object> - auto deserialize(const_nv_list const &__nvl, _Object &) const { + auto deserialize(const_nv_list const &__nvl, auto &) const { auto __value = __nvl.get_string(__field_name); // TODO: possibly we could have a specific exception for this if (__value != __field_value) @@ -372,14 +365,12 @@ struct __field_sequence : __detail::__serializer_tag { { } - template<typename _Object> - auto serialize(nv_list &__nvl, _Object const &__object) const { + auto serialize(nv_list &__nvl, auto const &__object) const { __first.serialize(__nvl, __object); __second.serialize(__nvl, __object); } - template<typename _Object> - auto deserialize(const_nv_list const &__nvl, _Object &__object) const { + auto deserialize(const_nv_list const &__nvl, auto &__object) const { __first.deserialize(__nvl, __object); __second.deserialize(__nvl, __object); } @@ -405,13 +396,12 @@ nv_serialize(auto &&__o, __detail::__serializer auto const &__schema) return (__nvl); } -template<typename _Object> nv_list -nv_serialize(_Object &&__o) +nv_serialize(auto &&__o) { using __schema_type = nv_schema<std::remove_cvref_t<decltype(__o)>>; auto __schema = __schema_type{}.get(); - return nv_serialize(std::forward<_Object>(__o), __schema); + return nv_serialize(std::forward<decltype(__o)>(__o), __schema); } void @@ -422,10 +412,9 @@ nv_deserialize(const_nv_list const &__nvl, __schema.deserialize(__nvl, __obj); } -template<typename _Object> -void nv_deserialize(const_nv_list const &__nvl, _Object &__obj) +void nv_deserialize(const_nv_list const &__nvl, auto &__obj) { - using __schema_type = nv_schema<std::remove_cvref_t<_Object>>; + using __schema_type = nv_schema<std::remove_cvref_t<decltype(__obj)>>; auto __schema = __schema_type{}.get(); nv_deserialize(__nvl, __obj, __schema); } diff --git a/libnvxx/tests/nvxx_basic.cc b/libnvxx/tests/nvxx_basic.cc index e808ef4..3f32592 100644 --- a/libnvxx/tests/nvxx_basic.cc +++ b/libnvxx/tests/nvxx_basic.cc @@ -289,7 +289,7 @@ TEST_CASE(nvxx_add_bool_array) auto data = std::array<bool, 2>{true, false}; auto nvl = bsd::nv_list(); - nvl.add_bool_array(key, std::span(data)); + nvl.add_bool_array(key, data); ATF_REQUIRE_EQ(true, nvl.exists(key)); ATF_REQUIRE_EQ(true, nvl.exists_bool_array(key)); @@ -365,10 +365,10 @@ TEST_CASE(nvxx_add_bool_contig_range) using namespace std::literals; auto constexpr key = "test_bool"sv; - auto data = std::vector{true, false}; + auto data = std::array<bool, 2>{true, false}; auto nvl = bsd::nv_list(); - nvl.add_bool_range(key, data); + nvl.add_bool_array(key, data); ATF_REQUIRE_EQ(true, nvl.exists(key)); ATF_REQUIRE_EQ(true, nvl.exists_bool_array(key)); @@ -606,7 +606,7 @@ TEST_CASE(nvxx_add_number_contig_range) std::ranges::iota_view{0_u64, size}); auto nvl = bsd::nv_list(); - nvl.add_number_range(key, data); + nvl.add_number_array(key, data); ATF_REQUIRE_EQ(true, nvl.exists(key)); ATF_REQUIRE_EQ(true, nvl.exists_number_array(key)); @@ -810,7 +810,7 @@ TEST_CASE(nvxx_add_string_contig_range) auto data = std::vector<std::string_view>{"one"sv, "two"sv}; auto nvl = bsd::nv_list(); - nvl.add_string_range(key, data); + nvl.add_string_array(key, data); ATF_REQUIRE_EQ(true, nvl.exists(key)); ATF_REQUIRE_EQ(true, nvl.exists_string_array(key)); |
