Welcome to mirror list, hosted at ThFree Co, Russian Federation.

filewritestream.h « rapidjson « include - github.com/miloyip/rapidjson.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9f0ce65964667df5da6f6ff4a24fbe0342b068b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef RAPIDJSON_FILEWRITESTREAM_H_
#define RAPIDJSON_FILEWRITESTREAM_H_

#include "rapidjson.h"
#include <cstdio>

namespace rapidjson {

//! Wrapper of C file stream for input using fread().
/*!
	\note implements Stream concept
*/
class FileWriteStream {
public:
	typedef char Ch;	//!< Character type. Only support char.

	FileWriteStream(FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { 
		RAPIDJSON_ASSERT(fp_ != 0);
	}

	void Put(char c) { 
		if (current_ >= bufferEnd_)
			Flush();

		*current_++ = c;
	}

	void PutN(char c, size_t n) {
		size_t avail = static_cast<size_t>(bufferEnd_ - current_);
		while (n > avail) {
			memset(current_, c, avail);
			current_ += avail;
			Flush();
			n -= avail;
			avail = static_cast<size_t>(bufferEnd_ - current_);
		}

		if (n > 0) {
			memset(current_, c, n);
			current_ += n;
		}
	}

	void Flush() {
		if (current_ != buffer_) {
			fwrite(buffer_, 1, static_cast<size_t>(current_ - buffer_), fp_);
			current_ = buffer_;
		}
	}

	// Not implemented
	char Peek() const { RAPIDJSON_ASSERT(false); return 0; }
	char Take() { RAPIDJSON_ASSERT(false); return 0; }
	size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; }
	char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
	size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; }

private:
	FILE* fp_;
	char *buffer_;
	char *bufferEnd_;
	char *current_;
};

//! Implement specialized version of PutN() with memset() for better performance.
template<>
inline void PutN(FileWriteStream& stream, char c, size_t n) {
	stream.PutN(c, n);
}

} // namespace rapidjson

#endif // RAPIDJSON_FILESTREAM_H_