aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLexi Winter <lexi@hemlock.eden.le-fay.org>2025-03-28 06:35:27 +0000
committerLexi Winter <lexi@hemlock.eden.le-fay.org>2025-03-28 06:35:27 +0000
commit22ae58f4d277fd2609374fbe3d227f75447bf225 (patch)
tree7a8f7ac9f6614be043b2758b550782f3472ff711
parent05d36a3c5ad51b81ed5d2e62be67cc5b5910ef21 (diff)
downloadlibnvxx-22ae58f4d277fd2609374fbe3d227f75447bf225.tar.gz
libnvxx-22ae58f4d277fd2609374fbe3d227f75447bf225.tar.bz2
relax the requirements on nv_list::add_*_range()
-rw-r--r--libnvxx/nvxx.322
-rw-r--r--libnvxx/nvxx_base.h214
-rw-r--r--libnvxx/nvxx_serialize.h67
-rw-r--r--libnvxx/tests/nvxx_basic.cc10
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));