forked from apache/brpc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzero_copy_stream_reader.h
73 lines (66 loc) · 1.8 KB
/
zero_copy_stream_reader.h
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
// Copyright (c) 2014 Baidu, Inc.
// File: iobuf_read_stream.h
// Author: Zhangyi Chen ([email protected])
// Date: 2014/10/29 15:01:09
#ifndef BRPC_JSON2PB_ZERO_COPY_STREAM_READER_H
#define BRPC_JSON2PB_ZERO_COPY_STREAM_READER_H
#include <google/protobuf/io/zero_copy_stream.h> // ZeroCopyInputStream
namespace json2pb {
class ZeroCopyStreamReader {
public:
typedef char Ch;
ZeroCopyStreamReader(google::protobuf::io::ZeroCopyInputStream *stream)
: _data(NULL), _data_size(0), _nread(0), _stream(stream) {
}
//Take a charactor and return its address.
const char* PeekAddr() {
if (!ReadBlockTail()) {
return _data;
}
while (_stream->Next((const void **)&_data, &_data_size)) {
if (!ReadBlockTail()) {
return _data;
}
}
return NULL;
}
const char* TakeWithAddr() {
const char* c = PeekAddr();
if (c) {
++_nread;
--_data_size;
return _data++;
}
return NULL;
}
char Take() {
const char* c = PeekAddr();
if (c) {
++_nread;
--_data_size;
++_data;
return *c;
}
return '\0';
}
char Peek() {
const char* c = PeekAddr();
return (c ? *c : '\0');
}
//Tell whether read the end of this block.
bool ReadBlockTail() {
return !_data_size;
}
size_t Tell() { return _nread; }
void Put(char) {}
void Flush() {}
char *PutBegin() { return NULL; }
size_t PutEnd(char *) { return 0; }
private:
const char *_data;
int _data_size;
size_t _nread;
google::protobuf::io::ZeroCopyInputStream *_stream;
};
} // namespace json2pb
#endif //BRPC_JSON2PB_ZERO_COPY_STREAM_READER_H