#pragma once #include #include // Structs or classes struct DeclStruct { std::string name; }; 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 { std::string name; std::vector elements; EnumUnderlyingType underlyingType; // Start with invalid value, calculate on demand EnumValuePattern pattern = EVP_COUNT; EnumValuePattern CalcPattern() const; void CalcPatternIfNecessary(); }; struct DeclFunctionArgument { std::string type; std::string name; }; struct DeclFunction { // Things like extern, static, etc. that gets written before the function return type std::string prefix; std::string name; std::string returnType; std::vector arguments; std::string body; };