dvander@70: /* vim: set ts=4 sw=4 tw=99 et: dvander@70: * dvander@70: * Copyright (C) 2012 David Anderson dvander@70: * dvander@70: * This file is part of JITCraft. dvander@70: * dvander@70: * JITCraft is free software: you can redistribute it and/or modify it under dvander@70: * the terms of the GNU General Public License as published by the Free dvander@70: * Software Foundation, either version 3 of the License, or (at your option) dvander@70: * any later version. dvander@70: * dvander@70: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@70: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@70: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@70: * dvander@70: * You should have received a copy of the GNU General Public License along with dvander@70: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@70: */ dvander@70: #ifndef _include_jc_compact_buffer_h_ dvander@70: #define _include_jc_compact_buffer_h_ dvander@70: dvander@70: #include "AllocatorPolicies.h" dvander@70: #include "Utility.h" dvander@70: #include "Vector.h" dvander@70: dvander@70: namespace ke { dvander@70: dvander@70: class CompactBufferReader dvander@70: { dvander@70: const uint8 *pos_; dvander@70: const uint8 *end_; dvander@70: dvander@70: public: dvander@70: CompactBufferReader(const uint8 *start, const uint8 *end) dvander@70: : pos_(start), dvander@70: end_(end) dvander@70: { dvander@70: } dvander@70: dvander@70: uint8 readUint8() { dvander@70: assert(pos_ < end_); dvander@70: return *pos_++; dvander@70: } dvander@70: dvander@70: uint32 readUint32() { dvander@70: uint32 value = 0; dvander@70: uint32 shift = 0; dvander@70: dvander@70: uint8 byte; dvander@70: do { dvander@70: byte = readUint8(); dvander@70: value |= (byte >> 1) << shift; dvander@70: shift += 7; dvander@70: } while (byte & 1); dvander@70: dvander@70: assert(shift < 32); dvander@70: return value; dvander@70: } dvander@70: dvander@70: bool done() const { dvander@70: return pos_ == end_; dvander@70: } dvander@70: }; dvander@70: dvander@70: class CompactBufferWriter dvander@70: { dvander@70: Vector buffer_; dvander@70: bool enoughMemory_; dvander@70: dvander@70: public: dvander@70: CompactBufferWriter() dvander@70: : enoughMemory_(true) dvander@70: { dvander@70: } dvander@70: dvander@70: void writeUint8(unsigned value) { dvander@70: enoughMemory_ &= buffer_.append(value); dvander@70: } dvander@70: void writeUint32(unsigned value) { dvander@70: do { dvander@70: writeUint8(((value & 0x7F) << 1) | (value > 0x7F)); dvander@70: value >>= 7; dvander@70: } while (value); dvander@70: } dvander@70: dvander@70: uint8 *buffer() const { dvander@70: return buffer_.buffer(); dvander@70: } dvander@70: size_t length() const { dvander@70: return buffer_.length(); dvander@70: } dvander@70: dvander@70: bool oom() const { dvander@70: return !enoughMemory_; dvander@70: } dvander@70: }; dvander@70: dvander@70: } dvander@70: dvander@70: #endif // _include_jc_compact_buffer_h_