From 410f401aef244871c926341fce78e931e2849ce1 Mon Sep 17 00:00:00 2001 From: Till W Date: Sun, 25 May 2025 13:07:11 +0200 Subject: [PATCH] flags enum stuff --- src/dependency/minidef/src/CppGen.cpp | 61 ++++++++++++++++++++++++-- src/dependency/minidef/src/MiniDef.cpp | 6 +++ src/dependency/minidef/src/TypeDef.h | 7 +++ tools/minidef.exe | 4 +- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/dependency/minidef/src/CppGen.cpp b/src/dependency/minidef/src/CppGen.cpp index 2757a25..7b2b9e4 100644 --- a/src/dependency/minidef/src/CppGen.cpp +++ b/src/dependency/minidef/src/CppGen.cpp @@ -55,6 +55,9 @@ namespace Gen constexpr char EnumField1[] = R"END( %s, )END"; + constexpr char EnumFieldNumbered2[] = + R"END( %s = %s, +)END"; constexpr char EnumNamesStart2[] = R"END( }; @@ -71,6 +74,25 @@ namespace Gen }; )END"; + constexpr char EnumFlagOperators12[] = + R"END( inline %s::Enum operator| (const %s::Enum& a, const %s::Enum& b) + { + return a | b; + } + inline %s::Enum operator& (const %s::Enum& a, const %s::Enum& b) + { + return a & b; + } + inline %s::Enum operator|= (%s::Enum& a, const %s::Enum& b) + { + return a |= b; + } + inline %s::Enum operator&= (%s::Enum& a, const %s::Enum& b) + { + return a &= b; + } +)END"; + constexpr char FileEnd[] = R"END(} )END"; @@ -124,6 +146,7 @@ namespace Gen } // Failed to resolve hash, the type definition chaned since the file was saved! try to match by name. + *obj = {}; int32_t nameMatchIdx = serializer.TypeBuf.FindDefByName(typeName); if (nameMatchIdx < 0) { @@ -328,6 +351,7 @@ void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions) for (int32_t enumIdx = 0; enumIdx < definitions.EnumCount; ++enumIdx) { const Def::Enum& e = definitions.Enums[enumIdx]; + bool isFlagsEnum = (uint32_t)e.EnumFlags & (uint32_t)Def::EEnumFlags::FlagsEnum; if (!IsValid(e.EnumType)) { @@ -335,12 +359,24 @@ void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions) continue; } - char Buf[Def::MaxNameLength]{0}; - PrintTypeName(Buf, sizeof(Buf), e.EnumType, definitions); - Write(WriteTemplates::EnumHeader4, e.Name, definitions.TypeCount + enumIdx, e.EntryCount, Buf); + char enumTypeNameBuf[Def::MaxNameLength]{0}; + PrintTypeName(enumTypeNameBuf, sizeof(enumTypeNameBuf), e.EnumType, definitions); + Write(WriteTemplates::EnumHeader4, e.Name, definitions.TypeCount + enumIdx, e.EntryCount, enumTypeNameBuf); for (int32_t entryIdx = 0; entryIdx < e.EntryCount; ++entryIdx) { - Write(WriteTemplates::EnumField1, e.EntryNames[entryIdx]); + if (isFlagsEnum) + { + char numBuf[64] = "0"; + if (entryIdx > 0) + { + bx::snprintf(numBuf, sizeof(numBuf), "1 << %u", entryIdx - 1); + } + Write(WriteTemplates::EnumFieldNumbered2, e.EntryNames[entryIdx], numBuf); + } + else + { + Write(WriteTemplates::EnumField1, e.EntryNames[entryIdx]); + } } Write(WriteTemplates::EnumNamesStart2, "EntryNames", Def::MaxNameLength); @@ -359,6 +395,23 @@ void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions) } Write(WriteTemplates::EnumNamesEnd); + + if (isFlagsEnum) + { + Write(WriteTemplates::EnumFlagOperators12, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name, + e.Name); + } } } void CppFileWriter::WriteTypes(const Def::DefinitionFile& definitions) diff --git a/src/dependency/minidef/src/MiniDef.cpp b/src/dependency/minidef/src/MiniDef.cpp index 11aad36..e752cd3 100644 --- a/src/dependency/minidef/src/MiniDef.cpp +++ b/src/dependency/minidef/src/MiniDef.cpp @@ -283,6 +283,12 @@ Parser::Result Parser::HandleEnum() e.EnumType = {(uint16_t)Gen::KnownType::i32, Def::EFieldType::DefinedClass}; } + if (CmpAdvance("Flags", Res) && Res == OK) + { + e.EnumFlags = (Def::EEnumFlags)((uint32_t)e.EnumFlags | (uint32_t)Def::EEnumFlags::FlagsEnum); + CHECK(SkipWhitespace()); + } + CHECK(ExpectChar("{")); CHECK(SkipWhitespace()); while (!CmpAdvance("}", Res)) diff --git a/src/dependency/minidef/src/TypeDef.h b/src/dependency/minidef/src/TypeDef.h index 46a5d2a..8e0768a 100644 --- a/src/dependency/minidef/src/TypeDef.h +++ b/src/dependency/minidef/src/TypeDef.h @@ -25,6 +25,12 @@ namespace Def DynamicArray = 1 << 0, }; + enum class EEnumFlags : uint32_t + { + None = 0, + FlagsEnum = 1, + }; + struct TypeRef { uint16_t TypeIdx = UINT16_MAX; @@ -58,6 +64,7 @@ namespace Def char ExtraStringFieldNames[MaxExtraEnumFields][MaxNameLength]; char ExtraStringFields[MaxFields][MaxExtraEnumFields][MaxNameLength]; char Name[MaxNameLength]{0}; + EEnumFlags EnumFlags = EEnumFlags::None; uint32_t Hash = 0; }; diff --git a/tools/minidef.exe b/tools/minidef.exe index df94859..65f6b1b 100644 --- a/tools/minidef.exe +++ b/tools/minidef.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e9808e99c44500636ce2fe352667531a6d18c3ad05b665a744db6ef6b53f1f0 -size 216064 +oid sha256:6f1ea8f1d8ea97e9a6ba272f6553e8b6cab415aa9384e7e028d7157d3ada3bec +size 217600