From ab5a998903e95469e850b43dfb7c2eee356d04cb Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 22 Mar 2022 15:09:07 +0100 Subject: [PATCH] Sort StructuredDataDef members and entries alphabetically after parsing --- .../StructuredDataDef/CommonStructuredDataEnum.cpp | 12 ++++++++++-- .../StructuredDataDef/CommonStructuredDataEnum.h | 3 ++- .../AssetLoaders/AssetLoaderStructuredDataDefSet.cpp | 6 ++++-- .../AssetLoaders/AssetLoaderStructuredDataDefSet.h | 4 ++-- .../Sequence/StructuredDataEnumScopeSequences.cpp | 6 ------ .../Sequence/StructuredDataStructScopeSequences.cpp | 3 --- .../AssetDumpers/AssetDumperStructuredDataDefSet.cpp | 2 +- 7 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.cpp b/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.cpp index 15c79971..1eaee34f 100644 --- a/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.cpp +++ b/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.cpp @@ -47,7 +47,7 @@ uint32_t CommonStructuredDataEnum::CalculateChecksum(const uint32_t initialValue const auto littleEndianElementCount = endianness::ToLittleEndian(ElementCount()); checksum = crc32(checksum, reinterpret_cast(&littleEndianElementCount), sizeof(littleEndianElementCount)); - for(const auto& entry : m_entries) + for (const auto& entry : m_entries) { checksum = crc32(checksum, reinterpret_cast(entry.m_name.c_str()), entry.m_name.size() + 1); @@ -58,10 +58,18 @@ uint32_t CommonStructuredDataEnum::CalculateChecksum(const uint32_t initialValue return checksum; } -void CommonStructuredDataEnum::SortEntries() +void CommonStructuredDataEnum::SortEntriesByOffset() { std::sort(m_entries.begin(), m_entries.end(), [](const CommonStructuredDataEnumEntry& e1, const CommonStructuredDataEnumEntry& e2) { return e1.m_value < e2.m_value; }); } + +void CommonStructuredDataEnum::SortEntriesByName() +{ + std::sort(m_entries.begin(), m_entries.end(), [](const CommonStructuredDataEnumEntry& e1, const CommonStructuredDataEnumEntry& e2) + { + return e1.m_name < e2.m_name; + }); +} diff --git a/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.h b/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.h index 09fd65a4..3d9d63f6 100644 --- a/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.h +++ b/src/ObjCommon/StructuredDataDef/CommonStructuredDataEnum.h @@ -27,5 +27,6 @@ struct CommonStructuredDataEnum _NODISCARD size_t ElementCount() const; _NODISCARD uint32_t CalculateChecksum(uint32_t initialValue) const; - void SortEntries(); + void SortEntriesByOffset(); + void SortEntriesByName(); }; diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp index 7ba70e75..12dc47b3 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp @@ -53,7 +53,7 @@ StructuredDataType AssetLoaderStructuredDataDefSet::ConvertType(CommonStructured } } -void AssetLoaderStructuredDataDefSet::ConvertEnum(StructuredDataEnum* outputEnum, const CommonStructuredDataEnum* inputEnum, MemoryManager* memory) +void AssetLoaderStructuredDataDefSet::ConvertEnum(StructuredDataEnum* outputEnum, CommonStructuredDataEnum* inputEnum, MemoryManager* memory) { outputEnum->entryCount = static_cast(inputEnum->m_entries.size()); if (inputEnum->m_reserved_entry_count <= 0) @@ -61,6 +61,7 @@ void AssetLoaderStructuredDataDefSet::ConvertEnum(StructuredDataEnum* outputEnum else outputEnum->reservedEntryCount = inputEnum->m_reserved_entry_count; + inputEnum->SortEntriesByName(); if (!inputEnum->m_entries.empty()) { outputEnum->entries = static_cast(memory->Alloc(sizeof(StructuredDataEnumEntry) * inputEnum->m_entries.size())); @@ -77,12 +78,13 @@ void AssetLoaderStructuredDataDefSet::ConvertEnum(StructuredDataEnum* outputEnum outputEnum->entries = nullptr; } -void AssetLoaderStructuredDataDefSet::ConvertStruct(StructuredDataStruct* outputStruct, const CommonStructuredDataStruct* inputStruct, MemoryManager* memory) +void AssetLoaderStructuredDataDefSet::ConvertStruct(StructuredDataStruct* outputStruct, CommonStructuredDataStruct* inputStruct, MemoryManager* memory) { outputStruct->size = static_cast(inputStruct->m_size_in_byte); outputStruct->bitOffset = inputStruct->m_bit_offset; outputStruct->propertyCount = static_cast(inputStruct->m_properties.size()); + inputStruct->SortPropertiesByName(); if (!inputStruct->m_properties.empty()) { outputStruct->properties = static_cast(memory->Alloc(sizeof(StructuredDataStructProperty) * inputStruct->m_properties.size())); diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.h b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.h index 70dce1ca..eefdb00d 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.h +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.h @@ -13,8 +13,8 @@ namespace IW4 _NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override; _NODISCARD bool CanLoadFromRaw() const override; static StructuredDataType ConvertType(CommonStructuredDataType inputType); - static void ConvertEnum(StructuredDataEnum* outputEnum, const CommonStructuredDataEnum* inputEnum, MemoryManager* memory); - static void ConvertStruct(StructuredDataStruct* outputStruct, const CommonStructuredDataStruct* inputStruct, MemoryManager* memory); + static void ConvertEnum(StructuredDataEnum* outputEnum, CommonStructuredDataEnum* inputEnum, MemoryManager* memory); + static void ConvertStruct(StructuredDataStruct* outputStruct, CommonStructuredDataStruct* inputStruct, MemoryManager* memory); static void ConvertIndexedArray(StructuredDataIndexedArray* outputIndexedArray, const CommonStructuredDataIndexedArray* inputIndexedArray, MemoryManager* memory); static void ConvertEnumedArray(StructuredDataEnumedArray* outputEnumedArray, const CommonStructuredDataEnumedArray* inputEnumedArray, MemoryManager* memory); static void ConvertDef(StructuredDataDef* outputDef, const CommonStructuredDataDef* inputDef, MemoryManager* memory); diff --git a/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataEnumScopeSequences.cpp b/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataEnumScopeSequences.cpp index 0febb697..4e6153eb 100644 --- a/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataEnumScopeSequences.cpp +++ b/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataEnumScopeSequences.cpp @@ -54,12 +54,6 @@ namespace sdd::enum_scope_sequences void ProcessMatch(StructuredDataDefParserState* state, SequenceResult& result) const override { assert(state->m_current_enum != nullptr); - - std::sort(state->m_current_enum->m_entries.begin(), state->m_current_enum->m_entries.end(), [](const CommonStructuredDataEnumEntry& e1, const CommonStructuredDataEnumEntry& e2) - { - return e1.m_name < e2.m_name; - }); - state->m_current_enum = nullptr; } }; diff --git a/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataStructScopeSequences.cpp b/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataStructScopeSequences.cpp index 9512dea9..382a2ebc 100644 --- a/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataStructScopeSequences.cpp +++ b/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataStructScopeSequences.cpp @@ -234,9 +234,6 @@ namespace sdd::struct_scope_sequences state->m_current_struct->m_size_in_byte = utils::Align(state->m_current_struct_padding_offset, 8u) / 8; state->m_current_struct_padding_offset = 0u; - - // Sort the entries of the struct alphabetically - state->m_current_struct->SortPropertiesByName(); state->m_current_struct = nullptr; } }; diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperStructuredDataDefSet.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperStructuredDataDefSet.cpp index ebe7ea20..ea98bde8 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperStructuredDataDefSet.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperStructuredDataDefSet.cpp @@ -82,7 +82,7 @@ void AssetDumperStructuredDataDefSet::ConvertEnum(CommonStructuredDataEnum* out, outEntry.m_value = inEntry.index; } - out->SortEntries(); + out->SortEntriesByOffset(); } void AssetDumperStructuredDataDefSet::ConvertStruct(const CommonStructuredDataDef* def, const StructuredDataDef* gameDef, CommonStructuredDataStruct* out, const StructuredDataStruct* in, const size_t structIndex)