// // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // BinaryStream.h: Provides binary serialization of simple types. #ifndef LIBGLESV2_BINARYSTREAM_H_ #define LIBGLESV2_BINARYSTREAM_H_ #include "common/angleutils.h" namespace gl { class BinaryInputStream { public: BinaryInputStream(const void *data, size_t length) { mError = false; mOffset = 0; mData = static_cast(data); mLength = length; } template void read(T *v, size_t num) { union { T dummy; // Compilation error for non-trivial types } dummy; (void) dummy; if (mError) { return; } size_t length = num * sizeof(T); if (mOffset + length > mLength) { mError = true; return; } memcpy(v, mData + mOffset, length); mOffset += length; } template void read(T * v) { read(v, 1); } void read(std::string *v) { size_t length; read(&length); if (mError) { return; } if (mOffset + length > mLength) { mError = true; return; } v->assign(mData + mOffset, length); mOffset += length; } void skip(size_t length) { if (mOffset + length > mLength) { mError = true; return; } mOffset += length; } size_t offset() const { return mOffset; } bool error() const { return mError; } bool endOfStream() const { return mOffset == mLength; } private: DISALLOW_COPY_AND_ASSIGN(BinaryInputStream); bool mError; size_t mOffset; const char *mData; size_t mLength; }; class BinaryOutputStream { public: BinaryOutputStream() { } template void write(const T *v, size_t num) { union { T dummy; // Compilation error for non-trivial types } dummy; (void) dummy; const char *asBytes = reinterpret_cast(v); mData.insert(mData.end(), asBytes, asBytes + num * sizeof(T)); } template void write(const T &v) { write(&v, 1); } void write(const std::string &v) { size_t length = v.length(); write(length); write(v.c_str(), length); } size_t length() const { return mData.size(); } const void* data() const { return mData.size() ? &mData[0] : NULL; } private: DISALLOW_COPY_AND_ASSIGN(BinaryOutputStream); std::vector mData; }; } #endif // LIBGLESV2_BINARYSTREAM_H_