mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-30 02:37:36 +02:00
Initial range support in scan
This commit is contained in:
@ -76,7 +76,6 @@ TEST(scan_test, separator) {
|
|||||||
EXPECT_EQ(n2, 20);
|
EXPECT_EQ(n2, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FMT_HAVE_STRPTIME
|
|
||||||
struct num {
|
struct num {
|
||||||
int value;
|
int value;
|
||||||
};
|
};
|
||||||
@ -93,10 +92,9 @@ template <> struct scanner<num> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class ScanContext>
|
template <class ScanContext>
|
||||||
auto scan(num&, ScanContext& ctx) const -> typename ScanContext::iterator {
|
auto scan(num& n, ScanContext& ctx) const -> typename ScanContext::iterator {
|
||||||
// TODO
|
// TODO: handle specifier
|
||||||
// return fmt::scan({ctx.begin(), ctx.end()}, "{}", n.value);
|
return fmt::scan(ctx, "{}", n.value);
|
||||||
return ctx.begin();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace fmt
|
} // namespace fmt
|
||||||
@ -105,9 +103,8 @@ TEST(scan_test, read_custom) {
|
|||||||
auto input = "42";
|
auto input = "42";
|
||||||
auto n = num();
|
auto n = num();
|
||||||
fmt::scan(input, "{:}", n);
|
fmt::scan(input, "{:}", n);
|
||||||
// EXPECT_EQ(n, 42);
|
EXPECT_EQ(n.value, 42);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(scan_test, invalid_format) {
|
TEST(scan_test, invalid_format) {
|
||||||
EXPECT_THROW_MSG(fmt::scan("", "{}"), fmt::format_error,
|
EXPECT_THROW_MSG(fmt::scan("", "{}"), fmt::format_error,
|
||||||
|
15
test/scan.h
15
test/scan.h
@ -94,6 +94,10 @@ class scan_buffer {
|
|||||||
value_ = *buf->ptr_;
|
value_ = *buf->ptr_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
friend scan_buffer& get_buffer(iterator it) {
|
||||||
|
return *it.buf_;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
iterator() : ptr_(sentinel()), buf_(nullptr) {}
|
iterator() : ptr_(sentinel()), buf_(nullptr) {}
|
||||||
|
|
||||||
@ -154,7 +158,7 @@ class string_scan_buffer : public scan_buffer {
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
void flockfile(FILE* f) { _lock_file(f); }
|
void flockfile(FILE* f) { _lock_file(f); }
|
||||||
void funlockfile(FILE* f) { _unlock_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
|
#endif
|
||||||
|
|
||||||
// A FILE wrapper. F is FILE defined as a template parameter to make
|
// 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());
|
return input.begin() + (buf.begin().base() - input.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename InputRange, typename... T,
|
||||||
|
FMT_ENABLE_IF(!std::is_convertible<InputRange, string_view>::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 <typename... T> bool scan(std::FILE* f, string_view fmt, T&... args) {
|
template <typename... T> bool scan(std::FILE* f, string_view fmt, T&... args) {
|
||||||
auto&& buf = detail::file_scan_buffer(f);
|
auto&& buf = detail::file_scan_buffer(f);
|
||||||
vscan(buf, fmt, make_scan_args(args...));
|
vscan(buf, fmt, make_scan_args(args...));
|
||||||
|
Reference in New Issue
Block a user