summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/BinaryStream.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/BinaryStream.h')
-rw-r--r--src/3rdparty/angle/src/libANGLE/BinaryStream.h97
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_