Added from_string methods.
This commit is contained in:
parent
84b77d1406
commit
3898cc8725
@ -478,6 +478,10 @@ ${baseTypes}
|
|||||||
#include <vulkan/${api}_to_string.hpp>
|
#include <vulkan/${api}_to_string.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined( VULKAN_HPP_NO_FROM_STRING )
|
||||||
|
#include <vulkan/${api}_from_string.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef VULKAN_HPP_NO_EXCEPTIONS
|
#ifndef VULKAN_HPP_NO_EXCEPTIONS
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
@ -776,6 +780,34 @@ ${enumsToString}
|
|||||||
writeToFile( str, vulkan_to_string_hpp );
|
writeToFile( str, vulkan_to_string_hpp );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VulkanHppGenerator::generateFromStringHppFile() const
|
||||||
|
{
|
||||||
|
std::string const vulkan_from_string_hpp = std::string( BASE_PATH ) + "/vulkan/" + m_api + "_from_string.hpp";
|
||||||
|
std::cout << "VulkanHppGenerator: Generating " << vulkan_from_string_hpp << "..." << std::endl;
|
||||||
|
|
||||||
|
std::string const vulkanHandlesHppTemplate = R"(${licenseHeader}
|
||||||
|
#ifndef VULKAN_FROM_STRING_HPP
|
||||||
|
# define VULKAN_FROM_STRING_HPP
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <vulkan/${api}_enums.hpp>
|
||||||
|
|
||||||
|
namespace VULKAN_HPP_NAMESPACE
|
||||||
|
{
|
||||||
|
${enumsFromString}
|
||||||
|
} // namespace VULKAN_HPP_NAMESPACE
|
||||||
|
#endif
|
||||||
|
)";
|
||||||
|
|
||||||
|
std::string str = replaceWithMap( vulkanHandlesHppTemplate,
|
||||||
|
{ { "api", m_api },
|
||||||
|
{ "enumsFromString", generateEnumsFromString() },
|
||||||
|
{ "licenseHeader", m_vulkanLicenseHeader } } );
|
||||||
|
|
||||||
|
writeToFile( str, vulkan_from_string_hpp );
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanHppGenerator::generateCppModuleFile() const
|
void VulkanHppGenerator::generateCppModuleFile() const
|
||||||
{
|
{
|
||||||
std::string const vulkan_cppm = std::string( BASE_PATH ) + "/vulkan/" + m_api + ".cppm";
|
std::string const vulkan_cppm = std::string( BASE_PATH ) + "/vulkan/" + m_api + ".cppm";
|
||||||
@ -6790,6 +6822,174 @@ ${functionBody}
|
|||||||
{ { "argument", enumData.second.values.empty() ? "" : " value" }, { "enumName", enumName }, { "functionBody", functionBody } } );
|
{ { "argument", enumData.second.values.empty() ? "" : " value" }, { "enumName", enumName }, { "functionBody", functionBody } } );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string VulkanHppGenerator::generateEnumsFromString() const
|
||||||
|
{
|
||||||
|
const std::string enumsFromStringTemplate = R"(
|
||||||
|
#define VULKAN_HPP_ENUM_FROM_STRING_STORAGE \
|
||||||
|
namespace VULKAN_HPP_NAMESPACE \
|
||||||
|
{ \
|
||||||
|
VULKAN_HPP_STORAGE_API const ::VULKAN_HPP_NAMESPACE::EnumFromStringMap enumFromStringMap; \
|
||||||
|
}
|
||||||
|
|
||||||
|
//=========================
|
||||||
|
//=== ENUMs from_string ===
|
||||||
|
//=========================
|
||||||
|
|
||||||
|
struct EnumFromStringMap
|
||||||
|
{
|
||||||
|
${enumsFromStringStorage}
|
||||||
|
};
|
||||||
|
VULKAN_HPP_STORAGE_API extern const EnumFromStringMap enumFromStringMap;
|
||||||
|
|
||||||
|
template<typename TEnum>
|
||||||
|
std::optional<TEnum> from_string(const std::string&);
|
||||||
|
${enumsFromString}
|
||||||
|
)";
|
||||||
|
|
||||||
|
std::string enumsFromStringStorage;
|
||||||
|
std::string enumsFromString;
|
||||||
|
std::set<std::string> listedEnums;
|
||||||
|
for ( auto const & feature : m_features )
|
||||||
|
{
|
||||||
|
enumsFromStringStorage += generateEnumsFromStringStorage( feature.requireData, listedEnums, feature.name );
|
||||||
|
}
|
||||||
|
for ( auto const & extension : m_extensions )
|
||||||
|
{
|
||||||
|
enumsFromStringStorage += generateEnumsFromStringStorage( extension.requireData, listedEnums, extension.name );
|
||||||
|
}
|
||||||
|
listedEnums.clear();
|
||||||
|
for ( auto const & feature : m_features )
|
||||||
|
{
|
||||||
|
enumsFromString += generateEnumsFromString( feature.requireData, listedEnums, feature.name );
|
||||||
|
}
|
||||||
|
for ( auto const & extension : m_extensions )
|
||||||
|
{
|
||||||
|
enumsFromString += generateEnumsFromString( extension.requireData, listedEnums, extension.name );
|
||||||
|
}
|
||||||
|
|
||||||
|
return replaceWithMap( enumsFromStringTemplate, {
|
||||||
|
{ "enumsFromString", enumsFromString },
|
||||||
|
{ "enumsFromStringStorage", enumsFromStringStorage }} );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string VulkanHppGenerator::generateEnumsFromString( std::vector<RequireData> const & requireData,
|
||||||
|
std::set<std::string> & listedEnums,
|
||||||
|
std::string const & title ) const
|
||||||
|
{
|
||||||
|
std::string str;
|
||||||
|
for ( auto const & require : requireData )
|
||||||
|
{
|
||||||
|
for ( auto const & type : require.types )
|
||||||
|
{
|
||||||
|
auto enumIt = m_enums.find( type );
|
||||||
|
if ( ( enumIt != m_enums.end() ) && !listedEnums.contains( type ) )
|
||||||
|
{
|
||||||
|
listedEnums.insert( type );
|
||||||
|
|
||||||
|
str += "\n";
|
||||||
|
str += generateEnumFromString( *enumIt );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return addTitleAndProtection( title, str );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string VulkanHppGenerator::generateEnumFromString( std::pair<std::string, EnumData> const & enumData ) const
|
||||||
|
{
|
||||||
|
std::string enumName = stripPrefix( enumData.first, "Vk" );
|
||||||
|
std::string functionBody;
|
||||||
|
if ( enumData.second.values.empty() )
|
||||||
|
{
|
||||||
|
functionBody = R"x( return std::nullopt;)x";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const std::string functionBodyTemplate =
|
||||||
|
R"x( auto it = enumFromStringMap.${enumName}Entries.find(value);
|
||||||
|
if (it != enumFromStringMap.${enumName}Entries.end())
|
||||||
|
{
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
)x";
|
||||||
|
|
||||||
|
functionBody = replaceWithMap( functionBodyTemplate, { { "enumName", enumName } } );
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string enumFromStringTemplate = R"(
|
||||||
|
template<>
|
||||||
|
VULKAN_HPP_INLINE std::optional<${enumName}> from_string<${enumName}>( const std::string& ${argument} )
|
||||||
|
{
|
||||||
|
${functionBody}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
return replaceWithMap( enumFromStringTemplate,
|
||||||
|
{ { "argument", enumData.second.values.empty() ? "" : " value" }, { "enumName", enumName }, { "functionBody", functionBody } } );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string VulkanHppGenerator::generateEnumsFromStringStorage( std::vector<RequireData> const & requireData,
|
||||||
|
std::set<std::string> & listedEnums,
|
||||||
|
std::string const & title ) const
|
||||||
|
{
|
||||||
|
std::string str;
|
||||||
|
for ( auto const & require : requireData )
|
||||||
|
{
|
||||||
|
for ( auto const & type : require.types )
|
||||||
|
{
|
||||||
|
auto enumIt = m_enums.find( type );
|
||||||
|
if ( ( enumIt != m_enums.end() ) && !listedEnums.contains( type ) )
|
||||||
|
{
|
||||||
|
listedEnums.insert( type );
|
||||||
|
|
||||||
|
str += "\n";
|
||||||
|
str += generateEnumFromStringStorage( *enumIt );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return addTitleAndProtection( title, str );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string VulkanHppGenerator::generateEnumFromStringStorage( std::pair<std::string, EnumData> const & enumData ) const
|
||||||
|
{
|
||||||
|
std::string enumName = stripPrefix( enumData.first, "Vk" );
|
||||||
|
std::string entries;
|
||||||
|
|
||||||
|
std::string previousEnter, previousLeave;
|
||||||
|
for ( auto const & value : enumData.second.values )
|
||||||
|
{
|
||||||
|
// generate cases for non-alias enum values only
|
||||||
|
if ( value.alias.empty() )
|
||||||
|
{
|
||||||
|
auto [enter, leave] = generateProtection( value.protect );
|
||||||
|
if ( previousEnter != enter )
|
||||||
|
{
|
||||||
|
entries += previousLeave + enter;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string entryTemplate = R"( { "${valueName}", ${enumName}::e${valueName} },
|
||||||
|
)";
|
||||||
|
entries += replaceWithMap(
|
||||||
|
entryTemplate,
|
||||||
|
{ { "enumName", enumName }, { "valueName", generateEnumValueName( enumData.first, value.name, enumData.second.isBitmask ).substr( 1 ) } } );
|
||||||
|
|
||||||
|
previousEnter = enter;
|
||||||
|
previousLeave = leave;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entries += previousLeave;
|
||||||
|
|
||||||
|
const std::string enumToStringTemplate = R"(
|
||||||
|
std::unordered_map<std::string, ${enumName}> ${enumName}Entries =
|
||||||
|
{
|
||||||
|
${entries}
|
||||||
|
};
|
||||||
|
)";
|
||||||
|
|
||||||
|
return replaceWithMap( enumToStringTemplate,
|
||||||
|
{ { "enumName", enumName }, { "entries", entries } } );
|
||||||
|
}
|
||||||
|
|
||||||
std::pair<std::string, std::string> VulkanHppGenerator::generateEnumSuffixes( std::string const & name, bool bitmask ) const
|
std::pair<std::string, std::string> VulkanHppGenerator::generateEnumSuffixes( std::string const & name, bool bitmask ) const
|
||||||
{
|
{
|
||||||
std::string prefix, postfix;
|
std::string prefix, postfix;
|
||||||
@ -15710,6 +15910,7 @@ int main( int argc, char ** argv )
|
|||||||
generator.generateStaticAssertionsHppFile();
|
generator.generateStaticAssertionsHppFile();
|
||||||
generator.generateStructsHppFile();
|
generator.generateStructsHppFile();
|
||||||
generator.generateToStringHppFile();
|
generator.generateToStringHppFile();
|
||||||
|
generator.generateFromStringHppFile();
|
||||||
generator.generateCppModuleFile();
|
generator.generateCppModuleFile();
|
||||||
|
|
||||||
#if !defined( CLANG_FORMAT_EXECUTABLE )
|
#if !defined( CLANG_FORMAT_EXECUTABLE )
|
||||||
|
@ -101,6 +101,7 @@ public:
|
|||||||
void generateStaticAssertionsHppFile() const;
|
void generateStaticAssertionsHppFile() const;
|
||||||
void generateStructsHppFile() const;
|
void generateStructsHppFile() const;
|
||||||
void generateToStringHppFile() const;
|
void generateToStringHppFile() const;
|
||||||
|
void generateFromStringHppFile() const;
|
||||||
void generateCppModuleFile() const;
|
void generateCppModuleFile() const;
|
||||||
void prepareRAIIHandles();
|
void prepareRAIIHandles();
|
||||||
void prepareVulkanFuncs();
|
void prepareVulkanFuncs();
|
||||||
@ -701,6 +702,11 @@ private:
|
|||||||
std::string generateEnumsToString() const;
|
std::string generateEnumsToString() const;
|
||||||
std::string generateEnumsToString( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
|
std::string generateEnumsToString( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
|
||||||
std::string generateEnumToString( std::pair<std::string, EnumData> const & enumData ) const;
|
std::string generateEnumToString( std::pair<std::string, EnumData> const & enumData ) const;
|
||||||
|
std::string generateEnumsFromString() const;
|
||||||
|
std::string generateEnumsFromString( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
|
||||||
|
std::string generateEnumFromString( std::pair<std::string, EnumData> const & enumData ) const;
|
||||||
|
std::string generateEnumsFromStringStorage( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
|
||||||
|
std::string generateEnumFromStringStorage( std::pair<std::string, EnumData> const & enumData ) const;
|
||||||
std::pair<std::string, std::string> generateEnumSuffixes( std::string const & name, bool bitmask ) const;
|
std::pair<std::string, std::string> generateEnumSuffixes( std::string const & name, bool bitmask ) const;
|
||||||
std::string generateEnumValueName( std::string const & enumName, std::string const & valueName, bool bitmask ) const;
|
std::string generateEnumValueName( std::string const & enumName, std::string const & valueName, bool bitmask ) const;
|
||||||
std::string generateExtensionDependencies() const;
|
std::string generateExtensionDependencies() const;
|
||||||
|
@ -6072,6 +6072,10 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
# include <vulkan/vulkan_to_string.hpp>
|
# include <vulkan/vulkan_to_string.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined( VULKAN_HPP_NO_FROM_STRING )
|
||||||
|
# include <vulkan/vulkan_from_string.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef VULKAN_HPP_NO_EXCEPTIONS
|
#ifndef VULKAN_HPP_NO_EXCEPTIONS
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
@ -15994,7 +15998,7 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
# elif defined( __APPLE__ )
|
# elif defined( __APPLE__ )
|
||||||
m_library = dlopen( "libvulkan.dylib", RTLD_NOW | RTLD_LOCAL );
|
m_library = dlopen( "libvulkan.dylib", RTLD_NOW | RTLD_LOCAL );
|
||||||
# elif defined( _WIN32 )
|
# elif defined( _WIN32 )
|
||||||
m_library = ::LoadLibraryA( "vulkan-1.dll" );
|
m_library = ::LoadLibraryA( "vulkan-1.dll" );
|
||||||
# else
|
# else
|
||||||
# error unsupported platform
|
# error unsupported platform
|
||||||
# endif
|
# endif
|
||||||
|
7774
vulkan/vulkan_from_string.hpp
Normal file
7774
vulkan/vulkan_from_string.hpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -17525,7 +17525,7 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
# else
|
# else
|
||||||
template <typename Dispatch>
|
template <typename Dispatch>
|
||||||
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
|
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
|
||||||
Device::acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
|
Device::acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
|
||||||
{
|
{
|
||||||
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
|
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
|
||||||
|
|
||||||
@ -17547,7 +17547,7 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
# else
|
# else
|
||||||
template <typename Dispatch>
|
template <typename Dispatch>
|
||||||
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
|
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
|
||||||
Device::releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
|
Device::releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
|
||||||
{
|
{
|
||||||
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
|
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
|
||||||
|
|
||||||
@ -20238,7 +20238,7 @@ namespace VULKAN_HPP_NAMESPACE
|
|||||||
# else
|
# else
|
||||||
template <typename Dispatch>
|
template <typename Dispatch>
|
||||||
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
|
VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
|
||||||
PhysicalDevice::acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
|
PhysicalDevice::acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
|
||||||
{
|
{
|
||||||
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
|
VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user