stream.h 1.85 KB
Newer Older
1
2
3
#ifndef STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66

4
#if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
5
6
7
#pragma once
#endif

8

9
10
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/mark.h"
Jesse Beder's avatar
Jesse Beder committed
11
#include <cstddef>
12
#include <deque>
13
#include <ios>
14
15
#include <iostream>
#include <set>
Jesse Beder's avatar
Jesse Beder committed
16
#include <string>
17
18
19

namespace YAML
{
20
	class Stream: private noncopyable
21
	{
22
	public:
23
24
		friend class StreamCharSource;
		
25
26
		Stream(std::istream& input);
		~Stream();
27

28
29
		operator bool() const;
		bool operator !() const { return !static_cast <bool>(*this); }
30

31
		char peek() const;
32
33
34
35
		char get();
		std::string get(int n);
		void eat(int n = 1);

36
		static char eof() { return 0x04; }
37
38
39
40
41
42
		
		const Mark mark() const { return m_mark; }
		int pos() const { return m_mark.pos; }
		int line() const { return m_mark.line; }
		int column() const { return m_mark.column; }
		void ResetColumn() { m_mark.column = 0; }
43

44
	private:
45
46
47
		enum CharacterSet {utf8, utf16le, utf16be, utf32le, utf32be};

		std::istream& m_input;
48
49
		Mark m_mark;
		
50
51
52
53
54
55
56
57
58
59
60
61
62
63
		CharacterSet m_charSet;
		mutable std::deque<char> m_readahead;
		unsigned char* const m_pPrefetched;
		mutable size_t m_nPrefetchedAvailable;
		mutable size_t m_nPrefetchedUsed;
		
		void AdvanceCurrent();
		char CharAt(size_t i) const;
		bool ReadAheadTo(size_t i) const;
		bool _ReadAheadTo(size_t i) const;
		void StreamInUtf8() const;
		void StreamInUtf16() const;
		void StreamInUtf32() const;
		unsigned char GetNextByte() const;
64
	};
65
66
67
68
69
70
71
72
73
74
75
76

	// CharAt
	// . Unchecked access
	inline char Stream::CharAt(size_t i) const {
		return m_readahead[i];
	}
	
	inline bool Stream::ReadAheadTo(size_t i) const {
		if(m_readahead.size() > i)
			return true;
		return _ReadAheadTo(i);
	}	
77
}
78
79

#endif // STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66