1 #ifndef STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66
3 
4 #if defined(_MSC_VER) ||                                            \
5     (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
6      (__GNUC__ >= 4))  // GCC supports "pragma once" correctly since 3.4
7 #pragma once
8 #endif
9 
10 #include "yaml-cpp/mark.h"
11 #include <cstddef>
12 #include <deque>
13 #include <ios>
14 #include <iostream>
15 #include <set>
16 #include <string>
17 
18 namespace YAML {
19 
20 class StreamCharSource;
21 
22 class Stream {
23  public:
24   friend class StreamCharSource;
25 
26   Stream(std::istream& input);
27   Stream(const Stream&) = delete;
28   Stream(Stream&&) = delete;
29   Stream& operator=(const Stream&) = delete;
30   Stream& operator=(Stream&&) = delete;
31   ~Stream();
32 
33   operator bool() const;
34   bool operator!() const { return !static_cast<bool>(*this); }
35 
36   char peek() const;
37   char get();
38   std::string get(int n);
39   void eat(int n = 1);
40 
eof()41   static char eof() { return 0x04; }
42 
mark()43   const Mark mark() const { return m_mark; }
pos()44   int pos() const { return m_mark.pos; }
line()45   int line() const { return m_mark.line; }
column()46   int column() const { return m_mark.column; }
ResetColumn()47   void ResetColumn() { m_mark.column = 0; }
48 
49  private:
50   enum CharacterSet { utf8, utf16le, utf16be, utf32le, utf32be };
51 
52   std::istream& m_input;
53   Mark m_mark;
54 
55   CharacterSet m_charSet;
56   mutable std::deque<char> m_readahead;
57   unsigned char* const m_pPrefetched;
58   mutable size_t m_nPrefetchedAvailable;
59   mutable size_t m_nPrefetchedUsed;
60 
61   void AdvanceCurrent();
62   char CharAt(size_t i) const;
63   bool ReadAheadTo(size_t i) const;
64   bool _ReadAheadTo(size_t i) const;
65   void StreamInUtf8() const;
66   void StreamInUtf16() const;
67   void StreamInUtf32() const;
68   unsigned char GetNextByte() const;
69 };
70 
71 // CharAt
72 // . Unchecked access
CharAt(size_t i)73 inline char Stream::CharAt(size_t i) const { return m_readahead[i]; }
74 
ReadAheadTo(size_t i)75 inline bool Stream::ReadAheadTo(size_t i) const {
76   if (m_readahead.size() > i)
77     return true;
78   return _ReadAheadTo(i);
79 }
80 }  // namespace YAML
81 
82 #endif  // STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66
83