1 #ifndef STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66
4 #if defined(_MSC_VER) || \
5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
10 #include "yaml-cpp/noncopyable.h"
11 #include "yaml-cpp/mark.h"
20 class Stream : private noncopyable {
22 friend class StreamCharSource;
24 Stream(std::istream& input);
27 operator bool() const;
28 bool operator!() const { return !static_cast<bool>(*this); }
32 std::string get(int n);
35 static char eof() { return 0x04; }
37 const Mark mark() const { return m_mark; }
38 int pos() const { return m_mark.pos; }
39 int line() const { return m_mark.line; }
40 int column() const { return m_mark.column; }
41 void ResetColumn() { m_mark.column = 0; }
44 enum CharacterSet { utf8, utf16le, utf16be, utf32le, utf32be };
46 std::istream& m_input;
49 CharacterSet m_charSet;
50 mutable std::deque<char> m_readahead;
51 unsigned char* const m_pPrefetched;
52 mutable size_t m_nPrefetchedAvailable;
53 mutable size_t m_nPrefetchedUsed;
55 void AdvanceCurrent();
56 char CharAt(size_t i) const;
57 bool ReadAheadTo(size_t i) const;
58 bool _ReadAheadTo(size_t i) const;
59 void StreamInUtf8() const;
60 void StreamInUtf16() const;
61 void StreamInUtf32() const;
62 unsigned char GetNextByte() const;
67 inline char Stream::CharAt(size_t i) const { return m_readahead[i]; }
69 inline bool Stream::ReadAheadTo(size_t i) const {
70 if (m_readahead.size() > i)
72 return _ReadAheadTo(i);
76 #endif // STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66