diff -r 000000000000 -r 6474c204b198 gfx/angle/src/libGLESv2/BinaryStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/angle/src/libGLESv2/BinaryStream.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,164 @@ +// +// 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_