diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/BinaryStream.h')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/BinaryStream.h | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/BinaryStream.h b/src/3rdparty/angle/src/libANGLE/BinaryStream.h index 3e6ccc7446..3e4c0934cf 100644 --- a/src/3rdparty/angle/src/libANGLE/BinaryStream.h +++ b/src/3rdparty/angle/src/libANGLE/BinaryStream.h @@ -9,25 +9,13 @@ #ifndef LIBANGLE_BINARYSTREAM_H_ #define LIBANGLE_BINARYSTREAM_H_ -#include "common/angleutils.h" -#include "common/mathutil.h" - #include <cstddef> #include <string> #include <vector> #include <stdint.h> -template <typename T> -void StaticAssertIsFundamental() -{ - // c++11 STL is not available on OSX or Android -#if !defined(ANGLE_PLATFORM_APPLE) && !defined(ANGLE_PLATFORM_ANDROID) - static_assert(std::is_fundamental<T>::value, "T must be a fundamental type."); -#else - union { T dummy; } dummy; - static_cast<void>(dummy); -#endif -} +#include "common/angleutils.h" +#include "common/mathutil.h" namespace gl { @@ -58,6 +46,16 @@ class BinaryInputStream : angle::NonCopyable *outValue = readInt<IntT>(); } + template <class IntT, class VectorElementT> + void readIntVector(std::vector<VectorElementT> *param) + { + unsigned int size = readInt<unsigned int>(); + for (unsigned int index = 0; index < size; ++index) + { + param->push_back(readInt<IntT>()); + } + } + bool readBool() { int value = 0; @@ -92,25 +90,31 @@ class BinaryInputStream : angle::NonCopyable return; } - if (!rx::IsUnsignedAdditionSafe(mOffset, length) || mOffset + length > mLength) + angle::CheckedNumeric<size_t> checkedOffset(mOffset); + checkedOffset += length; + + if (!checkedOffset.IsValid() || mOffset + length > mLength) { mError = true; return; } v->assign(reinterpret_cast<const char *>(mData) + mOffset, length); - mOffset += length; + mOffset = checkedOffset.ValueOrDie(); } void skip(size_t length) { - if (!rx::IsUnsignedAdditionSafe(mOffset, length) || mOffset + length > mLength) + angle::CheckedNumeric<size_t> checkedOffset(mOffset); + checkedOffset += length; + + if (!checkedOffset.IsValid() || mOffset + length > mLength) { mError = true; return; } - mOffset += length; + mOffset = checkedOffset.ValueOrDie(); } size_t offset() const @@ -142,24 +146,27 @@ class BinaryInputStream : angle::NonCopyable template <typename T> void read(T *v, size_t num) { - StaticAssertIsFundamental<T>(); + static_assert(std::is_fundamental<T>::value, "T must be a fundamental type."); - if (!rx::IsUnsignedMultiplicationSafe(num, sizeof(T))) + angle::CheckedNumeric<size_t> checkedLength(num); + checkedLength *= sizeof(T); + if (!checkedLength.IsValid()) { mError = true; return; } - size_t length = num * sizeof(T); + angle::CheckedNumeric<size_t> checkedOffset(mOffset); + checkedOffset += checkedLength; - if (!rx::IsUnsignedAdditionSafe(mOffset, length) || mOffset + length > mLength) + if (!checkedOffset.IsValid() || checkedOffset.ValueOrDie() > mLength) { mError = true; return; } - memcpy(v, mData + mOffset, length); - mOffset += length; + memcpy(v, mData + mOffset, checkedLength.ValueOrDie()); + mOffset = checkedOffset.ValueOrDie(); } template <typename T> @@ -173,19 +180,42 @@ class BinaryInputStream : angle::NonCopyable class BinaryOutputStream : angle::NonCopyable { public: - BinaryOutputStream() - { - } + BinaryOutputStream(); + ~BinaryOutputStream(); // writeInt also handles bool types template <class IntT> void writeInt(IntT param) { - ASSERT(rx::IsIntegerCastSafe<int>(param)); + ASSERT(angle::IsValueInRangeForNumericType<int>(param)); int intValue = static_cast<int>(param); write(&intValue, 1); } + // Specialized writeInt for values that can also be exactly -1. + template <class UintT> + void writeIntOrNegOne(UintT param) + { + if (param == static_cast<UintT>(-1)) + { + writeInt(-1); + } + else + { + writeInt(param); + } + } + + template <class IntT> + void writeIntVector(std::vector<IntT> param) + { + writeInt(param.size()); + for (IntT element : param) + { + writeIntOrNegOne(element); + } + } + void writeString(const std::string &v) { writeInt(v.length()); @@ -204,7 +234,7 @@ class BinaryOutputStream : angle::NonCopyable const void* data() const { - return mData.size() ? &mData[0] : NULL; + return mData.size() ? &mData[0] : nullptr; } private: @@ -213,12 +243,19 @@ class BinaryOutputStream : angle::NonCopyable template <typename T> void write(const T *v, size_t num) { - StaticAssertIsFundamental<T>(); + static_assert(std::is_fundamental<T>::value, "T must be a fundamental type."); const char *asBytes = reinterpret_cast<const char*>(v); mData.insert(mData.end(), asBytes, asBytes + num * sizeof(T)); } }; + +inline BinaryOutputStream::BinaryOutputStream() +{ } +inline BinaryOutputStream::~BinaryOutputStream() = default; + +} // namespace gl + #endif // LIBANGLE_BINARYSTREAM_H_ |