/* WARNING: This is auto-generated file. Do not modify, since changes will
 * be lost! Modify the generating script instead.
 * This file was generated by /scripts/gen_framework.py
 */
namespace vk
{
template<typename T> VkObjectType getObjectType	(void);
template<> inline VkObjectType	getObjectType<VkBuffer>							(void) { return VK_OBJECT_TYPE_BUFFER;							}
template<> inline VkObjectType	getObjectType<VkImage>							(void) { return VK_OBJECT_TYPE_IMAGE;							}
template<> inline VkObjectType	getObjectType<VkInstance>						(void) { return VK_OBJECT_TYPE_INSTANCE;						}
template<> inline VkObjectType	getObjectType<VkPhysicalDevice>					(void) { return VK_OBJECT_TYPE_PHYSICAL_DEVICE;					}
template<> inline VkObjectType	getObjectType<VkDevice>							(void) { return VK_OBJECT_TYPE_DEVICE;							}
template<> inline VkObjectType	getObjectType<VkQueue>							(void) { return VK_OBJECT_TYPE_QUEUE;							}
template<> inline VkObjectType	getObjectType<VkSemaphore>						(void) { return VK_OBJECT_TYPE_SEMAPHORE;						}
template<> inline VkObjectType	getObjectType<VkCommandBuffer>					(void) { return VK_OBJECT_TYPE_COMMAND_BUFFER;					}
template<> inline VkObjectType	getObjectType<VkFence>							(void) { return VK_OBJECT_TYPE_FENCE;							}
template<> inline VkObjectType	getObjectType<VkDeviceMemory>					(void) { return VK_OBJECT_TYPE_DEVICE_MEMORY;					}
template<> inline VkObjectType	getObjectType<VkEvent>							(void) { return VK_OBJECT_TYPE_EVENT;							}
template<> inline VkObjectType	getObjectType<VkQueryPool>						(void) { return VK_OBJECT_TYPE_QUERY_POOL;						}
template<> inline VkObjectType	getObjectType<VkBufferView>						(void) { return VK_OBJECT_TYPE_BUFFER_VIEW;						}
template<> inline VkObjectType	getObjectType<VkImageView>						(void) { return VK_OBJECT_TYPE_IMAGE_VIEW;						}
template<> inline VkObjectType	getObjectType<VkShaderModule>					(void) { return VK_OBJECT_TYPE_SHADER_MODULE;					}
template<> inline VkObjectType	getObjectType<VkPipelineCache>					(void) { return VK_OBJECT_TYPE_PIPELINE_CACHE;					}
template<> inline VkObjectType	getObjectType<VkPipelineLayout>					(void) { return VK_OBJECT_TYPE_PIPELINE_LAYOUT;					}
template<> inline VkObjectType	getObjectType<VkPipeline>						(void) { return VK_OBJECT_TYPE_PIPELINE;						}
template<> inline VkObjectType	getObjectType<VkRenderPass>						(void) { return VK_OBJECT_TYPE_RENDER_PASS;						}
template<> inline VkObjectType	getObjectType<VkDescriptorSetLayout>			(void) { return VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT;			}
template<> inline VkObjectType	getObjectType<VkSampler>						(void) { return VK_OBJECT_TYPE_SAMPLER;							}
template<> inline VkObjectType	getObjectType<VkDescriptorSet>					(void) { return VK_OBJECT_TYPE_DESCRIPTOR_SET;					}
template<> inline VkObjectType	getObjectType<VkDescriptorPool>					(void) { return VK_OBJECT_TYPE_DESCRIPTOR_POOL;					}
template<> inline VkObjectType	getObjectType<VkFramebuffer>					(void) { return VK_OBJECT_TYPE_FRAMEBUFFER;						}
template<> inline VkObjectType	getObjectType<VkCommandPool>					(void) { return VK_OBJECT_TYPE_COMMAND_POOL;					}
template<> inline VkObjectType	getObjectType<VkSamplerYcbcrConversion>			(void) { return VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION;		}
template<> inline VkObjectType	getObjectType<VkDescriptorUpdateTemplate>		(void) { return VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE;		}
template<> inline VkObjectType	getObjectType<VkSurfaceKHR>						(void) { return VK_OBJECT_TYPE_SURFACE_KHR;						}
template<> inline VkObjectType	getObjectType<VkSwapchainKHR>					(void) { return VK_OBJECT_TYPE_SWAPCHAIN_KHR;					}
template<> inline VkObjectType	getObjectType<VkDisplayKHR>						(void) { return VK_OBJECT_TYPE_DISPLAY_KHR;						}
template<> inline VkObjectType	getObjectType<VkDisplayModeKHR>					(void) { return VK_OBJECT_TYPE_DISPLAY_MODE_KHR;				}
template<> inline VkObjectType	getObjectType<VkDeferredOperationKHR>			(void) { return VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR;			}
template<> inline VkObjectType	getObjectType<VkDebugReportCallbackEXT>			(void) { return VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT;		}
template<> inline VkObjectType	getObjectType<VkDebugUtilsMessengerEXT>			(void) { return VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT;		}
template<> inline VkObjectType	getObjectType<VkValidationCacheEXT>				(void) { return VK_OBJECT_TYPE_VALIDATION_CACHE_EXT;			}
template<> inline VkObjectType	getObjectType<VkAccelerationStructureNV>		(void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV;		}
template<> inline VkObjectType	getObjectType<VkPerformanceConfigurationINTEL>	(void) { return VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL;	}
template<> inline VkObjectType	getObjectType<VkIndirectCommandsLayoutNV>		(void) { return VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV;		}
template<> inline VkObjectType	getObjectType<VkPrivateDataSlotEXT>				(void) { return VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT;			}
template<> inline VkObjectType	getObjectType<VkAccelerationStructureKHR>		(void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR;		}
template<> inline VkObjectType	getObjectType<VkVideoSessionKHR>				(void) { return VK_OBJECT_TYPE_VIDEO_SESSION_KHR;				}
template<> inline VkObjectType	getObjectType<VkVideoSessionParametersKHR>		(void) { return VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR;	}
}
