EncodedBuffer.h revision c23fad2f9079f678eae15338f5e57e2a6bf7e391
1c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin/*
2c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * Copyright (C) 2017 The Android Open Source Project
3c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *
4c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * Licensed under the Apache License, Version 2.0 (the "License");
5c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * you may not use this file except in compliance with the License.
6c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * You may obtain a copy of the License at
7c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *
8c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *      http://www.apache.org/licenses/LICENSE-2.0
9c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *
10c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * Unless required by applicable law or agreed to in writing, software
11c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * distributed under the License is distributed on an "AS IS" BASIS,
12c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * See the License for the specific language governing permissions and
14c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * limitations under the License.
15c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin */
16c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
17c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#ifndef ANDROID_UTIL_ENCODED_BUFFER_H
18c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#define ANDROID_UTIL_ENCODED_BUFFER_H
19c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
20c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#include <stdint.h>
21c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#include <vector>
22c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
23c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinnamespace android {
24c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinnamespace util {
25c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
26c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinusing namespace std;
27c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
28c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin/**
29c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * A stream of bytes containing a read pointer and a write pointer,
30c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * backed by a set of fixed-size buffers.  There are write functions for the
31c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * primitive types stored by protocol buffers, but none of the logic
32c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * for tags, inner objects, or any of that.
33c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *
34c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * Terminology:
35c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *      *Pos:       Position in the whole data set (as if it were a single buffer).
36c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *      *Index:     Index of a buffer within the mBuffers list.
37c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin *      *Offset:    Position within a buffer.
38c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin */
39c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinclass EncodedBuffer
40c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin{
41c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinpublic:
42c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EncodedBuffer();
43c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    EncodedBuffer(size_t chunkSize);
44c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    ~EncodedBuffer();
45c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
46c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    class Pointer {
47c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    public:
48c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        Pointer();
49c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        Pointer(size_t chunkSize);
50c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
51c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t pos() const;
52c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t index() const;
53c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t offset() const;
54c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
55c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        void move(size_t amt);
56c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        inline void move() { move(1); };
57c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
58c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        void rewind();
59c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        Pointer copy() const;
60c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
61c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    private:
62c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t mChunkSize;
63c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t mIndex;
64c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t mOffset;
65c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    };
66c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
67c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /******************************** Write APIs ************************************************/
68c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
69c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
70c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Returns the number of bytes written in the buffer
71c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
72c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    size_t size() const;
73c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
74c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
75c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Returns the write pointer.
76c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
77c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    Pointer* wp();
78c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
79c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
80c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Returns the current position of write pointer, if the write buffer is full, it will automatically
81c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * rotate to a new buffer with given chunkSize. If NULL is returned, it means NO_MEMORY
82c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
83c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    uint8_t* writeBuffer();
84c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
85c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
86c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Returns the writeable size in the current write buffer .
87c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
88c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    size_t currentToWrite();
89c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
90c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
91c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Write a varint into a vector. Return the size of the varint.
92c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
93c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    size_t writeRawVarint(uint32_t val);
94c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
95c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
96c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Write a protobuf header. Return the size of the header.
97c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
98c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    size_t writeHeader(uint32_t fieldId, uint8_t wireType);
99c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
100c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /********************************* Read APIs ************************************************/
101c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    class iterator;
102c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    friend class iterator;
103c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    class iterator {
104c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    public:
105c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        iterator(const EncodedBuffer& buffer);
106c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
107c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
108c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Returns the number of bytes written in the buffer
109c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
110c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t size() const;
111c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
112c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
113c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Returns the size of total bytes read.
114c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
115c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t bytesRead() const;
116c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
117c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
118c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Returns the read pointer.
119c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
120c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        Pointer* rp();
121c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
122c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
123c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Returns the current position of read pointer, if NULL is returned, it reaches end of buffer.
124c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
125c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        uint8_t const* readBuffer();
126c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
127c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
128c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Returns the readable size in the current read buffer.
129c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
130c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        size_t currentToRead();
131c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
132c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
133c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Returns true if next bytes is available for read.
134c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
135c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        bool hasNext();
136c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
137c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
138c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Reads the current byte and moves pointer 1 bit.
139c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
140c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        uint8_t next();
141c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
142c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        /**
143c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Read varint from iterator, the iterator will point to next available byte.
144c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         * Return the number of bytes of the varint.
145c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin         */
146c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        uint32_t readRawVarint();
147c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
148c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    private:
149c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        const EncodedBuffer& mData;
150c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin        Pointer mRp;
151c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    };
152c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
153c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    /**
154c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     * Returns the iterator of EncodedBuffer so it guarantees consumers won't be able to modified the buffer.
155c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin     */
156c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    iterator begin() const;
157c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
158c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinprivate:
159c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    size_t mChunkSize;
160c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    vector<uint8_t*> mBuffers;
161c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
162c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    Pointer mWp;
163c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
164c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin    inline uint8_t* at(const Pointer& p) const; // helper function to get value
165c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin};
166c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
167c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin} // util
168c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin} // android
169c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
170c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#endif // ANDROID_UTIL_ENCODED_BUFFER_H