From e17bc67547a66cdd378ca6a90c56b865d30d6168 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Sun, 4 Feb 2024 07:44:11 -0800 Subject: [PATCH] Make scan variadic --- test/scan-test.cc | 15 ++++++++++----- test/scan.h | 11 ++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/test/scan-test.cc b/test/scan-test.cc index e9ffbe791181..2ff322a751b1 100644 --- a/test/scan-test.cc +++ b/test/scan-test.cc @@ -111,11 +111,16 @@ TEST(scan_test, invalid_format) { } TEST(scan_test, example) { - std::string key; - int value = 0; - fmt::scan_to("answer = 42", "{} = {}", key, value); - EXPECT_EQ(key, "answer"); - EXPECT_EQ(value, 42); + // Example from https://wg21.link/p1729r3. + if (auto result = fmt::scan("answer = 42", "{} = {}")) { +#ifdef __cpp_structured_bindings + const auto& [key, value] = result->values(); + EXPECT_EQ(key, "answer"); + EXPECT_EQ(value, 42); +#endif + } else { + FAIL(); + } } TEST(scan_test, end_of_input) { fmt::scan("", "{}"); } diff --git a/test/scan.h b/test/scan.h index 2e3f8f7a4d65..7e477fed3318 100644 --- a/test/scan.h +++ b/test/scan.h @@ -582,6 +582,8 @@ template class scan_data { return std::get<0>(values_); } + auto values() const -> const std::tuple& { return values_; } + auto make_args() -> std::array { auto args = std::array(); detail::make_args<0>(args, values_); @@ -600,10 +602,13 @@ class scan_error {}; template class expected { private: T value_; + bool has_value_ = true; public: expected(T value) : value_(std::move(value)) {} + explicit operator bool() const { return has_value_; } + auto operator->() const -> const T* { return &value_; } }; @@ -624,9 +629,9 @@ auto scan_to(string_view input, string_view fmt, T&... args) return vscan(input, fmt, make_scan_args(args...)); } -template -auto scan(string_view input, string_view fmt) -> scan_result { - auto data = scan_data(); +template +auto scan(string_view input, string_view fmt) -> scan_result { + auto data = scan_data(); vscan(input, fmt, data.make_args()); return data; }