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)73inline char Stream::CharAt(size_t i) const { return m_readahead[i]; } 74 ReadAheadTo(size_t i)75inline 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