Add an array operations to CDataPack (#1219)

This commit is contained in:
Deathreus
2020-05-08 15:23:48 -07:00
committed by GitHub
parent bc89e54f6d
commit 13621a1274
4 changed files with 291 additions and 1 deletions
+69
View File
@@ -123,6 +123,28 @@ void CDataPack::PackString(const char *string)
elements.insert(position++, val);
}
void CDataPack::PackCellArray(cell_t const *vals, cell_t count)
{
InternalPack val;
val.type = CDataPackType::CellArray;
val.pData.aval = new cell_t [count + 1];
memcpy(&val.pData.aval[1], vals, sizeof(cell_t) * (count + 1));
val.pData.aval[0] = count;
elements.insert(position++, val);
}
void CDataPack::PackFloatArray(cell_t const *vals, cell_t count)
{
InternalPack val;
val.type = CDataPackType::FloatArray;
val.pData.aval = new cell_t [count + 1];
memcpy(&val.pData.aval[1], vals, sizeof(cell_t) * (count + 1));
val.pData.aval[0] = count;
elements.insert(position++, val);
}
void CDataPack::Reset() const
{
position = 0;
@@ -188,6 +210,46 @@ const char *CDataPack::ReadString(size_t *len) const
return val.chars();
}
cell_t *CDataPack::ReadCellArray(cell_t *size) const
{
if (!IsReadable() || elements[position].type != CDataPackType::CellArray)
{
if(size)
*size = 0;
return nullptr;
}
cell_t *val = elements[position].pData.aval;
cell_t *ptr = &(val[1]);
++position;
if (size)
*size = val[0];
return ptr;
}
cell_t *CDataPack::ReadFloatArray(cell_t *size) const
{
if (!IsReadable() || elements[position].type != CDataPackType::FloatArray)
{
if(size)
*size = 0;
return nullptr;
}
cell_t *val = elements[position].pData.aval;
cell_t *ptr = &(val[1]);
++position;
if (size)
*size = val[0];
return ptr;
}
void *CDataPack::ReadMemory(size_t *size) const
{
void *ptr = nullptr;
@@ -239,6 +301,13 @@ bool CDataPack::RemoveItem(size_t pos)
delete elements[pos].pData.sval;
break;
}
case CDataPackType::CellArray:
case CDataPackType::FloatArray:
{
delete elements[pos].pData.aval;
break;
}
}
elements.remove(pos);