More elegant serialisation data structure.

Signed-off-by: Andrea Odetti <mariofutire@gmail.com>
This commit is contained in:
Andrea Odetti 2021-11-28 14:29:16 +00:00
parent 02740cee80
commit a16b2b2d35
3 changed files with 18 additions and 17 deletions

View file

@ -387,13 +387,13 @@ size_t retro_serialize_size(void)
bool retro_serialize(void *data, size_t size)
{
ra2::log_cb(RETRO_LOG_INFO, "RA2: %s\n", __FUNCTION__);
return ra2::RetroSerialisation::serialise(static_cast<char *>(data), size);
return ra2::RetroSerialisation::serialise(data, size);
}
bool retro_unserialize(const void *data, size_t size)
{
ra2::log_cb(RETRO_LOG_INFO, "RA2: %s\n", __FUNCTION__);
return ra2::RetroSerialisation::deserialise(static_cast<const char *>(data), size);
return ra2::RetroSerialisation::deserialise(data, size);
}
void retro_cheat_reset(void)

View file

@ -49,6 +49,12 @@ namespace
Snapshot_SaveState();
}
struct SerialisationFormat_t
{
uint32_t size;
char data[]; // zero-length array, containing the AW's yaml format
};
}
namespace ra2
@ -70,7 +76,7 @@ namespace ra2
return sizeof(uint32_t) + fileSize;
}
bool RetroSerialisation::serialise(char * data, size_t size)
bool RetroSerialisation::serialise(void * data, size_t size)
{
AutoFile autoFile;
if (!autoFile)
@ -89,19 +95,17 @@ namespace ra2
}
else
{
uint32_t * sizePtr = reinterpret_cast<uint32_t *>(data);
*sizePtr = fileSize;
char * dataPtr = data + sizeof(uint32_t);
SerialisationFormat_t * serialised = reinterpret_cast<SerialisationFormat_t *>(data);
serialised->size = fileSize;
ifs.seekg(0, std::ios::beg);
ifs.read(dataPtr, fileSize);
ifs.read(serialised->data, serialised->size);
return true;
}
}
bool RetroSerialisation::deserialise(const char * data, size_t size)
bool RetroSerialisation::deserialise(const void * data, size_t size)
{
AutoFile autoFile;
if (!autoFile)
@ -109,22 +113,19 @@ namespace ra2
return false;
}
const uint32_t * sizePtr = reinterpret_cast<const uint32_t *>(data);
const size_t fileSize = *sizePtr;
const SerialisationFormat_t * serialised = reinterpret_cast<const SerialisationFormat_t *>(data);
if (sizeof(uint32_t) + fileSize > size)
if (sizeof(uint32_t) + serialised->size > size)
{
return false;
}
else
{
const char * dataPtr = data + sizeof(uint32_t);
const std::string filename = autoFile.getFilename();
// do not remove the {} scope below!
{
std::ofstream ofs(filename, std::ios::binary);
ofs.write(dataPtr, fileSize);
ofs.write(serialised->data, serialised->size);
}
Snapshot_SetFilename(filename);

View file

@ -7,8 +7,8 @@ namespace ra2
{
public:
static size_t getSize();
static bool serialise(char * data, size_t size);
static bool deserialise(const char * data, size_t size);
static bool serialise(void * data, size_t size);
static bool deserialise(const void * data, size_t size);
};
}