// Copyright(c) 2015-2019, NVIDIA CORPORATION. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include #include #include class VulkanHppGenerator { public: VulkanHppGenerator( tinyxml2::XMLDocument const & document ); void appendBaseTypes( std::string & str ) const; void appendBitmasks( std::string & str ) const; void appendDispatchLoaderDynamic( std::string & str ); // use vkGet*ProcAddress to get function pointers void appendDispatchLoaderStatic( std::string & str ); // use exported symbols from loader void appendDispatchLoaderDefault( std::string & str ); // typedef to DispatchLoaderStatic or undefined type, based on VK_NO_PROTOTYPES void appendEnums( std::string & str ) const; void appendHandles( std::string & str ); void appendHandlesCommandDefinitions( std::string & str ) const; void appendHashStructures( std::string & str ) const; void appendResultExceptions( std::string & str ) const; void appendStructs( std::string & str ); void appendStructureChainValidation( std::string & str ); void appendThrowExceptions( std::string & str ) const; void appendIndexTypeTraits( std::string & str ) const; std::string const & getTypesafeCheck() const; std::string const & getVersion() const; std::string const & getVulkanLicenseHeader() const; private: struct BaseTypeData { BaseTypeData( std::string const & type_, int line ) : type( type_ ), xmlLine( line ) {} std::string type; int xmlLine; }; struct BitmaskData { BitmaskData( std::string const & r, std::string const & t, int line ) : requirements( r ), type( t ), xmlLine( line ) {} std::string requirements; std::string type; std::string alias; int xmlLine; }; struct NameData { std::string name; std::vector arraySizes; std::string bitCount; }; struct TypeInfo { std::string compose( bool inNamespace = true ) const; bool operator==( TypeInfo const & rhs ) const { return ( prefix == rhs.prefix ) && ( type == rhs.type ) && ( postfix == rhs.postfix ); } bool isConstPointer() const { return ( prefix.find( "const" ) != std::string::npos ) && ( postfix.find( '*' ) != std::string::npos ); } bool isNonConstPointer() const { return ( prefix.find( "const" ) == std::string::npos ) && ( postfix.find( '*' ) != std::string::npos ); } bool isValue() const { return ( ( prefix.find( '*' ) == std::string::npos ) && ( postfix.find( '*' ) == std::string::npos ) ); } std::string prefix; std::string type; std::string postfix; }; struct ParamData { ParamData( int line ) : optional( false ), xmlLine( line ) {} TypeInfo type; std::string name; std::vector arraySizes; std::string len; bool optional; int xmlLine; }; struct CommandAliasData { CommandAliasData( int line ) : xmlLine( line ) {} std::set extensions; std::string feature; int xmlLine; }; struct CommandData { CommandData( int line ) : xmlLine( line ) {} std::map aliasData; std::vector errorCodes; std::set extensions; std::string feature; std::string handle; std::vector params; std::string returnType; std::vector successCodes; int xmlLine; }; struct EnumValueData { EnumValueData( int line, std::string const & vulkan, std::string const & vk, bool singleBit_ ) : vulkanValue( vulkan ), vkValue( vk ), singleBit( singleBit_ ), xmlLine( line ) {} std::string vulkanValue; std::string vkValue; bool singleBit; int xmlLine; }; struct EnumData { void addEnumAlias( int line, std::string const & name, std::string const & alias, std::string const & vkName ); void addEnumValue( int line, std::string const & valueName, bool bitmask, bool bitpos, std::string const & prefix, std::string const & postfix, std::string const & tag ); std::string alias; // alias for this enum std::map> aliases; // map from name to alias and vk-name bool isBitmask = false; std::vector values; }; struct ExtensionData { ExtensionData( int line, std::string const & deprecatedBy_, std::string const & obsoletedBy_, std::string const & platform_, std::string const & promotedTo_ ) : deprecatedBy( deprecatedBy_ ) , obsoletedBy( obsoletedBy_ ) , platform( platform_ ) , promotedTo( promotedTo_ ) , xmlLine( line ) {} std::string deprecatedBy; std::string obsoletedBy; std::string platform; std::string promotedTo; std::map requirements; int xmlLine; }; struct FuncPointerData { FuncPointerData( std::string const & r, int line ) : requirements( r ), xmlLine( line ) {} std::string requirements; int xmlLine; }; struct HandleData { HandleData( std::vector const & p, std::string const & objType, int line ) : objTypeEnum( objType ), parents( p ), xmlLine( line ) {} std::string alias; std::set childrenHandles; std::set commands; std::string deleteCommand; std::string deletePool; std::string objTypeEnum; std::vector parents; int xmlLine; }; struct MemberData { MemberData( int line ) : xmlLine( line ) {} TypeInfo type; std::string name; std::vector arraySizes; std::string bitCount; std::vector len; bool noAutoValidity = false; std::vector optional; std::string selection; std::string selector; std::vector values; std::string usedConstant; int xmlLine; }; struct PlatformData { PlatformData( std::string const & protect_ ) : protect( protect_ ) {} std::string protect; }; struct StructureData { StructureData( std::vector const & extends, int line ) : structExtends( extends ), xmlLine( line ) {} bool allowDuplicate = false; bool isUnion = false; bool returnedOnly = false; bool mutualExclusiveLens = false; std::vector members; std::vector structExtends; std::set aliases; std::string subStruct; int xmlLine; }; enum class TypeCategory { Bitmask, BaseType, Define, Enum, FuncPointer, Handle, Requires, Struct, Union, Unknown }; struct TypeData { TypeData( TypeCategory category_ ) : category( category_ ) {} TypeCategory category; std::set extensions; std::string feature; }; private: void appendArgumentPlainType( std::string & str, ParamData const & paramData ) const; void appendArguments( std::string & str, CommandData const & commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const & vectorParamIndices, bool twoStep, bool firstCall, size_t from, size_t to ) const; void appendArgumentVector( std::string & str, size_t paramIndex, ParamData const & paramData, size_t returnParamIndex, size_t templateParamIndex, bool twoStep, bool firstCall ) const; void appendBitmask( std::string & os, std::string const & bitmaskName, std::string const & bitmaskType, std::string const & bitmaskAlias, std::string const & enumName, std::vector const & enumValues ) const; void appendBitmaskToStringFunction( std::string & str, std::string const & flagsName, std::string const & enumName, std::vector const & enumValues ) const; void appendCall( std::string & str, std::string const & name, CommandData const & commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const & vectorParamIndices, bool twoStep, bool firstCall ) const; void appendCommand( std::string & str, std::string const & name, CommandData const & commandData, bool definition ) const; void appendCommandChained( std::string & str, std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t nonConstPointerIndex ) const; void appendCommandSingular( std::string & str, std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; void appendCommandStandard( std::string & str, std::string const & name, CommandData const & commandData, bool definition ) const; void appendCommandStandardAndEnhanced( std::string & str, std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, std::vector const & nonConstPointerParamIndices ) const; void appendCommandStandardEnhancedDeprecatedAllocator( std::string & str, std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, std::vector const & nonConstPointerParamIndices ) const; void appendCommandStandardOrEnhanced( std::string & str, std::string const & name, CommandData const & commandData, bool definition ) const; void appendCommandUnique( std::string & str, std::string const & name, CommandData const & commandData, size_t nonConstPointerIndex, bool definition ) const; void appendCommandVector( std::string & str, std::string const & name, CommandData const & commandData, bool definition, std::pair const & vectorParamIndex, std::vector const & returnParamIndices ) const; void appendCommandVectorChained( std::string & str, std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, std::vector const & returnParamIndices ) const; void appendCommandVectorDeprecated( std::string & str, std::string const & name, CommandData const & commandData, std::map const & vectorParamIndices, std::vector const & returnParamIndices, bool definition ) const; void appendCommandVectorSingularUnique( std::string & str, std::string const & name, CommandData const & commandData, std::map const & vectorParamIndices, size_t returnParamIndex, bool definition ) const; void appendCommandVectorUnique( std::string & str, std::string const & name, CommandData const & commandData, std::map const & vectorParamIndices, size_t returnParamIndex, bool definition ) const; void appendDispatchLoaderDynamicCommand( std::string & str, std::string & emptyFunctions, std::string & deviceFunctions, std::string & deviceFunctionsInstance, std::string & instanceFunctions, std::string const & commandName, CommandData const & commandData ); void appendEnum( std::string & str, std::pair const & enumData ) const; void appendEnumInitializer( std::string & str, TypeInfo const & type, std::vector const & arraySizes, std::vector const & values ) const; void appendEnumToString( std::string & str, std::pair const & enumData ) const; std::string appendFunctionBodyEnhancedLocalReturnVariable( std::string & str, std::string const & indentation, CommandData const & commandData, size_t returnParamIndex, std::string const & enhancedReturnType, bool withAllocator ) const; void appendFunctionBodyEnhancedMultiVectorSizeCheck( std::string & str, std::string const & indentation, std::string const & name, CommandData const & commandData, size_t returnParamIndex, std::map const & vectorParamIndices ) const; void appendFunctionBodyEnhancedReturnResultValue( std::string & str, std::string const & indentation, std::string const & returnName, std::string const & name, CommandData const & commandData, size_t returnParamIndex, bool twoStep ) const; void appendFunctionBodyEnhancedTwoStep( std::string & str, std::string const & indentation, std::string const & name, CommandData const & commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const & vectorParamIndices, std::string const & returnName ) const; bool appendFunctionHeaderArgumentEnhanced( std::string & str, ParamData const & param, size_t paramIndex, std::map const & vectorParamIndices, bool skip, bool argEncountered, bool isTemplateParam ) const; void appendFunctionHeaderArgumentEnhancedVector( std::string & str, ParamData const & param, std::string const & strippedParameterName, bool hasSizeParam, bool isTemplateParam ) const; void appendHandle( std::string & str, std::pair const & handle ); void appendStruct( std::string & str, std::pair const & structure ); void appendStructAssignmentOperators( std::string & str, std::pair const & structure, std::string const & prefix ) const; void appendStructCompareOperators( std::string & str, std::pair const & structure ) const; void appendStructConstructors( std::string & str, std::pair const & structData, std::string const & prefix ) const; void appendStructConstructorsEnhanced( std::string & str, std::pair const & structData, std::string const & prefix ) const; bool appendStructConstructorArgument( std::string & str, bool listedArgument, MemberData const & memberData, bool withDefault ) const; std::string appendStructMembers( std::string & str, std::pair const & structData, std::string const & prefix ) const; void appendStructSetter( std::string & str, std::string const & structureName, std::vector const & memberData, size_t index ) const; void appendStructSubConstructor( std::string & str, std::pair const & structData, std::string const & prefix ) const; void appendStructure( std::string & str, std::pair const & structure ) const; void appendType( std::string & str, std::string const & typeName ); void appendUnion( std::string & str, std::pair const & structure ) const; void appendUniqueTypes( std::string & str, std::string const & parentType, std::set const & childrenTypes ) const; std::string constructArgumentListEnhanced( std::vector const & params, std::set const & skippedParams, size_t singularParam, bool definition, bool withAllocators, bool structureChain ) const; std::string constructArgumentListStandard( std::vector const & params, std::set const & skippedParams ) const; std::string constructCallArgumentsEnhanced( std::string const & handle, std::vector const & params, bool nonConstPointerAsNullptr, size_t singularParamIndex ) const; std::string constructCallArgumentsStandard( std::string const & handle, std::vector const & params ) const; std::string constructCommandResult( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices ) const; std::string constructCommandResultEnumerate( std::string const & name, CommandData const & commandData, bool definition, std::pair const & vectorParamIndices, bool withAllocators ) const; std::string constructCommandResultEnumerateChained( std::string const & name, CommandData const & commandData, bool definition, std::pair const & vectorParamIndex, std::vector const & returnParamIndices, bool withAllocator ) const; std::string constructCommandResultEnumerateTwoVectors( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, std::vector const & returnParamIndices, bool withAllocators ) const; std::string constructCommandResultEnumerateTwoVectorsDeprecated( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, bool withAllocators ) const; std::string constructCommandResultGetChain( std::string const & name, CommandData const & commandData, bool definition, size_t nonConstPointerIndex ) const; std::string constructCommandResultGetHandleUnique( std::string const & name, CommandData const & commandData, bool definition, size_t nonConstPointerIndex ) const; std::string constructCommandResultGetTwoVectors( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices ) const; std::string constructCommandResultGetValue( std::string const & name, CommandData const & commandData, bool definition, size_t nonConstPointerIndex ) const; std::string constructCommandResultGetValueDeprecated( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructCommandResultGetVector( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructCommandResultGetVectorAndValue( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, std::vector const & returnParamIndex, bool withAllocator ) const; std::string constructCommandResultGetVectorDeprecated( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructCommandResultGetVectorOfHandles( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex, bool withAllocator ) const; std::string constructCommandResultGetVectorOfHandlesSingular( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructCommandResultGetVectorOfHandlesUnique( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex, bool withAllocator ) const; std::string constructCommandResultGetVectorOfHandlesUniqueSingular( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructCommandResultGetVectorSingular( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructCommandStandard( std::string const & name, CommandData const & commandData, bool definition ) const; std::string constructCommandType( std::string const & name, CommandData const & commandData, bool definition ) const; std::string constructCommandVoid( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices ) const; std::string constructCommandVoidEnumerate( std::string const & name, CommandData const & commandData, bool definition, std::pair const & vectorParamIndex, std::vector const & returnParamIndices, bool withAllocators ) const; std::string constructCommandVoidEnumerateChained( std::string const & name, CommandData const & commandData, bool definition, std::pair const & vectorParamIndex, std::vector const & returnParamIndices, bool withAllocators ) const; std::string constructCommandVoidGetChain( std::string const & name, CommandData const & commandData, bool definition, size_t nonConstPointerIndex ) const; std::string constructCommandVoidGetValue( std::string const & name, CommandData const & commandData, bool definition, std::map const & vectorParamIndices, size_t returnParamIndex ) const; std::string constructConstexprString( std::pair const & structData ) const; std::string constructFunctionBodyEnhanced( std::string const & indentation, std::string const & name, CommandData const & commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const & vectorParamIndices, bool twoStep, std::string const & enhancedReturnType, bool withAllocator ) const; std::string constructFunctionBodyEnhancedSingleStep( std::string const & indentation, std::string const & name, CommandData const & commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const & vectorParamIndices ) const; std::string constructFunctionHeaderArgumentsEnhanced( CommandData const & commandData, size_t returnParamIndex, size_t templateParamIndex, std::map const & vectorParamIndices, bool withDefaults, bool withAllocator ) const; std::string constructNoDiscardStandard( CommandData const & commandData ) const; std::string constructReturnType( CommandData const & commandData, std::string const & baseType ) const; std::string constructSuccessCheck( std::vector const & successCodes ) const; std::string constructSuccessCodeList( std::vector const & successCodes ) const; std::string constructVectorSizeCheck( std::string const & name, CommandData const & commandData, std::map> const & countToVectorMap, std::set const & skippedParams ) const; void checkCorrectness(); bool containsArray( std::string const & type ) const; bool containsUnion( std::string const & type ) const; size_t determineDefaultStartIndex( std::vector const & params, std::set const & skippedParams ) const; std::string determineEnhancedReturnType( CommandData const & commandData, size_t returnParamIndex, bool isStructureChain ) const; size_t determineReturnParamIndex( CommandData const & commandData, std::map const & vectorParamIndices, bool twoStep ) const; std::set determineSkippedParams( std::string const & handleType, std::vector const & params, std::map const & vectorParamIndices, std::vector const & returnParamIndex, bool singular ) const; std::string determineSubStruct( std::pair const & structure ) const; std::vector determineConstPointerParamIndices( std::vector const & params ) const; std::vector determineNonConstPointerParamIndices( std::vector const & params ) const; std::map determineVectorParamIndicesNew( std::vector const & params ) const; std::string generateLenInitializer( std::vector::const_iterator mit, std::map::const_iterator, std::vector::const_iterator>>::const_iterator litit, bool mutualExclusiveLens ) const; std::pair generateProtection( std::string const & feature, std::set const & extension ) const; std::pair generateProtection( std::string const & type, bool isAliased ) const; std::string generateSizeCheck( std::vector::const_iterator> const & arrayIts, std::string const & structName, std::string const & prefix, bool mutualExclusiveLens ) const; std::set getPlatforms( std::set const & extensions ) const; std::pair getPoolTypeAndName( std::string const & type ) const; std::string getVectorSize( std::vector const & params, std::map const & vectorParamIndices, size_t returnParamIndex ) const; bool isHandleType( std::string const & type ) const; bool isLenByStructMember( std::string const & name, std::vector const & params ) const; bool isLenByStructMember( std::string const & name, ParamData const & param ) const; bool isParam( std::string const & name, std::vector const & params ) const; bool isStructureChainAnchor( std::string const & type ) const; bool needsComplexBody( CommandData const & commandData ) const; std::pair>> needsVectorSizeCheck( std::map const & vectorParamIndices ) const; void readBaseType( tinyxml2::XMLElement const * element, std::map const & attributes ); void readBitmask( tinyxml2::XMLElement const * element, std::map const & attributes ); void readBitmaskAlias( tinyxml2::XMLElement const * element, std::map const & attributes ); void readCommand( tinyxml2::XMLElement const * element ); void readCommand( tinyxml2::XMLElement const * element, std::map const & attributess ); void readCommandAlias( tinyxml2::XMLElement const * element, std::map const & attributes ); ParamData readCommandParam( tinyxml2::XMLElement const * element, std::vector const & params ); std::pair readCommandProto( tinyxml2::XMLElement const * element ); void readCommands( tinyxml2::XMLElement const * element ); std::string readComment( tinyxml2::XMLElement const * element ); void readDefine( tinyxml2::XMLElement const * element, std::map const & attributes ); void readEnum( tinyxml2::XMLElement const * element, EnumData & enumData, bool bitmask, std::string const & prefix, std::string const & postfix ); void readEnum( tinyxml2::XMLElement const * element, std::map const & attributes, EnumData & enumData, bool bitmask, std::string const & prefix, std::string const & postfix ); void readEnumAlias( tinyxml2::XMLElement const * element, std::map const & attributes, EnumData & enumData, bool bitmask, std::string const & prefix, std::string const & postfix ); void readEnumConstant( tinyxml2::XMLElement const * element ); void readEnums( tinyxml2::XMLElement const * element ); void readExtension( tinyxml2::XMLElement const * element ); void readExtensionDisabledCommand( tinyxml2::XMLElement const * element ); void readExtensionDisabledEnum( std::string const & extensionName, tinyxml2::XMLElement const * element ); void readExtensionDisabledRequire( std::string const & extensionName, tinyxml2::XMLElement const * element ); void readExtensionDisabledType( tinyxml2::XMLElement const * element ); void readExtensionRequire( tinyxml2::XMLElement const * element, std::string const & extension, std::string const & tag, std::map & requirements ); void readExtensionRequireCommand( tinyxml2::XMLElement const * element, std::string const & extension ); void readExtensionRequireType( tinyxml2::XMLElement const * element, std::string const & extension ); void readExtensions( tinyxml2::XMLElement const * element ); void readFeature( tinyxml2::XMLElement const * element ); void readFeatureRequire( tinyxml2::XMLElement const * element, std::string const & feature ); void readFeatureRequireCommand( tinyxml2::XMLElement const * element, std::string const & feature ); void readFeatureRequireType( tinyxml2::XMLElement const * element, std::string const & feature ); void readFuncpointer( tinyxml2::XMLElement const * element, std::map const & attributes ); void readHandle( tinyxml2::XMLElement const * element, std::map const & attributes ); std::pair readNameAndType( tinyxml2::XMLElement const * elements ); void readPlatform( tinyxml2::XMLElement const * element ); void readPlatforms( tinyxml2::XMLElement const * element ); void readRegistry( tinyxml2::XMLElement const * element ); void readRequireEnum( tinyxml2::XMLElement const * element, std::string const & tag ); void readRequireEnum( tinyxml2::XMLElement const * element, std::map const & attributes, std::string const & tag ); void readRequireEnumAlias( tinyxml2::XMLElement const * element, std::map const & attributes, std::string const & tag ); void readRequires( tinyxml2::XMLElement const * element, std::map const & attributes ); void readSPIRVCapability( tinyxml2::XMLElement const * element ); void readSPIRVCapabilityEnable( tinyxml2::XMLElement const * element ); void readSPIRVCapabilityEnableExtension( int xmlLine, std::map const & attributes ); void readSPIRVCapabilityEnableProperty( int xmlLine, std::map const & attributes ); void readSPIRVCapabilityEnableStruct( int xmlLine, std::map const & attributes ); void readSPIRVCapabilityEnableVersion( int xmlLine, std::map const & attributes ); void readSPIRVCapabilities( tinyxml2::XMLElement const * element ); void readSPIRVExtension( tinyxml2::XMLElement const * element ); void readSPIRVExtensionEnable( tinyxml2::XMLElement const * element ); void readSPIRVExtensions( tinyxml2::XMLElement const * element ); void readStruct( tinyxml2::XMLElement const * element, bool isUnion, std::map const & attributes ); void readStructAlias( tinyxml2::XMLElement const * element, std::map const & attributes ); void readStructMember( tinyxml2::XMLElement const * element, std::vector & members, bool isUnion ); void readStructMemberEnum( tinyxml2::XMLElement const * element, MemberData & memberData ); void readStructMemberName( tinyxml2::XMLElement const * element, MemberData & memberData, std::vector const & members ); void readStructMemberType( tinyxml2::XMLElement const * element, MemberData & memberData ); void readTag( tinyxml2::XMLElement const * element ); void readTags( tinyxml2::XMLElement const * element ); void readType( tinyxml2::XMLElement const * element ); void readTypeEnum( tinyxml2::XMLElement const * element, std::map const & attributes ); void readTypeInclude( tinyxml2::XMLElement const * element, std::map const & attributes ); void readTypes( tinyxml2::XMLElement const * element ); void registerDeleter( std::string const & name, std::pair const & commandData ); void setVulkanLicenseHeader( int line, std::string const & comment ); std::string toString( TypeCategory category ); private: std::map m_baseTypes; std::map m_bitmasks; std::map m_commands; std::set m_constants; std::set m_defines; std::map m_enums; std::set m_extendedStructs; // structs which are referenced by the structextends tag std::map m_extensions; std::map m_features; std::map m_funcPointers; std::map m_handles; std::set m_includes; std::set m_listedTypes; std::set m_listingTypes; std::map m_platforms; std::map m_structureAliases; std::map m_structures; std::set m_tags; std::map m_types; std::string m_typesafeCheck; std::string m_version; std::string m_vulkanLicenseHeader; }; const size_t INVALID_INDEX = (size_t)~0;