Skip to content

Commit

Permalink
Structure serialization code better.
Browse files Browse the repository at this point in the history
  • Loading branch information
linuscu committed Sep 29, 2024
1 parent a415088 commit 89b20f4
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 82 deletions.
92 changes: 11 additions & 81 deletions packages/serialization/include/serialization/SerializationBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,24 +42,9 @@ namespace l::serialization {
archive(self.mIdentifier, self.mVersion);
}

bool Peek(std::vector<unsigned char>& data) {
if (data.size() < 4*2) { // identifier + version = 8 bytes
return false;
}
zpp::serializer::memory_input_archive_peek inPeek(data);
inPeek(*this);
return true;
}

bool IsIdentifierValid() {
return mIdentifier == kHeaderIdentifier;
}
bool IsVersionValid(int32_t latestVersion) {
if (mIdentifier != kHeaderIdentifier) {
mVersion = mIdentifier; // we might have loaded data without identifier but with version, so check
}
return mVersion >= 0 && mVersion <= latestVersion;
}
bool Peek(std::vector<unsigned char>& data);
bool IsIdentifierValid();
bool IsVersionValid(int32_t latestVersion);

int32_t mIdentifier;
int32_t mVersion;
Expand Down Expand Up @@ -91,58 +76,13 @@ namespace l::serialization {
}
virtual ~SerializationBase() = default;

SerializationBase& operator=(SerializationBase&& other) noexcept {
mIdentifier = other.mIdentifier;
mVersion = other.mVersion;
mLatestVersion = other.mLatestVersion;
mFiletype = other.mFiletype;
mUseIdentifier = other.mUseIdentifier;
mUseVersion = other.mUseVersion;
mUseFiletype = other.mUseFiletype;
return *this;
}
SerializationBase& operator=(const SerializationBase& other) noexcept {
mIdentifier = other.mIdentifier;
mVersion = other.mVersion;
mLatestVersion = other.mLatestVersion;
mFiletype = other.mFiletype;
mUseIdentifier = other.mUseIdentifier;
mUseVersion = other.mUseVersion;
mUseFiletype = other.mUseFiletype;
return *this;
}
SerializationBase(SerializationBase&& other) noexcept {
*this = std::move(other);
}
SerializationBase(const SerializationBase& other) noexcept {
*this = other;
}

void LoadArchiveData(std::vector<unsigned char>& data) {
HeaderValidity headerValidity;
bool peekSuccessful = headerValidity.Peek(data);
if (peekSuccessful && headerValidity.IsIdentifierValid()) {
mUseIdentifier = true;
mUseVersion = true;
}
else {
mUseIdentifier = false;
if (mUseVersion) {
ASSERT(peekSuccessful && headerValidity.IsVersionValid(mLatestVersion));
}
}
SerializationBase& operator=(SerializationBase&& other) noexcept;
SerializationBase& operator=(const SerializationBase& other) noexcept;
SerializationBase(SerializationBase&& other) noexcept;
SerializationBase(const SerializationBase& other) noexcept;

zpp::serializer::memory_input_archive in(data);
in(*this);

mUseIdentifier = true;
mUseVersion = true;
}

void GetArchiveData(std::vector<unsigned char>& data) {
zpp::serializer::memory_output_archive out(data);
out(*this);
}
void LoadArchiveData(std::vector<unsigned char>& data);
void GetArchiveData(std::vector<unsigned char>& data);

friend zpp::serializer::access;
template <typename Archive, typename Self>
Expand Down Expand Up @@ -179,9 +119,7 @@ namespace l::serialization {
}
}

int32_t GetVersion() const {
return mVersion;
}
int32_t GetVersion() const;

protected:
virtual void Save(SaveArchive&) const {}
Expand All @@ -197,15 +135,7 @@ namespace l::serialization {
bool mUseVersion = true;
bool mUseFiletype = false;

void UpgradeToLatest() {
mLatestVersion = mVersion > mLatestVersion ? mVersion : mLatestVersion;
if (mUseVersion) {
for (; mVersion < mLatestVersion; mVersion++) {
Upgrade(mVersion);
}
}
mVersion = mVersion < mLatestVersion ? mLatestVersion : mVersion;
}
void UpgradeToLatest();
};

class Config : public SerializationBase {
Expand Down
91 changes: 90 additions & 1 deletion packages/serialization/source/common/SerializationBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,95 @@
#include <ctime>

namespace l::serialization {
const int32_t kIdentifier = 0x00defa00; // storage base file identifier
const int32_t kHeaderIdentifier = 0x00defa00; // storage base file identifier

bool HeaderValidity::Peek(std::vector<unsigned char>& data) {
if (data.size() < 4 * 2) { // identifier + version = 8 bytes
return false;
}
zpp::serializer::memory_input_archive_peek inPeek(data);
inPeek(*this);
return true;
}

bool HeaderValidity::IsIdentifierValid() {
return mIdentifier == kHeaderIdentifier;
}
bool HeaderValidity::IsVersionValid(int32_t latestVersion) {
if (mIdentifier != kHeaderIdentifier) {
mVersion = mIdentifier; // we might have loaded data without identifier but with version, so check
}
return mVersion >= 0 && mVersion <= latestVersion;
}

/******************************************************************************/

SerializationBase& SerializationBase::operator=(SerializationBase&& other) noexcept {
mIdentifier = other.mIdentifier;
mVersion = other.mVersion;
mLatestVersion = other.mLatestVersion;
mFiletype = other.mFiletype;
mUseIdentifier = other.mUseIdentifier;
mUseVersion = other.mUseVersion;
mUseFiletype = other.mUseFiletype;
return *this;
}
SerializationBase& SerializationBase::operator=(const SerializationBase& other) noexcept {
mIdentifier = other.mIdentifier;
mVersion = other.mVersion;
mLatestVersion = other.mLatestVersion;
mFiletype = other.mFiletype;
mUseIdentifier = other.mUseIdentifier;
mUseVersion = other.mUseVersion;
mUseFiletype = other.mUseFiletype;
return *this;
}
SerializationBase::SerializationBase(SerializationBase&& other) noexcept {
*this = std::move(other);
}
SerializationBase::SerializationBase(const SerializationBase& other) noexcept {
*this = other;
}

void SerializationBase::LoadArchiveData(std::vector<unsigned char>& data) {
HeaderValidity headerValidity;
bool peekSuccessful = headerValidity.Peek(data);
if (peekSuccessful && headerValidity.IsIdentifierValid()) {
mUseIdentifier = true;
mUseVersion = true;
}
else {
mUseIdentifier = false;
if (mUseVersion) {
ASSERT(peekSuccessful && headerValidity.IsVersionValid(mLatestVersion));
}
}

zpp::serializer::memory_input_archive in(data);
in(*this);

mUseIdentifier = true;
mUseVersion = true;
}

void SerializationBase::GetArchiveData(std::vector<unsigned char>& data) {
zpp::serializer::memory_output_archive out(data);
out(*this);
}

int32_t SerializationBase::GetVersion() const {
return mVersion;
}

void SerializationBase::UpgradeToLatest() {
mLatestVersion = mVersion > mLatestVersion ? mVersion : mLatestVersion;
if (mUseVersion) {
for (; mVersion < mLatestVersion; mVersion++) {
Upgrade(mVersion);
}
}
mVersion = mVersion < mLatestVersion ? mLatestVersion : mVersion;
}


}

0 comments on commit 89b20f4

Please sign in to comment.