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