1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-23 12:08:45 +02:00

BinaryDeserializer: replace length check macro with inline function

This commit is contained in:
Arseniy Shestakov 2018-01-29 18:54:41 +03:00
parent fc3b8b2c87
commit ff2d01a03d

View File

@ -13,6 +13,7 @@
#include "CTypeList.h" #include "CTypeList.h"
#include "../mapObjects/CGHeroInstance.h" #include "../mapObjects/CGHeroInstance.h"
#include "../../Global.h"
class CStackInstance; class CStackInstance;
class FileStream; class FileStream;
@ -111,14 +112,17 @@ class DLL_LINKAGE BinaryDeserializer : public CLoaderBase
} }
}; };
#define READ_CHECK_U32(x) \ STRONG_INLINE ui32 readAndCheckLength()
ui32 length; \ {
load(length); \ ui32 length;
if(length > 500000) \ load(length);
{ \ if(length > 500000)
logGlobal->warn("Warning: very big length: %d", length);\ {
reader->reportState(logGlobal); \ logGlobal->warn("Warning: very big length: %d", length);
reader->reportState(logGlobal);
}; };
return length;
}
template <typename T> class CPointerLoader; template <typename T> class CPointerLoader;
@ -237,7 +241,7 @@ public:
template <typename T, typename std::enable_if < !std::is_same<T, bool >::value, int >::type = 0> template <typename T, typename std::enable_if < !std::is_same<T, bool >::value, int >::type = 0>
void load(std::vector<T> &data) void load(std::vector<T> &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.resize(length); data.resize(length);
for(ui32 i=0;i<length;i++) for(ui32 i=0;i<length;i++)
load( data[i]); load( data[i]);
@ -401,7 +405,7 @@ public:
template <typename T> template <typename T>
void load(std::set<T> &data) void load(std::set<T> &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.clear(); data.clear();
T ins; T ins;
for(ui32 i=0;i<length;i++) for(ui32 i=0;i<length;i++)
@ -413,7 +417,7 @@ public:
template <typename T, typename U> template <typename T, typename U>
void load(std::unordered_set<T, U> &data) void load(std::unordered_set<T, U> &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.clear(); data.clear();
T ins; T ins;
for(ui32 i=0;i<length;i++) for(ui32 i=0;i<length;i++)
@ -425,7 +429,7 @@ public:
template <typename T> template <typename T>
void load(std::list<T> &data) void load(std::list<T> &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.clear(); data.clear();
T ins; T ins;
for(ui32 i=0;i<length;i++) for(ui32 i=0;i<length;i++)
@ -444,7 +448,7 @@ public:
template <typename T1, typename T2> template <typename T1, typename T2>
void load(std::map<T1,T2> &data) void load(std::map<T1,T2> &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.clear(); data.clear();
T1 key; T1 key;
T2 value; T2 value;
@ -458,7 +462,7 @@ public:
template <typename T1, typename T2> template <typename T1, typename T2>
void load(std::multimap<T1, T2> &data) void load(std::multimap<T1, T2> &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.clear(); data.clear();
T1 key; T1 key;
T2 value; T2 value;
@ -471,7 +475,7 @@ public:
} }
void load(std::string &data) void load(std::string &data)
{ {
READ_CHECK_U32(length); ui32 length = readAndCheckLength();
data.resize(length); data.resize(length);
this->read((void*)data.c_str(),length); this->read((void*)data.c_str(),length);
} }