@@ -94,6 +94,10 @@ class scan_buffer {
9494 value_ = *buf->ptr_ ;
9595 }
9696
97+ friend scan_buffer& get_buffer (iterator it) {
98+ return *it.buf_ ;
99+ }
100+
97101 public:
98102 iterator () : ptr_(sentinel()), buf_(nullptr ) {}
99103
@@ -154,7 +158,7 @@ class string_scan_buffer : public scan_buffer {
154158#ifdef _WIN32
155159void flockfile (FILE* f) { _lock_file (f); }
156160void funlockfile (FILE* f) { _unlock_file (f); }
157- int getc_unlocked (FILE * f) { return _fgetc_nolock (f); }
161+ int getc_unlocked (FILE* f) { return _fgetc_nolock (f); }
158162#endif
159163
160164// 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)
534538 return input.begin () + (buf.begin ().base () - input.data ());
535539}
536540
541+ template <typename InputRange, typename ... T,
542+ FMT_ENABLE_IF (!std::is_convertible<InputRange, string_view>::value)>
543+ auto scan(InputRange&& input, string_view fmt, T&... args)
544+ -> decltype(std::begin(input)) {
545+ auto it = std::begin (input);
546+ vscan (get_buffer (it), fmt, make_scan_args (args...));
547+ return it;
548+ }
549+
537550template <typename ... T> bool scan (std::FILE* f, string_view fmt, T&... args) {
538551 auto && buf = detail::file_scan_buffer (f);
539552 vscan (buf, fmt, make_scan_args (args...));
0 commit comments