Create default StructuredDataDef struct when none was specified so there is always a root struct

This commit is contained in:
Jan 2022-01-22 14:35:43 +01:00
parent 5327ce8ec9
commit f061ff91f5
2 changed files with 23 additions and 7 deletions

View File

@ -95,7 +95,7 @@ void AssetLoaderStructuredDataDefSet::ConvertStruct(StructuredDataStruct* output
outputProperty.name = memory->Dup(inputProperty.m_name.c_str()); outputProperty.name = memory->Dup(inputProperty.m_name.c_str());
outputProperty.type = ConvertType(inputProperty.m_type); outputProperty.type = ConvertType(inputProperty.m_type);
if(outputProperty.type.type != DATA_BOOL) if (outputProperty.type.type != DATA_BOOL)
{ {
assert(inputProperty.m_offset_in_bits % 8 == 0); assert(inputProperty.m_offset_in_bits % 8 == 0);
outputProperty.offset = inputProperty.m_offset_in_bits / 8; outputProperty.offset = inputProperty.m_offset_in_bits / 8;

View File

@ -101,18 +101,34 @@ namespace sdd::def_scope_sequences
}); });
} }
private:
static void CreateDefaultStructWhenNoStructsSpecified(const StructuredDataDefParserState* state)
{
if (state->m_current_def->m_structs.empty())
{
state->m_current_def->m_structs.emplace_back(std::make_unique<CommonStructuredDataDefStruct>());
state->m_current_def->m_root_type = CommonStructuredDataDefType(CommonStructuredDataDefTypeCategory::STRUCT, 0u);
}
}
static void SetDefSizeFromRootStruct(const StructuredDataDefParserState* state)
{
if (state->m_current_def->m_root_type.m_category == CommonStructuredDataDefTypeCategory::STRUCT
&& state->m_current_def->m_root_type.m_info.type_index < state->m_current_def->m_structs.size())
{
const auto* _struct = state->m_current_def->m_structs[state->m_current_def->m_root_type.m_info.type_index].get();
state->m_current_def->m_size_in_byte = _struct->m_size_in_byte;
}
}
protected: protected:
void ProcessMatch(StructuredDataDefParserState* state, SequenceResult<SimpleParserValue>& result) const override void ProcessMatch(StructuredDataDefParserState* state, SequenceResult<SimpleParserValue>& result) const override
{ {
assert(state->m_current_enum == nullptr); assert(state->m_current_enum == nullptr);
assert(state->m_current_struct == nullptr); assert(state->m_current_struct == nullptr);
if(state->m_current_def->m_root_type.m_category == CommonStructuredDataDefTypeCategory::STRUCT CreateDefaultStructWhenNoStructsSpecified(state);
&& state->m_current_def->m_root_type.m_info.type_index < state->m_current_def->m_structs.size()) SetDefSizeFromRootStruct(state);
{
const auto* _struct = state->m_current_def->m_structs[state->m_current_def->m_root_type.m_info.type_index].get();
state->m_current_def->m_size_in_byte = _struct->m_size_in_byte;
}
state->m_current_def = nullptr; state->m_current_def = nullptr;
state->m_def_types_by_name.clear(); state->m_def_types_by_name.clear();