diff options
| author | Lexi Winter <lexi@hemlock.eden.le-fay.org> | 2025-03-24 23:39:38 +0000 |
|---|---|---|
| committer | Lexi Winter <lexi@hemlock.eden.le-fay.org> | 2025-03-24 23:39:38 +0000 |
| commit | 3275dc3ce981900b92e2097180e62aae39a75503 (patch) | |
| tree | c76571bce783453f1d713202314caa3e96ac1603 | |
| parent | 5dae4f7b4badf20f88476768dbba98255fb04ecc (diff) | |
| download | libnvxx-3275dc3ce981900b92e2097180e62aae39a75503.tar.gz libnvxx-3275dc3ce981900b92e2097180e62aae39a75503.tar.bz2 | |
add iteration for array types
| -rw-r--r-- | libnvxx/nvxx_iterator.cc | 52 | ||||
| -rw-r--r-- | libnvxx/nvxx_iterator.h | 7 | ||||
| -rw-r--r-- | libnvxx/tests/nvxx_iterator.cc | 62 |
3 files changed, 117 insertions, 4 deletions
diff --git a/libnvxx/nvxx_iterator.cc b/libnvxx/nvxx_iterator.cc index 9e0781b..7312152 100644 --- a/libnvxx/nvxx_iterator.cc +++ b/libnvxx/nvxx_iterator.cc @@ -156,6 +156,58 @@ nv_list_iterator::__advance() break; } + case NV_TYPE_BOOL_ARRAY: { + auto nitems = std::size_t{}; + auto ptr = cnvlist_get_bool_array(__cookie, &nitems); + auto span = std::span{ptr, nitems}; + __current = std::make_pair(name, span); + break; + } + + case NV_TYPE_NUMBER_ARRAY: { + auto nitems = std::size_t{}; + auto ptr = cnvlist_get_number_array(__cookie, &nitems); + auto span = std::span{ptr, nitems}; + __current = std::make_pair(name, span); + break; + } + + case NV_TYPE_STRING_ARRAY: { + auto nitems = std::size_t{}; + auto ptr = cnvlist_get_string_array(__cookie, &nitems); + auto span = std::span{ptr, nitems}; + auto vector = + span + | std::views::transform([] (char const *ptr) { + return std::string_view(ptr); + }) + | std::ranges::to<std::vector>(); + __current = std::make_pair(name, vector); + break; + } + + case NV_TYPE_DESCRIPTOR_ARRAY: { + auto nitems = std::size_t{}; + auto ptr = cnvlist_get_descriptor_array(__cookie, &nitems); + auto span = std::span{ptr, nitems}; + __current = std::make_pair(name, span); + break; + } + + case NV_TYPE_NVLIST_ARRAY: { + auto nitems = std::size_t{}; + auto ptr = cnvlist_get_nvlist_array(__cookie, &nitems); + auto span = std::span{ptr, nitems}; + auto vector = + span + | std::views::transform([] (::nvlist_t const *ptr) { + return const_nv_list(ptr); + }) + | std::ranges::to<std::vector>(); + __current = std::make_pair(name, vector); + break; + } + default: std::abort(); } diff --git a/libnvxx/nvxx_iterator.h b/libnvxx/nvxx_iterator.h index d626bfd..c65f546 100644 --- a/libnvxx/nvxx_iterator.h +++ b/libnvxx/nvxx_iterator.h @@ -45,7 +45,12 @@ using nv_list_value_t = std::variant< std::string_view, /* string */ const_nv_list, /* nvlist */ int, /* descriptor */ - std::span<std::byte const> /* binary */ + std::span<std::byte const>, /* binary */ + std::span<bool const>, /* bool array */ + std::span<std::uint64_t const>, /* number array */ + std::vector<std::string_view>, /* string array */ + std::span<int const>, /* descriptor array */ + std::vector<const_nv_list> /* nvlist array */ >; // the iterator value type diff --git a/libnvxx/tests/nvxx_iterator.cc b/libnvxx/tests/nvxx_iterator.cc index fd96b38..9f41c9c 100644 --- a/libnvxx/tests/nvxx_iterator.cc +++ b/libnvxx/tests/nvxx_iterator.cc @@ -40,7 +40,8 @@ TEST_CASE(nvxx_basic_iterate) { using namespace std::literals; auto nvl = bsd::nv_list(); - int fds[2]; + auto fds = std::array<int, 2>{}; + auto fds2 = std::array<int, 2>{}; auto binary = std::array<std::byte, 4>{ static_cast<std::byte>(1), @@ -49,22 +50,37 @@ TEST_CASE(nvxx_basic_iterate) static_cast<std::byte>(4) }; - auto ret = ::pipe(fds); + auto ret = ::pipe(&fds[0]); ATF_REQUIRE_EQ(0, ret); + ret = ::pipe(&fds2[0]); + ATF_REQUIRE_EQ(0, ret); + + auto bool_array = std::vector{true, false, false}; + auto number_array = std::vector<std::uint64_t>{2, 3, 4}; + auto string_array = std::vector{"one"sv, "two"sv, "three"sv}; nvl.add_null("a null"); nvl.add_number("a number", 42); nvl.add_string("a string", "a test string"); nvl.add_bool("a bool", true); nvl.add_binary("a binary", binary); + nvl.add_bool_range("a bool array", bool_array); + nvl.add_number_range("a number array", number_array); + nvl.add_string_range("a string array", string_array); auto fdesc = fds[0]; nvl.move_descriptor("an fd", fdesc); + nvl.add_descriptor_range("a descriptor array", fds2); + auto nvl2 = bsd::nv_list(); nvl2.add_number("child number", 666); nvl.add_nvlist("an nvlist", nvl2); + auto nvl3 = bsd::nv_list(); + nvl3.add_number("an array number", 4242); + nvl.add_nvlist_array("an nvlist array", std::span{&nvl3, 1}); + auto begin = std::ranges::begin(nvl); auto end = std::ranges::end(nvl); @@ -107,6 +123,46 @@ TEST_CASE(nvxx_basic_iterate) std::get<bsd::const_nv_list>(value) .get_number("child number")); + } else if (std::holds_alternative< + std::span<bool const>>(value)) { + ATF_REQUIRE_EQ("a bool array"sv, name); + auto data = std::get<std::span<bool const>>(value); + ATF_REQUIRE_EQ(true, + std::ranges::equal(bool_array, data)); + + } else if (std::holds_alternative< + std::span<std::uint64_t const>>(value)) { + ATF_REQUIRE_EQ("a number array"sv, name); + auto data = std::get<std::span< + std::uint64_t const>>(value); + ATF_REQUIRE_EQ(true, + std::ranges::equal(number_array, data)); + + } else if (std::holds_alternative< + std::vector< + std::string_view>>(value)) { + ATF_REQUIRE_EQ("a string array"sv, name); + auto data = std::get<std::vector< + std::string_view>>(value); + ATF_REQUIRE_EQ(true, + std::ranges::equal(string_array, data)); + + } else if (std::holds_alternative< + std::span<int const>>(value)) { + ATF_REQUIRE_EQ("a descriptor array"sv, name); + auto data = std::get<std::span<int const>>(value); + ATF_REQUIRE_EQ(2, std::ranges::size(data)); + // XXX: should test we get the actual descriptors + + } else if (std::holds_alternative< + std::vector<bsd::const_nv_list>>(value)) { + ATF_REQUIRE_EQ("an nvlist array"sv, name); + auto data = std::get<std::vector< + bsd::const_nv_list>>(value); + ATF_REQUIRE_EQ(1, std::ranges::size(data)); + auto n = data[0].get_number("an array number"); + ATF_REQUIRE_EQ(4242, n); + } else ATF_REQUIRE_EQ(true, false); @@ -114,7 +170,7 @@ TEST_CASE(nvxx_basic_iterate) ++begin; } - ATF_REQUIRE_EQ(7, i); + ATF_REQUIRE_EQ(12, i); } ATF_INIT_TEST_CASES(tcs) |
