diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2020-05-23 23:33:57 +0300 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2020-05-25 14:25:05 +0200 |
commit | 813c483a312e1b1b4fa5a02234009ec546a0cc8c (patch) | |
tree | 8cbe1568270f49fa13caf0ca92948695c8fac386 /libbutl/char-scanner.ixx | |
parent | 095beb64a0752317a9a1d9777284a6c9343417cc (diff) |
Add putback depth char_scanner template parameter
Diffstat (limited to 'libbutl/char-scanner.ixx')
-rw-r--r-- | libbutl/char-scanner.ixx | 52 |
1 files changed, 25 insertions, 27 deletions
diff --git a/libbutl/char-scanner.ixx b/libbutl/char-scanner.ixx index 7e9c4b0..57aefc2 100644 --- a/libbutl/char-scanner.ixx +++ b/libbutl/char-scanner.ixx @@ -3,36 +3,33 @@ namespace butl { - template <typename V> - inline char_scanner<V>:: + template <typename V, std::size_t N> + inline char_scanner<V, N>:: char_scanner (std::istream& is, bool crlf, std::uint64_t l, std::uint64_t p) : char_scanner (is, validator_type (), crlf, l, p) { } - template <typename V> - inline auto char_scanner<V>:: + template <typename V, std::size_t N> + inline auto char_scanner<V, N>:: peek (std::string& what) -> xchar { return peek (&what); } - template <typename V> - inline auto char_scanner<V>:: + template <typename V, std::size_t N> + inline auto char_scanner<V, N>:: peek () -> xchar { return peek (nullptr /* what */); } - template <typename V> - inline auto char_scanner<V>:: + template <typename V, std::size_t N> + inline auto char_scanner<V, N>:: get (std::string* what) -> xchar { - if (unget_) - { - unget_ = false; - return ungetc_; - } + if (ungetn_ != 0) + return ungetb_[--ungetn_]; else { xchar c (peek (what)); @@ -41,33 +38,34 @@ namespace butl } } - template <typename V> - inline auto char_scanner<V>:: + template <typename V, std::size_t N> + inline auto char_scanner<V, N>:: get (std::string& what) -> xchar { return get (&what); } - template <typename V> - inline auto char_scanner<V>:: + template <typename V, std::size_t N> + inline auto char_scanner<V, N>:: get () -> xchar { return get (nullptr /* what */); } - template <typename V> - inline void char_scanner<V>:: + template <typename V, std::size_t N> + inline void char_scanner<V, N>:: unget (const xchar& c) { // Because iostream::unget cannot work once eos is reached, we have to // provide our own implementation. // - unget_ = true; - ungetc_ = c; + assert (ungetn_ != N); // Make sure the buffer is not filled. + + ungetb_[ungetn_++] = c; } - template <typename V> - inline auto char_scanner<V>:: + template <typename V, std::size_t N> + inline auto char_scanner<V, N>:: peek_ () -> int_type { if (gptr_ != egptr_) @@ -86,8 +84,8 @@ namespace butl return r; } - template <typename V> - inline void char_scanner<V>:: + template <typename V, std::size_t N> + inline void char_scanner<V, N>:: get_ () { int_type c; @@ -106,8 +104,8 @@ namespace butl save_->push_back (static_cast<char_type> (c)); } - template <typename V> - inline std::uint64_t char_scanner<V>:: + template <typename V, std::size_t N> + inline std::uint64_t char_scanner<V, N>:: pos_ () const { return buf_ != nullptr ? buf_->tellg () : 0; |