|
|
|
@ -334,8 +334,9 @@ I ReadVarInt(Stream& is)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj)))
|
|
|
|
|
#define VARINT(obj) REF(WrapVarInt(REF(obj)))
|
|
|
|
|
#define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj)))
|
|
|
|
|
#define VARINT(obj) REF(WrapVarInt(REF(obj)))
|
|
|
|
|
#define LIMITED_STRING(obj,n) REF(LimitedString< n >(REF(obj)))
|
|
|
|
|
|
|
|
|
|
/** Wrapper for serializing arrays and POD.
|
|
|
|
|
*/
|
|
|
|
@ -398,6 +399,40 @@ public:
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<size_t Limit>
|
|
|
|
|
class LimitedString
|
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
std::string& string;
|
|
|
|
|
public:
|
|
|
|
|
LimitedString(std::string& string) : string(string) {}
|
|
|
|
|
|
|
|
|
|
template<typename Stream>
|
|
|
|
|
void Unserialize(Stream& s, int, int=0)
|
|
|
|
|
{
|
|
|
|
|
size_t size = ReadCompactSize(s);
|
|
|
|
|
if (size > Limit) {
|
|
|
|
|
throw std::ios_base::failure("String length limit exceeded");
|
|
|
|
|
}
|
|
|
|
|
string.resize(size);
|
|
|
|
|
if (size != 0)
|
|
|
|
|
s.read((char*)&string[0], size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename Stream>
|
|
|
|
|
void Serialize(Stream& s, int, int=0) const
|
|
|
|
|
{
|
|
|
|
|
WriteCompactSize(s, string.size());
|
|
|
|
|
if (!string.empty())
|
|
|
|
|
s.write((char*)&string[0], string.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned int GetSerializeSize(int, int=0) const
|
|
|
|
|
{
|
|
|
|
|
return GetSizeOfCompactSize(string.size()) + string.size();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<typename I>
|
|
|
|
|
CVarInt<I> WrapVarInt(I& n) { return CVarInt<I>(n); }
|
|
|
|
|
|
|
|
|
|