diff --git a/VulkanHppGenerator.cpp b/VulkanHppGenerator.cpp index 2e5ab13..e4a886f 100644 --- a/VulkanHppGenerator.cpp +++ b/VulkanHppGenerator.cpp @@ -60,7 +60,6 @@ std::string trimEnd(std::string const& input); void writeArgumentCount(std::ostream & os, size_t vectorIndex, std::string const& vectorName, std::string const& counterName, size_t returnParamIndex, size_t templateParamIndex, bool twoStep, bool singular); void writeBitmask(std::ostream & os, std::string const& bitmaskName, std::string const& bitmaskAlias, std::string const& enumName, std::vector> const& enumValues); void writeBitmaskToStringFunction(std::ostream & os, std::string const& flagsName, std::string const& enumName, std::vector> const& enumValues); -void writeEnumToString(std::ostream & os, std::string const& enumName, std::vector> const& enumValues); std::string writeFunctionBodyEnhancedLocalReturnVariableSingular(std::ostream & os, std::string const& indentation, std::string const& typeName, std::string const&returnName, bool isStructureChain); std::pair writeFunctionBodyStandardReturn(std::string const& returnType); @@ -684,43 +683,6 @@ ${cases} os << replaceWithMap(toStringTemplate, { { "typeName", bitmaskName },{ "argumentName", enumValues.empty() ? " " : " value " },{ "functionBody", functionBody } }); } -void writeEnumToString(std::ostream & os, std::string const& enumName, std::vector> const& enumValues) -{ - std::string functionBody; - if (enumValues.empty()) - { - functionBody = "\n return \"(void)\";"; - } - else - { - static const std::string caseTemplate = R"( case ${type}::${value} : return "${valueText}";)"; - std::ostringstream casesString; - for (auto const& value : enumValues) - { - casesString << replaceWithMap(caseTemplate, { { "type", enumName },{ "value", value.second },{ "valueText", value.second.substr(1) } }) << std::endl; - } - - static const std::string switchTemplate = R"( - switch ( value ) - { -${cases} default: return "invalid"; - })"; - functionBody = replaceWithMap(switchTemplate, { { "cases", casesString.str() } }); - } - - static const std::string enumToString = R"( - VULKAN_HPP_INLINE std::string to_string( ${typeName}${argumentName} ) - {${functionBody} - } -)"; - os << replaceWithMap(enumToString, - { - { "typeName", enumName }, - { "argumentName", enumValues.empty() ? "" : " value" }, - { "functionBody", functionBody } - }); -} - std::string writeFunctionBodyEnhancedLocalReturnVariableSingular(std::ostream & os, std::string const& indentation, std::string const& typeName, std::string const& returnName, bool isStructureChain) { std::string adjustedReturnName = stripPluralS(returnName); @@ -2276,23 +2238,18 @@ void VulkanHppGenerator::writeBitmasks(std::ostream & os) const { for (auto const& bitmask : m_bitmasks) { - std::string protect = bitmask.second.platform.empty() ? "" : m_platforms.find(bitmask.second.platform)->second; - if (!protect.empty()) - { - os << std::endl - << "#ifdef " << protect; - } - auto bitmaskBits = m_bitmaskBits.find(bitmask.second.requires); assert(bitmaskBits != m_bitmaskBits.end()); + + os << std::endl; + writePlatformEnter(os, bitmask.second.platform); writeEnum(os, *bitmaskBits); - std::string strippedEnumName = stripPrefix(bitmaskBits->first, "Vk"); - writeEnumToString(os, strippedEnumName, bitmaskBits->second.values); + writeEnumToString(os, *bitmaskBits); std::string strippedBitmaskName = stripPrefix(bitmask.first, "Vk"); + std::string strippedEnumName = stripPrefix(bitmaskBits->first, "Vk"); writeBitmask(os, strippedBitmaskName, bitmask.second.alias, strippedEnumName, bitmaskBits->second.values); writeBitmaskToStringFunction(os, strippedBitmaskName, strippedEnumName, bitmaskBits->second.values); - - leaveProtect(os, protect); + writePlatformLeave(os, bitmask.second.platform); } } @@ -2557,18 +2514,13 @@ void VulkanHppGenerator::writeEnum(std::ostream & os, std::pairsecond; - - static const std::string enumTemplate = R"(${enterProtect} - enum class ${name} + static const std::string enumTemplate = +R"( enum class ${name} {${values}}; -${leaveProtect})"; +)"; os << replaceWithMap(enumTemplate, { - { "enterProtect", protect.empty() ? "" : ("\n#ifdef " + protect) }, - { "leaveProtect", protect.empty() ? "" : ("#endif /*" + protect + "*/\n") }, { "name", stripPrefix(enumData.first, "Vk") }, { "values", values }, }); @@ -2578,11 +2530,52 @@ void VulkanHppGenerator::writeEnums(std::ostream & os) const { for (auto const& e : m_enums) { + os << std::endl; + writePlatformEnter(os, e.second.platform); writeEnum(os, e); - writeEnumToString(os, stripPrefix(e.first, "Vk"), e.second.values); + writeEnumToString(os, e); + writePlatformLeave(os, e.second.platform); } } +void VulkanHppGenerator::writeEnumToString(std::ostream & os, std::pair const& enumData) const +{ + std::string enumName = stripPrefix(enumData.first, "Vk"); + std::string functionBody; + if (enumData.second.values.empty()) + { + functionBody = "\n return \"(void)\";"; + } + else + { + static const std::string caseTemplate = R"( case ${type}::${value} : return "${valueText}";)"; + std::ostringstream casesString; + for (auto const& value : enumData.second.values) + { + casesString << replaceWithMap(caseTemplate, { { "type", enumName },{ "value", value.second },{ "valueText", value.second.substr(1) } }) << std::endl; + } + + static const std::string switchTemplate = R"( + switch ( value ) + { +${cases} default: return "invalid"; + })"; + functionBody = replaceWithMap(switchTemplate, { { "cases", casesString.str() } }); + } + + static const std::string enumToString = R"( + VULKAN_HPP_INLINE std::string to_string( ${typeName}${argumentName} ) + {${functionBody} + } +)"; + os << replaceWithMap(enumToString, + { + { "typeName", enumName }, + { "argumentName", enumData.second.values.empty() ? "" : " value" }, + { "functionBody", functionBody } + }); +} + void VulkanHppGenerator::writeForwardDeclarations(std::ostream & os) const { os << std::endl; @@ -3601,6 +3594,26 @@ void VulkanHppGenerator::writeResultExceptions(std::ostream & os) const os << std::endl; } +void VulkanHppGenerator::writePlatformEnter(std::ostream & os, std::string const& platform) const +{ + if (!platform.empty()) + { + auto it = m_platforms.find(platform); + assert((it != m_platforms.end()) && !it->second.empty()); + os << "#ifdef " << it->second << std::endl; + } +} + +void VulkanHppGenerator::writePlatformLeave(std::ostream & os, std::string const& platform) const +{ + if (!platform.empty()) + { + auto it = m_platforms.find(platform); + assert((it != m_platforms.end()) && !it->second.empty()); + os << "#endif /*" << it->second << "*/" << std::endl; + } +} + void VulkanHppGenerator::writeStruct(std::ostream & os, std::pair const& structure, std::set & listedStructures) const { if (listedStructures.find(structure.first) == listedStructures.end()) diff --git a/VulkanHppGenerator.hpp b/VulkanHppGenerator.hpp index cdf8f5d..808e0b8 100644 --- a/VulkanHppGenerator.hpp +++ b/VulkanHppGenerator.hpp @@ -189,6 +189,7 @@ class VulkanHppGenerator void writeArgumentVulkanType(std::ostream & os, ParamData const& paramData) const; void writeCommand(std::ostream &os, std::string const& indentation, std::string const& name, std::pair const& commandData, bool definition) const; void writeEnum(std::ostream & os, std::pair const& enumData) const; + void writeEnumToString(std::ostream & os, std::pair const& enumData) const; void writeFunction(std::ostream & os, std::string const& indentation, std::string const& name, std::pair const& commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const& vectorParamIndices, bool twoStep, std::string const& enhancedReturnType, bool definition, bool enhanced, bool singular, bool unique, bool isStructureChain, bool withAllocator) const; void writeFunctionBodyEnhanced(std::ostream & os, std::string const& indentation, std::string const& commandName, std::pair const& commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const& vectorParamIndices, bool twoStep, std::string const& enhancedReturnType, bool singular, bool unique, bool isStructureChain, bool withAllocator) const; std::string writeFunctionBodyEnhancedLocalReturnVariable(std::ostream & os, std::string const& indentation, CommandData const& commandData, size_t returnParamIndex, std::map const& vectorParamIndices, bool twoStep, std::string const& enhancedReturnType, bool singular, bool isStructureChain, bool withAllocator) const; @@ -211,6 +212,8 @@ class VulkanHppGenerator void writeFunctionHeaderReturnType(std::ostream & os, CommandData const& commandData, size_t returnParamIndex, std::map const& vectorParamIndices, std::string const& enhancedReturnType, bool enhanced, bool singular, bool unique, bool isStructureChain) const; void writeFunctionHeaderTemplate(std::ostream & os, std::string const& indentation, size_t returnParamIndex, size_t templateParamIndex, std::string const& enhancedReturnType, bool enhanced, bool singular, bool unique, bool withDefault, bool isStructureChain) const; void writeHandle(std::ostream & os, std::pair const& handle, std::set & listedHandles) const; + void writePlatformEnter(std::ostream & os, std::string const& platform) const; + void writePlatformLeave(std::ostream & os, std::string const& platform) const; void writeStruct(std::ostream & os, std::pair const& structure, std::set & listedStructures) const; void writeStructCompareOperators(std::ostream & os, std::pair const& structure) const; void writeStructConstructor(std::ostream & os, std::pair const& structData) const;