|
|
|
@@ -194,8 +194,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[this->size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < this->size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -265,8 +264,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -336,8 +334,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -398,17 +395,87 @@ namespace ehs
|
|
|
|
|
offset += sizeof(T) * value.Size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T, typename O = UInt_64>
|
|
|
|
|
void WriteStr(const T* str, N inSize = 0)
|
|
|
|
|
{
|
|
|
|
|
bool sizeKnown = inSize;
|
|
|
|
|
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
while (str[inSize])
|
|
|
|
|
inSize++;
|
|
|
|
|
|
|
|
|
|
N bSize = sizeof(T) * inSize;
|
|
|
|
|
N bSizeN = bSize;
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
bSizeN += sizeof(T);
|
|
|
|
|
|
|
|
|
|
if (bSizeN > size - offset)
|
|
|
|
|
{
|
|
|
|
|
N remainder = bSizeN - (size - offset);
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
|
size += remainder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (CPU::GetEndianness() == Endianness::LE)
|
|
|
|
|
{
|
|
|
|
|
if (endianness == Endianness::LE)
|
|
|
|
|
{
|
|
|
|
|
Util::Copy(&data[offset], &str[0], bSize);
|
|
|
|
|
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
*(T*)&data[offset + inSize] = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (N i = 0; i < inSize; ++i)
|
|
|
|
|
for (N b = 0; b < sizeof(T); ++b)
|
|
|
|
|
data[offset + sizeof(T) * i + b] = ((Byte*)&str[i])[sizeof(T) - i - 1];
|
|
|
|
|
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
*(T*)&data[offset + bSize] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (endianness == Endianness::LE)
|
|
|
|
|
{
|
|
|
|
|
for (N i = 0; i < inSize; ++i)
|
|
|
|
|
for (N b = 0; b < sizeof(T); ++b)
|
|
|
|
|
data[offset + sizeof(T) * i + b] = ((Byte*)&str[i])[sizeof(T) - i - 1];
|
|
|
|
|
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
*(T*)&data[offset + bSize] = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Util::Copy(&data[offset], &str[0], bSize);
|
|
|
|
|
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
*(T*)&data[offset + bSize] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
offset += bSizeN;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T, typename O = UInt_64>
|
|
|
|
|
void WriteStr(const Str<T, O>& str)
|
|
|
|
|
{
|
|
|
|
|
if (sizeof(N) + sizeof(T) * str.Size() > size - offset)
|
|
|
|
|
N inSize = sizeof(T) * (str.Size() + 1);
|
|
|
|
|
|
|
|
|
|
if (inSize > size - offset)
|
|
|
|
|
{
|
|
|
|
|
N remainder = sizeof(N) + sizeof(T) * str.Size() - (size - offset);
|
|
|
|
|
N remainder = inSize - (size - offset);
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -419,54 +486,38 @@ namespace ehs
|
|
|
|
|
{
|
|
|
|
|
if (endianness == Endianness::LE)
|
|
|
|
|
{
|
|
|
|
|
*(N*)&data[offset] = (N)str.Size();
|
|
|
|
|
Util::Copy(&data[offset], &str[0], str.Size(true));
|
|
|
|
|
|
|
|
|
|
offset += sizeof(N);
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < str.Size(); ++i)
|
|
|
|
|
*(T*)&data[offset + i * sizeof(T)] = str[i];
|
|
|
|
|
*(T*)&data[offset + str.Size(true)] = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
N tmpSize = (N)str.Size();
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < sizeof(N); ++i)
|
|
|
|
|
data[offset + i] = ((Byte*)&tmpSize)[sizeof(N) - i - 1];
|
|
|
|
|
|
|
|
|
|
offset += sizeof(N);
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < str.Size(); ++i)
|
|
|
|
|
for (N b = 0; b < sizeof(T); ++b)
|
|
|
|
|
data[offset + i * sizeof(T) + b] = ((Byte*)&str[i])[sizeof(T) - i - 1];
|
|
|
|
|
data[offset + sizeof(T) * i + b] = ((Byte*)&str[i])[sizeof(T) - i - 1];
|
|
|
|
|
|
|
|
|
|
*(T*)&data[offset + str.Size(true)] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (endianness == Endianness::LE)
|
|
|
|
|
{
|
|
|
|
|
N tmpSize = (N)str.Size();
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < sizeof(N); ++i)
|
|
|
|
|
data[offset + i] = ((Byte*)&tmpSize)[sizeof(N) - i - 1];
|
|
|
|
|
|
|
|
|
|
offset += sizeof(N);
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < str.Size(); ++i)
|
|
|
|
|
for (N b = 0; b < sizeof(T); ++b)
|
|
|
|
|
data[offset + i * sizeof(T) + b] = ((Byte*)&str[i])[sizeof(T) - i - 1];
|
|
|
|
|
data[offset + sizeof(T) * i + b] = ((Byte*)&str[i])[sizeof(T) - i - 1];
|
|
|
|
|
|
|
|
|
|
*(T*)&data[offset + str.Size(true)] = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*(N*)&data[offset] = (N)str.Size();
|
|
|
|
|
Util::Copy(&data[offset], &str[0], str.Size(true));
|
|
|
|
|
|
|
|
|
|
offset += sizeof(N);
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < str.Size(); ++i)
|
|
|
|
|
*(T*)&data[offset + i * sizeof(T)] = str[i];
|
|
|
|
|
*(T*)&data[offset + str.Size(true)] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
offset += str.Size() * sizeof(T);
|
|
|
|
|
offset += inSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WriteVersion(const Version& value)
|
|
|
|
@@ -477,8 +528,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -518,8 +568,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -559,8 +608,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -599,8 +647,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -640,8 +687,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -681,8 +727,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -721,8 +766,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -762,8 +806,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -803,8 +846,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -844,8 +886,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -885,8 +926,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -944,6 +984,26 @@ namespace ehs
|
|
|
|
|
offset += ser.Size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WritePadding(const N size)
|
|
|
|
|
{
|
|
|
|
|
if (size > this->size - offset)
|
|
|
|
|
{
|
|
|
|
|
N remainder = size - (this->size - offset);
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[this->size + remainder];
|
|
|
|
|
|
|
|
|
|
Util::Copy(r, data, this->size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
|
this->size += remainder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Util::Zero(&data[offset], size);
|
|
|
|
|
|
|
|
|
|
offset += size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
void Write(const T value)
|
|
|
|
|
{
|
|
|
|
@@ -953,8 +1013,7 @@ namespace ehs
|
|
|
|
|
|
|
|
|
|
Byte* r = new Byte[size + remainder];
|
|
|
|
|
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
r[i] = data[i];
|
|
|
|
|
Util::Copy(r, data, size);
|
|
|
|
|
|
|
|
|
|
delete[] data;
|
|
|
|
|
data = r;
|
|
|
|
@@ -1014,12 +1073,39 @@ namespace ehs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T, typename O>
|
|
|
|
|
Str<T, O> ReadStr(const O size = 0)
|
|
|
|
|
Str<T, O> ReadStr(O size = 0)
|
|
|
|
|
{
|
|
|
|
|
Str<T, O> result(size ? size : (O)Read<N>());
|
|
|
|
|
bool sizeKnown = size;
|
|
|
|
|
|
|
|
|
|
for (O i = 0; i < result.Size(); ++i)
|
|
|
|
|
result[i] = Read<T>();
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
while (&data[offset + sizeof(T) * size])
|
|
|
|
|
size++;
|
|
|
|
|
|
|
|
|
|
Str<T, O> result(size);
|
|
|
|
|
|
|
|
|
|
if (CPU::GetEndianness() == Endianness::LE)
|
|
|
|
|
{
|
|
|
|
|
if (endianness == Endianness::LE)
|
|
|
|
|
Util::Copy(&result[0], &data[offset], result.Size(true));
|
|
|
|
|
else
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
for (N b = 0; b < sizeof(T); ++b)
|
|
|
|
|
((Byte*)&result[i])[sizeof(T) - i - 1] = data[offset + sizeof(T) * i + b];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (endianness == Endianness::LE)
|
|
|
|
|
for (N i = 0; i < size; ++i)
|
|
|
|
|
for (N b = 0; b < sizeof(T); ++b)
|
|
|
|
|
((Byte*)&result[i])[sizeof(T) - i - 1] = data[offset + sizeof(T) * i + b];
|
|
|
|
|
else
|
|
|
|
|
Util::Copy(&result[0], &data[offset], result.Size(true));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
offset += result.Size(true);
|
|
|
|
|
|
|
|
|
|
if (!sizeKnown)
|
|
|
|
|
offset++;
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|