diff --git a/packages/serialization/include/serialization/SerializationBase.h b/packages/serialization/include/serialization/SerializationBase.h index 072cd82..1e15c69 100644 --- a/packages/serialization/include/serialization/SerializationBase.h +++ b/packages/serialization/include/serialization/SerializationBase.h @@ -42,24 +42,9 @@ namespace l::serialization { archive(self.mIdentifier, self.mVersion); } - bool Peek(std::vector& 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& data); + bool IsIdentifierValid(); + bool IsVersionValid(int32_t latestVersion); int32_t mIdentifier; int32_t mVersion; @@ -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& 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& data) { - zpp::serializer::memory_output_archive out(data); - out(*this); - } + void LoadArchiveData(std::vector& data); + void GetArchiveData(std::vector& data); friend zpp::serializer::access; template @@ -179,9 +119,7 @@ namespace l::serialization { } } - int32_t GetVersion() const { - return mVersion; - } + int32_t GetVersion() const; protected: virtual void Save(SaveArchive&) const {} @@ -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 { diff --git a/packages/serialization/source/common/SerializationBase.cpp b/packages/serialization/source/common/SerializationBase.cpp index 85aeb9f..d25481c 100644 --- a/packages/serialization/source/common/SerializationBase.cpp +++ b/packages/serialization/source/common/SerializationBase.cpp @@ -9,6 +9,95 @@ #include 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& 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& 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& 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; + } + }