diff --git a/test/scan-test.cc b/test/scan-test.cc index f9ea9379..e2bfea3e 100644 --- a/test/scan-test.cc +++ b/test/scan-test.cc @@ -76,7 +76,6 @@ TEST(scan_test, separator) { EXPECT_EQ(n2, 20); } -#ifdef FMT_HAVE_STRPTIME struct num { int value; }; @@ -93,10 +92,9 @@ template <> struct scanner { } template - auto scan(num&, ScanContext& ctx) const -> typename ScanContext::iterator { - // TODO - // return fmt::scan({ctx.begin(), ctx.end()}, "{}", n.value); - return ctx.begin(); + auto scan(num& n, ScanContext& ctx) const -> typename ScanContext::iterator { + // TODO: handle specifier + return fmt::scan(ctx, "{}", n.value); } }; } // namespace fmt @@ -105,9 +103,8 @@ TEST(scan_test, read_custom) { auto input = "42"; auto n = num(); fmt::scan(input, "{:}", n); - // EXPECT_EQ(n, 42); + EXPECT_EQ(n.value, 42); } -#endif TEST(scan_test, invalid_format) { EXPECT_THROW_MSG(fmt::scan("", "{}"), fmt::format_error, diff --git a/test/scan.h b/test/scan.h index c03356a9..495ec628 100644 --- a/test/scan.h +++ b/test/scan.h @@ -94,6 +94,10 @@ class scan_buffer { value_ = *buf->ptr_; } + friend scan_buffer& get_buffer(iterator it) { + return *it.buf_; + } + public: iterator() : ptr_(sentinel()), buf_(nullptr) {} @@ -154,7 +158,7 @@ class string_scan_buffer : public scan_buffer { #ifdef _WIN32 void flockfile(FILE* f) { _lock_file(f); } void funlockfile(FILE* f) { _unlock_file(f); } -int getc_unlocked(FILE *f) { return _fgetc_nolock(f); } +int getc_unlocked(FILE* f) { return _fgetc_nolock(f); } #endif // A FILE wrapper. F is FILE defined as a template parameter to make @@ -534,6 +538,15 @@ auto scan(string_view input, string_view fmt, T&... args) return input.begin() + (buf.begin().base() - input.data()); } +template ::value)> +auto scan(InputRange&& input, string_view fmt, T&... args) + -> decltype(std::begin(input)) { + auto it = std::begin(input); + vscan(get_buffer(it), fmt, make_scan_args(args...)); + return it; +} + template bool scan(std::FILE* f, string_view fmt, T&... args) { auto&& buf = detail::file_scan_buffer(f); vscan(buf, fmt, make_scan_args(args...));