/* 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<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<VkAccelerationStructureKHR>		(void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR;		}
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<VkDeferredOperationKHR>			(void) { return VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR;			}
template<> inline VkObjectType	getObjectType<VkAccelerationStructureNV>		(void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV;		}
}
