• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright(c) 2015-2019, NVIDIA CORPORATION. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #pragma once
16 
17 #include <iostream>
18 #include <map>
19 #include <set>
20 #include <tinyxml2.h>
21 #include <vector>
22 
23 const size_t INVALID_INDEX = (size_t)~0;
24 
25 template <typename BitType>
26 class Flags
27 {
28 public:
29   using MaskType = typename std::underlying_type<BitType>::type;
30 
Flags()31   constexpr Flags() noexcept : m_mask( 0 ) {}
32 
Flags(BitType bit)33   constexpr Flags( BitType bit ) noexcept : m_mask( static_cast<MaskType>( bit ) ) {}
34 
Flags(MaskType flags)35   constexpr explicit Flags( MaskType flags ) noexcept : m_mask( flags ) {}
36 
operator !() const37   constexpr bool operator!() const noexcept
38   {
39     return !m_mask;
40   }
41 
operator &(BitType const & rhs) const42   constexpr bool operator&( BitType const & rhs ) const noexcept
43   {
44     return m_mask & static_cast<MaskType>( rhs );
45   }
46 
operator &(Flags<BitType> const & rhs) const47   constexpr Flags<BitType> operator&( Flags<BitType> const & rhs ) const noexcept
48   {
49     return Flags<BitType>( m_mask & rhs.m_mask );
50   }
51 
operator |(Flags<BitType> const & rhs) const52   constexpr Flags<BitType> operator|( Flags<BitType> const & rhs ) const noexcept
53   {
54     return Flags<BitType>( m_mask | rhs.m_mask );
55   }
56 
57 private:
58   MaskType m_mask;
59 };
60 
61 enum class CommandFlavourFlagBits : uint8_t
62 {
63   chained       = 1 << 0,
64   singular      = 1 << 1,
65   unique        = 1 << 2,
66   withAllocator = 1 << 3
67 };
68 using CommandFlavourFlags = Flags<CommandFlavourFlagBits>;
69 
operator |(CommandFlavourFlagBits const & lhs,CommandFlavourFlagBits const & rhs)70 constexpr CommandFlavourFlags operator|( CommandFlavourFlagBits const & lhs, CommandFlavourFlagBits const & rhs ) noexcept
71 {
72   return CommandFlavourFlags( lhs ) | CommandFlavourFlags( rhs );
73 }
74 
75 class VulkanHppGenerator
76 {
77 public:
78   VulkanHppGenerator( tinyxml2::XMLDocument const & document );
79 
80   void generateVulkanEnumsHppFile() const;
81   void generateVulkanFormatTraitsHppFile() const;
82   void generateVulkanFuncsHppFile() const;
83   void generateVulkanHandlesHppFile() const;
84   void generateVulkanHashHppFile() const;
85   void generateVulkanHppFile() const;
86   void generateVulkanRAIIHppFile() const;
87   void generateVulkanStaticAssertionsHppFile() const;
88   void generateVulkanStructsHppFile() const;
89   void generateVulkanToStringHppFile() const;
90   void prepareRAIIHandles();
91   void prepareVulkanFuncs();
92 
93 private:
94   struct TypeInfo
95   {
96     std::string compose( std::string const & nameSpace ) const;
97 
operator ==VulkanHppGenerator::TypeInfo98     bool operator==( TypeInfo const & rhs ) const
99     {
100       return ( prefix == rhs.prefix ) && ( type == rhs.type ) && ( postfix == rhs.postfix );
101     }
102 
operator !=VulkanHppGenerator::TypeInfo103     bool operator!=( TypeInfo const & rhs ) const
104     {
105       return !operator==( rhs );
106     }
107 
operator <VulkanHppGenerator::TypeInfo108     bool operator<( TypeInfo const & rhs ) const
109     {
110       return ( prefix < rhs.prefix ) || ( ( prefix == rhs.prefix ) && ( ( type < rhs.type ) || ( ( type == rhs.type ) && ( postfix < rhs.postfix ) ) ) );
111     }
112 
isConstPointerVulkanHppGenerator::TypeInfo113     bool isConstPointer() const
114     {
115       return ( prefix.find( "const" ) != std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
116     }
117 
isNonConstPointerVulkanHppGenerator::TypeInfo118     bool isNonConstPointer() const
119     {
120       return ( prefix.find( "const" ) == std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
121     }
122 
isValueVulkanHppGenerator::TypeInfo123     bool isValue() const
124     {
125       return ( ( prefix.find( '*' ) == std::string::npos ) && ( postfix.find( '*' ) == std::string::npos ) );
126     }
127 
128     std::string prefix;
129     std::string type;
130     std::string postfix;
131   };
132 
133   struct BaseTypeData
134   {
BaseTypeDataVulkanHppGenerator::BaseTypeData135     BaseTypeData( TypeInfo const & typeInfo_, int line ) : typeInfo( typeInfo_ ), xmlLine( line ) {}
136 
137     TypeInfo typeInfo;
138     int      xmlLine;
139   };
140 
141   struct BitmaskData
142   {
BitmaskDataVulkanHppGenerator::BitmaskData143     BitmaskData( std::string const & r, std::string const & t, int line ) : requirements( r ), type( t ), xmlLine( line ) {}
144 
145     std::string requirements;
146     std::string type;
147     std::string alias;
148     int         xmlLine;
149   };
150 
151   struct NameData
152   {
153     std::string              name;
154     std::vector<std::string> arraySizes;
155   };
156 
157   struct ParamData
158   {
ParamDataVulkanHppGenerator::ParamData159     ParamData( int line ) : optional( false ), xmlLine( line ) {}
160 
161     TypeInfo                 type;
162     std::string              name;
163     std::vector<std::string> arraySizes;
164     std::string              len;
165     bool                     optional;
166     std::string              stride;
167     int                      xmlLine;
168   };
169 
170   struct CommandData
171   {
CommandDataVulkanHppGenerator::CommandData172     CommandData( int line ) : xmlLine( line ) {}
173 
174     std::string              alias;
175     std::vector<std::string> errorCodes;
176     std::string              handle;
177     std::vector<ParamData>   params;
178     std::string              referencedIn;
179     std::string              returnType;
180     std::vector<std::string> successCodes;
181     int                      xmlLine;
182   };
183 
184   struct DefineData
185   {
DefineDataVulkanHppGenerator::DefineData186     DefineData( std::string const & require_, int line ) : require( require_ ), xmlLine( line ) {}
187 
188     std::string require;
189     int         xmlLine;
190   };
191 
192   struct EnumAliasData
193   {
EnumAliasDataVulkanHppGenerator::EnumAliasData194     EnumAliasData( std::string const & name_, int line ) : name( name_ ), xmlLine( line ) {}
195 
196     std::string name;
197     int         xmlLine;
198   };
199 
200   struct EnumValueData
201   {
EnumValueDataVulkanHppGenerator::EnumValueData202     EnumValueData( int line, std::string const & name_, std::string const & protect_, std::string const & extension_, bool singleBit_ )
203       : name( name_ ), extension( extension_ ), protect( protect_ ), singleBit( singleBit_ ), xmlLine( line )
204     {
205     }
206 
207     std::string name;
208     std::string extension;
209     std::string protect;
210     bool        singleBit;
211     int         xmlLine;
212   };
213 
214   struct EnumData
215   {
216     void addEnumAlias( int line, std::string const & name, std::string const & alias );
217     void addEnumValue( int line, std::string const & valueName, std::string const & protect, bool bitpos, std::string const & extension );
218 
219     std::string                          alias     = {};  // alias for this enum
220     std::map<std::string, EnumAliasData> aliases   = {};  // aliases for the values
221     std::string                          bitwidth  = {};
222     bool                                 isBitmask = false;
223     std::vector<EnumValueData>           values    = {};
224     int                                  xmlLine   = 0;
225   };
226 
227   struct RequireData
228   {
229     RequireData( int line, std::vector<std::string> const & depends_ );
230 
231     std::vector<std::string> depends;
232     std::vector<std::string> commands;
233     std::vector<std::string> types;
234     int                      xmlLine;
235   };
236 
237   struct FeatureData
238   {
FeatureDataVulkanHppGenerator::FeatureData239     FeatureData( std::string const & number_ ) : number( number_ ) {}
240 
241     std::string              number;
242     std::vector<RequireData> requireData;
243   };
244 
245   struct ExtensionData
246   {
ExtensionDataVulkanHppGenerator::ExtensionData247     ExtensionData( int                 line,
248                    std::string const & deprecatedBy_,
249                    std::string const & number_,
250                    std::string const & obsoletedBy_,
251                    std::string const & platform_,
252                    std::string const & promotedTo_ )
253       : deprecatedBy( deprecatedBy_ ), number( number_ ), obsoletedBy( obsoletedBy_ ), platform( platform_ ), promotedTo( promotedTo_ ), xmlLine( line )
254     {
255     }
256 
257     std::string              deprecatedBy;
258     std::string              number;
259     std::string              obsoletedBy;
260     std::string              platform;
261     std::string              promotedTo;
262     std::set<std::string>    depends;
263     std::vector<RequireData> requireData;
264     int                      xmlLine;
265   };
266 
267   struct SkippedExtensionData
268   {
SkippedExtensionDataVulkanHppGenerator::SkippedExtensionData269     SkippedExtensionData( int line, std::string const & platform_ ) : platform( platform_ ), xmlLine( line ) {}
270 
271     std::string platform;
272     int         xmlLine;
273   };
274 
275   struct ComponentData
276   {
ComponentDataVulkanHppGenerator::ComponentData277     ComponentData( int line ) : xmlLine( line ) {}
278 
279     std::string bits;
280     std::string name;
281     std::string numericFormat;
282     std::string planeIndex;
283     int         xmlLine;
284   };
285 
286   struct PlaneData
287   {
PlaneDataVulkanHppGenerator::PlaneData288     PlaneData( int line ) : xmlLine( line ) {}
289 
290     std::string compatible;
291     std::string heightDivisor;
292     std::string widthDivisor;
293     int         xmlLine;
294   };
295 
296   struct FormatData
297   {
FormatDataVulkanHppGenerator::FormatData298     FormatData( int line ) : xmlLine( line ) {}
299 
300     std::string                blockExtent;
301     std::string                blockSize;
302     std::string                chroma;
303     std::string                classAttribute;
304     std::vector<ComponentData> components;
305     std::string                compressed;
306     std::string                packed;
307     std::vector<PlaneData>     planes;
308     std::string                spirvImageFormat;
309     std::string                texelsPerBlock;
310     int                        xmlLine;
311   };
312 
313   struct FuncPointerArgumentData
314   {
FuncPointerArgumentDataVulkanHppGenerator::FuncPointerArgumentData315     FuncPointerArgumentData( std::string const & t, int line ) : type( t ), xmlLine( line ) {}
316 
317     std::string type;
318     int         xmlLine;
319   };
320 
321   struct FuncPointerData
322   {
FuncPointerDataVulkanHppGenerator::FuncPointerData323     FuncPointerData( std::string const & r, int line ) : requirements( r ), xmlLine( line ) {}
324 
325     std::vector<FuncPointerArgumentData> arguments;
326     std::string                          requirements;
327     int                                  xmlLine;
328   };
329 
330   struct HandleData
331   {
HandleDataVulkanHppGenerator::HandleData332     HandleData( std::string const & p, std::string const & objType, bool isDispatchable, int line )
333       : objTypeEnum( objType ), parent( p ), isDispatchable( isDispatchable ), xmlLine( line )
334     {
335     }
336 
337     std::string           alias;
338     std::set<std::string> childrenHandles;
339     std::set<std::string> commands;
340     std::string           deleteCommand;
341     std::string           deletePool;
342     std::string           objTypeEnum;
343     std::string           parent;
344     std::set<std::string> secondLevelCommands;
345     bool                  isDispatchable;
346     int                   xmlLine;
347 
348     // RAII data
349     std::map<std::string, CommandData>::const_iterator              destructorIt;
350     std::vector<std::map<std::string, CommandData>::const_iterator> constructorIts;
351   };
352 
353   struct MemberData
354   {
MemberDataVulkanHppGenerator::MemberData355     MemberData( int line ) : xmlLine( line ) {}
356 
357     TypeInfo                 type;
358     std::string              name;
359     std::vector<std::string> arraySizes;
360     std::string              bitCount;
361     std::vector<std::string> len;
362     bool                     noAutoValidity = false;
363     std::vector<bool>        optional;
364     std::vector<std::string> selection;
365     std::string              selector;
366     std::string              value;
367     std::string              usedConstant;
368     int                      xmlLine;
369   };
370 
371   struct PlatformData
372   {
PlatformDataVulkanHppGenerator::PlatformData373     PlatformData( std::string const & protect_ ) : protect( protect_ ) {}
374 
375     std::string protect;
376   };
377 
378   struct StructureAliasData
379   {
StructureAliasDataVulkanHppGenerator::StructureAliasData380     StructureAliasData( std::string const & alias_, int line ) : alias( alias_ ), xmlLine( line ) {}
381 
382     std::string alias;
383     int         xmlLine;
384   };
385 
386   struct StructureData
387   {
StructureDataVulkanHppGenerator::StructureData388     StructureData( std::vector<std::string> const & extends, int line ) : structExtends( extends ), xmlLine( line ) {}
389 
390     bool                     allowDuplicate      = false;
391     bool                     isUnion             = false;
392     bool                     returnedOnly        = false;
393     bool                     mutualExclusiveLens = false;
394     std::vector<MemberData>  members;
395     std::vector<std::string> structExtends;
396     std::string              subStruct;
397     int                      xmlLine;
398   };
399 
400   enum class TypeCategory
401   {
402     Bitmask,
403     BaseType,
404     Define,
405     Enum,
406     FuncPointer,
407     Handle,
408     Requires,
409     Struct,
410     Union,
411     Unknown
412   };
413 
414   struct TypeData
415   {
416     TypeCategory category     = TypeCategory::Unknown;
417     std::string  referencedIn = {};
418   };
419 
420   struct VectorParamData
421   {
422     size_t lenParam    = INVALID_INDEX;
423     size_t strideParam = INVALID_INDEX;
424   };
425 
426 private:
427   void        addCommand( std::string const & name, CommandData & commandData );
428   void        addMissingFlagBits( std::vector<RequireData> & requireData, std::string const & referencedIn );
429   std::string addTitleAndProtection( std::string const & title, std::string const & strIf, std::string const & strElse = {} ) const;
430   bool        allVectorSizesSupported( std::vector<ParamData> const & params, std::map<size_t, VectorParamData> const & vectorParams ) const;
431   void        appendDispatchLoaderDynamicCommands( std::vector<RequireData> const & requireData,
432                                                    std::set<std::string> &          listedCommands,
433                                                    std::string const &              title,
434                                                    std::string &                    commandMembers,
435                                                    std::string &                    initialCommandAssignments,
436                                                    std::string &                    instanceCommandAssignments,
437                                                    std::string &                    deviceCommandAssignments ) const;
438   void        appendRAIIDispatcherCommands( std::vector<RequireData> const & requireData,
439                                             std::set<std::string> &          listedCommands,
440                                             std::string const &              title,
441                                             std::string &                    contextInitializers,
442                                             std::string &                    contextMembers,
443                                             std::string &                    deviceAssignments,
444                                             std::string &                    deviceMembers,
445                                             std::string &                    instanceAssignments,
446                                             std::string &                    instanceMembers ) const;
447   void        checkBitmaskCorrectness() const;
448   void        checkCommandCorrectness() const;
449   void        checkCorrectness() const;
450   void        checkDefineCorrectness() const;
451   void        checkEnumCorrectness() const;
452   void        checkEnumCorrectness( std::vector<RequireData> const & requireData ) const;
453   bool        checkEquivalentSingularConstructor( std::vector<std::map<std::string, CommandData>::const_iterator> const & constructorIts,
454                                                   std::map<std::string, CommandData>::const_iterator                      constructorIt,
455                                                   std::vector<ParamData>::const_iterator                                  lenIt ) const;
456   void        checkExtensionCorrectness() const;
457   void        checkFuncPointerCorrectness() const;
458   void        checkHandleCorrectness() const;
459   void        checkStructCorrectness() const;
460   void checkStructMemberCorrectness( std::string const & structureName, std::vector<MemberData> const & members, std::set<std::string> & sTypeValues ) const;
461   std::string              combineDataTypes( std::map<size_t, VectorParamData> const & vectorParams,
462                                              std::vector<size_t> const &               returnParams,
463                                              bool                                      enumerating,
464                                              std::vector<std::string> const &          dataTypes,
465                                              CommandFlavourFlags                       flavourFlags,
466                                              bool                                      raii ) const;
467   bool                     containsArray( std::string const & type ) const;
468   bool                     containsFuncPointer( std::string const & type ) const;
469   bool                     containsFloatingPoints( std::vector<MemberData> const & members ) const;
470   bool                     containsUnion( std::string const & type ) const;
471   std::vector<size_t>      determineConstPointerParams( std::vector<ParamData> const & params ) const;
472   std::vector<std::string> determineDataTypes( std::vector<VulkanHppGenerator::ParamData> const & params,
473                                                std::map<size_t, VectorParamData> const &          vectorParams,
474                                                std::vector<size_t> const &                        returnParams,
475                                                std::set<size_t> const &                           templatedParams ) const;
476   size_t                   determineDefaultStartIndex( std::vector<ParamData> const & params, std::set<size_t> const & skippedParams ) const;
477   bool                     determineEnumeration( std::map<size_t, VectorParamData> const & vectorParams, std::vector<size_t> const & returnParams ) const;
478   size_t                   determineInitialSkipCount( std::string const & command ) const;
479   std::vector<size_t>      determineReturnParams( std::vector<ParamData> const & params ) const;
480   std::vector<std::map<std::string, CommandData>::const_iterator>
481     determineRAIIHandleConstructors( std::string const & handleType, std::map<std::string, CommandData>::const_iterator destructorIt ) const;
482   std::map<std::string, CommandData>::const_iterator determineRAIIHandleDestructor( std::string const & handleType ) const;
483   std::set<size_t>                        determineSingularParams( size_t returnParam, std::map<size_t, VectorParamData> const & vectorParams ) const;
484   std::set<size_t>                        determineSkippedParams( std::vector<ParamData> const &            params,
485                                                                   size_t                                    initialSkipCount,
486                                                                   std::map<size_t, VectorParamData> const & vectorParams,
487                                                                   std::vector<size_t> const &               returnParam,
488                                                                   bool                                      singular ) const;
489   std::string                             determineSubStruct( std::pair<std::string, StructureData> const & structure ) const;
490   std::map<size_t, VectorParamData>       determineVectorParams( std::vector<ParamData> const & params ) const;
491   std::set<size_t>                        determineVoidPointerParams( std::vector<ParamData> const & params ) const;
492   void                                    distributeSecondLevelCommands( std::set<std::string> const & specialFunctions );
493   std::string                             findBaseName( std::string aliasName, std::map<std::string, EnumAliasData> const & aliases ) const;
494   std::vector<MemberData>::const_iterator findStructMemberIt( std::string const & name, std::vector<MemberData> const & memberData ) const;
495   std::vector<MemberData>::const_iterator findStructMemberItByType( std::string const & type, std::vector<MemberData> const & memberData ) const;
496   std::pair<std::string, std::string>     generateAllocatorTemplates( std::vector<size_t> const &               returnParams,
497                                                                       std::vector<std::string> const &          returnDataTypes,
498                                                                       std::map<size_t, VectorParamData> const & vectorParams,
499                                                                       CommandFlavourFlags                       flavourFlags,
500                                                                       bool                                      definition ) const;
501   std::string                             generateArgumentListEnhanced( std::vector<ParamData> const &            params,
502                                                                         std::vector<size_t> const &               returnParams,
503                                                                         std::map<size_t, VectorParamData> const & vectorParams,
504                                                                         std::set<size_t> const &                  skippedParams,
505                                                                         std::set<size_t> const &                  singularParams,
506                                                                         std::set<size_t> const &                  templatedParams,
507                                                                         bool                                      definition,
508                                                                         CommandFlavourFlags                       flavourFlags,
509                                                                         bool                                      withDispatcher ) const;
510   std::string                             generateArgumentListStandard( std::vector<ParamData> const & params, std::set<size_t> const & skippedParams ) const;
511   std::string                             generateArgumentTemplates( std::vector<ParamData> const &            params,
512                                                                      std::vector<size_t> const &               returnParams,
513                                                                      std::map<size_t, VectorParamData> const & vectorParams,
514                                                                      std::set<size_t> const &                  templatedParams,
515                                                                      CommandFlavourFlags                       flavourFlags,
516                                                                      bool                                      raii ) const;
517   std::string                             generateBaseTypes() const;
518   std::string generateBitmask( std::map<std::string, BitmaskData>::const_iterator bitmaskIt, std::string const & surroundingProtect ) const;
519   std::string generateBitmasksToString() const;
520   std::string generateBitmasksToString( std::vector<RequireData> const & requireData, std::set<std::string> & listedBitmasks, std::string const & title ) const;
521   std::string generateBitmaskToString( std::map<std::string, BitmaskData>::const_iterator bitmaskIt ) const;
522   std::string generateCallArgumentsEnhanced( CommandData const &      commandData,
523                                              size_t                   initialSkipCount,
524                                              bool                     nonConstPointerAsNullptr,
525                                              std::set<size_t> const & singularParams,
526                                              std::set<size_t> const & templatedParams,
527                                              bool                     raiiHandleMemberFunction ) const;
528   std::string generateCallArgumentsRAIIFactory( std::vector<ParamData> const & params,
529                                                 size_t                         initialSkipCount,
530                                                 std::set<size_t> const &       skippedParams,
531                                                 std::set<size_t> const &       singularParams ) const;
532   std::string generateCallArgumentsStandard( std::string const & handle, std::vector<ParamData> const & params ) const;
533   std::string generateCallArgumentEnhanced( std::vector<ParamData> const & params,
534                                             size_t                         paramIndex,
535                                             bool                           nonConstPointerAsNullptr,
536                                             std::set<size_t> const &       singularParams,
537                                             std::set<size_t> const &       templatedParams ) const;
538   std::string generateCallArgumentEnhancedConstPointer( ParamData const &        param,
539                                                         size_t                   paramIndex,
540                                                         std::set<size_t> const & singularParams,
541                                                         std::set<size_t> const & templatedParams ) const;
542   std::string generateCallArgumentEnhancedNonConstPointer( ParamData const &        param,
543                                                            size_t                   paramIndex,
544                                                            bool                     nonConstPointerAsNullptr,
545                                                            std::set<size_t> const & singularParams ) const;
546   std::string generateCallArgumentEnhancedValue( std::vector<ParamData> const & params, size_t paramIndex, std::set<size_t> const & singularParams ) const;
547   std::string generateCallSequence( std::string const &                       name,
548                                     CommandData const &                       commandData,
549                                     std::vector<size_t> const &               returnParams,
550                                     std::map<size_t, VectorParamData> const & vectorParams,
551                                     size_t                                    initialSkipCount,
552                                     std::set<size_t> const &                  singularParams,
553                                     std::set<size_t> const &                  templatedParams,
554                                     CommandFlavourFlags                       flavourFlags,
555                                     bool                                      raii ) const;
556   std::string generateChainTemplates( std::vector<size_t> const & returnParams, bool chained ) const;
557   std::string generateCommand( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
558   std::string generateCommandDefinitions() const;
559   std::string
560     generateCommandDefinitions( std::vector<RequireData> const & requireData, std::set<std::string> & listedCommands, std::string const & title ) const;
561   std::string generateCommandDefinitions( std::string const & command, std::string const & handle ) const;
562   std::string generateCommandEnhanced( std::string const &                       name,
563                                        CommandData const &                       commandData,
564                                        size_t                                    initialSkipCount,
565                                        bool                                      definition,
566                                        std::map<size_t, VectorParamData> const & vectorParams,
567                                        std::vector<size_t> const &               returnParams,
568                                        CommandFlavourFlags                       flavourFlags = {} ) const;
569   std::string generateCommandName( std::string const &            vulkanCommandName,
570                                    std::vector<ParamData> const & params,
571                                    size_t                         initialSkipCount,
572                                    std::set<std::string> const &  tags,
573                                    CommandFlavourFlags            flavourFlags = {} ) const;
574   std::string
575     generateCommandResultMultiSuccessNoErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
576   std::string generateCommandResultMultiSuccessNoErrors0Return( std::string const & name,
577                                                                 CommandData const & commandData,
578                                                                 size_t              initialSkipCount,
579                                                                 bool                definition ) const;
580   std::string generateCommandResultMultiSuccessNoErrors2Return(
581     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParams ) const;
582   std::string
583     generateCommandResultMultiSuccessWithErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
584   std::string generateCommandResultMultiSuccessWithErrors1Return(
585     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
586   std::string generateCommandResultMultiSuccessWithErrors2Return(
587     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
588   std::string generateCommandResultMultiSuccessWithErrors3Return(
589     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
590   std::string
591     generateCommandResultSingleSuccessNoErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
592   std::string
593     generateCommandResultSingleSuccessWithErrors( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
594   std::string generateCommandResultSingleSuccessWithErrors1Return(
595     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
596   std::string generateCommandResultSingleSuccessWithErrors1ReturnChain(
597     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
598   std::string generateCommandResultSingleSuccessWithErrors1ReturnHandle(
599     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
600   std::string generateCommandResultSingleSuccessWithErrors1ReturnHandle1Vector( std::string const &                        name,
601                                                                                 CommandData const &                        commandData,
602                                                                                 size_t                                     initialSkipCount,
603                                                                                 bool                                       definition,
604                                                                                 size_t                                     returnParam,
605                                                                                 std::pair<size_t, VectorParamData> const & vectorParamIndex ) const;
606   std::string generateCommandResultSingleSuccessWithErrors1ReturnHandle2Vector( std::string const &                       name,
607                                                                                 CommandData const &                       commandData,
608                                                                                 size_t                                    initialSkipCount,
609                                                                                 bool                                      definition,
610                                                                                 size_t                                    returnParam,
611                                                                                 std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
612   std::string generateCommandResultSingleSuccessWithErrors1ReturnValue(
613     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
614   std::string generateCommandResultSingleSuccessWithErrors1ReturnValue2Vectors( std::string const &                       name,
615                                                                                 CommandData const &                       commandData,
616                                                                                 size_t                                    initialSkipCount,
617                                                                                 bool                                      definition,
618                                                                                 size_t                                    returnParam,
619                                                                                 std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
620   std::string generateCommandResultSingleSuccessWithErrors1ReturnVoid(
621     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
622   std::string generateCommandResultSingleSuccessWithErrors2Return(
623     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
624   std::string
625     generateCommandResultWithErrors0Return( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
626   std::string generateCommandSet( bool                             definition,
627                                   std::string const &              standard,
628                                   std::vector<std::string> const & enhanced = {},
629                                   std::vector<std::string> const & unique   = {} ) const;
630   std::string generateCommandSet( std::string const & standard, std::string const & enhanced ) const;
631   std::string generateCommandStandard( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
632   std::string generateCommandValue( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
633   std::string generateCommandVoid0Return( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition ) const;
634   std::string
635     generateCommandVoid1Return( std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, size_t returnParam ) const;
636   std::string generateCommandVoid2Return(
637     std::string const & name, CommandData const & commandData, size_t initialSkipCount, bool definition, std::vector<size_t> const & returnParamIndices ) const;
638   std::string generateConstexprString( std::string const & structName ) const;
639   std::string generateDataDeclarations( CommandData const &                       commandData,
640                                         std::vector<size_t> const &               returnParams,
641                                         std::map<size_t, VectorParamData> const & vectorParams,
642                                         std::set<size_t> const &                  templatedParams,
643                                         CommandFlavourFlags                       flavourFlags,
644                                         bool                                      raii,
645                                         std::vector<std::string> const &          dataTypes,
646                                         std::string const &                       dataType,
647                                         std::string const &                       returnType,
648                                         std::string const &                       returnVariable ) const;
649   std::string generateDataDeclarations1Return( CommandData const &                       commandData,
650                                                std::vector<size_t> const &               returnParams,
651                                                std::map<size_t, VectorParamData> const & vectorParams,
652                                                std::set<size_t> const &                  templatedParams,
653                                                CommandFlavourFlags                       flavourFlags,
654                                                std::vector<std::string> const &          dataTypes,
655                                                std::string const &                       dataType,
656                                                std::string const &                       returnType,
657                                                std::string const &                       returnVariable ) const;
658   std::string generateDataDeclarations2Returns( CommandData const &                       commandData,
659                                                 std::vector<size_t> const &               returnParams,
660                                                 std::map<size_t, VectorParamData> const & vectorParams,
661                                                 CommandFlavourFlags                       flavourFlags,
662                                                 bool                                      raii,
663                                                 std::vector<std::string> const &          dataTypes,
664                                                 std::string const &                       dataType,
665                                                 std::string const &                       returnVariable ) const;
666   std::string generateDataDeclarations3Returns( CommandData const &              commandData,
667                                                 std::vector<size_t> const &      returnParams,
668                                                 CommandFlavourFlags              flavourFlags,
669                                                 bool                             raii,
670                                                 std::vector<std::string> const & dataTypes ) const;
671   std::string generateDataPreparation( CommandData const &                       commandData,
672                                        size_t                                    initialSkipCount,
673                                        std::vector<size_t> const &               returnParams,
674                                        std::map<size_t, VectorParamData> const & vectorParams,
675                                        std::set<size_t> const &                  templatedParams,
676                                        CommandFlavourFlags                       flavourFlags,
677                                        bool                                      enumerating ) const;
678   std::string generateDataSizeChecks( CommandData const &                       commandData,
679                                       std::vector<size_t> const &               returnParams,
680                                       std::vector<std::string> const &          returnParamTypes,
681                                       std::map<size_t, VectorParamData> const & vectorParams,
682                                       std::set<size_t> const &                  templatedParams,
683                                       bool                                      singular ) const;
684   std::string generateDispatchLoaderDynamic() const;  // uses vkGet*ProcAddress to get function pointers
685   std::string generateDispatchLoaderStatic() const;   // uses exported symbols from loader
686   std::string generateDestroyCommand( std::string const & name, CommandData const & commandData ) const;
687   std::string
688     generateDispatchLoaderDynamicCommandAssignment( std::string const & commandName, CommandData const & commandData, std::string const & firstArg ) const;
689   std::string generateDispatchLoaderStaticCommands( std::vector<RequireData> const & requireData,
690                                                     std::set<std::string> &          listedCommands,
691                                                     std::string const &              title ) const;
692   std::string generateEnum( std::pair<std::string, EnumData> const & enumData, std::string const & surroundingProtect ) const;
693   std::string generateEnums() const;
694   std::string generateEnums( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
695   std::string generateEnumsToString() const;
696   std::string generateEnumsToString( std::vector<RequireData> const & requireData, std::set<std::string> & listedEnums, std::string const & title ) const;
697   std::string generateEnumInitializer( TypeInfo const &                   type,
698                                        std::vector<std::string> const &   arraySizes,
699                                        std::vector<EnumValueData> const & values,
700                                        bool                               bitmask ) const;
701   std::string generateEnumToString( std::pair<std::string, EnumData> const & enumData ) const;
702   std::string generateFailureCheck( std::vector<std::string> const & successCodes ) const;
703   std::string generateFormatTraits() const;
704   std::string generateFunctionPointerCheck( std::string const & function, std::string const & referencedIn ) const;
705   std::string generateHandle( std::pair<std::string, HandleData> const & handle, std::set<std::string> & listedHandles ) const;
706   std::string generateHandleCommandDeclarations( std::set<std::string> const & commands ) const;
707   std::string generateHandleDependencies( std::pair<std::string, HandleData> const & handle, std::set<std::string> & listedHandles ) const;
708   std::string generateHandleEmpty( HandleData const & handleData ) const;
709   std::string generateHandleHashStructures( std::vector<RequireData> const & requireData, std::string const & title ) const;
710   std::string generateHandleHashStructures() const;
711   std::string generateHandles() const;
712   std::string generateIndexTypeTraits() const;
713   std::string
714               generateLenInitializer( std::vector<MemberData>::const_iterator                                                                                 mit,
715                                       std::map<std::vector<MemberData>::const_iterator, std::vector<std::vector<MemberData>::const_iterator>>::const_iterator litit,
716                                       bool mutualExclusiveLens ) const;
717   std::string generateName( TypeInfo const & typeInfo ) const;
718   std::string generateNoExcept( std::vector<std::string> const &          errorCodes,
719                                 std::vector<size_t> const &               returnParams,
720                                 std::map<size_t, VectorParamData> const & vectorParams,
721                                 CommandFlavourFlags                       flavourFlags,
722                                 bool                                      vectorSizeCheck,
723                                 bool                                      raii ) const;
724   std::string generateObjectDeleter( std::string const & commandName, CommandData const & commandData, size_t initialSkipCount, size_t returnParam ) const;
725   std::pair<std::string, std::string> generateProtection( std::string const & protect ) const;
726   std::string                         generateRAIICommandDefinitions() const;
727   std::string
728     generateRAIICommandDefinitions( std::vector<RequireData> const & requireData, std::set<std::string> & listedCommands, std::string const & title ) const;
729   std::string generateRAIIDispatchers() const;
730   std::string generateRAIIHandle( std::pair<std::string, HandleData> const & handle,
731                                   std::set<std::string> &                    listedHandles,
732                                   std::set<std::string> const &              specialFunctions ) const;
733   std::string generateRAIIHandleCommand( std::string const & command, size_t initialSkipCount, bool definition ) const;
734   std::string generateRAIIHandleCommandDeclarations( std::pair<std::string, HandleData> const & handle, std::set<std::string> const & specialFunctions ) const;
735   std::string generateRAIIHandleCommandEnhanced( std::map<std::string, CommandData>::const_iterator commandIt,
736                                                  size_t                                             initialSkipCount,
737                                                  std::vector<size_t> const &                        returnParams,
738                                                  std::map<size_t, VectorParamData> const &          vectorParamIndices,
739                                                  bool                                               definition,
740                                                  CommandFlavourFlags                                flavourFlags = {} ) const;
741   std::string generateRAIIHandleCommandFactory( std::map<std::string, CommandData>::const_iterator commandIt,
742                                                 size_t                                             initialSkipCount,
743                                                 std::vector<size_t> const &                        returnParams,
744                                                 std::map<size_t, VectorParamData> const &          vectorParams,
745                                                 bool                                               definition,
746                                                 CommandFlavourFlags                                flavourFlags = {} ) const;
747   std::string generateRAIIHandleCommandFactoryArgumentList( std::vector<ParamData> const & params,
748                                                             std::set<size_t> const &       skippedParams,
749                                                             bool                           definition,
750                                                             bool                           singular ) const;
751   std::string generateRAIIHandleCommandResult( std::map<std::string, CommandData>::const_iterator commandIt, size_t initialSkipCount, bool definition ) const;
752   std::string generateRAIIHandleCommandResultMultiSuccessNoErrors( std::map<std::string, CommandData>::const_iterator commandIt,
753                                                                    size_t                                             initialSkipCount,
754                                                                    bool                                               definition ) const;
755   std::string generateRAIIHandleCommandResultMultiSuccessNoErrors2Return( std::map<std::string, CommandData>::const_iterator commandIt,
756                                                                           size_t                                             initialSkipCount,
757                                                                           bool                                               definition,
758                                                                           std::vector<size_t> const &                        returnParams ) const;
759   std::string generateRAIIHandleCommandResultMultiSuccessWithErrors( std::map<std::string, CommandData>::const_iterator commandIt,
760                                                                      size_t                                             initialSkipCount,
761                                                                      bool                                               definition ) const;
762   std::string generateRAIIHandleCommandResultMultiSuccessWithErrors1Return( std::map<std::string, CommandData>::const_iterator commandIt,
763                                                                             size_t                                             initialSkipCount,
764                                                                             bool                                               definition,
765                                                                             size_t                                             returnParam ) const;
766   std::string generateRAIIHandleCommandResultMultiSuccessWithErrors2Return( std::map<std::string, CommandData>::const_iterator commandIt,
767                                                                             size_t                                             initialSkipCount,
768                                                                             bool                                               definition,
769                                                                             std::vector<size_t> const &                        returnParamIndices ) const;
770   std::string generateRAIIHandleCommandResultMultiSuccessWithErrors3Return( std::map<std::string, CommandData>::const_iterator commandIt,
771                                                                             size_t                                             initialSkipCount,
772                                                                             bool                                               definition,
773                                                                             std::vector<size_t> const &                        returnParamIndices ) const;
774   std::string generateRAIIHandleCommandResultSingleSuccessNoErrors( std::map<std::string, CommandData>::const_iterator commandIt,
775                                                                     size_t                                             initialSkipCount,
776                                                                     bool                                               definition ) const;
777   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors( std::map<std::string, CommandData>::const_iterator commandIt,
778                                                                       size_t                                             initialSkipCount,
779                                                                       bool                                               definition ) const;
780   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1Return( std::map<std::string, CommandData>::const_iterator commandIt,
781                                                                              size_t                                             initialSkipCount,
782                                                                              bool                                               definition,
783                                                                              size_t                                             returnParam ) const;
784   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnChain( std::map<std::string, CommandData>::const_iterator commandIt,
785                                                                                   size_t                                             initialSkipCount,
786                                                                                   bool                                               definition,
787                                                                                   size_t                                             returnParam ) const;
788   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnHandle( std::map<std::string, CommandData>::const_iterator commandIt,
789                                                                                    size_t                                             initialSkipCount,
790                                                                                    bool                                               definition,
791                                                                                    size_t                                             returnParam ) const;
792   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnValue( std::map<std::string, CommandData>::const_iterator commandIt,
793                                                                                   size_t                                             initialSkipCount,
794                                                                                   bool                                               definition,
795                                                                                   size_t                                             returnParam ) const;
796   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnValue2Vectors( std::map<std::string, CommandData>::const_iterator commandIt,
797                                                                                           size_t                                             initialSkipCount,
798                                                                                           bool                                               definition,
799                                                                                           size_t                                             returnParam,
800                                                                                           std::map<size_t, VectorParamData> const & vectorParams ) const;
801   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors1ReturnVoid( std::map<std::string, CommandData>::const_iterator commandIt,
802                                                                                  size_t                                             initialSkipCount,
803                                                                                  bool                                               definition,
804                                                                                  size_t                                             returnParam ) const;
805   std::string generateRAIIHandleCommandResultSingleSuccessWithErrors2Return( std::map<std::string, CommandData>::const_iterator commandIt,
806                                                                              size_t                                             initialSkipCount,
807                                                                              bool                                               definition,
808                                                                              std::vector<size_t> const &                        returnParamIndices ) const;
809   std::string generateRAIIHandleCommandValue( std::map<std::string, CommandData>::const_iterator commandIt, size_t initialSkipCount, bool definition ) const;
810   std::string generateRAIIHandleCommandVoid( std::map<std::string, CommandData>::const_iterator commandIt, size_t initialSkipCount, bool definition ) const;
811   std::pair<std::string, std::string> generateRAIIHandleStaticCreate( std::pair<std::string, HandleData> const &         handle,
812                                                                       std::map<std::string, CommandData>::const_iterator constructorIt,
813                                                                       std::string const &                                enter,
814                                                                       std::string const &                                leave ) const;
815 
816   std::pair<std::string, std::string> generateRAIIHandleConstructor( std::pair<std::string, HandleData> const &         handle,
817                                                                      std::map<std::string, CommandData>::const_iterator constructorIt,
818                                                                      std::string const &                                enter,
819                                                                      std::string const &                                leave ) const;
820   std::pair<std::string, std::string> generateRAIIHandleStaticCreate1Return2Vector( std::pair<std::string, HandleData> const &         handle,
821                                                                                     std::map<std::string, CommandData>::const_iterator constructorIt,
822                                                                                     std::string const &                                enter,
823                                                                                     std::string const &                                leave,
824                                                                                     size_t                                             returnParam,
825                                                                                     std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
826   std::pair<std::string, std::string> generateRAIIHandleConstructor1Return2Vector( std::pair<std::string, HandleData> const &         handle,
827                                                                                    std::map<std::string, CommandData>::const_iterator constructorIt,
828                                                                                    std::string const &                                enter,
829                                                                                    std::string const &                                leave,
830                                                                                    size_t                                             returnParam,
831                                                                                    std::map<size_t, VectorParamData> const & vectorParamIndices ) const;
832   std::pair<std::string, std::string> generateRAIIHandleStaticCreates( std::pair<std::string, HandleData> const & handle ) const;
833   std::pair<std::string, std::string> generateRAIIHandleConstructors( std::pair<std::string, HandleData> const & handle ) const;
834 
835   std::string generateRAIIHandleStaticCreateToConstructorArgument( ParamData const & param,
836                                                                    bool singular ) const;
837   std::string generateRAIIHandleStaticCreateToConstructorArguments( std::pair<std::string, HandleData> const & handle,
838                                                                     std::map<std::string, VulkanHppGenerator::CommandData>::const_iterator constructorIt ) const;
839 
840   std::string generateRAIIHandleConstructorArgument( ParamData const & param, bool definition, bool singular, bool takesOwnership ) const;
841   std::string generateRAIIHandleConstructorArguments( std::pair<std::string, HandleData> const &                             handle,
842                                                       std::map<std::string, VulkanHppGenerator::CommandData>::const_iterator constructorIt,
843                                                       bool                                                                   singular,
844                                                       bool                                                                   takesOwnership ) const;
845   std::string generateRAIIHandleConstructorCallArguments( std::pair<std::string, HandleData> const &                             handle,
846                                                           std::map<std::string, VulkanHppGenerator::CommandData>::const_iterator constructorIt,
847                                                           bool                                                                   nonConstPointerAsNullptr,
848                                                           std::set<size_t> const &                                               singularParams,
849                                                           bool allocatorIsMemberVariable,
850                                                           bool handleParamsAreMembers ) const;
851   std::string generateRAIIHandleStaticCreateEnumerate( std::pair<std::string, HandleData> const &         handle,
852                                                        std::map<std::string, CommandData>::const_iterator constructorIt,
853                                                        std::vector<ParamData>::const_iterator             handleParamIt,
854                                                        std::vector<ParamData>::const_iterator             lenParamIt,
855                                                        std::string const &                                enter,
856                                                        std::string const &                                leave ) const;
857   std::string generateRAIIHandleConstructorEnumerate( std::pair<std::string, HandleData> const &         handle,
858                                                       std::map<std::string, CommandData>::const_iterator constructorIt,
859                                                       std::vector<ParamData>::const_iterator             handleParamIt,
860                                                       std::vector<ParamData>::const_iterator             lenParamIt,
861                                                       std::string const &                                enter,
862                                                       std::string const &                                leave ) const;
863   std::string generateRAIIHandleConstructorInitializationList( std::pair<std::string, HandleData> const &         handle,
864                                                                std::map<std::string, CommandData>::const_iterator constructorIt,
865                                                                std::map<std::string, CommandData>::const_iterator destructorIt,
866                                                                bool                                               takesOwnership ) const;
867   std::string generateRAIIHandleConstructorParamName( std::string const & type, std::map<std::string, CommandData>::const_iterator destructorIt ) const;
868   std::pair<std::string, std::string> generateRAIIHandleStaticCreateResult( std::pair<std::string, HandleData> const &         handle,
869                                                                             std::map<std::string, CommandData>::const_iterator constructorIt,
870                                                                             std::string const &                                enter,
871                                                                             std::string const &                                leave ) const;
872   std::pair<std::string, std::string> generateRAIIHandleConstructorResult( std::pair<std::string, HandleData> const &         handle,
873                                                                            std::map<std::string, CommandData>::const_iterator constructorIt,
874                                                                            std::string const &                                enter,
875                                                                            std::string const &                                leave ) const;
876   std::string generateRAIIHandleStaticCreateResultSingleSuccessWithErrors1Return0Vector( std::pair<std::string, HandleData> const &         handle,
877                                                                                          std::map<std::string, CommandData>::const_iterator constructorIt,
878                                                                                          std::string const &                                enter,
879                                                                                          std::string const &                                leave ) const;
880   std::string generateRAIIHandleConstructorResultSingleSuccessWithErrors1Return0Vector( std::pair<std::string, HandleData> const &         handle,
881                                                                                         std::map<std::string, CommandData>::const_iterator constructorIt,
882                                                                                         std::string const &                                enter,
883                                                                                         std::string const &                                leave ) const;
884   std::string generateRAIIHandleConstructorTakeOwnership( std::pair<std::string, HandleData> const & handle ) const;
885   std::string generateRAIIHandleStaticCreateVector( std::pair<std::string, HandleData> const &         handle,
886                                                     std::map<std::string, CommandData>::const_iterator constructorIt,
887                                                     std::vector<ParamData>::const_iterator             handleParamIt,
888                                                     std::string const &                                enter,
889                                                     std::string const &                                leave ) const;
890   std::string generateRAIIHandleConstructorVector( std::pair<std::string, HandleData> const &         handle,
891                                                    std::map<std::string, CommandData>::const_iterator constructorIt,
892                                                    std::vector<ParamData>::const_iterator             handleParamIt,
893                                                    std::string const &                                enter,
894                                                    std::string const &                                leave ) const;
895   std::string generateRAIIHandleStaticCreateVectorSingular( std::pair<std::string, HandleData> const &         handle,
896                                                             std::map<std::string, CommandData>::const_iterator constructorIt,
897                                                             std::vector<ParamData>::const_iterator             handleParamIt,
898                                                             std::string const &                                enter,
899                                                             std::string const &                                leave ) const;
900   std::string generateRAIIHandleConstructorVectorSingular( std::pair<std::string, HandleData> const &         handle,
901                                                            std::map<std::string, CommandData>::const_iterator constructorIt,
902                                                            std::vector<ParamData>::const_iterator             handleParamIt,
903                                                            std::string const &                                enter,
904                                                            std::string const &                                leave ) const;
905   std::pair<std::string, std::string> generateRAIIHandleConstructorVoid( std::pair<std::string, HandleData> const &         handle,
906                                                                          std::map<std::string, CommandData>::const_iterator constructorIt,
907                                                                          std::string const &                                enter,
908                                                                          std::string const &                                leave ) const;
909   std::string                         generateRAIIHandleConstructorVoid1Return0Vector( std::pair<std::string, HandleData> const &         handle,
910                                                                                        std::map<std::string, CommandData>::const_iterator constructorIt,
911                                                                                        std::string const &                                enter,
912                                                                                        std::string const &                                leave ) const;
913   std::string generateRAIIHandleContext( std::pair<std::string, HandleData> const & handle, std::set<std::string> const & specialFunctions ) const;
914   std::string generateRAIIHandleDestructorCallArguments( std::string const &                                handleType,
915                                                          std::map<std::string, CommandData>::const_iterator destructorIt ) const;
916   std::tuple<std::string, std::string, std::string, std::string, std::string, std::string, std::string>
917               generateRAIIHandleDetails( std::pair<std::string, HandleData> const & handle ) const;
918   std::string generateRAIIHandleForwardDeclarations( std::vector<RequireData> const & requireData, std::string const & title ) const;
919   std::string generateRAIIHandles() const;
920   std::string generateRAIIHandleSingularConstructorArguments( std::pair<std::string, HandleData> const &         handle,
921                                                               std::map<std::string, CommandData>::const_iterator constructorIt ) const;
922   std::string generateRAIIHandleVectorSizeCheck( std::string const &                           name,
923                                                  CommandData const &                           commandData,
924                                                  size_t                                        initialSkipCount,
925                                                  std::map<size_t, std::vector<size_t>> const & countToVectorMap,
926                                                  std::set<size_t> const &                      skippedParams ) const;
927   std::string generateResultAssignment( CommandData const & commandData ) const;
928   std::string generateResultCheck(
929     CommandData const & commandData, std::string const & className, std::string const & classSeparator, std::string commandName, bool enumerating ) const;
930   std::string generateResultExceptions() const;
931   std::string generateReturnStatement( std::string const & commandName,
932                                        CommandData const & commandData,
933                                        std::string const & returnVariable,
934                                        std::string const & returnType,
935                                        std::string const & dataType,
936                                        size_t              initialSkipCount,
937                                        size_t              returnParam,
938                                        CommandFlavourFlags flavourFlags,
939                                        bool                enumerating,
940                                        bool                raii ) const;
941   std::string generateReturnType( CommandData const &                       commandData,
942                                   std::vector<size_t> const &               returnParams,
943                                   std::map<size_t, VectorParamData> const & vectorParams,
944                                   CommandFlavourFlags                       flavourFlags,
945                                   bool                                      raii,
946                                   std::string const &                       dataType ) const;
947   std::string generateReturnVariable( CommandData const &                       commandData,
948                                       std::vector<size_t> const &               returnParams,
949                                       std::map<size_t, VectorParamData> const & vectorParams,
950                                       CommandFlavourFlags                       flavourFlags ) const;
951   std::string
952     generateSizeCheck( std::vector<std::vector<MemberData>::const_iterator> const & arrayIts, std::string const & structName, bool mutualExclusiveLens ) const;
953   std::string generateStaticAssertions() const;
954   std::string generateStaticAssertions( std::vector<RequireData> const & requireData, std::string const & title ) const;
955   std::string generateStruct( std::pair<std::string, StructureData> const & structure, std::set<std::string> & listedStructs ) const;
956   std::string generateStructCompareOperators( std::pair<std::string, StructureData> const & structure ) const;
957   std::string generateStructConstructors( std::pair<std::string, StructureData> const & structData ) const;
958   std::string generateStructConstructorsEnhanced( std::pair<std::string, StructureData> const & structData ) const;
959   std::string generateStructConstructorArgument( bool listedArgument, MemberData const & memberData, bool withDefault ) const;
960   std::string generateStructHashStructure( std::pair<std::string, StructureData> const & structure, std::set<std::string> & listedStructs ) const;
961   std::string generateStructHashStructures() const;
962   std::string generateStructHashSum( std::string const & structName, std::vector<MemberData> const & members ) const;
963   std::string generateStructs() const;
964   std::string generateStructure( std::pair<std::string, StructureData> const & structure ) const;
965   std::string generateStructExtendsStructs() const;
966   std::string
967     generateStructExtendsStructs( std::vector<RequireData> const & requireData, std::set<std::string> & listedStructs, std::string const & title ) const;
968   std::string generateStructForwardDeclarations() const;
969   std::string generateStructForwardDeclarations( std::vector<RequireData> const & requireData, std::string const & title ) const;
970   std::tuple<std::string, std::string, std::string, std::string> generateStructMembers( std::pair<std::string, StructureData> const & structData ) const;
971   std::string                         generateStructSetter( std::string const & structureName, std::vector<MemberData> const & memberData, size_t index ) const;
972   std::string                         generateStructSubConstructor( std::pair<std::string, StructureData> const & structData ) const;
973   std::string                         generateSuccessCheck( std::vector<std::string> const & successCodes ) const;
974   std::string                         generateSuccessCodeList( std::vector<std::string> const & successCodes, bool enumerating ) const;
975   std::string                         generateThrowResultException() const;
976   std::string                         generateTypenameCheck( std::vector<size_t> const &               returnParams,
977                                                              std::map<size_t, VectorParamData> const & vectorParams,
978                                                              bool                                      definition,
979                                                              std::vector<std::string> const &          dataTypes,
980                                                              CommandFlavourFlags                       flavourFlags ) const;
981   std::string                         generateUnion( std::pair<std::string, StructureData> const & structure ) const;
982   std::string                         generateUniqueTypes( std::string const & parentType, std::set<std::string> const & childrenTypes ) const;
983   std::string                         generateVectorSizeCheck( std::string const &                           name,
984                                                                CommandData const &                           commandData,
985                                                                size_t                                        initialSkipCount,
986                                                                std::map<size_t, std::vector<size_t>> const & countToVectorMap,
987                                                                std::set<size_t> const &                      skippedParams,
988                                                                bool                                          onlyThrows ) const;
989   std::pair<std::string, std::string> getParentTypeAndName( std::pair<std::string, HandleData> const & handle ) const;
990   std::string                         getPlatform( std::string const & title ) const;
991   std::pair<std::string, std::string> getPoolTypeAndName( std::string const & type ) const;
992   std::string                         getProtect( EnumValueData const & evd ) const;
993   std::string                         getProtectFromPlatform( std::string const & platform ) const;
994   std::string                         getProtectFromTitle( std::string const & title ) const;
995   std::string                         getProtectFromType( std::string const & type ) const;
996   std::string                         getVectorSize( std::vector<ParamData> const &            params,
997                                                      std::map<size_t, VectorParamData> const & vectorParamIndices,
998                                                      size_t                                    returnParam,
999                                                      std::string const &                       returnParamType,
1000                                                      std::set<size_t> const &                  templatedParams ) const;
1001   bool                                hasLen( std::vector<MemberData> const & members, MemberData const & md ) const;
1002   bool                                hasParentHandle( std::string const & handle, std::string const & parent ) const;
1003   bool                                isDeviceCommand( CommandData const & commandData ) const;
1004   bool                                isHandleType( std::string const & type ) const;
1005   bool                                isLenByStructMember( std::string const & name, std::vector<ParamData> const & params ) const;
1006   bool                                isLenByStructMember( std::string const & name, ParamData const & param ) const;
1007   bool isMultiSuccessCodeConstructor( std::vector<std::map<std::string, CommandData>::const_iterator> const & constructorIts ) const;
1008   bool isParam( std::string const & name, std::vector<ParamData> const & params ) const;
1009   bool isStructMember( std::string const & name, std::vector<MemberData> const & memberData ) const;
1010   bool isStructureChainAnchor( std::string const & type ) const;
1011   std::pair<bool, std::map<size_t, std::vector<size_t>>> needsVectorSizeCheck( std::vector<ParamData> const &            params,
1012                                                                                std::map<size_t, VectorParamData> const & vectorParams,
1013                                                                                std::vector<size_t> const &               returnParams,
1014                                                                                std::set<size_t> const &                  singularParams ) const;
1015   void                                                   readCommands( tinyxml2::XMLElement const * element );
1016   void                                                   readCommandsCommand( tinyxml2::XMLElement const * element );
1017   std::pair<bool, ParamData>          readCommandsCommandParam( tinyxml2::XMLElement const * element, std::vector<ParamData> const & params );
1018   std::pair<std::string, std::string> readCommandsCommandProto( tinyxml2::XMLElement const * element );
1019   std::string                         readComment( tinyxml2::XMLElement const * element );
1020   void                                readEnums( tinyxml2::XMLElement const * element );
1021   void                                readEnumsConstant( tinyxml2::XMLElement const * element );
1022   void                                readEnumsEnum( tinyxml2::XMLElement const * element, std::map<std::string, EnumData>::iterator enumIt );
1023   void                                readExtensions( tinyxml2::XMLElement const * element );
1024   void                                readExtensionsExtension( tinyxml2::XMLElement const * element );
1025   void readExtensionsExtensionRequire( tinyxml2::XMLElement const * element, std::map<std::string, ExtensionData>::iterator extensionIt );
1026   void readExtensionsExtensionRequireCommand( tinyxml2::XMLElement const * element, std::string const & extensionName, RequireData & requireData );
1027   void readExtensionsExtensionRequireSkipped( tinyxml2::XMLElement const * element );
1028   void readExtensionsExtensionRequireType( tinyxml2::XMLElement const * element, std::string const & extensionName, RequireData & requireData );
1029   void readFeature( tinyxml2::XMLElement const * element );
1030   void readFeatureRequire( tinyxml2::XMLElement const * element, std::map<std::string, FeatureData>::iterator featureIt );
1031   void readFeatureRequireCommand( tinyxml2::XMLElement const * element, std::map<std::string, FeatureData>::iterator featureIt, RequireData & requireData );
1032   void readFeatureRequireCommandSkipped( tinyxml2::XMLElement const * element );
1033   void readFeatureRequireSkipped( tinyxml2::XMLElement const * element );
1034   void readFeatureRequireType( tinyxml2::XMLElement const * element, std::map<std::string, FeatureData>::iterator featureIt, RequireData & requireData );
1035   void readFormats( tinyxml2::XMLElement const * element );
1036   void readFormatsFormat( tinyxml2::XMLElement const * element );
1037   void readFormatsFormatComponent( tinyxml2::XMLElement const * element, FormatData & formatData );
1038   void readFormatsFormatPlane( tinyxml2::XMLElement const * element, FormatData & formatData );
1039   void readFormatsFormatSPIRVImageFormat( tinyxml2::XMLElement const * element, FormatData & formatData );
1040   std::pair<NameData, TypeInfo> readNameAndType( tinyxml2::XMLElement const * elements );
1041   void                          readPlatforms( tinyxml2::XMLElement const * element );
1042   void                          readPlatformsPlatform( tinyxml2::XMLElement const * element );
1043   void                          readRegistry( tinyxml2::XMLElement const * element );
1044   void                          readRequireCommandSkipped( tinyxml2::XMLElement const * element );
1045   void                          readRequireEnum( tinyxml2::XMLElement const * element, std::string const & extensionName );
1046   void                          readRequireEnumSkipped( tinyxml2::XMLElement const * element );
1047   void                          readRequireTypeSkipped( tinyxml2::XMLElement const * element );
1048   void                          readSPIRVCapabilities( tinyxml2::XMLElement const * element );
1049   void                          readSPIRVCapabilitiesSPIRVCapability( tinyxml2::XMLElement const * element );
1050   void                          readSPIRVCapabilitiesSPIRVCapabilityEnable( tinyxml2::XMLElement const * element );
1051   void                          readSPIRVCapabilitiesSPIRVCapabilityEnableExtension( int xmlLine, std::map<std::string, std::string> const & attributes );
1052   void                          readSPIRVCapabilitiesSPIRVCapabilityEnableProperty( int xmlLine, std::map<std::string, std::string> const & attributes );
1053   void                          readSPIRVCapabilitiesSPIRVCapabilityEnableStruct( int xmlLine, std::map<std::string, std::string> const & attributes );
1054   void                          readSPIRVCapabilitiesSPIRVCapabilityEnableVersion( int xmlLine, std::map<std::string, std::string> const & attributes );
1055   void                          readSPIRVExtensions( tinyxml2::XMLElement const * element );
1056   void                          readSPIRVExtensionsExtension( tinyxml2::XMLElement const * element );
1057   void                          readSPIRVExtensionsExtensionEnable( tinyxml2::XMLElement const * element );
1058   void                          readTags( tinyxml2::XMLElement const * element );
1059   void                          readTagsTag( tinyxml2::XMLElement const * element );
1060   void                          readTypes( tinyxml2::XMLElement const * element );
1061   void                          readTypesType( tinyxml2::XMLElement const * element );
1062   void                          readTypesTypeBasetype( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1063   void                          readTypesTypeBitmask( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1064   void                          readTypesTypeDefine( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1065   void                          readTypesTypeEnum( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1066   void                          readTypesTypeFuncpointer( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1067   void                          readTypesTypeHandle( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1068   void                          readTypesTypeInclude( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1069   void                          readTypesTypeRequires( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
1070   void     readTypesTypeStruct( tinyxml2::XMLElement const * element, bool isUnion, std::map<std::string, std::string> const & attributes );
1071   void     readTypesTypeStructMember( tinyxml2::XMLElement const * element, std::vector<MemberData> & members, bool isUnion );
1072   void     readTypesTypeStructMemberEnum( tinyxml2::XMLElement const * element, MemberData & memberData );
1073   void     readTypesTypeStructMemberName( tinyxml2::XMLElement const * element, MemberData & memberData, std::vector<MemberData> const & members );
1074   void     readTypesTypeStructMemberType( tinyxml2::XMLElement const * element, MemberData & memberData );
1075   TypeInfo readTypeInfo( tinyxml2::XMLElement const * element ) const;
1076   void     registerDeleter( std::string const & name, std::pair<std::string, CommandData> const & commandData );
1077   void     rescheduleRAIIHandle( std::string &                              str,
1078                                  std::pair<std::string, HandleData> const & handle,
1079                                  std::set<std::string> &                    listedHandles,
1080                                  std::set<std::string> const &              specialFunctions ) const;
1081   std::vector<std::string> selectCommandsByHandle( std::vector<RequireData> const & requireData,
1082                                                    std::set<std::string> const &    handleCommands,
1083                                                    std::set<std::string> &          listedCommands ) const;
1084   void                     setVulkanLicenseHeader( int line, std::string const & comment );
1085   bool                     skipLeadingGrandParent( std::pair<std::string, HandleData> const & handle ) const;
1086   std::string              toString( TypeCategory category );
1087 
1088 private:
1089   std::map<std::string, BaseTypeData>                                 m_baseTypes;
1090   std::map<std::string, BitmaskData>                                  m_bitmasks;
1091   std::map<std::string, CommandData>                                  m_commands;
1092   std::map<std::string, std::string>                                  m_constants;
1093   std::map<std::string, DefineData>                                   m_defines;
1094   std::map<std::string, EnumData>                                     m_enums;
1095   std::set<std::string>                                               m_extendedStructs;  // structs which are referenced by the structextends tag
1096   std::map<std::string, ExtensionData>                                m_extensions;
1097   std::map<int, std::map<std::string, ExtensionData>::const_iterator> m_extensionsByNumber;
1098   std::map<std::string, FeatureData>                                  m_features;
1099   std::map<std::string, FormatData>                                   m_formats;
1100   std::map<std::string, FuncPointerData>                              m_funcPointers;
1101   std::map<std::string, HandleData>                                   m_handles;
1102   std::set<std::string>                                               m_includes;
1103   std::map<std::string, PlatformData>                                 m_platforms;
1104   std::set<std::string>                                               m_RAIISpecialFunctions;
1105   std::map<std::string, EnumData>                                     m_skippedEnums;
1106   std::set<std::string>                                               m_skippedCommands;
1107   std::set<std::string>                                               m_skippedFeatures;
1108   std::map<std::string, TypeData>                                     m_skippedTypes;
1109   std::map<std::string, StructureData>                                m_structures;
1110   std::map<std::string, StructureAliasData>                           m_structureAliases;
1111   std::map<std::string, std::set<std::string>>                        m_structureAliasesInverse;
1112   std::set<std::string>                                               m_tags;
1113   std::map<std::string, TypeData>                                     m_types;
1114   std::string                                                         m_typesafeCheck;
1115   std::string                                                         m_version;
1116   std::string                                                         m_vulkanLicenseHeader;
1117 };
1118