#pragma once #include #include // TODO replace std::string name with std::string_view into the token storage? struct DeclNamespace { DeclNamespace* container = nullptr; std::string name; std::string_view fullname; // View into storage map key }; struct DeclStruct; struct DeclMemberVariable { DeclStruct* containerStruct = nullptr; std::string name; std::string type; std::string getterName; std::string setterName; }; struct DeclMemberFunction { DeclStruct* containerStruct = nullptr; // TODO }; // Structs or classes struct DeclStruct { DeclNamespace* container = nullptr; std::vector baseClasses; std::vector memberVariables; std::vector generatedVariables; std::vector memberFunctions; std::vector generatedFunctions; std::string name; std::string_view fullname; // Scanned generation options bool generating : 1 = false; bool generatingInheritanceHiearchy : 1 = false; }; enum EnumUnderlyingType { EUT_Int8, EUT_Int16, EUT_Int32, EUT_Int64, EUT_Uint8, EUT_Uint16, EUT_Uint32, EUT_Uint64, EUT_COUNT, }; enum EnumValuePattern { // The numbers cover n..m with no gaps EVP_Continuous, // The numbers cover for i in n..m, 1 << i // e.g. [0] = 1 << 0, // [1] = 1 << 1. // [2] = 1 << 2. etc. EVP_Bits, // The numbesr don't have a particular pattern EVP_Random, EVP_COUNT, }; struct DeclEnumElement { std::string name; // TODO support int64_t, etc. enum underlying types uint64_t value; }; struct DeclEnum { DeclNamespace* container = nullptr; std::string name; std::string_view fullname; std::vector elements; EnumUnderlyingType underlyingType; std::string underlyingTypeStr; // Start with invalid value, calculate on demand mutable EnumValuePattern pattern = EVP_COUNT; // TODO replace this with a regex? std::string generateRemovingPrefix; std::string generatingAddingPrefix; // NOTE: this flag acts as a gate for every specific generating option, must be enabled for them to work bool generating : 1 = false; bool generateToString : 1 = false; bool generateFromString : 1 = false; // NOTE: see GenerateForEnum() for the exact heuristics bool generateExcludeUseHeuristics : 1 = false; EnumValuePattern CalcPattern() const; EnumValuePattern GetPattern() const; }; struct DeclFunctionArgument { std::string type; std::string name; }; struct DeclFunction { DeclNamespace* container = nullptr; // Things like extern, static, etc. that gets written before the function return type std::string prefix; std::string name; std::string_view fullname; std::string returnType; std::vector arguments; std::string body; };