zero_copy_stream_reader.h 1.8 KB
Newer Older
gejun's avatar
gejun committed
1
// Copyright (c) 2014 Baidu, Inc.
gejun's avatar
gejun committed
2 3 4 5
// File: iobuf_read_stream.h
// Author: Zhangyi Chen (chenzhangyi01@baidu.com)
// Date: 2014/10/29 15:01:09

gejun's avatar
gejun committed
6 7
#ifndef  BRPC_JSON2PB_ZERO_COPY_STREAM_READER_H
#define  BRPC_JSON2PB_ZERO_COPY_STREAM_READER_H
gejun's avatar
gejun committed
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

#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

gejun's avatar
gejun committed
73
#endif  //BRPC_JSON2PB_ZERO_COPY_STREAM_READER_H