///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2015-2016 The Khronos Group Inc.
// Copyright (c) 2015-2016 Valve Corporation
// Copyright (c) 2015-2016 LunarG, Inc.
// Copyright (c) 2015-2016 Google, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///////////////////////////////////////////////////////////////////////////////

#include "vkjson.h"

#include <assert.h>
#include <stdlib.h>
#include <string.h>

#include <json/json.h>

#include <algorithm>
#include <cinttypes>
#include <cmath>
#include <cstdio>
#include <limits>
#include <memory>
#include <sstream>
#include <type_traits>
#include <utility>

/*
 * This file is autogenerated by vkjson_generator.py. Do not edit directly.
 */
namespace {

/*
 * Annotation to tell clang that we intend to fall through from one case to
 * another in a switch. Sourced from android-base/macros.h.
 */
#define FALLTHROUGH_INTENDED [[clang::fallthrough]]

inline bool IsIntegral(double value) {
#if defined(ANDROID)
  // Android NDK doesn't provide std::trunc yet
  return trunc(value) == value;
#else
  return std::trunc(value) == value;
#endif
}

// Floating point fields of Vulkan structure use single precision. The string
// output of max double value in c++ will be larger than Java double's infinity
// value. Below fake double max/min values are only to serve the safe json text
// parsing in between C++ and Java, because Java json library simply cannot
// handle infinity.
static const double SAFE_DOUBLE_MAX = 0.99 * std::numeric_limits<double>::max();
static const double SAFE_DOUBLE_MIN = -SAFE_DOUBLE_MAX;

template <typename T>
struct EnumTraits;

template <>
struct EnumTraits<VkImageLayout> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_IMAGE_LAYOUT_UNDEFINED:
      case VK_IMAGE_LAYOUT_GENERAL:
      case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
      case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
      case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
      case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
      case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
      case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
      case VK_IMAGE_LAYOUT_PREINITIALIZED:
      case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
      case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
      case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
      case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
      case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
      case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
      case VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL:
      case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL:
      case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
      case VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR:
      case VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR:
      case VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR:
      case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
      case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT:
      case VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR:
#ifdef VK_ENABLE_BETA_EXTENSIONS
      case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR:
#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
      case VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR:
#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
      case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR:
#endif
      case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkImageType> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_IMAGE_TYPE_1D:
      case VK_IMAGE_TYPE_2D:
      case VK_IMAGE_TYPE_3D:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkImageTiling> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_IMAGE_TILING_OPTIMAL:
      case VK_IMAGE_TILING_LINEAR:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkPhysicalDeviceType> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_PHYSICAL_DEVICE_TYPE_OTHER:
      case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU:
      case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:
      case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:
      case VK_PHYSICAL_DEVICE_TYPE_CPU:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkFormat> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_FORMAT_UNDEFINED:
      case VK_FORMAT_R4G4_UNORM_PACK8:
      case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
      case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
      case VK_FORMAT_R5G6B5_UNORM_PACK16:
      case VK_FORMAT_B5G6R5_UNORM_PACK16:
      case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
      case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
      case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
      case VK_FORMAT_R8_UNORM:
      case VK_FORMAT_R8_SNORM:
      case VK_FORMAT_R8_USCALED:
      case VK_FORMAT_R8_SSCALED:
      case VK_FORMAT_R8_UINT:
      case VK_FORMAT_R8_SINT:
      case VK_FORMAT_R8_SRGB:
      case VK_FORMAT_R8G8_UNORM:
      case VK_FORMAT_R8G8_SNORM:
      case VK_FORMAT_R8G8_USCALED:
      case VK_FORMAT_R8G8_SSCALED:
      case VK_FORMAT_R8G8_UINT:
      case VK_FORMAT_R8G8_SINT:
      case VK_FORMAT_R8G8_SRGB:
      case VK_FORMAT_R8G8B8_UNORM:
      case VK_FORMAT_R8G8B8_SNORM:
      case VK_FORMAT_R8G8B8_USCALED:
      case VK_FORMAT_R8G8B8_SSCALED:
      case VK_FORMAT_R8G8B8_UINT:
      case VK_FORMAT_R8G8B8_SINT:
      case VK_FORMAT_R8G8B8_SRGB:
      case VK_FORMAT_B8G8R8_UNORM:
      case VK_FORMAT_B8G8R8_SNORM:
      case VK_FORMAT_B8G8R8_USCALED:
      case VK_FORMAT_B8G8R8_SSCALED:
      case VK_FORMAT_B8G8R8_UINT:
      case VK_FORMAT_B8G8R8_SINT:
      case VK_FORMAT_B8G8R8_SRGB:
      case VK_FORMAT_R8G8B8A8_UNORM:
      case VK_FORMAT_R8G8B8A8_SNORM:
      case VK_FORMAT_R8G8B8A8_USCALED:
      case VK_FORMAT_R8G8B8A8_SSCALED:
      case VK_FORMAT_R8G8B8A8_UINT:
      case VK_FORMAT_R8G8B8A8_SINT:
      case VK_FORMAT_R8G8B8A8_SRGB:
      case VK_FORMAT_B8G8R8A8_UNORM:
      case VK_FORMAT_B8G8R8A8_SNORM:
      case VK_FORMAT_B8G8R8A8_USCALED:
      case VK_FORMAT_B8G8R8A8_SSCALED:
      case VK_FORMAT_B8G8R8A8_UINT:
      case VK_FORMAT_B8G8R8A8_SINT:
      case VK_FORMAT_B8G8R8A8_SRGB:
      case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
      case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
      case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
      case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
      case VK_FORMAT_A8B8G8R8_UINT_PACK32:
      case VK_FORMAT_A8B8G8R8_SINT_PACK32:
      case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
      case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
      case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
      case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
      case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
      case VK_FORMAT_A2R10G10B10_UINT_PACK32:
      case VK_FORMAT_A2R10G10B10_SINT_PACK32:
      case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
      case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
      case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
      case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
      case VK_FORMAT_A2B10G10R10_UINT_PACK32:
      case VK_FORMAT_A2B10G10R10_SINT_PACK32:
      case VK_FORMAT_R16_UNORM:
      case VK_FORMAT_R16_SNORM:
      case VK_FORMAT_R16_USCALED:
      case VK_FORMAT_R16_SSCALED:
      case VK_FORMAT_R16_UINT:
      case VK_FORMAT_R16_SINT:
      case VK_FORMAT_R16_SFLOAT:
      case VK_FORMAT_R16G16_UNORM:
      case VK_FORMAT_R16G16_SNORM:
      case VK_FORMAT_R16G16_USCALED:
      case VK_FORMAT_R16G16_SSCALED:
      case VK_FORMAT_R16G16_UINT:
      case VK_FORMAT_R16G16_SINT:
      case VK_FORMAT_R16G16_SFLOAT:
      case VK_FORMAT_R16G16B16_UNORM:
      case VK_FORMAT_R16G16B16_SNORM:
      case VK_FORMAT_R16G16B16_USCALED:
      case VK_FORMAT_R16G16B16_SSCALED:
      case VK_FORMAT_R16G16B16_UINT:
      case VK_FORMAT_R16G16B16_SINT:
      case VK_FORMAT_R16G16B16_SFLOAT:
      case VK_FORMAT_R16G16B16A16_UNORM:
      case VK_FORMAT_R16G16B16A16_SNORM:
      case VK_FORMAT_R16G16B16A16_USCALED:
      case VK_FORMAT_R16G16B16A16_SSCALED:
      case VK_FORMAT_R16G16B16A16_UINT:
      case VK_FORMAT_R16G16B16A16_SINT:
      case VK_FORMAT_R16G16B16A16_SFLOAT:
      case VK_FORMAT_R32_UINT:
      case VK_FORMAT_R32_SINT:
      case VK_FORMAT_R32_SFLOAT:
      case VK_FORMAT_R32G32_UINT:
      case VK_FORMAT_R32G32_SINT:
      case VK_FORMAT_R32G32_SFLOAT:
      case VK_FORMAT_R32G32B32_UINT:
      case VK_FORMAT_R32G32B32_SINT:
      case VK_FORMAT_R32G32B32_SFLOAT:
      case VK_FORMAT_R32G32B32A32_UINT:
      case VK_FORMAT_R32G32B32A32_SINT:
      case VK_FORMAT_R32G32B32A32_SFLOAT:
      case VK_FORMAT_R64_UINT:
      case VK_FORMAT_R64_SINT:
      case VK_FORMAT_R64_SFLOAT:
      case VK_FORMAT_R64G64_UINT:
      case VK_FORMAT_R64G64_SINT:
      case VK_FORMAT_R64G64_SFLOAT:
      case VK_FORMAT_R64G64B64_UINT:
      case VK_FORMAT_R64G64B64_SINT:
      case VK_FORMAT_R64G64B64_SFLOAT:
      case VK_FORMAT_R64G64B64A64_UINT:
      case VK_FORMAT_R64G64B64A64_SINT:
      case VK_FORMAT_R64G64B64A64_SFLOAT:
      case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
      case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
      case VK_FORMAT_D16_UNORM:
      case VK_FORMAT_X8_D24_UNORM_PACK32:
      case VK_FORMAT_D32_SFLOAT:
      case VK_FORMAT_S8_UINT:
      case VK_FORMAT_D16_UNORM_S8_UINT:
      case VK_FORMAT_D24_UNORM_S8_UINT:
      case VK_FORMAT_D32_SFLOAT_S8_UINT:
      case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
      case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
      case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
      case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
      case VK_FORMAT_BC2_UNORM_BLOCK:
      case VK_FORMAT_BC2_SRGB_BLOCK:
      case VK_FORMAT_BC3_UNORM_BLOCK:
      case VK_FORMAT_BC3_SRGB_BLOCK:
      case VK_FORMAT_BC4_UNORM_BLOCK:
      case VK_FORMAT_BC4_SNORM_BLOCK:
      case VK_FORMAT_BC5_UNORM_BLOCK:
      case VK_FORMAT_BC5_SNORM_BLOCK:
      case VK_FORMAT_BC6H_UFLOAT_BLOCK:
      case VK_FORMAT_BC6H_SFLOAT_BLOCK:
      case VK_FORMAT_BC7_UNORM_BLOCK:
      case VK_FORMAT_BC7_SRGB_BLOCK:
      case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
      case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
      case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
      case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
      case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
      case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
      case VK_FORMAT_EAC_R11_UNORM_BLOCK:
      case VK_FORMAT_EAC_R11_SNORM_BLOCK:
      case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
      case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
      case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
      case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
      case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
      case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
      case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
      case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
      case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
      case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
      case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
      case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
      case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
      case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
      case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
      case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
      case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
      case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
      case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
      case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
      case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
      case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
      case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
      case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
      case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
      case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
      case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
      case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
      case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
      case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
      case VK_FORMAT_G8B8G8R8_422_UNORM:
      case VK_FORMAT_B8G8R8G8_422_UNORM:
      case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
      case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
      case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
      case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
      case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
      case VK_FORMAT_R10X6_UNORM_PACK16:
      case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
      case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
      case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
      case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
      case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
      case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
      case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
      case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
      case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
      case VK_FORMAT_R12X4_UNORM_PACK16:
      case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
      case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
      case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
      case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
      case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
      case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
      case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
      case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
      case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
      case VK_FORMAT_G16B16G16R16_422_UNORM:
      case VK_FORMAT_B16G16R16G16_422_UNORM:
      case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
      case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
      case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
      case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
      case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
      case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM:
      case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16:
      case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16:
      case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM:
      case VK_FORMAT_A4R4G4B4_UNORM_PACK16:
      case VK_FORMAT_A4B4G4R4_UNORM_PACK16:
      case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK:
      case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK:
      case VK_FORMAT_A1B5G5R5_UNORM_PACK16:
      case VK_FORMAT_A8_UNORM:
      case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
      case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
      case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
      case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
      case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
      case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
      case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
      case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
      case VK_FORMAT_R8_BOOL_ARM:
      case VK_FORMAT_R16G16_SFIXED5_NV:
      case VK_FORMAT_R10X6_UINT_PACK16_ARM:
      case VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM:
      case VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM:
      case VK_FORMAT_R12X4_UINT_PACK16_ARM:
      case VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM:
      case VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM:
      case VK_FORMAT_R14X2_UINT_PACK16_ARM:
      case VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM:
      case VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM:
      case VK_FORMAT_R14X2_UNORM_PACK16_ARM:
      case VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM:
      case VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM:
      case VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM:
      case VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkRayTracingInvocationReorderModeNV> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV:
      case VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkSampleCountFlagBits> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_SAMPLE_COUNT_1_BIT:
      case VK_SAMPLE_COUNT_2_BIT:
      case VK_SAMPLE_COUNT_4_BIT:
      case VK_SAMPLE_COUNT_8_BIT:
      case VK_SAMPLE_COUNT_16_BIT:
      case VK_SAMPLE_COUNT_32_BIT:
      case VK_SAMPLE_COUNT_64_BIT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkExternalMemoryHandleTypeFlagBits> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT:
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
      case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkExternalSemaphoreHandleTypeFlagBits> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
      case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
      case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
      case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT:
      case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkExternalFenceHandleTypeFlagBits> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
      case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
      case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
      case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkPointClippingBehavior> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES:
      case VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkChromaLocation> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_CHROMA_LOCATION_COSITED_EVEN:
      case VK_CHROMA_LOCATION_MIDPOINT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkDriverId> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_DRIVER_ID_AMD_PROPRIETARY:
      case VK_DRIVER_ID_AMD_OPEN_SOURCE:
      case VK_DRIVER_ID_MESA_RADV:
      case VK_DRIVER_ID_NVIDIA_PROPRIETARY:
      case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS:
      case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA:
      case VK_DRIVER_ID_IMAGINATION_PROPRIETARY:
      case VK_DRIVER_ID_QUALCOMM_PROPRIETARY:
      case VK_DRIVER_ID_ARM_PROPRIETARY:
      case VK_DRIVER_ID_GOOGLE_SWIFTSHADER:
      case VK_DRIVER_ID_GGP_PROPRIETARY:
      case VK_DRIVER_ID_BROADCOM_PROPRIETARY:
      case VK_DRIVER_ID_MESA_LLVMPIPE:
      case VK_DRIVER_ID_MOLTENVK:
      case VK_DRIVER_ID_COREAVI_PROPRIETARY:
      case VK_DRIVER_ID_JUICE_PROPRIETARY:
      case VK_DRIVER_ID_VERISILICON_PROPRIETARY:
      case VK_DRIVER_ID_MESA_TURNIP:
      case VK_DRIVER_ID_MESA_V3DV:
      case VK_DRIVER_ID_MESA_PANVK:
      case VK_DRIVER_ID_SAMSUNG_PROPRIETARY:
      case VK_DRIVER_ID_MESA_VENUS:
      case VK_DRIVER_ID_MESA_DOZEN:
      case VK_DRIVER_ID_MESA_NVK:
      case VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA:
      case VK_DRIVER_ID_MESA_HONEYKRISP:
      case VK_DRIVER_ID_VULKAN_SC_EMULATION_ON_VULKAN:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkShaderFloatControlsIndependence> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY:
      case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL:
      case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkPipelineRobustnessBufferBehavior> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT:
      case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED:
      case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS:
      case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkPipelineRobustnessImageBehavior> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT:
      case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED:
      case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS:
      case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkPhysicalDeviceLayeredApiKHR> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_PHYSICAL_DEVICE_LAYERED_API_VULKAN_KHR:
      case VK_PHYSICAL_DEVICE_LAYERED_API_D3D12_KHR:
      case VK_PHYSICAL_DEVICE_LAYERED_API_METAL_KHR:
      case VK_PHYSICAL_DEVICE_LAYERED_API_OPENGL_KHR:
      case VK_PHYSICAL_DEVICE_LAYERED_API_OPENGLES_KHR:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkLayeredDriverUnderlyingApiMSFT> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT:
      case VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT:
        return true;
    }
    return false;
  }
};

template <>
struct EnumTraits<VkDefaultVertexAttributeValueKHR> {
  static bool exist(uint32_t e) {
    switch (e) {
      case VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ZERO_KHR:
      case VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ONE_KHR:
        return true;
    }
    return false;
  }
};

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkExtent3D* extents) {
  return visitor->Visit("width", &extents->width) &&
         visitor->Visit("height", &extents->height) &&
         visitor->Visit("depth", &extents->depth);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLayeredApiPropertiesKHR* properties) {
  return visitor->Visit("vendorID", &properties->vendorID) &&
         visitor->Visit("deviceID", &properties->deviceID) &&
         visitor->Visit("layeredAPI", &properties->layeredAPI) &&
         visitor->Visit("deviceName", &properties->deviceName);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkExtent2D* extents) {
  return visitor->Visit("width", &extents->width) &&
         visitor->Visit("height", &extents->height);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkConformanceVersionKHR* version) {
  return visitor->Visit("major", &version->major) &&
         visitor->Visit("minor", &version->minor) &&
         visitor->Visit("subminor", &version->subminor) &&
         visitor->Visit("patch", &version->patch);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkMemoryType* type) {
  return visitor->Visit("propertyFlags", &type->propertyFlags) &&
         visitor->Visit("heapIndex", &type->heapIndex);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkMemoryHeap* heap) {
  return visitor->Visit("size", &heap->size) &&
         visitor->Visit("flags", &heap->flags);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonCore11* core) {
  return visitor->Visit("features", &core->features) &&
         visitor->Visit("properties", &core->properties);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonCore12* core) {
  return visitor->Visit("features", &core->features) &&
         visitor->Visit("properties", &core->properties);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonCore13* core) {
  return visitor->Visit("features", &core->features) &&
         visitor->Visit("properties", &core->properties);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonCore14* core) {
  return visitor->Visit("features", &core->features) &&
         visitor->Visit("properties", &core->properties);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonAMDAntiLag* structs) {
  return visitor->Visit("antiLagFeaturesAMD", &structs->anti_lag_features_amd);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonAMDDeviceCoherentMemory* structs) {
  return visitor->Visit("coherentMemoryFeaturesAMD",
                        &structs->coherent_memory_features_amd);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonAMDShaderCoreProperties* structs) {
  return visitor->Visit("shaderCorePropertiesAMD",
                        &structs->shader_core_properties_amd);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonAMDShaderCoreProperties2* structs) {
  return visitor->Visit("shaderCoreProperties2AMD",
                        &structs->shader_core_properties2_amd);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonAMDShaderEarlyAndLateFragmentTests* structs) {
  return visitor->Visit(
      "shaderEarlyAndLateFragmentTestsFeaturesAMD",
      &structs->shader_early_and_late_fragment_tests_features_amd);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonANDROIDExternalFormatResolve* structs) {
  return visitor->Visit("externalFormatResolveFeaturesANDROID",
                        &structs->external_format_resolve_features_android) &&
         visitor->Visit("externalFormatResolvePropertiesANDROID",
                        &structs->external_format_resolve_properties_android);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonARMFormatPack* structs) {
  return visitor->Visit("formatPackFeaturesARM",
                        &structs->format_pack_features_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonARMPipelineOpacityMicromap* structs) {
  return visitor->Visit("pipelineOpacityMicromapFeaturesARM",
                        &structs->pipeline_opacity_micromap_features_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonARMRasterizationOrderAttachmentAccess* structs) {
  return visitor->Visit(
      "rasterizationOrderAttachmentAccessFeaturesARM",
      &structs->rasterization_order_attachment_access_features_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonARMRenderPassStriped* structs) {
  return visitor->Visit("renderPassStripedFeaturesARM",
                        &structs->render_pass_striped_features_arm) &&
         visitor->Visit("renderPassStripedPropertiesARM",
                        &structs->render_pass_striped_properties_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonARMSchedulingControls* structs) {
  return visitor->Visit("schedulingControlsFeaturesARM",
                        &structs->scheduling_controls_features_arm) &&
         visitor->Visit("schedulingControlsPropertiesARM",
                        &structs->scheduling_controls_properties_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonARMShaderCoreBuiltins* structs) {
  return visitor->Visit("shaderCoreBuiltinsFeaturesARM",
                        &structs->shader_core_builtins_features_arm) &&
         visitor->Visit("shaderCoreBuiltinsPropertiesARM",
                        &structs->shader_core_builtins_properties_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonARMShaderCoreProperties* structs) {
  return visitor->Visit("shaderCorePropertiesARM",
                        &structs->shader_core_properties_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonARMTensors* structs) {
  return visitor->Visit("tensorPropertiesARM",
                        &structs->tensor_properties_arm) &&
         visitor->Visit("tensorFeaturesARM", &structs->tensor_features_arm) &&
         visitor->Visit("descriptorBufferTensorFeaturesARM",
                        &structs->descriptor_buffer_tensor_features_arm) &&
         visitor->Visit("descriptorBufferTensorPropertiesARM",
                        &structs->descriptor_buffer_tensor_properties_arm);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExt4444Formats* structs) {
  return visitor->Visit("formats4444FeaturesEXT",
                        &structs->formats_4444_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtAstcDecodeMode* structs) {
  return visitor->Visit("ASTCDecodeFeaturesEXT",
                        &structs->astc_decode_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtAttachmentFeedbackLoopDynamicState* structs) {
  return visitor->Visit(
      "attachmentFeedbackLoopDynamicStateFeaturesEXT",
      &structs->attachment_feedback_loop_dynamic_state_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtAttachmentFeedbackLoopLayout* structs) {
  return visitor->Visit("attachmentFeedbackLoopLayoutFeaturesEXT",
                        &structs->attachment_feedback_loop_layout_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtBlendOperationAdvanced* structs) {
  return visitor->Visit("blendOperationAdvancedFeaturesEXT",
                        &structs->blend_operation_advanced_features_ext) &&
         visitor->Visit("blendOperationAdvancedPropertiesEXT",
                        &structs->blend_operation_advanced_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtBorderColorSwizzle* structs) {
  return visitor->Visit("borderColorSwizzleFeaturesEXT",
                        &structs->border_color_swizzle_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtBufferDeviceAddress* structs) {
  return visitor->Visit("bufferAddressFeaturesEXT",
                        &structs->buffer_address_features_ext) &&
         visitor->Visit("bufferDeviceAddressFeaturesEXT",
                        &structs->buffer_device_address_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtColorWriteEnable* structs) {
  return visitor->Visit("colorWriteEnableFeaturesEXT",
                        &structs->color_write_enable_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtConditionalRendering* structs) {
  return visitor->Visit("conditionalRenderingFeaturesEXT",
                        &structs->conditional_rendering_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtConservativeRasterization* structs) {
  return visitor->Visit("conservativeRasterizationPropertiesEXT",
                        &structs->conservative_rasterization_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtCustomBorderColor* structs) {
  return visitor->Visit("customBorderColorPropertiesEXT",
                        &structs->custom_border_color_properties_ext) &&
         visitor->Visit("customBorderColorFeaturesEXT",
                        &structs->custom_border_color_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDepthBiasControl* structs) {
  return visitor->Visit("depthBiasControlFeaturesEXT",
                        &structs->depth_bias_control_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDepthClampControl* structs) {
  return visitor->Visit("depthClampControlFeaturesEXT",
                        &structs->depth_clamp_control_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDepthClipControl* structs) {
  return visitor->Visit("depthClipControlFeaturesEXT",
                        &structs->depth_clip_control_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDepthClipEnable* structs) {
  return visitor->Visit("depthClipEnableFeaturesEXT",
                        &structs->depth_clip_enable_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDescriptorBuffer* structs) {
  return visitor->Visit("descriptorBufferPropertiesEXT",
                        &structs->descriptor_buffer_properties_ext) &&
         visitor->Visit(
             "descriptorBufferDensityMapPropertiesEXT",
             &structs->descriptor_buffer_density_map_properties_ext) &&
         visitor->Visit("descriptorBufferFeaturesEXT",
                        &structs->descriptor_buffer_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDescriptorIndexing* structs) {
  return visitor->Visit("descriptorIndexingFeaturesEXT",
                        &structs->descriptor_indexing_features_ext) &&
         visitor->Visit("descriptorIndexingPropertiesEXT",
                        &structs->descriptor_indexing_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtDeviceAddressBindingReport* structs) {
  return visitor->Visit("addressBindingReportFeaturesEXT",
                        &structs->address_binding_report_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDeviceFault* structs) {
  return visitor->Visit("faultFeaturesEXT", &structs->fault_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtDeviceGeneratedCommands* structs) {
  return visitor->Visit("deviceGeneratedCommandsFeaturesEXT",
                        &structs->device_generated_commands_features_ext) &&
         visitor->Visit("deviceGeneratedCommandsPropertiesEXT",
                        &structs->device_generated_commands_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDeviceMemoryReport* structs) {
  return visitor->Visit("deviceMemoryReportFeaturesEXT",
                        &structs->device_memory_report_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtDiscardRectangles* structs) {
  return visitor->Visit("discardRectanglePropertiesEXT",
                        &structs->discard_rectangle_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtDynamicRenderingUnusedAttachments* structs) {
  return visitor->Visit(
      "dynamicRenderingUnusedAttachmentsFeaturesEXT",
      &structs->dynamic_rendering_unused_attachments_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtExtendedDynamicState* structs) {
  return visitor->Visit("extendedDynamicStateFeaturesEXT",
                        &structs->extended_dynamic_state_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtExtendedDynamicState2* structs) {
  return visitor->Visit("extendedDynamicState2FeaturesEXT",
                        &structs->extended_dynamic_state2_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtExtendedDynamicState3* structs) {
  return visitor->Visit("extendedDynamicState3FeaturesEXT",
                        &structs->extended_dynamic_state3_features_ext) &&
         visitor->Visit("extendedDynamicState3PropertiesEXT",
                        &structs->extended_dynamic_state3_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtExternalMemoryHost* structs) {
  return visitor->Visit("externalMemoryHostPropertiesEXT",
                        &structs->external_memory_host_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtFragmentDensityMap* structs) {
  return visitor->Visit("fragmentDensityMapFeaturesEXT",
                        &structs->fragment_density_map_features_ext) &&
         visitor->Visit("fragmentDensityMapPropertiesEXT",
                        &structs->fragment_density_map_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtFragmentDensityMap2* structs) {
  return visitor->Visit("fragmentDensityMap2FeaturesEXT",
                        &structs->fragment_density_map2_features_ext) &&
         visitor->Visit("fragmentDensityMap2PropertiesEXT",
                        &structs->fragment_density_map2_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtFragmentDensityMapOffset* structs) {
  return visitor->Visit("fragmentDensityMapOffsetFeaturesEXT",
                        &structs->fragment_density_map_offset_features_ext) &&
         visitor->Visit("fragmentDensityMapOffsetPropertiesEXT",
                        &structs->fragment_density_map_offset_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtFragmentShaderInterlock* structs) {
  return visitor->Visit("fragmentShaderInterlockFeaturesEXT",
                        &structs->fragment_shader_interlock_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtFrameBoundary* structs) {
  return visitor->Visit("frameBoundaryFeaturesEXT",
                        &structs->frame_boundary_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtGlobalPriorityQuery* structs) {
  return visitor->Visit("globalPriorityQueryFeaturesEXT",
                        &structs->global_priority_query_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtGraphicsPipelineLibrary* structs) {
  return visitor->Visit("graphicsPipelineLibraryFeaturesEXT",
                        &structs->graphics_pipeline_library_features_ext) &&
         visitor->Visit("graphicsPipelineLibraryPropertiesEXT",
                        &structs->graphics_pipeline_library_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtHostImageCopy* structs) {
  return visitor->Visit("hostImageCopyFeaturesEXT",
                        &structs->host_image_copy_features_ext) &&
         visitor->Visit("hostImageCopyPropertiesEXT",
                        &structs->host_image_copy_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtHostQueryReset* structs) {
  return visitor->Visit("hostQueryResetFeaturesEXT",
                        &structs->host_query_reset_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtImage2dViewOf3d* structs) {
  return visitor->Visit("image2DViewOf3DFeaturesEXT",
                        &structs->image_2d_view_of_3d_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtImageCompressionControl* structs) {
  return visitor->Visit("imageCompressionControlFeaturesEXT",
                        &structs->image_compression_control_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtImageCompressionControlSwapchain* structs) {
  return visitor->Visit(
      "imageCompressionControlSwapchainFeaturesEXT",
      &structs->image_compression_control_swapchain_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtImageRobustness* structs) {
  return visitor->Visit("imageRobustnessFeaturesEXT",
                        &structs->image_robustness_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtImageSlicedViewOf3d* structs) {
  return visitor->Visit("imageSlicedViewOf3DFeaturesEXT",
                        &structs->image_sliced_view_of_3d_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtImageViewMinLod* structs) {
  return visitor->Visit("imageViewMinLodFeaturesEXT",
                        &structs->image_view_min_lod_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtIndexTypeUint8* structs) {
  return visitor->Visit("indexTypeUint8FeaturesEXT",
                        &structs->index_type_uint8_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtInlineUniformBlock* structs) {
  return visitor->Visit("inlineUniformBlockFeaturesEXT",
                        &structs->inline_uniform_block_features_ext) &&
         visitor->Visit("inlineUniformBlockPropertiesEXT",
                        &structs->inline_uniform_block_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtLegacyDithering* structs) {
  return visitor->Visit("legacyDitheringFeaturesEXT",
                        &structs->legacy_dithering_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtLegacyVertexAttributes* structs) {
  return visitor->Visit("legacyVertexAttributesFeaturesEXT",
                        &structs->legacy_vertex_attributes_features_ext) &&
         visitor->Visit("legacyVertexAttributesPropertiesEXT",
                        &structs->legacy_vertex_attributes_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtLineRasterization* structs) {
  return visitor->Visit("lineRasterizationFeaturesEXT",
                        &structs->line_rasterization_features_ext) &&
         visitor->Visit("lineRasterizationPropertiesEXT",
                        &structs->line_rasterization_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtMapMemoryPlaced* structs) {
  return visitor->Visit("mapMemoryPlacedFeaturesEXT",
                        &structs->map_memory_placed_features_ext) &&
         visitor->Visit("mapMemoryPlacedPropertiesEXT",
                        &structs->map_memory_placed_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtMemoryPriority* structs) {
  return visitor->Visit("memoryPriorityFeaturesEXT",
                        &structs->memory_priority_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtMeshShader* structs) {
  return visitor->Visit("meshShaderFeaturesEXT",
                        &structs->mesh_shader_features_ext) &&
         visitor->Visit("meshShaderPropertiesEXT",
                        &structs->mesh_shader_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtMultiDraw* structs) {
  return visitor->Visit("multiDrawFeaturesEXT",
                        &structs->multi_draw_features_ext) &&
         visitor->Visit("multiDrawPropertiesEXT",
                        &structs->multi_draw_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtMultisampledRenderToSingleSampled* structs) {
  return visitor->Visit(
      "multisampledRenderToSingleSampledFeaturesEXT",
      &structs->multisampled_render_to_single_sampled_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtMutableDescriptorType* structs) {
  return visitor->Visit("mutableDescriptorTypeFeaturesEXT",
                        &structs->mutable_descriptor_type_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtNestedCommandBuffer* structs) {
  return visitor->Visit("nestedCommandBufferFeaturesEXT",
                        &structs->nested_command_buffer_features_ext) &&
         visitor->Visit("nestedCommandBufferPropertiesEXT",
                        &structs->nested_command_buffer_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtNonSeamlessCubeMap* structs) {
  return visitor->Visit("nonSeamlessCubeMapFeaturesEXT",
                        &structs->non_seamless_cube_map_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtOpacityMicromap* structs) {
  return visitor->Visit("opacityMicromapFeaturesEXT",
                        &structs->opacity_micromap_features_ext) &&
         visitor->Visit("opacityMicromapPropertiesEXT",
                        &structs->opacity_micromap_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPageableDeviceLocalMemory* structs) {
  return visitor->Visit("pageableDeviceLocalMemoryFeaturesEXT",
                        &structs->pageable_device_local_memory_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtPciBusInfo* structs) {
  return visitor->Visit("PCIBusInfoPropertiesEXT",
                        &structs->pci_bus_info_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtPhysicalDeviceDrm* structs) {
  return visitor->Visit("drmPropertiesEXT", &structs->drm_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPipelineCreationCacheControl* structs) {
  return visitor->Visit("pipelineCreationCacheControlFeaturesEXT",
                        &structs->pipeline_creation_cache_control_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPipelineLibraryGroupHandles* structs) {
  return visitor->Visit("pipelineLibraryGroupHandlesFeaturesEXT",
                        &structs->pipeline_library_group_handles_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtPipelineProperties* structs) {
  return visitor->Visit("pipelinePropertiesFeaturesEXT",
                        &structs->pipeline_properties_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPipelineProtectedAccess* structs) {
  return visitor->Visit("pipelineProtectedAccessFeaturesEXT",
                        &structs->pipeline_protected_access_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtPipelineRobustness* structs) {
  return visitor->Visit("pipelineRobustnessFeaturesEXT",
                        &structs->pipeline_robustness_features_ext) &&
         visitor->Visit("pipelineRobustnessPropertiesEXT",
                        &structs->pipeline_robustness_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPresentModeFifoLatestReady* structs) {
  return visitor->Visit("presentModeFifoLatestReadyFeaturesEXT",
                        &structs->present_mode_fifo_latest_ready_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPrimitiveTopologyListRestart* structs) {
  return visitor->Visit("primitiveTopologyListRestartFeaturesEXT",
                        &structs->primitive_topology_list_restart_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtPrimitivesGeneratedQuery* structs) {
  return visitor->Visit("primitivesGeneratedQueryFeaturesEXT",
                        &structs->primitives_generated_query_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtPrivateData* structs) {
  return visitor->Visit("privateDataFeaturesEXT",
                        &structs->private_data_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtProvokingVertex* structs) {
  return visitor->Visit("provokingVertexFeaturesEXT",
                        &structs->provoking_vertex_features_ext) &&
         visitor->Visit("provokingVertexPropertiesEXT",
                        &structs->provoking_vertex_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtRasterizationOrderAttachmentAccess* structs) {
  return visitor->Visit(
      "rasterizationOrderAttachmentAccessFeaturesEXT",
      &structs->rasterization_order_attachment_access_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtRgba10x6Formats* structs) {
  return visitor->Visit("RGBA10X6FormatsFeaturesEXT",
                        &structs->rgba10_x6_formats_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtRobustness2* structs) {
  return visitor->Visit("robustness2FeaturesEXT",
                        &structs->robustness2_features_ext) &&
         visitor->Visit("robustness2PropertiesEXT",
                        &structs->robustness2_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtSampleLocations* structs) {
  return visitor->Visit("sampleLocationsPropertiesEXT",
                        &structs->sample_locations_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtSamplerFilterMinmax* structs) {
  return visitor->Visit("samplerFilterMinmaxPropertiesEXT",
                        &structs->sampler_filter_minmax_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtScalarBlockLayout* structs) {
  return visitor->Visit("scalarBlockLayoutFeaturesEXT",
                        &structs->scalar_block_layout_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtShaderAtomicFloat* structs) {
  return visitor->Visit("shaderAtomicFloatFeaturesEXT",
                        &structs->shader_atomic_float_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtShaderAtomicFloat2* structs) {
  return visitor->Visit("shaderAtomicFloat2FeaturesEXT",
                        &structs->shader_atomic_float2_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtShaderDemoteToHelperInvocation* structs) {
  return visitor->Visit(
      "shaderDemoteToHelperInvocationFeaturesEXT",
      &structs->shader_demote_to_helper_invocation_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtShaderFloat8* structs) {
  return visitor->Visit("shaderFloat8FeaturesEXT",
                        &structs->shader_float8_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtShaderImageAtomicInt64* structs) {
  return visitor->Visit("shaderImageAtomicInt64FeaturesEXT",
                        &structs->shader_image_atomic_int64_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtShaderModuleIdentifier* structs) {
  return visitor->Visit("shaderModuleIdentifierFeaturesEXT",
                        &structs->shader_module_identifier_features_ext) &&
         visitor->Visit("shaderModuleIdentifierPropertiesEXT",
                        &structs->shader_module_identifier_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtShaderObject* structs) {
  return visitor->Visit("shaderObjectFeaturesEXT",
                        &structs->shader_object_features_ext) &&
         visitor->Visit("shaderObjectPropertiesEXT",
                        &structs->shader_object_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtShaderReplicatedComposites* structs) {
  return visitor->Visit("shaderReplicatedCompositesFeaturesEXT",
                        &structs->shader_replicated_composites_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtShaderTileImage* structs) {
  return visitor->Visit("shaderTileImageFeaturesEXT",
                        &structs->shader_tile_image_features_ext) &&
         visitor->Visit("shaderTileImagePropertiesEXT",
                        &structs->shader_tile_image_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtSubgroupSizeControl* structs) {
  return visitor->Visit("subgroupSizeControlFeaturesEXT",
                        &structs->subgroup_size_control_features_ext) &&
         visitor->Visit("subgroupSizeControlPropertiesEXT",
                        &structs->subgroup_size_control_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtSubpassMergeFeedback* structs) {
  return visitor->Visit("subpassMergeFeedbackFeaturesEXT",
                        &structs->subpass_merge_feedback_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtSwapchainMaintenance1* structs) {
  return visitor->Visit("swapchainMaintenance1FeaturesEXT",
                        &structs->swapchain_maintenance1_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtTexelBufferAlignment* structs) {
  return visitor->Visit("texelBufferAlignmentFeaturesEXT",
                        &structs->texel_buffer_alignment_features_ext) &&
         visitor->Visit("texelBufferAlignmentPropertiesEXT",
                        &structs->texel_buffer_alignment_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtTextureCompressionAstcHdr* structs) {
  return visitor->Visit("textureCompressionASTCHDRFeaturesEXT",
                        &structs->texture_compression_astchdr_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtTransformFeedback* structs) {
  return visitor->Visit("transformFeedbackFeaturesEXT",
                        &structs->transform_feedback_features_ext) &&
         visitor->Visit("transformFeedbackPropertiesEXT",
                        &structs->transform_feedback_properties_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtVertexAttributeDivisor* structs) {
  return visitor->Visit("vertexAttributeDivisorPropertiesEXT",
                        &structs->vertex_attribute_divisor_properties_ext) &&
         visitor->Visit("vertexAttributeDivisorFeaturesEXT",
                        &structs->vertex_attribute_divisor_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtVertexAttributeRobustness* structs) {
  return visitor->Visit("vertexAttributeRobustnessFeaturesEXT",
                        &structs->vertex_attribute_robustness_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtVertexInputDynamicState* structs) {
  return visitor->Visit("vertexInputDynamicStateFeaturesEXT",
                        &structs->vertex_input_dynamic_state_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtYcbcr2plane444Formats* structs) {
  return visitor->Visit("ycbcr2Plane444FormatsFeaturesEXT",
                        &structs->ycbcr_2plane_444_formats_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonExtYcbcrImageArrays* structs) {
  return visitor->Visit("ycbcrImageArraysFeaturesEXT",
                        &structs->ycbcr_image_arrays_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtZeroInitializeDeviceMemory* structs) {
  return visitor->Visit("zeroInitializeDeviceMemoryFeaturesEXT",
                        &structs->zero_initialize_device_memory_features_ext);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonHUAWEIClusterCullingShader* structs) {
  return visitor->Visit("clusterCullingShaderFeaturesHUAWEI",
                        &structs->cluster_culling_shader_features_huawei) &&
         visitor->Visit("clusterCullingShaderPropertiesHUAWEI",
                        &structs->cluster_culling_shader_properties_huawei);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonHUAWEIHdrVivid* structs) {
  return visitor->Visit("hdrVividFeaturesHUAWEI",
                        &structs->hdr_vivid_features_huawei);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonHUAWEIInvocationMask* structs) {
  return visitor->Visit("invocationMaskFeaturesHUAWEI",
                        &structs->invocation_mask_features_huawei);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonHUAWEISubpassShading* structs) {
  return visitor->Visit("subpassShadingFeaturesHUAWEI",
                        &structs->subpass_shading_features_huawei) &&
         visitor->Visit("subpassShadingPropertiesHUAWEI",
                        &structs->subpass_shading_properties_huawei);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonIMGRelaxedLineRasterization* structs) {
  return visitor->Visit("relaxedLineRasterizationFeaturesIMG",
                        &structs->relaxed_line_rasterization_features_img);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonExtVKINTELShaderIntegerFunctions2* structs) {
  return visitor->Visit("shaderIntegerFunctions2FeaturesINTEL",
                        &structs->shader_integer_functions2_features_intel);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHR16bitStorage* structs) {
  return visitor->Visit("bit16StorageFeaturesKHR",
                        &structs->bit16_storage_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHR8bitStorage* structs) {
  return visitor->Visit("bit8StorageFeaturesKHR",
                        &structs->bit8_storage_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRAccelerationStructure* structs) {
  return visitor->Visit("accelerationStructureFeaturesKHR",
                        &structs->acceleration_structure_features_khr) &&
         visitor->Visit("accelerationStructurePropertiesKHR",
                        &structs->acceleration_structure_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRBufferDeviceAddress* structs) {
  return visitor->Visit("bufferDeviceAddressFeaturesKHR",
                        &structs->buffer_device_address_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRComputeShaderDerivatives* structs) {
  return visitor->Visit("computeShaderDerivativesFeaturesKHR",
                        &structs->compute_shader_derivatives_features_khr) &&
         visitor->Visit("computeShaderDerivativesPropertiesKHR",
                        &structs->compute_shader_derivatives_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRCooperativeMatrix* structs) {
  return visitor->Visit("cooperativeMatrixFeaturesKHR",
                        &structs->cooperative_matrix_features_khr) &&
         visitor->Visit("cooperativeMatrixPropertiesKHR",
                        &structs->cooperative_matrix_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRDepthClampZeroOne* structs) {
  return visitor->Visit("depthClampZeroOneFeaturesKHR",
                        &structs->depth_clamp_zero_one_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRDepthStencilResolve* structs) {
  return visitor->Visit("depthStencilResolvePropertiesKHR",
                        &structs->depth_stencil_resolve_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRDriverProperties* structs) {
  return visitor->Visit("driverPropertiesKHR", &structs->driver_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRDynamicRendering* structs) {
  return visitor->Visit("dynamicRenderingFeaturesKHR",
                        &structs->dynamic_rendering_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRDynamicRenderingLocalRead* structs) {
  return visitor->Visit("dynamicRenderingLocalReadFeaturesKHR",
                        &structs->dynamic_rendering_local_read_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRExternalFenceCapabilities* structs) {
  return visitor->Visit("IDPropertiesKHR", &structs->id_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRExternalMemoryCapabilities* structs) {
  return visitor->Visit("IDPropertiesKHR", &structs->id_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRExternalSemaphoreCapabilities* structs) {
  return visitor->Visit("IDPropertiesKHR", &structs->id_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRFragmentShaderBarycentric* structs) {
  return visitor->Visit("fragmentShaderBarycentricFeaturesKHR",
                        &structs->fragment_shader_barycentric_features_khr) &&
         visitor->Visit("fragmentShaderBarycentricPropertiesKHR",
                        &structs->fragment_shader_barycentric_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRFragmentShadingRate* structs) {
  return visitor->Visit("fragmentShadingRateFeaturesKHR",
                        &structs->fragment_shading_rate_features_khr) &&
         visitor->Visit("fragmentShadingRatePropertiesKHR",
                        &structs->fragment_shading_rate_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRGlobalPriority* structs) {
  return visitor->Visit("globalPriorityQueryFeaturesKHR",
                        &structs->global_priority_query_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRImagelessFramebuffer* structs) {
  return visitor->Visit("imagelessFramebufferFeaturesKHR",
                        &structs->imageless_framebuffer_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRIndexTypeUint8* structs) {
  return visitor->Visit("indexTypeUint8FeaturesKHR",
                        &structs->index_type_uint8_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRLineRasterization* structs) {
  return visitor->Visit("lineRasterizationFeaturesKHR",
                        &structs->line_rasterization_features_khr) &&
         visitor->Visit("lineRasterizationPropertiesKHR",
                        &structs->line_rasterization_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance2* structs) {
  return visitor->Visit("pointClippingPropertiesKHR",
                        &structs->point_clipping_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance3* structs) {
  return visitor->Visit("maintenance3PropertiesKHR",
                        &structs->maintenance3_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance4* structs) {
  return visitor->Visit("maintenance4FeaturesKHR",
                        &structs->maintenance4_features_khr) &&
         visitor->Visit("maintenance4PropertiesKHR",
                        &structs->maintenance4_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance5* structs) {
  return visitor->Visit("maintenance5FeaturesKHR",
                        &structs->maintenance5_features_khr) &&
         visitor->Visit("maintenance5PropertiesKHR",
                        &structs->maintenance5_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance6* structs) {
  return visitor->Visit("maintenance6FeaturesKHR",
                        &structs->maintenance6_features_khr) &&
         visitor->Visit("maintenance6PropertiesKHR",
                        &structs->maintenance6_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance7* structs) {
  return visitor->Visit("maintenance7FeaturesKHR",
                        &structs->maintenance7_features_khr) &&
         visitor->Visit("maintenance7PropertiesKHR",
                        &structs->maintenance7_properties_khr) &&
         visitor->Visit("layeredApiPropertiesListKHR",
                        &structs->layered_api_properties_list_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance8* structs) {
  return visitor->Visit("maintenance8FeaturesKHR",
                        &structs->maintenance8_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMaintenance9* structs) {
  return visitor->Visit("maintenance9FeaturesKHR",
                        &structs->maintenance9_features_khr) &&
         visitor->Visit("maintenance9PropertiesKHR",
                        &structs->maintenance9_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRMultiview* structs) {
  return visitor->Visit("multiviewFeaturesKHR",
                        &structs->multiview_features_khr) &&
         visitor->Visit("multiviewPropertiesKHR",
                        &structs->multiview_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPerformanceQuery* structs) {
  return visitor->Visit("performanceQueryFeaturesKHR",
                        &structs->performance_query_features_khr) &&
         visitor->Visit("performanceQueryPropertiesKHR",
                        &structs->performance_query_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPipelineBinary* structs) {
  return visitor->Visit("pipelineBinaryFeaturesKHR",
                        &structs->pipeline_binary_features_khr) &&
         visitor->Visit("pipelineBinaryPropertiesKHR",
                        &structs->pipeline_binary_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRPipelineExecutableProperties* structs) {
  return visitor->Visit("pipelineExecutablePropertiesFeaturesKHR",
                        &structs->pipeline_executable_properties_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPresentId* structs) {
  return visitor->Visit("presentIdFeaturesKHR",
                        &structs->present_id_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPresentId2* structs) {
  return visitor->Visit("presentId2FeaturesKHR",
                        &structs->present_id2_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPresentWait* structs) {
  return visitor->Visit("presentWaitFeaturesKHR",
                        &structs->present_wait_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPresentWait2* structs) {
  return visitor->Visit("presentWait2FeaturesKHR",
                        &structs->present_wait2_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRPushDescriptor* structs) {
  return visitor->Visit("pushDescriptorPropertiesKHR",
                        &structs->push_descriptor_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRRayQuery* structs) {
  return visitor->Visit("rayQueryFeaturesKHR",
                        &structs->ray_query_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRRayTracingMaintenance1* structs) {
  return visitor->Visit("rayTracingMaintenance1FeaturesKHR",
                        &structs->ray_tracing_maintenance1_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRRayTracingPipeline* structs) {
  return visitor->Visit("rayTracingPipelineFeaturesKHR",
                        &structs->ray_tracing_pipeline_features_khr) &&
         visitor->Visit("rayTracingPipelinePropertiesKHR",
                        &structs->ray_tracing_pipeline_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRRayTracingPositionFetch* structs) {
  return visitor->Visit("rayTracingPositionFetchFeaturesKHR",
                        &structs->ray_tracing_position_fetch_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRRobustness2* structs) {
  return visitor->Visit("robustness2FeaturesKHR",
                        &structs->robustness2_features_khr) &&
         visitor->Visit("robustness2PropertiesKHR",
                        &structs->robustness2_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRSamplerYcbcrConversion* structs) {
  return visitor->Visit("samplerYcbcrConversionFeaturesKHR",
                        &structs->sampler_ycbcr_conversion_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRSeparateDepthStencilLayouts* structs) {
  return visitor->Visit("separateDepthStencilLayoutsFeaturesKHR",
                        &structs->separate_depth_stencil_layouts_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderAtomicInt64* structs) {
  return visitor->Visit("shaderAtomicInt64FeaturesKHR",
                        &structs->shader_atomic_int64_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderBfloat16* structs) {
  return visitor->Visit("shaderBfloat16FeaturesKHR",
                        &structs->shader_bfloat16_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderClock* structs) {
  return visitor->Visit("shaderClockFeaturesKHR",
                        &structs->shader_clock_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderExpectAssume* structs) {
  return visitor->Visit("shaderExpectAssumeFeaturesKHR",
                        &structs->shader_expect_assume_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloat16Int8* structs) {
  return visitor->Visit("shaderFloat16Int8FeaturesKHR",
                        &structs->shader_float16_int8_features_khr) &&
         visitor->Visit("float16Int8FeaturesKHR",
                        &structs->float16_int8_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloatControls* structs) {
  return visitor->Visit("floatControlsPropertiesKHR",
                        &structs->float_controls_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloatControls2* structs) {
  return visitor->Visit("shaderFloatControls2FeaturesKHR",
                        &structs->shader_float_controls2_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRShaderIntegerDotProduct* structs) {
  return visitor->Visit("shaderIntegerDotProductFeaturesKHR",
                        &structs->shader_integer_dot_product_features_khr) &&
         visitor->Visit("shaderIntegerDotProductPropertiesKHR",
                        &structs->shader_integer_dot_product_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRShaderMaximalReconvergence* structs) {
  return visitor->Visit("shaderMaximalReconvergenceFeaturesKHR",
                        &structs->shader_maximal_reconvergence_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderQuadControl* structs) {
  return visitor->Visit("shaderQuadControlFeaturesKHR",
                        &structs->shader_quad_control_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRShaderRelaxedExtendedInstruction* structs) {
  return visitor->Visit(
      "shaderRelaxedExtendedInstructionFeaturesKHR",
      &structs->shader_relaxed_extended_instruction_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRShaderSubgroupExtendedTypes* structs) {
  return visitor->Visit("shaderSubgroupExtendedTypesFeaturesKHR",
                        &structs->shader_subgroup_extended_types_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRShaderSubgroupRotate* structs) {
  return visitor->Visit("shaderSubgroupRotateFeaturesKHR",
                        &structs->shader_subgroup_rotate_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRShaderSubgroupUniformControlFlow* structs) {
  return visitor->Visit(
      "shaderSubgroupUniformControlFlowFeaturesKHR",
      &structs->shader_subgroup_uniform_control_flow_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRShaderTerminateInvocation* structs) {
  return visitor->Visit("shaderTerminateInvocationFeaturesKHR",
                        &structs->shader_terminate_invocation_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRSynchronization2* structs) {
  return visitor->Visit("synchronization2FeaturesKHR",
                        &structs->synchronization2_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRTimelineSemaphore* structs) {
  return visitor->Visit("timelineSemaphoreFeaturesKHR",
                        &structs->timeline_semaphore_features_khr) &&
         visitor->Visit("timelineSemaphorePropertiesKHR",
                        &structs->timeline_semaphore_properties_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRUnifiedImageLayouts* structs) {
  return visitor->Visit("unifiedImageLayoutsFeaturesKHR",
                        &structs->unified_image_layouts_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRUniformBufferStandardLayout* structs) {
  return visitor->Visit("uniformBufferStandardLayoutFeaturesKHR",
                        &structs->uniform_buffer_standard_layout_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRVariablePointers* structs) {
  return visitor->Visit("variablePointerFeaturesKHR",
                        &structs->variable_pointer_features_khr) &&
         visitor->Visit("variablePointersFeaturesKHR",
                        &structs->variable_pointers_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRVertexAttributeDivisor* structs) {
  return visitor->Visit("vertexAttributeDivisorPropertiesKHR",
                        &structs->vertex_attribute_divisor_properties_khr) &&
         visitor->Visit("vertexAttributeDivisorFeaturesKHR",
                        &structs->vertex_attribute_divisor_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRVideoDecodeVp9* structs) {
  return visitor->Visit("videoDecodeVP9FeaturesKHR",
                        &structs->video_decode_vp9_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRVideoEncodeAv1* structs) {
  return visitor->Visit("videoEncodeAV1FeaturesKHR",
                        &structs->video_encode_av1_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRVideoEncodeQuantizationMap* structs) {
  return visitor->Visit("videoEncodeQuantizationMapFeaturesKHR",
                        &structs->video_encode_quantization_map_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRVideoMaintenance1* structs) {
  return visitor->Visit("videoMaintenance1FeaturesKHR",
                        &structs->video_maintenance1_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRVideoMaintenance2* structs) {
  return visitor->Visit("videoMaintenance2FeaturesKHR",
                        &structs->video_maintenance2_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonKHRVulkanMemoryModel* structs) {
  return visitor->Visit("vulkanMemoryModelFeaturesKHR",
                        &structs->vulkan_memory_model_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRWorkgroupMemoryExplicitLayout* structs) {
  return visitor->Visit(
      "workgroupMemoryExplicitLayoutFeaturesKHR",
      &structs->workgroup_memory_explicit_layout_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonKHRZeroInitializeWorkgroupMemory* structs) {
  return visitor->Visit(
      "zeroInitializeWorkgroupMemoryFeaturesKHR",
      &structs->zero_initialize_workgroup_memory_features_khr);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonMESAImageAlignmentControl* structs) {
  return visitor->Visit("imageAlignmentControlFeaturesMESA",
                        &structs->image_alignment_control_features_mesa) &&
         visitor->Visit("imageAlignmentControlPropertiesMESA",
                        &structs->image_alignment_control_properties_mesa);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonMSFTLayeredDriver* structs) {
  return visitor->Visit("layeredDriverPropertiesMSFT",
                        &structs->layered_driver_properties_msft);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVXMultiviewPerViewAttributes* structs) {
  return visitor->Visit("multiviewPerViewAttributesPropertiesNVX",
                        &structs->multiview_per_view_attributes_properties_nvx);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVClusterAccelerationStructure* structs) {
  return visitor->Visit("clusterAccelerationStructureFeaturesNV",
                        &structs->cluster_acceleration_structure_features_nv) &&
         visitor->Visit("clusterAccelerationStructurePropertiesNV",
                        &structs->cluster_acceleration_structure_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVCommandBufferInheritance* structs) {
  return visitor->Visit("commandBufferInheritanceFeaturesNV",
                        &structs->command_buffer_inheritance_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVComputeShaderDerivatives* structs) {
  return visitor->Visit("computeShaderDerivativesFeaturesNV",
                        &structs->compute_shader_derivatives_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVCooperativeMatrix* structs) {
  return visitor->Visit("cooperativeMatrixFeaturesNV",
                        &structs->cooperative_matrix_features_nv) &&
         visitor->Visit("cooperativeMatrixPropertiesNV",
                        &structs->cooperative_matrix_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVCooperativeMatrix2* structs) {
  return visitor->Visit("cooperativeMatrix2FeaturesNV",
                        &structs->cooperative_matrix2_features_nv) &&
         visitor->Visit("cooperativeMatrix2PropertiesNV",
                        &structs->cooperative_matrix2_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVCooperativeVector* structs) {
  return visitor->Visit("cooperativeVectorPropertiesNV",
                        &structs->cooperative_vector_properties_nv) &&
         visitor->Visit("cooperativeVectorFeaturesNV",
                        &structs->cooperative_vector_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVCopyMemoryIndirect* structs) {
  return visitor->Visit("copyMemoryIndirectFeaturesNV",
                        &structs->copy_memory_indirect_features_nv) &&
         visitor->Visit("copyMemoryIndirectPropertiesNV",
                        &structs->copy_memory_indirect_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVCornerSampledImage* structs) {
  return visitor->Visit("cornerSampledImageFeaturesNV",
                        &structs->corner_sampled_image_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVCoverageReductionMode* structs) {
  return visitor->Visit("coverageReductionModeFeaturesNV",
                        &structs->coverage_reduction_mode_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVDedicatedAllocationImageAliasing* structs) {
  return visitor->Visit(
      "dedicatedAllocationImageAliasingFeaturesNV",
      &structs->dedicated_allocation_image_aliasing_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVDescriptorPoolOverallocation* structs) {
  return visitor->Visit("descriptorPoolOverallocationFeaturesNV",
                        &structs->descriptor_pool_overallocation_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVDeviceDiagnosticsConfig* structs) {
  return visitor->Visit("diagnosticsConfigFeaturesNV",
                        &structs->diagnostics_config_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVDeviceGeneratedCommands* structs) {
  return visitor->Visit("deviceGeneratedCommandsPropertiesNV",
                        &structs->device_generated_commands_properties_nv) &&
         visitor->Visit("deviceGeneratedCommandsFeaturesNV",
                        &structs->device_generated_commands_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVDeviceGeneratedCommandsCompute* structs) {
  return visitor->Visit(
      "deviceGeneratedCommandsComputeFeaturesNV",
      &structs->device_generated_commands_compute_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVExtendedSparseAddressSpace* structs) {
  return visitor->Visit("extendedSparseAddressSpaceFeaturesNV",
                        &structs->extended_sparse_address_space_features_nv) &&
         visitor->Visit("extendedSparseAddressSpacePropertiesNV",
                        &structs->extended_sparse_address_space_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVExternalComputeQueue* structs) {
  return visitor->Visit("externalComputeQueuePropertiesNV",
                        &structs->external_compute_queue_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVExternalMemoryRdma* structs) {
  return visitor->Visit("externalMemoryRDMAFeaturesNV",
                        &structs->external_memory_rdma_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVFragmentShadingRateEnums* structs) {
  return visitor->Visit("fragmentShadingRateEnumsFeaturesNV",
                        &structs->fragment_shading_rate_enums_features_nv) &&
         visitor->Visit("fragmentShadingRateEnumsPropertiesNV",
                        &structs->fragment_shading_rate_enums_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVInheritedViewportScissor* structs) {
  return visitor->Visit("inheritedViewportScissorFeaturesNV",
                        &structs->inherited_viewport_scissor_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVLinearColorAttachment* structs) {
  return visitor->Visit("linearColorAttachmentFeaturesNV",
                        &structs->linear_color_attachment_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVMemoryDecompression* structs) {
  return visitor->Visit("memoryDecompressionFeaturesNV",
                        &structs->memory_decompression_features_nv) &&
         visitor->Visit("memoryDecompressionPropertiesNV",
                        &structs->memory_decompression_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVMeshShader* structs) {
  return visitor->Visit("meshShaderFeaturesNV",
                        &structs->mesh_shader_features_nv) &&
         visitor->Visit("meshShaderPropertiesNV",
                        &structs->mesh_shader_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVOpticalFlow* structs) {
  return visitor->Visit("opticalFlowFeaturesNV",
                        &structs->optical_flow_features_nv) &&
         visitor->Visit("opticalFlowPropertiesNV",
                        &structs->optical_flow_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVPartitionedAccelerationStructure* structs) {
  return visitor->Visit(
             "partitionedAccelerationStructureFeaturesNV",
             &structs->partitioned_acceleration_structure_features_nv) &&
         visitor->Visit(
             "partitionedAccelerationStructurePropertiesNV",
             &structs->partitioned_acceleration_structure_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVPerStageDescriptorSet* structs) {
  return visitor->Visit("perStageDescriptorSetFeaturesNV",
                        &structs->per_stage_descriptor_set_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVPresentBarrier* structs) {
  return visitor->Visit("presentBarrierFeaturesNV",
                        &structs->present_barrier_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVRawAccessChains* structs) {
  return visitor->Visit("rawAccessChainsFeaturesNV",
                        &structs->raw_access_chains_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVRayTracing* structs) {
  return visitor->Visit("rayTracingPropertiesNV",
                        &structs->ray_tracing_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVRayTracingInvocationReorder* structs) {
  return visitor->Visit(
             "rayTracingInvocationReorderPropertiesNV",
             &structs->ray_tracing_invocation_reorder_properties_nv) &&
         visitor->Visit("rayTracingInvocationReorderFeaturesNV",
                        &structs->ray_tracing_invocation_reorder_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVRayTracingLinearSweptSpheres* structs) {
  return visitor->Visit("rayTracingLinearSweptSpheresFeaturesNV",
                        &structs->ray_tracing_linear_swept_spheres_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVRayTracingMotionBlur* structs) {
  return visitor->Visit("rayTracingMotionBlurFeaturesNV",
                        &structs->ray_tracing_motion_blur_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVRayTracingValidation* structs) {
  return visitor->Visit("rayTracingValidationFeaturesNV",
                        &structs->ray_tracing_validation_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVRepresentativeFragmentTest* structs) {
  return visitor->Visit("representativeFragmentTestFeaturesNV",
                        &structs->representative_fragment_test_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVScissorExclusive* structs) {
  return visitor->Visit("exclusiveScissorFeaturesNV",
                        &structs->exclusive_scissor_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonNVShaderAtomicFloat16Vector* structs) {
  return visitor->Visit("shaderAtomicFloat16VectorFeaturesNV",
                        &structs->shader_atomic_float16_vector_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVShaderImageFootprint* structs) {
  return visitor->Visit("shaderImageFootprintFeaturesNV",
                        &structs->shader_image_footprint_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVShaderSmBuiltins* structs) {
  return visitor->Visit("shaderSMBuiltinsPropertiesNV",
                        &structs->shader_sm_builtins_properties_nv) &&
         visitor->Visit("shaderSMBuiltinsFeaturesNV",
                        &structs->shader_sm_builtins_features_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonNVShadingRateImage* structs) {
  return visitor->Visit("shadingRateImageFeaturesNV",
                        &structs->shading_rate_image_features_nv) &&
         visitor->Visit("shadingRateImagePropertiesNV",
                        &structs->shading_rate_image_properties_nv);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMFilterCubicClamp* structs) {
  return visitor->Visit("cubicClampFeaturesQCOM",
                        &structs->cubic_clamp_features_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMFilterCubicWeights* structs) {
  return visitor->Visit("cubicWeightsFeaturesQCOM",
                        &structs->cubic_weights_features_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonQCOMFragmentDensityMapOffset* structs) {
  return visitor->Visit("fragmentDensityMapOffsetFeaturesQCOM",
                        &structs->fragment_density_map_offset_features_qcom) &&
         visitor->Visit("fragmentDensityMapOffsetPropertiesQCOM",
                        &structs->fragment_density_map_offset_properties_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMImageProcessing* structs) {
  return visitor->Visit("imageProcessingFeaturesQCOM",
                        &structs->image_processing_features_qcom) &&
         visitor->Visit("imageProcessingPropertiesQCOM",
                        &structs->image_processing_properties_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMImageProcessing2* structs) {
  return visitor->Visit("imageProcessing2FeaturesQCOM",
                        &structs->image_processing2_features_qcom) &&
         visitor->Visit("imageProcessing2PropertiesQCOM",
                        &structs->image_processing2_properties_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonQCOMMultiviewPerViewRenderAreas* structs) {
  return visitor->Visit(
      "multiviewPerViewRenderAreasFeaturesQCOM",
      &structs->multiview_per_view_render_areas_features_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonQCOMMultiviewPerViewViewports* structs) {
  return visitor->Visit("multiviewPerViewViewportsFeaturesQCOM",
                        &structs->multiview_per_view_viewports_features_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMTileMemoryHeap* structs) {
  return visitor->Visit("tileMemoryHeapFeaturesQCOM",
                        &structs->tile_memory_heap_features_qcom) &&
         visitor->Visit("tileMemoryHeapPropertiesQCOM",
                        &structs->tile_memory_heap_properties_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMTileProperties* structs) {
  return visitor->Visit("tilePropertiesFeaturesQCOM",
                        &structs->tile_properties_features_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMTileShading* structs) {
  return visitor->Visit("tileShadingFeaturesQCOM",
                        &structs->tile_shading_features_qcom) &&
         visitor->Visit("tileShadingPropertiesQCOM",
                        &structs->tile_shading_properties_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonQCOMYcbcrDegamma* structs) {
  return visitor->Visit("ycbcrDegammaFeaturesQCOM",
                        &structs->ycbcr_degamma_features_qcom);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonSECAmigoProfiling* structs) {
  return visitor->Visit("amigoProfilingFeaturesSEC",
                        &structs->amigo_profiling_features_sec);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonVALVEDescriptorSetHostMapping* structs) {
  return visitor->Visit("descriptorSetHostMappingFeaturesVALVE",
                        &structs->descriptor_set_host_mapping_features_valve);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkJsonVALVEMutableDescriptorType* structs) {
  return visitor->Visit("mutableDescriptorTypeFeaturesVALVE",
                        &structs->mutable_descriptor_type_features_valve);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevice16BitStorageFeatures* features) {
  return

      visitor->Visit("storageBuffer16BitAccess",
                     &features->storageBuffer16BitAccess) &&
      visitor->Visit("uniformAndStorageBuffer16BitAccess",
                     &features->uniformAndStorageBuffer16BitAccess) &&
      visitor->Visit("storagePushConstant16",
                     &features->storagePushConstant16) &&
      visitor->Visit("storageInputOutput16", &features->storageInputOutput16);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevice4444FormatsFeaturesEXT* features) {
  return

      visitor->Visit("formatA4R4G4B4", &features->formatA4R4G4B4) &&
      visitor->Visit("formatA4B4G4R4", &features->formatA4B4G4R4);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevice8BitStorageFeatures* features) {
  return

      visitor->Visit("storageBuffer8BitAccess",
                     &features->storageBuffer8BitAccess) &&
      visitor->Visit("uniformAndStorageBuffer8BitAccess",
                     &features->uniformAndStorageBuffer8BitAccess) &&
      visitor->Visit("storagePushConstant8", &features->storagePushConstant8);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceASTCDecodeFeaturesEXT* features) {
  return

      visitor->Visit("decodeModeSharedExponent",
                     &features->decodeModeSharedExponent);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceAccelerationStructureFeaturesKHR* features) {
  return

      visitor->Visit("accelerationStructure",
                     &features->accelerationStructure) &&
      visitor->Visit("accelerationStructureCaptureReplay",
                     &features->accelerationStructureCaptureReplay) &&
      visitor->Visit("accelerationStructureIndirectBuild",
                     &features->accelerationStructureIndirectBuild) &&
      visitor->Visit("accelerationStructureHostCommands",
                     &features->accelerationStructureHostCommands) &&
      visitor->Visit(
          "descriptorBindingAccelerationStructureUpdateAfterBind",
          &features->descriptorBindingAccelerationStructureUpdateAfterBind);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceAccelerationStructurePropertiesKHR* properties) {
  return

      visitor->Visit("maxGeometryCount", &properties->maxGeometryCount) &&
      visitor->Visit("maxInstanceCount", &properties->maxInstanceCount) &&
      visitor->Visit("maxPrimitiveCount", &properties->maxPrimitiveCount) &&
      visitor->Visit(
          "maxPerStageDescriptorAccelerationStructures",
          &properties->maxPerStageDescriptorAccelerationStructures) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindAccelerationStructures",
          &properties
               ->maxPerStageDescriptorUpdateAfterBindAccelerationStructures) &&
      visitor->Visit("maxDescriptorSetAccelerationStructures",
                     &properties->maxDescriptorSetAccelerationStructures) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindAccelerationStructures",
          &properties->maxDescriptorSetUpdateAfterBindAccelerationStructures) &&
      visitor->Visit(
          "minAccelerationStructureScratchOffsetAlignment",
          &properties->minAccelerationStructureScratchOffsetAlignment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceAddressBindingReportFeaturesEXT* features) {
  return

      visitor->Visit("reportAddressBinding", &features->reportAddressBinding);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceAmigoProfilingFeaturesSEC* features) {
  return

      visitor->Visit("amigoProfiling", &features->amigoProfiling);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceAntiLagFeaturesAMD* features) {
  return

      visitor->Visit("antiLag", &features->antiLag);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT* features) {
  return

      visitor->Visit("attachmentFeedbackLoopDynamicState",
                     &features->attachmentFeedbackLoopDynamicState);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT* features) {
  return

      visitor->Visit("attachmentFeedbackLoopLayout",
                     &features->attachmentFeedbackLoopLayout);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* features) {
  return

      visitor->Visit("advancedBlendCoherentOperations",
                     &features->advancedBlendCoherentOperations);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* properties) {
  return

      visitor->Visit("advancedBlendMaxColorAttachments",
                     &properties->advancedBlendMaxColorAttachments) &&
      visitor->Visit("advancedBlendIndependentBlend",
                     &properties->advancedBlendIndependentBlend) &&
      visitor->Visit("advancedBlendNonPremultipliedSrcColor",
                     &properties->advancedBlendNonPremultipliedSrcColor) &&
      visitor->Visit("advancedBlendNonPremultipliedDstColor",
                     &properties->advancedBlendNonPremultipliedDstColor) &&
      visitor->Visit("advancedBlendCorrelatedOverlap",
                     &properties->advancedBlendCorrelatedOverlap) &&
      visitor->Visit("advancedBlendAllOperations",
                     &properties->advancedBlendAllOperations);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* features) {
  return

      visitor->Visit("borderColorSwizzle", &features->borderColorSwizzle) &&
      visitor->Visit("borderColorSwizzleFromImage",
                     &features->borderColorSwizzleFromImage);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* features) {
  return

      visitor->Visit("bufferDeviceAddress", &features->bufferDeviceAddress) &&
      visitor->Visit("bufferDeviceAddressCaptureReplay",
                     &features->bufferDeviceAddressCaptureReplay) &&
      visitor->Visit("bufferDeviceAddressMultiDevice",
                     &features->bufferDeviceAddressMultiDevice);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceBufferDeviceAddressFeatures* features) {
  return

      visitor->Visit("bufferDeviceAddress", &features->bufferDeviceAddress) &&
      visitor->Visit("bufferDeviceAddressCaptureReplay",
                     &features->bufferDeviceAddressCaptureReplay) &&
      visitor->Visit("bufferDeviceAddressMultiDevice",
                     &features->bufferDeviceAddressMultiDevice);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceClusterAccelerationStructureFeaturesNV* features) {
  return

      visitor->Visit("clusterAccelerationStructure",
                     &features->clusterAccelerationStructure);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceClusterAccelerationStructurePropertiesNV* properties) {
  return

      visitor->Visit("maxVerticesPerCluster",
                     &properties->maxVerticesPerCluster) &&
      visitor->Visit("maxTrianglesPerCluster",
                     &properties->maxTrianglesPerCluster) &&
      visitor->Visit("clusterScratchByteAlignment",
                     &properties->clusterScratchByteAlignment) &&
      visitor->Visit("clusterByteAlignment",
                     &properties->clusterByteAlignment) &&
      visitor->Visit("clusterTemplateByteAlignment",
                     &properties->clusterTemplateByteAlignment) &&
      visitor->Visit("clusterBottomLevelByteAlignment",
                     &properties->clusterBottomLevelByteAlignment) &&
      visitor->Visit("clusterTemplateBoundsByteAlignment",
                     &properties->clusterTemplateBoundsByteAlignment) &&
      visitor->Visit("maxClusterGeometryIndex",
                     &properties->maxClusterGeometryIndex);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI* features) {
  return

      visitor->Visit("clustercullingShader", &features->clustercullingShader) &&
      visitor->Visit("multiviewClusterCullingShader",
                     &features->multiviewClusterCullingShader);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI* properties) {
  return

      visitor->Visit("maxWorkGroupCount", &properties->maxWorkGroupCount) &&
      visitor->Visit("maxWorkGroupSize", &properties->maxWorkGroupSize) &&
      visitor->Visit("maxOutputClusterCount",
                     &properties->maxOutputClusterCount) &&
      visitor->Visit("indirectBufferOffsetAlignment",
                     &properties->indirectBufferOffsetAlignment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCoherentMemoryFeaturesAMD* features) {
  return

      visitor->Visit("deviceCoherentMemory", &features->deviceCoherentMemory);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceColorWriteEnableFeaturesEXT* features) {
  return

      visitor->Visit("colorWriteEnable", &features->colorWriteEnable);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceCommandBufferInheritanceFeaturesNV* features) {
  return

      visitor->Visit("commandBufferInheritance",
                     &features->commandBufferInheritance);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR* features) {
  return

      visitor->Visit("computeDerivativeGroupQuads",
                     &features->computeDerivativeGroupQuads) &&
      visitor->Visit("computeDerivativeGroupLinear",
                     &features->computeDerivativeGroupLinear);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR* properties) {
  return

      visitor->Visit("meshAndTaskShaderDerivatives",
                     &properties->meshAndTaskShaderDerivatives);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceConditionalRenderingFeaturesEXT* features) {
  return

      visitor->Visit("conditionalRendering", &features->conditionalRendering) &&
      visitor->Visit("inheritedConditionalRendering",
                     &features->inheritedConditionalRendering);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* properties) {
  return

      visitor->Visit("primitiveOverestimationSize",
                     &properties->primitiveOverestimationSize) &&
      visitor->Visit("maxExtraPrimitiveOverestimationSize",
                     &properties->maxExtraPrimitiveOverestimationSize) &&
      visitor->Visit(
          "extraPrimitiveOverestimationSizeGranularity",
          &properties->extraPrimitiveOverestimationSizeGranularity) &&
      visitor->Visit("primitiveUnderestimation",
                     &properties->primitiveUnderestimation) &&
      visitor->Visit("conservativePointAndLineRasterization",
                     &properties->conservativePointAndLineRasterization) &&
      visitor->Visit("degenerateTrianglesRasterized",
                     &properties->degenerateTrianglesRasterized) &&
      visitor->Visit("degenerateLinesRasterized",
                     &properties->degenerateLinesRasterized) &&
      visitor->Visit("fullyCoveredFragmentShaderInputVariable",
                     &properties->fullyCoveredFragmentShaderInputVariable) &&
      visitor->Visit("conservativeRasterizationPostDepthCoverage",
                     &properties->conservativeRasterizationPostDepthCoverage);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCooperativeMatrix2FeaturesNV* features) {
  return

      visitor->Visit("cooperativeMatrixWorkgroupScope",
                     &features->cooperativeMatrixWorkgroupScope) &&
      visitor->Visit("cooperativeMatrixFlexibleDimensions",
                     &features->cooperativeMatrixFlexibleDimensions) &&
      visitor->Visit("cooperativeMatrixReductions",
                     &features->cooperativeMatrixReductions) &&
      visitor->Visit("cooperativeMatrixConversions",
                     &features->cooperativeMatrixConversions) &&
      visitor->Visit("cooperativeMatrixPerElementOperations",
                     &features->cooperativeMatrixPerElementOperations) &&
      visitor->Visit("cooperativeMatrixTensorAddressing",
                     &features->cooperativeMatrixTensorAddressing) &&
      visitor->Visit("cooperativeMatrixBlockLoads",
                     &features->cooperativeMatrixBlockLoads);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceCooperativeMatrix2PropertiesNV* properties) {
  return

      visitor->Visit(
          "cooperativeMatrixWorkgroupScopeMaxWorkgroupSize",
          &properties->cooperativeMatrixWorkgroupScopeMaxWorkgroupSize) &&
      visitor->Visit(
          "cooperativeMatrixFlexibleDimensionsMaxDimension",
          &properties->cooperativeMatrixFlexibleDimensionsMaxDimension) &&
      visitor->Visit(
          "cooperativeMatrixWorkgroupScopeReservedSharedMemory",
          &properties->cooperativeMatrixWorkgroupScopeReservedSharedMemory);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCooperativeMatrixFeaturesKHR* features) {
  return

      visitor->Visit("cooperativeMatrix", &features->cooperativeMatrix) &&
      visitor->Visit("cooperativeMatrixRobustBufferAccess",
                     &features->cooperativeMatrixRobustBufferAccess);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCooperativeMatrixFeaturesNV* features) {
  return

      visitor->Visit("cooperativeMatrix", &features->cooperativeMatrix) &&
      visitor->Visit("cooperativeMatrixRobustBufferAccess",
                     &features->cooperativeMatrixRobustBufferAccess);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceCooperativeMatrixPropertiesKHR* properties) {
  return

      visitor->Visit("cooperativeMatrixSupportedStages",
                     &properties->cooperativeMatrixSupportedStages);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCooperativeMatrixPropertiesNV* properties) {
  return

      visitor->Visit("cooperativeMatrixSupportedStages",
                     &properties->cooperativeMatrixSupportedStages);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCooperativeVectorFeaturesNV* features) {
  return

      visitor->Visit("cooperativeVector", &features->cooperativeVector) &&
      visitor->Visit("cooperativeVectorTraining",
                     &features->cooperativeVectorTraining);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCooperativeVectorPropertiesNV* properties) {
  return

      visitor->Visit("cooperativeVectorSupportedStages",
                     &properties->cooperativeVectorSupportedStages) &&
      visitor->Visit(
          "cooperativeVectorTrainingFloat16Accumulation",
          &properties->cooperativeVectorTrainingFloat16Accumulation) &&
      visitor->Visit(
          "cooperativeVectorTrainingFloat32Accumulation",
          &properties->cooperativeVectorTrainingFloat32Accumulation) &&
      visitor->Visit("maxCooperativeVectorComponents",
                     &properties->maxCooperativeVectorComponents);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCopyMemoryIndirectFeaturesNV* features) {
  return

      visitor->Visit("indirectCopy", &features->indirectCopy);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceCopyMemoryIndirectPropertiesNV* properties) {
  return

      visitor->Visit("supportedQueues", &properties->supportedQueues);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCornerSampledImageFeaturesNV* features) {
  return

      visitor->Visit("cornerSampledImage", &features->cornerSampledImage);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCoverageReductionModeFeaturesNV* features) {
  return

      visitor->Visit("coverageReductionMode", &features->coverageReductionMode);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCubicClampFeaturesQCOM* features) {
  return

      visitor->Visit("cubicRangeClamp", &features->cubicRangeClamp);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCubicWeightsFeaturesQCOM* features) {
  return

      visitor->Visit("selectableCubicWeights",
                     &features->selectableCubicWeights);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceCustomBorderColorFeaturesEXT* features) {
  return

      visitor->Visit("customBorderColors", &features->customBorderColors) &&
      visitor->Visit("customBorderColorWithoutFormat",
                     &features->customBorderColorWithoutFormat);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceCustomBorderColorPropertiesEXT* properties) {
  return

      visitor->Visit("maxCustomBorderColorSamplers",
                     &properties->maxCustomBorderColorSamplers);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* features) {
  return

      visitor->Visit("dedicatedAllocationImageAliasing",
                     &features->dedicatedAllocationImageAliasing);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDepthBiasControlFeaturesEXT* features) {
  return

      visitor->Visit("depthBiasControl", &features->depthBiasControl) &&
      visitor->Visit(
          "leastRepresentableValueForceUnormRepresentation",
          &features->leastRepresentableValueForceUnormRepresentation) &&
      visitor->Visit("floatRepresentation", &features->floatRepresentation) &&
      visitor->Visit("depthBiasExact", &features->depthBiasExact);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDepthClampControlFeaturesEXT* features) {
  return

      visitor->Visit("depthClampControl", &features->depthClampControl);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDepthClampZeroOneFeaturesKHR* features) {
  return

      visitor->Visit("depthClampZeroOne", &features->depthClampZeroOne);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDepthClipControlFeaturesEXT* features) {
  return

      visitor->Visit("depthClipControl", &features->depthClipControl);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDepthClipEnableFeaturesEXT* features) {
  return

      visitor->Visit("depthClipEnable", &features->depthClipEnable);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDepthStencilResolveProperties* properties) {
  return

      visitor->Visit("supportedDepthResolveModes",
                     &properties->supportedDepthResolveModes) &&
      visitor->Visit("supportedStencilResolveModes",
                     &properties->supportedStencilResolveModes) &&
      visitor->Visit("independentResolveNone",
                     &properties->independentResolveNone) &&
      visitor->Visit("independentResolve", &properties->independentResolve);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT* properties) {
  return

      visitor->Visit("combinedImageSamplerDensityMapDescriptorSize",
                     &properties->combinedImageSamplerDensityMapDescriptorSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDescriptorBufferFeaturesEXT* features) {
  return

      visitor->Visit("descriptorBuffer", &features->descriptorBuffer) &&
      visitor->Visit("descriptorBufferCaptureReplay",
                     &features->descriptorBufferCaptureReplay) &&
      visitor->Visit("descriptorBufferImageLayoutIgnored",
                     &features->descriptorBufferImageLayoutIgnored) &&
      visitor->Visit("descriptorBufferPushDescriptors",
                     &features->descriptorBufferPushDescriptors);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDescriptorBufferPropertiesEXT* properties) {
  return

      visitor->Visit("combinedImageSamplerDescriptorSingleArray",
                     &properties->combinedImageSamplerDescriptorSingleArray) &&
      visitor->Visit("bufferlessPushDescriptors",
                     &properties->bufferlessPushDescriptors) &&
      visitor->Visit("allowSamplerImageViewPostSubmitCreation",
                     &properties->allowSamplerImageViewPostSubmitCreation) &&
      visitor->Visit("descriptorBufferOffsetAlignment",
                     &properties->descriptorBufferOffsetAlignment) &&
      visitor->Visit("maxDescriptorBufferBindings",
                     &properties->maxDescriptorBufferBindings) &&
      visitor->Visit("maxResourceDescriptorBufferBindings",
                     &properties->maxResourceDescriptorBufferBindings) &&
      visitor->Visit("maxSamplerDescriptorBufferBindings",
                     &properties->maxSamplerDescriptorBufferBindings) &&
      visitor->Visit("maxEmbeddedImmutableSamplerBindings",
                     &properties->maxEmbeddedImmutableSamplerBindings) &&
      visitor->Visit("maxEmbeddedImmutableSamplers",
                     &properties->maxEmbeddedImmutableSamplers) &&
      visitor->Visit("bufferCaptureReplayDescriptorDataSize",
                     &properties->bufferCaptureReplayDescriptorDataSize) &&
      visitor->Visit("imageCaptureReplayDescriptorDataSize",
                     &properties->imageCaptureReplayDescriptorDataSize) &&
      visitor->Visit("imageViewCaptureReplayDescriptorDataSize",
                     &properties->imageViewCaptureReplayDescriptorDataSize) &&
      visitor->Visit("samplerCaptureReplayDescriptorDataSize",
                     &properties->samplerCaptureReplayDescriptorDataSize) &&
      visitor->Visit(
          "accelerationStructureCaptureReplayDescriptorDataSize",
          &properties->accelerationStructureCaptureReplayDescriptorDataSize) &&
      visitor->Visit("samplerDescriptorSize",
                     &properties->samplerDescriptorSize) &&
      visitor->Visit("combinedImageSamplerDescriptorSize",
                     &properties->combinedImageSamplerDescriptorSize) &&
      visitor->Visit("sampledImageDescriptorSize",
                     &properties->sampledImageDescriptorSize) &&
      visitor->Visit("storageImageDescriptorSize",
                     &properties->storageImageDescriptorSize) &&
      visitor->Visit("uniformTexelBufferDescriptorSize",
                     &properties->uniformTexelBufferDescriptorSize) &&
      visitor->Visit("robustUniformTexelBufferDescriptorSize",
                     &properties->robustUniformTexelBufferDescriptorSize) &&
      visitor->Visit("storageTexelBufferDescriptorSize",
                     &properties->storageTexelBufferDescriptorSize) &&
      visitor->Visit("robustStorageTexelBufferDescriptorSize",
                     &properties->robustStorageTexelBufferDescriptorSize) &&
      visitor->Visit("uniformBufferDescriptorSize",
                     &properties->uniformBufferDescriptorSize) &&
      visitor->Visit("robustUniformBufferDescriptorSize",
                     &properties->robustUniformBufferDescriptorSize) &&
      visitor->Visit("storageBufferDescriptorSize",
                     &properties->storageBufferDescriptorSize) &&
      visitor->Visit("robustStorageBufferDescriptorSize",
                     &properties->robustStorageBufferDescriptorSize) &&
      visitor->Visit("inputAttachmentDescriptorSize",
                     &properties->inputAttachmentDescriptorSize) &&
      visitor->Visit("accelerationStructureDescriptorSize",
                     &properties->accelerationStructureDescriptorSize) &&
      visitor->Visit("maxSamplerDescriptorBufferRange",
                     &properties->maxSamplerDescriptorBufferRange) &&
      visitor->Visit("maxResourceDescriptorBufferRange",
                     &properties->maxResourceDescriptorBufferRange) &&
      visitor->Visit("samplerDescriptorBufferAddressSpaceSize",
                     &properties->samplerDescriptorBufferAddressSpaceSize) &&
      visitor->Visit("resourceDescriptorBufferAddressSpaceSize",
                     &properties->resourceDescriptorBufferAddressSpaceSize) &&
      visitor->Visit("descriptorBufferAddressSpaceSize",
                     &properties->descriptorBufferAddressSpaceSize);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDescriptorBufferTensorFeaturesARM* features) {
  return

      visitor->Visit("descriptorBufferTensorDescriptors",
                     &features->descriptorBufferTensorDescriptors);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDescriptorBufferTensorPropertiesARM* properties) {
  return

      visitor->Visit("tensorCaptureReplayDescriptorDataSize",
                     &properties->tensorCaptureReplayDescriptorDataSize) &&
      visitor->Visit("tensorViewCaptureReplayDescriptorDataSize",
                     &properties->tensorViewCaptureReplayDescriptorDataSize) &&
      visitor->Visit("tensorDescriptorSize", &properties->tensorDescriptorSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDescriptorIndexingFeatures* features) {
  return

      visitor->Visit("shaderInputAttachmentArrayDynamicIndexing",
                     &features->shaderInputAttachmentArrayDynamicIndexing) &&
      visitor->Visit("shaderUniformTexelBufferArrayDynamicIndexing",
                     &features->shaderUniformTexelBufferArrayDynamicIndexing) &&
      visitor->Visit("shaderStorageTexelBufferArrayDynamicIndexing",
                     &features->shaderStorageTexelBufferArrayDynamicIndexing) &&
      visitor->Visit("shaderUniformBufferArrayNonUniformIndexing",
                     &features->shaderUniformBufferArrayNonUniformIndexing) &&
      visitor->Visit("shaderSampledImageArrayNonUniformIndexing",
                     &features->shaderSampledImageArrayNonUniformIndexing) &&
      visitor->Visit("shaderStorageBufferArrayNonUniformIndexing",
                     &features->shaderStorageBufferArrayNonUniformIndexing) &&
      visitor->Visit("shaderStorageImageArrayNonUniformIndexing",
                     &features->shaderStorageImageArrayNonUniformIndexing) &&
      visitor->Visit("shaderInputAttachmentArrayNonUniformIndexing",
                     &features->shaderInputAttachmentArrayNonUniformIndexing) &&
      visitor->Visit(
          "shaderUniformTexelBufferArrayNonUniformIndexing",
          &features->shaderUniformTexelBufferArrayNonUniformIndexing) &&
      visitor->Visit(
          "shaderStorageTexelBufferArrayNonUniformIndexing",
          &features->shaderStorageTexelBufferArrayNonUniformIndexing) &&
      visitor->Visit(
          "descriptorBindingUniformBufferUpdateAfterBind",
          &features->descriptorBindingUniformBufferUpdateAfterBind) &&
      visitor->Visit("descriptorBindingSampledImageUpdateAfterBind",
                     &features->descriptorBindingSampledImageUpdateAfterBind) &&
      visitor->Visit("descriptorBindingStorageImageUpdateAfterBind",
                     &features->descriptorBindingStorageImageUpdateAfterBind) &&
      visitor->Visit(
          "descriptorBindingStorageBufferUpdateAfterBind",
          &features->descriptorBindingStorageBufferUpdateAfterBind) &&
      visitor->Visit(
          "descriptorBindingUniformTexelBufferUpdateAfterBind",
          &features->descriptorBindingUniformTexelBufferUpdateAfterBind) &&
      visitor->Visit(
          "descriptorBindingStorageTexelBufferUpdateAfterBind",
          &features->descriptorBindingStorageTexelBufferUpdateAfterBind) &&
      visitor->Visit("descriptorBindingUpdateUnusedWhilePending",
                     &features->descriptorBindingUpdateUnusedWhilePending) &&
      visitor->Visit("descriptorBindingPartiallyBound",
                     &features->descriptorBindingPartiallyBound) &&
      visitor->Visit("descriptorBindingVariableDescriptorCount",
                     &features->descriptorBindingVariableDescriptorCount) &&
      visitor->Visit("runtimeDescriptorArray",
                     &features->runtimeDescriptorArray);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDescriptorIndexingProperties* properties) {
  return

      visitor->Visit("maxUpdateAfterBindDescriptorsInAllPools",
                     &properties->maxUpdateAfterBindDescriptorsInAllPools) &&
      visitor->Visit(
          "shaderUniformBufferArrayNonUniformIndexingNative",
          &properties->shaderUniformBufferArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderSampledImageArrayNonUniformIndexingNative",
          &properties->shaderSampledImageArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderStorageBufferArrayNonUniformIndexingNative",
          &properties->shaderStorageBufferArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderStorageImageArrayNonUniformIndexingNative",
          &properties->shaderStorageImageArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderInputAttachmentArrayNonUniformIndexingNative",
          &properties->shaderInputAttachmentArrayNonUniformIndexingNative) &&
      visitor->Visit("robustBufferAccessUpdateAfterBind",
                     &properties->robustBufferAccessUpdateAfterBind) &&
      visitor->Visit("quadDivergentImplicitLod",
                     &properties->quadDivergentImplicitLod) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindSamplers",
          &properties->maxPerStageDescriptorUpdateAfterBindSamplers) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindUniformBuffers",
          &properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindStorageBuffers",
          &properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindSampledImages",
          &properties->maxPerStageDescriptorUpdateAfterBindSampledImages) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindStorageImages",
          &properties->maxPerStageDescriptorUpdateAfterBindStorageImages) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindInputAttachments",
          &properties->maxPerStageDescriptorUpdateAfterBindInputAttachments) &&
      visitor->Visit("maxPerStageUpdateAfterBindResources",
                     &properties->maxPerStageUpdateAfterBindResources) &&
      visitor->Visit("maxDescriptorSetUpdateAfterBindSamplers",
                     &properties->maxDescriptorSetUpdateAfterBindSamplers) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindUniformBuffers",
          &properties->maxDescriptorSetUpdateAfterBindUniformBuffers) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic",
          &properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageBuffers",
          &properties->maxDescriptorSetUpdateAfterBindStorageBuffers) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic",
          &properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindSampledImages",
          &properties->maxDescriptorSetUpdateAfterBindSampledImages) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageImages",
          &properties->maxDescriptorSetUpdateAfterBindStorageImages) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindInputAttachments",
          &properties->maxDescriptorSetUpdateAfterBindInputAttachments);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV* features) {
  return

      visitor->Visit("descriptorPoolOverallocation",
                     &features->descriptorPoolOverallocation);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE* features) {
  return

      visitor->Visit("descriptorSetHostMapping",
                     &features->descriptorSetHostMapping);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV* features) {
  return

      visitor->Visit("deviceGeneratedCompute",
                     &features->deviceGeneratedCompute) &&
      visitor->Visit("deviceGeneratedComputePipelines",
                     &features->deviceGeneratedComputePipelines) &&
      visitor->Visit("deviceGeneratedComputeCaptureReplay",
                     &features->deviceGeneratedComputeCaptureReplay);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT* features) {
  return

      visitor->Visit("deviceGeneratedCommands",
                     &features->deviceGeneratedCommands) &&
      visitor->Visit("dynamicGeneratedPipelineLayout",
                     &features->dynamicGeneratedPipelineLayout);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* features) {
  return

      visitor->Visit("deviceGeneratedCommands",
                     &features->deviceGeneratedCommands);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT* properties) {
  return

      visitor->Visit("maxIndirectPipelineCount",
                     &properties->maxIndirectPipelineCount) &&
      visitor->Visit("maxIndirectShaderObjectCount",
                     &properties->maxIndirectShaderObjectCount) &&
      visitor->Visit("maxIndirectSequenceCount",
                     &properties->maxIndirectSequenceCount) &&
      visitor->Visit("maxIndirectCommandsTokenCount",
                     &properties->maxIndirectCommandsTokenCount) &&
      visitor->Visit("maxIndirectCommandsTokenOffset",
                     &properties->maxIndirectCommandsTokenOffset) &&
      visitor->Visit("maxIndirectCommandsIndirectStride",
                     &properties->maxIndirectCommandsIndirectStride) &&
      visitor->Visit("supportedIndirectCommandsInputModes",
                     &properties->supportedIndirectCommandsInputModes) &&
      visitor->Visit("supportedIndirectCommandsShaderStages",
                     &properties->supportedIndirectCommandsShaderStages) &&
      visitor->Visit(
          "supportedIndirectCommandsShaderStagesPipelineBinding",
          &properties->supportedIndirectCommandsShaderStagesPipelineBinding) &&
      visitor->Visit(
          "supportedIndirectCommandsShaderStagesShaderBinding",
          &properties->supportedIndirectCommandsShaderStagesShaderBinding) &&
      visitor->Visit("deviceGeneratedCommandsTransformFeedback",
                     &properties->deviceGeneratedCommandsTransformFeedback) &&
      visitor->Visit(
          "deviceGeneratedCommandsMultiDrawIndirectCount",
          &properties->deviceGeneratedCommandsMultiDrawIndirectCount);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* properties) {
  return

      visitor->Visit("maxGraphicsShaderGroupCount",
                     &properties->maxGraphicsShaderGroupCount) &&
      visitor->Visit("maxIndirectSequenceCount",
                     &properties->maxIndirectSequenceCount) &&
      visitor->Visit("maxIndirectCommandsTokenCount",
                     &properties->maxIndirectCommandsTokenCount) &&
      visitor->Visit("maxIndirectCommandsStreamCount",
                     &properties->maxIndirectCommandsStreamCount) &&
      visitor->Visit("maxIndirectCommandsTokenOffset",
                     &properties->maxIndirectCommandsTokenOffset) &&
      visitor->Visit("maxIndirectCommandsStreamStride",
                     &properties->maxIndirectCommandsStreamStride) &&
      visitor->Visit("minSequencesCountBufferOffsetAlignment",
                     &properties->minSequencesCountBufferOffsetAlignment) &&
      visitor->Visit("minSequencesIndexBufferOffsetAlignment",
                     &properties->minSequencesIndexBufferOffsetAlignment) &&
      visitor->Visit("minIndirectCommandsBufferOffsetAlignment",
                     &properties->minIndirectCommandsBufferOffsetAlignment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* features) {
  return

      visitor->Visit("deviceMemoryReport", &features->deviceMemoryReport);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* features) {
  return

      visitor->Visit("diagnosticsConfig", &features->diagnosticsConfig);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDiscardRectanglePropertiesEXT* properties) {
  return

      visitor->Visit("maxDiscardRectangles", &properties->maxDiscardRectangles);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDriverProperties* properties) {
  return

      visitor->Visit("driverID", &properties->driverID) &&
      visitor->Visit("driverName", &properties->driverName) &&
      visitor->Visit("driverInfo", &properties->driverInfo) &&
      visitor->Visit("conformanceVersion", &properties->conformanceVersion);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDrmPropertiesEXT* properties) {
  return

      visitor->Visit("hasPrimary", &properties->hasPrimary) &&
      visitor->Visit("hasRender", &properties->hasRender) &&
      visitor->Visit("primaryMajor", &properties->primaryMajor) &&
      visitor->Visit("primaryMinor", &properties->primaryMinor) &&
      visitor->Visit("renderMajor", &properties->renderMajor) &&
      visitor->Visit("renderMinor", &properties->renderMinor);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceDynamicRenderingFeatures* features) {
  return

      visitor->Visit("dynamicRendering", &features->dynamicRendering);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDynamicRenderingLocalReadFeatures* features) {
  return

      visitor->Visit("dynamicRenderingLocalRead",
                     &features->dynamicRenderingLocalRead);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT* features) {
  return

      visitor->Visit("dynamicRenderingUnusedAttachments",
                     &features->dynamicRenderingUnusedAttachments);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceExclusiveScissorFeaturesNV* features) {
  return

      visitor->Visit("exclusiveScissor", &features->exclusiveScissor);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* features) {
  return

      visitor->Visit("extendedDynamicState2",
                     &features->extendedDynamicState2) &&
      visitor->Visit("extendedDynamicState2LogicOp",
                     &features->extendedDynamicState2LogicOp) &&
      visitor->Visit("extendedDynamicState2PatchControlPoints",
                     &features->extendedDynamicState2PatchControlPoints);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExtendedDynamicState3FeaturesEXT* features) {
  return

      visitor->Visit(
          "extendedDynamicState3TessellationDomainOrigin",
          &features->extendedDynamicState3TessellationDomainOrigin) &&
      visitor->Visit("extendedDynamicState3DepthClampEnable",
                     &features->extendedDynamicState3DepthClampEnable) &&
      visitor->Visit("extendedDynamicState3PolygonMode",
                     &features->extendedDynamicState3PolygonMode) &&
      visitor->Visit("extendedDynamicState3RasterizationSamples",
                     &features->extendedDynamicState3RasterizationSamples) &&
      visitor->Visit("extendedDynamicState3SampleMask",
                     &features->extendedDynamicState3SampleMask) &&
      visitor->Visit("extendedDynamicState3AlphaToCoverageEnable",
                     &features->extendedDynamicState3AlphaToCoverageEnable) &&
      visitor->Visit("extendedDynamicState3AlphaToOneEnable",
                     &features->extendedDynamicState3AlphaToOneEnable) &&
      visitor->Visit("extendedDynamicState3LogicOpEnable",
                     &features->extendedDynamicState3LogicOpEnable) &&
      visitor->Visit("extendedDynamicState3ColorBlendEnable",
                     &features->extendedDynamicState3ColorBlendEnable) &&
      visitor->Visit("extendedDynamicState3ColorBlendEquation",
                     &features->extendedDynamicState3ColorBlendEquation) &&
      visitor->Visit("extendedDynamicState3ColorWriteMask",
                     &features->extendedDynamicState3ColorWriteMask) &&
      visitor->Visit("extendedDynamicState3RasterizationStream",
                     &features->extendedDynamicState3RasterizationStream) &&
      visitor->Visit(
          "extendedDynamicState3ConservativeRasterizationMode",
          &features->extendedDynamicState3ConservativeRasterizationMode) &&
      visitor->Visit(
          "extendedDynamicState3ExtraPrimitiveOverestimationSize",
          &features->extendedDynamicState3ExtraPrimitiveOverestimationSize) &&
      visitor->Visit("extendedDynamicState3DepthClipEnable",
                     &features->extendedDynamicState3DepthClipEnable) &&
      visitor->Visit("extendedDynamicState3SampleLocationsEnable",
                     &features->extendedDynamicState3SampleLocationsEnable) &&
      visitor->Visit("extendedDynamicState3ColorBlendAdvanced",
                     &features->extendedDynamicState3ColorBlendAdvanced) &&
      visitor->Visit("extendedDynamicState3ProvokingVertexMode",
                     &features->extendedDynamicState3ProvokingVertexMode) &&
      visitor->Visit("extendedDynamicState3LineRasterizationMode",
                     &features->extendedDynamicState3LineRasterizationMode) &&
      visitor->Visit("extendedDynamicState3LineStippleEnable",
                     &features->extendedDynamicState3LineStippleEnable) &&
      visitor->Visit(
          "extendedDynamicState3DepthClipNegativeOneToOne",
          &features->extendedDynamicState3DepthClipNegativeOneToOne) &&
      visitor->Visit("extendedDynamicState3ViewportWScalingEnable",
                     &features->extendedDynamicState3ViewportWScalingEnable) &&
      visitor->Visit("extendedDynamicState3ViewportSwizzle",
                     &features->extendedDynamicState3ViewportSwizzle) &&
      visitor->Visit("extendedDynamicState3CoverageToColorEnable",
                     &features->extendedDynamicState3CoverageToColorEnable) &&
      visitor->Visit("extendedDynamicState3CoverageToColorLocation",
                     &features->extendedDynamicState3CoverageToColorLocation) &&
      visitor->Visit("extendedDynamicState3CoverageModulationMode",
                     &features->extendedDynamicState3CoverageModulationMode) &&
      visitor->Visit(
          "extendedDynamicState3CoverageModulationTableEnable",
          &features->extendedDynamicState3CoverageModulationTableEnable) &&
      visitor->Visit("extendedDynamicState3CoverageModulationTable",
                     &features->extendedDynamicState3CoverageModulationTable) &&
      visitor->Visit("extendedDynamicState3CoverageReductionMode",
                     &features->extendedDynamicState3CoverageReductionMode) &&
      visitor->Visit(
          "extendedDynamicState3RepresentativeFragmentTestEnable",
          &features->extendedDynamicState3RepresentativeFragmentTestEnable) &&
      visitor->Visit("extendedDynamicState3ShadingRateImageEnable",
                     &features->extendedDynamicState3ShadingRateImageEnable);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExtendedDynamicState3PropertiesEXT* properties) {
  return

      visitor->Visit("dynamicPrimitiveTopologyUnrestricted",
                     &properties->dynamicPrimitiveTopologyUnrestricted);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* features) {
  return

      visitor->Visit("extendedDynamicState", &features->extendedDynamicState);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV* features) {
  return

      visitor->Visit("extendedSparseAddressSpace",
                     &features->extendedSparseAddressSpace);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV* properties) {
  return

      visitor->Visit("extendedSparseAddressSpaceSize",
                     &properties->extendedSparseAddressSpaceSize) &&
      visitor->Visit("extendedSparseImageUsageFlags",
                     &properties->extendedSparseImageUsageFlags) &&
      visitor->Visit("extendedSparseBufferUsageFlags",
                     &properties->extendedSparseBufferUsageFlags);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExternalComputeQueuePropertiesNV* properties) {
  return

      visitor->Visit("externalDataSize", &properties->externalDataSize) &&
      visitor->Visit("maxExternalQueues", &properties->maxExternalQueues);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExternalFormatResolveFeaturesANDROID* features) {
  return

      visitor->Visit("externalFormatResolve", &features->externalFormatResolve);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExternalFormatResolvePropertiesANDROID* properties) {
  return

      visitor->Visit(
          "nullColorAttachmentWithExternalFormatResolve",
          &properties->nullColorAttachmentWithExternalFormatResolve) &&
      visitor->Visit("externalFormatResolveChromaOffsetX",
                     &properties->externalFormatResolveChromaOffsetX) &&
      visitor->Visit("externalFormatResolveChromaOffsetY",
                     &properties->externalFormatResolveChromaOffsetY);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* properties) {
  return

      visitor->Visit("minImportedHostPointerAlignment",
                     &properties->minImportedHostPointerAlignment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* features) {
  return

      visitor->Visit("externalMemoryRDMA", &features->externalMemoryRDMA);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFaultFeaturesEXT* features) {
  return

      visitor->Visit("deviceFault", &features->deviceFault) &&
      visitor->Visit("deviceFaultVendorBinary",
                     &features->deviceFaultVendorBinary);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderFloat16Int8Features* features) {
  return

      visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
      visitor->Visit("shaderInt8", &features->shaderInt8);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFloatControlsProperties* properties) {
  return

      visitor->Visit("denormBehaviorIndependence",
                     &properties->denormBehaviorIndependence) &&
      visitor->Visit("roundingModeIndependence",
                     &properties->roundingModeIndependence) &&
      visitor->Visit("shaderSignedZeroInfNanPreserveFloat16",
                     &properties->shaderSignedZeroInfNanPreserveFloat16) &&
      visitor->Visit("shaderSignedZeroInfNanPreserveFloat32",
                     &properties->shaderSignedZeroInfNanPreserveFloat32) &&
      visitor->Visit("shaderSignedZeroInfNanPreserveFloat64",
                     &properties->shaderSignedZeroInfNanPreserveFloat64) &&
      visitor->Visit("shaderDenormPreserveFloat16",
                     &properties->shaderDenormPreserveFloat16) &&
      visitor->Visit("shaderDenormPreserveFloat32",
                     &properties->shaderDenormPreserveFloat32) &&
      visitor->Visit("shaderDenormPreserveFloat64",
                     &properties->shaderDenormPreserveFloat64) &&
      visitor->Visit("shaderDenormFlushToZeroFloat16",
                     &properties->shaderDenormFlushToZeroFloat16) &&
      visitor->Visit("shaderDenormFlushToZeroFloat32",
                     &properties->shaderDenormFlushToZeroFloat32) &&
      visitor->Visit("shaderDenormFlushToZeroFloat64",
                     &properties->shaderDenormFlushToZeroFloat64) &&
      visitor->Visit("shaderRoundingModeRTEFloat16",
                     &properties->shaderRoundingModeRTEFloat16) &&
      visitor->Visit("shaderRoundingModeRTEFloat32",
                     &properties->shaderRoundingModeRTEFloat32) &&
      visitor->Visit("shaderRoundingModeRTEFloat64",
                     &properties->shaderRoundingModeRTEFloat64) &&
      visitor->Visit("shaderRoundingModeRTZFloat16",
                     &properties->shaderRoundingModeRTZFloat16) &&
      visitor->Visit("shaderRoundingModeRTZFloat32",
                     &properties->shaderRoundingModeRTZFloat32) &&
      visitor->Visit("shaderRoundingModeRTZFloat64",
                     &properties->shaderRoundingModeRTZFloat64);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFormatPackFeaturesARM* features) {
  return

      visitor->Visit("formatPack", &features->formatPack);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* features) {
  return

      visitor->Visit("fragmentDensityMapDeferred",
                     &features->fragmentDensityMapDeferred);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* properties) {
  return

      visitor->Visit("subsampledLoads", &properties->subsampledLoads) &&
      visitor->Visit("subsampledCoarseReconstructionEarlyAccess",
                     &properties->subsampledCoarseReconstructionEarlyAccess) &&
      visitor->Visit("maxSubsampledArrayLayers",
                     &properties->maxSubsampledArrayLayers) &&
      visitor->Visit("maxDescriptorSetSubsampledSamplers",
                     &properties->maxDescriptorSetSubsampledSamplers);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* features) {
  return

      visitor->Visit("fragmentDensityMap", &features->fragmentDensityMap) &&
      visitor->Visit("fragmentDensityMapDynamic",
                     &features->fragmentDensityMapDynamic) &&
      visitor->Visit("fragmentDensityMapNonSubsampledImages",
                     &features->fragmentDensityMapNonSubsampledImages);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT* features) {
  return

      visitor->Visit("fragmentDensityMapOffset",
                     &features->fragmentDensityMapOffset);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT* properties) {
  return

      visitor->Visit("fragmentDensityOffsetGranularity",
                     &properties->fragmentDensityOffsetGranularity);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* properties) {
  return

      visitor->Visit("minFragmentDensityTexelSize",
                     &properties->minFragmentDensityTexelSize) &&
      visitor->Visit("maxFragmentDensityTexelSize",
                     &properties->maxFragmentDensityTexelSize) &&
      visitor->Visit("fragmentDensityInvocations",
                     &properties->fragmentDensityInvocations);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR* features) {
  return

      visitor->Visit("fragmentShaderBarycentric",
                     &features->fragmentShaderBarycentric);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR* properties) {
  return

      visitor->Visit(
          "triStripVertexOrderIndependentOfProvokingVertex",
          &properties->triStripVertexOrderIndependentOfProvokingVertex);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* features) {
  return

      visitor->Visit("fragmentShaderSampleInterlock",
                     &features->fragmentShaderSampleInterlock) &&
      visitor->Visit("fragmentShaderPixelInterlock",
                     &features->fragmentShaderPixelInterlock) &&
      visitor->Visit("fragmentShaderShadingRateInterlock",
                     &features->fragmentShaderShadingRateInterlock);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* features) {
  return

      visitor->Visit("fragmentShadingRateEnums",
                     &features->fragmentShadingRateEnums) &&
      visitor->Visit("supersampleFragmentShadingRates",
                     &features->supersampleFragmentShadingRates) &&
      visitor->Visit("noInvocationFragmentShadingRates",
                     &features->noInvocationFragmentShadingRates);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* properties) {
  return

      visitor->Visit("maxFragmentShadingRateInvocationCount",
                     &properties->maxFragmentShadingRateInvocationCount);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* features) {
  return

      visitor->Visit("pipelineFragmentShadingRate",
                     &features->pipelineFragmentShadingRate) &&
      visitor->Visit("primitiveFragmentShadingRate",
                     &features->primitiveFragmentShadingRate) &&
      visitor->Visit("attachmentFragmentShadingRate",
                     &features->attachmentFragmentShadingRate);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* properties) {
  return

      visitor->Visit("minFragmentShadingRateAttachmentTexelSize",
                     &properties->minFragmentShadingRateAttachmentTexelSize) &&
      visitor->Visit("maxFragmentShadingRateAttachmentTexelSize",
                     &properties->maxFragmentShadingRateAttachmentTexelSize) &&
      visitor->Visit(
          "maxFragmentShadingRateAttachmentTexelSizeAspectRatio",
          &properties->maxFragmentShadingRateAttachmentTexelSizeAspectRatio) &&
      visitor->Visit(
          "primitiveFragmentShadingRateWithMultipleViewports",
          &properties->primitiveFragmentShadingRateWithMultipleViewports) &&
      visitor->Visit("layeredShadingRateAttachments",
                     &properties->layeredShadingRateAttachments) &&
      visitor->Visit("fragmentShadingRateNonTrivialCombinerOps",
                     &properties->fragmentShadingRateNonTrivialCombinerOps) &&
      visitor->Visit("maxFragmentSize", &properties->maxFragmentSize) &&
      visitor->Visit("maxFragmentSizeAspectRatio",
                     &properties->maxFragmentSizeAspectRatio) &&
      visitor->Visit("maxFragmentShadingRateCoverageSamples",
                     &properties->maxFragmentShadingRateCoverageSamples) &&
      visitor->Visit("maxFragmentShadingRateRasterizationSamples",
                     &properties->maxFragmentShadingRateRasterizationSamples) &&
      visitor->Visit(
          "fragmentShadingRateWithShaderDepthStencilWrites",
          &properties->fragmentShadingRateWithShaderDepthStencilWrites) &&
      visitor->Visit("fragmentShadingRateWithSampleMask",
                     &properties->fragmentShadingRateWithSampleMask) &&
      visitor->Visit("fragmentShadingRateWithShaderSampleMask",
                     &properties->fragmentShadingRateWithShaderSampleMask) &&
      visitor->Visit(
          "fragmentShadingRateWithConservativeRasterization",
          &properties->fragmentShadingRateWithConservativeRasterization) &&
      visitor->Visit(
          "fragmentShadingRateWithFragmentShaderInterlock",
          &properties->fragmentShadingRateWithFragmentShaderInterlock) &&
      visitor->Visit(
          "fragmentShadingRateWithCustomSampleLocations",
          &properties->fragmentShadingRateWithCustomSampleLocations) &&
      visitor->Visit("fragmentShadingRateStrictMultiplyCombiner",
                     &properties->fragmentShadingRateStrictMultiplyCombiner);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceFrameBoundaryFeaturesEXT* features) {
  return

      visitor->Visit("frameBoundary", &features->frameBoundary);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceGlobalPriorityQueryFeatures* features) {
  return

      visitor->Visit("globalPriorityQuery", &features->globalPriorityQuery);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT* features) {
  return

      visitor->Visit("graphicsPipelineLibrary",
                     &features->graphicsPipelineLibrary);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT* properties) {
  return

      visitor->Visit("graphicsPipelineLibraryFastLinking",
                     &properties->graphicsPipelineLibraryFastLinking) &&
      visitor->Visit(
          "graphicsPipelineLibraryIndependentInterpolationDecoration",
          &properties
               ->graphicsPipelineLibraryIndependentInterpolationDecoration);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceHdrVividFeaturesHUAWEI* features) {
  return

      visitor->Visit("hdrVivid", &features->hdrVivid);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceHostImageCopyFeatures* features) {
  return

      visitor->Visit("hostImageCopy", &features->hostImageCopy);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceHostImageCopyProperties* properties) {
  return

      visitor->Visit("copySrcLayoutCount", &properties->copySrcLayoutCount) &&
      visitor->VisitArray("pCopySrcLayouts", properties->copySrcLayoutCount,
                          &properties->pCopySrcLayouts) &&
      visitor->Visit("copyDstLayoutCount", &properties->copyDstLayoutCount) &&
      visitor->VisitArray("pCopyDstLayouts", properties->copyDstLayoutCount,
                          &properties->pCopyDstLayouts) &&
      visitor->Visit("optimalTilingLayoutUUID",
                     &properties->optimalTilingLayoutUUID) &&
      visitor->Visit("identicalMemoryTypeRequirements",
                     &properties->identicalMemoryTypeRequirements);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceHostQueryResetFeatures* features) {
  return

      visitor->Visit("hostQueryReset", &features->hostQueryReset);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceIDProperties* properties) {
  return

      visitor->Visit("deviceUUID", &properties->deviceUUID) &&
      visitor->Visit("driverUUID", &properties->driverUUID) &&
      visitor->Visit("deviceLUID", &properties->deviceLUID) &&
      visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
      visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* features) {
  return

      visitor->Visit("image2DViewOf3D", &features->image2DViewOf3D) &&
      visitor->Visit("sampler2DViewOf3D", &features->sampler2DViewOf3D);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceImageAlignmentControlFeaturesMESA* features) {
  return

      visitor->Visit("imageAlignmentControl", &features->imageAlignmentControl);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceImageAlignmentControlPropertiesMESA* properties) {
  return

      visitor->Visit("supportedImageAlignmentMask",
                     &properties->supportedImageAlignmentMask);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceImageCompressionControlFeaturesEXT* features) {
  return

      visitor->Visit("imageCompressionControl",
                     &features->imageCompressionControl);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT* features) {
  return

      visitor->Visit("imageCompressionControlSwapchain",
                     &features->imageCompressionControlSwapchain);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImageProcessing2FeaturesQCOM* features) {
  return

      visitor->Visit("textureBlockMatch2", &features->textureBlockMatch2);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceImageProcessing2PropertiesQCOM* properties) {
  return

      visitor->Visit("maxBlockMatchWindow", &properties->maxBlockMatchWindow);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImageProcessingFeaturesQCOM* features) {
  return

      visitor->Visit("textureSampleWeighted",
                     &features->textureSampleWeighted) &&
      visitor->Visit("textureBoxFilter", &features->textureBoxFilter) &&
      visitor->Visit("textureBlockMatch", &features->textureBlockMatch);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImageProcessingPropertiesQCOM* properties) {
  return

      visitor->Visit("maxWeightFilterPhases",
                     &properties->maxWeightFilterPhases) &&
      visitor->Visit("maxWeightFilterDimension",
                     &properties->maxWeightFilterDimension) &&
      visitor->Visit("maxBlockMatchRegion", &properties->maxBlockMatchRegion) &&
      visitor->Visit("maxBoxFilterBlockSize",
                     &properties->maxBoxFilterBlockSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImageRobustnessFeatures* features) {
  return

      visitor->Visit("robustImageAccess", &features->robustImageAccess);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT* features) {
  return

      visitor->Visit("imageSlicedViewOf3D", &features->imageSlicedViewOf3D);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImageViewMinLodFeaturesEXT* features) {
  return

      visitor->Visit("minLod", &features->minLod);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceImagelessFramebufferFeatures* features) {
  return

      visitor->Visit("imagelessFramebuffer", &features->imagelessFramebuffer);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceIndexTypeUint8Features* features) {
  return

      visitor->Visit("indexTypeUint8", &features->indexTypeUint8);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* features) {
  return

      visitor->Visit("inheritedViewportScissor2D",
                     &features->inheritedViewportScissor2D);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceInlineUniformBlockFeatures* features) {
  return

      visitor->Visit("inlineUniformBlock", &features->inlineUniformBlock) &&
      visitor->Visit(
          "descriptorBindingInlineUniformBlockUpdateAfterBind",
          &features->descriptorBindingInlineUniformBlockUpdateAfterBind);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceInlineUniformBlockProperties* properties) {
  return

      visitor->Visit("maxInlineUniformBlockSize",
                     &properties->maxInlineUniformBlockSize) &&
      visitor->Visit("maxPerStageDescriptorInlineUniformBlocks",
                     &properties->maxPerStageDescriptorInlineUniformBlocks) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks",
          &properties
               ->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) &&
      visitor->Visit("maxDescriptorSetInlineUniformBlocks",
                     &properties->maxDescriptorSetInlineUniformBlocks) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindInlineUniformBlocks",
          &properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* features) {
  return

      visitor->Visit("invocationMask", &features->invocationMask);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLayeredApiPropertiesListKHR* properties) {
  return

      visitor->Visit("layeredApiCount", &properties->layeredApiCount) &&
      visitor->VisitArray("pLayeredApis", properties->layeredApiCount,
                          &properties->pLayeredApis);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLayeredDriverPropertiesMSFT* properties) {
  return

      visitor->Visit("underlyingAPI", &properties->underlyingAPI);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLegacyDitheringFeaturesEXT* features) {
  return

      visitor->Visit("legacyDithering", &features->legacyDithering);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT* features) {
  return

      visitor->Visit("legacyVertexAttributes",
                     &features->legacyVertexAttributes);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT* properties) {
  return

      visitor->Visit("nativeUnalignedPerformance",
                     &properties->nativeUnalignedPerformance);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLineRasterizationFeatures* features) {
  return

      visitor->Visit("rectangularLines", &features->rectangularLines) &&
      visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
      visitor->Visit("smoothLines", &features->smoothLines) &&
      visitor->Visit("stippledRectangularLines",
                     &features->stippledRectangularLines) &&
      visitor->Visit("stippledBresenhamLines",
                     &features->stippledBresenhamLines) &&
      visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLineRasterizationProperties* properties) {
  return

      visitor->Visit("lineSubPixelPrecisionBits",
                     &properties->lineSubPixelPrecisionBits);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceLinearColorAttachmentFeaturesNV* features) {
  return

      visitor->Visit("linearColorAttachment", &features->linearColorAttachment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance3Properties* properties) {
  return

      visitor->Visit("maxPerSetDescriptors",
                     &properties->maxPerSetDescriptors) &&
      visitor->Visit("maxMemoryAllocationSize",
                     &properties->maxMemoryAllocationSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance4Features* features) {
  return

      visitor->Visit("maintenance4", &features->maintenance4);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance4Properties* properties) {
  return

      visitor->Visit("maxBufferSize", &properties->maxBufferSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance5Features* features) {
  return

      visitor->Visit("maintenance5", &features->maintenance5);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance5Properties* properties) {
  return

      visitor->Visit(
          "earlyFragmentMultisampleCoverageAfterSampleCounting",
          &properties->earlyFragmentMultisampleCoverageAfterSampleCounting) &&
      visitor->Visit(
          "earlyFragmentSampleMaskTestBeforeSampleCounting",
          &properties->earlyFragmentSampleMaskTestBeforeSampleCounting) &&
      visitor->Visit("depthStencilSwizzleOneSupport",
                     &properties->depthStencilSwizzleOneSupport) &&
      visitor->Visit("polygonModePointSize",
                     &properties->polygonModePointSize) &&
      visitor->Visit(
          "nonStrictSinglePixelWideLinesUseParallelogram",
          &properties->nonStrictSinglePixelWideLinesUseParallelogram) &&
      visitor->Visit("nonStrictWideLinesUseParallelogram",
                     &properties->nonStrictWideLinesUseParallelogram);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance6Features* features) {
  return

      visitor->Visit("maintenance6", &features->maintenance6);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance6Properties* properties) {
  return

      visitor->Visit("blockTexelViewCompatibleMultipleLayers",
                     &properties->blockTexelViewCompatibleMultipleLayers) &&
      visitor->Visit("maxCombinedImageSamplerDescriptorCount",
                     &properties->maxCombinedImageSamplerDescriptorCount) &&
      visitor->Visit("fragmentShadingRateClampCombinerInputs",
                     &properties->fragmentShadingRateClampCombinerInputs);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance7FeaturesKHR* features) {
  return

      visitor->Visit("maintenance7", &features->maintenance7);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance7PropertiesKHR* properties) {
  return

      visitor->Visit("robustFragmentShadingRateAttachmentAccess",
                     &properties->robustFragmentShadingRateAttachmentAccess) &&
      visitor->Visit("separateDepthStencilAttachmentAccess",
                     &properties->separateDepthStencilAttachmentAccess) &&
      visitor->Visit("maxDescriptorSetTotalUniformBuffersDynamic",
                     &properties->maxDescriptorSetTotalUniformBuffersDynamic) &&
      visitor->Visit("maxDescriptorSetTotalStorageBuffersDynamic",
                     &properties->maxDescriptorSetTotalStorageBuffersDynamic) &&
      visitor->Visit("maxDescriptorSetTotalBuffersDynamic",
                     &properties->maxDescriptorSetTotalBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic",
          &properties
               ->maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic",
          &properties
               ->maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindTotalBuffersDynamic",
          &properties->maxDescriptorSetUpdateAfterBindTotalBuffersDynamic);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance8FeaturesKHR* features) {
  return

      visitor->Visit("maintenance8", &features->maintenance8);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance9FeaturesKHR* features) {
  return

      visitor->Visit("maintenance9", &features->maintenance9);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMaintenance9PropertiesKHR* properties) {
  return

      visitor->Visit("image2DViewOf3DSparse",
                     &properties->image2DViewOf3DSparse) &&
      visitor->Visit("defaultVertexAttributeValue",
                     &properties->defaultVertexAttributeValue);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMapMemoryPlacedFeaturesEXT* features) {
  return

      visitor->Visit("memoryMapPlaced", &features->memoryMapPlaced) &&
      visitor->Visit("memoryMapRangePlaced", &features->memoryMapRangePlaced) &&
      visitor->Visit("memoryUnmapReserve", &features->memoryUnmapReserve);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMapMemoryPlacedPropertiesEXT* properties) {
  return

      visitor->Visit("minPlacedMemoryMapAlignment",
                     &properties->minPlacedMemoryMapAlignment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMemoryDecompressionFeaturesNV* features) {
  return

      visitor->Visit("memoryDecompression", &features->memoryDecompression);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceMemoryDecompressionPropertiesNV* properties) {
  return

      visitor->Visit("decompressionMethods",
                     &properties->decompressionMethods) &&
      visitor->Visit("maxDecompressionIndirectCount",
                     &properties->maxDecompressionIndirectCount);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMemoryPriorityFeaturesEXT* features) {
  return

      visitor->Visit("memoryPriority", &features->memoryPriority);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMeshShaderFeaturesEXT* features) {
  return

      visitor->Visit("taskShader", &features->taskShader) &&
      visitor->Visit("meshShader", &features->meshShader) &&
      visitor->Visit("multiviewMeshShader", &features->multiviewMeshShader) &&
      visitor->Visit("primitiveFragmentShadingRateMeshShader",
                     &features->primitiveFragmentShadingRateMeshShader) &&
      visitor->Visit("meshShaderQueries", &features->meshShaderQueries);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMeshShaderFeaturesNV* features) {
  return

      visitor->Visit("taskShader", &features->taskShader) &&
      visitor->Visit("meshShader", &features->meshShader);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMeshShaderPropertiesEXT* properties) {
  return

      visitor->Visit("maxTaskWorkGroupTotalCount",
                     &properties->maxTaskWorkGroupTotalCount) &&
      visitor->Visit("maxTaskWorkGroupCount",
                     &properties->maxTaskWorkGroupCount) &&
      visitor->Visit("maxTaskWorkGroupInvocations",
                     &properties->maxTaskWorkGroupInvocations) &&
      visitor->Visit("maxTaskWorkGroupSize",
                     &properties->maxTaskWorkGroupSize) &&
      visitor->Visit("maxTaskPayloadSize", &properties->maxTaskPayloadSize) &&
      visitor->Visit("maxTaskSharedMemorySize",
                     &properties->maxTaskSharedMemorySize) &&
      visitor->Visit("maxTaskPayloadAndSharedMemorySize",
                     &properties->maxTaskPayloadAndSharedMemorySize) &&
      visitor->Visit("maxMeshWorkGroupTotalCount",
                     &properties->maxMeshWorkGroupTotalCount) &&
      visitor->Visit("maxMeshWorkGroupCount",
                     &properties->maxMeshWorkGroupCount) &&
      visitor->Visit("maxMeshWorkGroupInvocations",
                     &properties->maxMeshWorkGroupInvocations) &&
      visitor->Visit("maxMeshWorkGroupSize",
                     &properties->maxMeshWorkGroupSize) &&
      visitor->Visit("maxMeshSharedMemorySize",
                     &properties->maxMeshSharedMemorySize) &&
      visitor->Visit("maxMeshPayloadAndSharedMemorySize",
                     &properties->maxMeshPayloadAndSharedMemorySize) &&
      visitor->Visit("maxMeshOutputMemorySize",
                     &properties->maxMeshOutputMemorySize) &&
      visitor->Visit("maxMeshPayloadAndOutputMemorySize",
                     &properties->maxMeshPayloadAndOutputMemorySize) &&
      visitor->Visit("maxMeshOutputComponents",
                     &properties->maxMeshOutputComponents) &&
      visitor->Visit("maxMeshOutputVertices",
                     &properties->maxMeshOutputVertices) &&
      visitor->Visit("maxMeshOutputPrimitives",
                     &properties->maxMeshOutputPrimitives) &&
      visitor->Visit("maxMeshOutputLayers", &properties->maxMeshOutputLayers) &&
      visitor->Visit("maxMeshMultiviewViewCount",
                     &properties->maxMeshMultiviewViewCount) &&
      visitor->Visit("meshOutputPerVertexGranularity",
                     &properties->meshOutputPerVertexGranularity) &&
      visitor->Visit("meshOutputPerPrimitiveGranularity",
                     &properties->meshOutputPerPrimitiveGranularity) &&
      visitor->Visit("maxPreferredTaskWorkGroupInvocations",
                     &properties->maxPreferredTaskWorkGroupInvocations) &&
      visitor->Visit("maxPreferredMeshWorkGroupInvocations",
                     &properties->maxPreferredMeshWorkGroupInvocations) &&
      visitor->Visit("prefersLocalInvocationVertexOutput",
                     &properties->prefersLocalInvocationVertexOutput) &&
      visitor->Visit("prefersLocalInvocationPrimitiveOutput",
                     &properties->prefersLocalInvocationPrimitiveOutput) &&
      visitor->Visit("prefersCompactVertexOutput",
                     &properties->prefersCompactVertexOutput) &&
      visitor->Visit("prefersCompactPrimitiveOutput",
                     &properties->prefersCompactPrimitiveOutput);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMeshShaderPropertiesNV* properties) {
  return

      visitor->Visit("maxDrawMeshTasksCount",
                     &properties->maxDrawMeshTasksCount) &&
      visitor->Visit("maxTaskWorkGroupInvocations",
                     &properties->maxTaskWorkGroupInvocations) &&
      visitor->Visit("maxTaskWorkGroupSize",
                     &properties->maxTaskWorkGroupSize) &&
      visitor->Visit("maxTaskTotalMemorySize",
                     &properties->maxTaskTotalMemorySize) &&
      visitor->Visit("maxTaskOutputCount", &properties->maxTaskOutputCount) &&
      visitor->Visit("maxMeshWorkGroupInvocations",
                     &properties->maxMeshWorkGroupInvocations) &&
      visitor->Visit("maxMeshWorkGroupSize",
                     &properties->maxMeshWorkGroupSize) &&
      visitor->Visit("maxMeshTotalMemorySize",
                     &properties->maxMeshTotalMemorySize) &&
      visitor->Visit("maxMeshOutputVertices",
                     &properties->maxMeshOutputVertices) &&
      visitor->Visit("maxMeshOutputPrimitives",
                     &properties->maxMeshOutputPrimitives) &&
      visitor->Visit("maxMeshMultiviewViewCount",
                     &properties->maxMeshMultiviewViewCount) &&
      visitor->Visit("meshOutputPerVertexGranularity",
                     &properties->meshOutputPerVertexGranularity) &&
      visitor->Visit("meshOutputPerPrimitiveGranularity",
                     &properties->meshOutputPerPrimitiveGranularity);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMultiDrawFeaturesEXT* features) {
  return

      visitor->Visit("multiDraw", &features->multiDraw);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMultiDrawPropertiesEXT* properties) {
  return

      visitor->Visit("maxMultiDrawCount", &properties->maxMultiDrawCount);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT* features) {
  return

      visitor->Visit("multisampledRenderToSingleSampled",
                     &features->multisampledRenderToSingleSampled);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMultiviewFeatures* features) {
  return

      visitor->Visit("multiview", &features->multiview) &&
      visitor->Visit("multiviewGeometryShader",
                     &features->multiviewGeometryShader) &&
      visitor->Visit("multiviewTessellationShader",
                     &features->multiviewTessellationShader);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* properties) {
  return

      visitor->Visit("perViewPositionAllComponents",
                     &properties->perViewPositionAllComponents);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM* features) {
  return

      visitor->Visit("multiviewPerViewRenderAreas",
                     &features->multiviewPerViewRenderAreas);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM* features) {
  return

      visitor->Visit("multiviewPerViewViewports",
                     &features->multiviewPerViewViewports);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMultiviewProperties* properties) {
  return

      visitor->Visit("maxMultiviewViewCount",
                     &properties->maxMultiviewViewCount) &&
      visitor->Visit("maxMultiviewInstanceIndex",
                     &properties->maxMultiviewInstanceIndex);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT* features) {
  return

      visitor->Visit("mutableDescriptorType", &features->mutableDescriptorType);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceNestedCommandBufferFeaturesEXT* features) {
  return

      visitor->Visit("nestedCommandBuffer", &features->nestedCommandBuffer) &&
      visitor->Visit("nestedCommandBufferRendering",
                     &features->nestedCommandBufferRendering) &&
      visitor->Visit("nestedCommandBufferSimultaneousUse",
                     &features->nestedCommandBufferSimultaneousUse);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceNestedCommandBufferPropertiesEXT* properties) {
  return

      visitor->Visit("maxCommandBufferNestingLevel",
                     &properties->maxCommandBufferNestingLevel);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT* features) {
  return

      visitor->Visit("nonSeamlessCubeMap", &features->nonSeamlessCubeMap);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceOpacityMicromapFeaturesEXT* features) {
  return

      visitor->Visit("micromap", &features->micromap) &&
      visitor->Visit("micromapCaptureReplay",
                     &features->micromapCaptureReplay) &&
      visitor->Visit("micromapHostCommands", &features->micromapHostCommands);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceOpacityMicromapPropertiesEXT* properties) {
  return

      visitor->Visit("maxOpacity2StateSubdivisionLevel",
                     &properties->maxOpacity2StateSubdivisionLevel) &&
      visitor->Visit("maxOpacity4StateSubdivisionLevel",
                     &properties->maxOpacity4StateSubdivisionLevel);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceOpticalFlowFeaturesNV* features) {
  return

      visitor->Visit("opticalFlow", &features->opticalFlow);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceOpticalFlowPropertiesNV* properties) {
  return

      visitor->Visit("supportedOutputGridSizes",
                     &properties->supportedOutputGridSizes) &&
      visitor->Visit("supportedHintGridSizes",
                     &properties->supportedHintGridSizes) &&
      visitor->Visit("hintSupported", &properties->hintSupported) &&
      visitor->Visit("costSupported", &properties->costSupported) &&
      visitor->Visit("bidirectionalFlowSupported",
                     &properties->bidirectionalFlowSupported) &&
      visitor->Visit("globalFlowSupported", &properties->globalFlowSupported) &&
      visitor->Visit("minWidth", &properties->minWidth) &&
      visitor->Visit("minHeight", &properties->minHeight) &&
      visitor->Visit("maxWidth", &properties->maxWidth) &&
      visitor->Visit("maxHeight", &properties->maxHeight) &&
      visitor->Visit("maxNumRegionsOfInterest",
                     &properties->maxNumRegionsOfInterest);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePCIBusInfoPropertiesEXT* properties) {
  return

      visitor->Visit("pciDomain", &properties->pciDomain) &&
      visitor->Visit("pciBus", &properties->pciBus) &&
      visitor->Visit("pciDevice", &properties->pciDevice) &&
      visitor->Visit("pciFunction", &properties->pciFunction);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* features) {
  return

      visitor->Visit("pageableDeviceLocalMemory",
                     &features->pageableDeviceLocalMemory);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV* features) {
  return

      visitor->Visit("partitionedAccelerationStructure",
                     &features->partitionedAccelerationStructure);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV* properties) {
  return

      visitor->Visit("maxPartitionCount", &properties->maxPartitionCount);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePerStageDescriptorSetFeaturesNV* features) {
  return

      visitor->Visit("perStageDescriptorSet",
                     &features->perStageDescriptorSet) &&
      visitor->Visit("dynamicPipelineLayout", &features->dynamicPipelineLayout);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePerformanceQueryFeaturesKHR* features) {
  return

      visitor->Visit("performanceCounterQueryPools",
                     &features->performanceCounterQueryPools) &&
      visitor->Visit("performanceCounterMultipleQueryPools",
                     &features->performanceCounterMultipleQueryPools);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePerformanceQueryPropertiesKHR* properties) {
  return

      visitor->Visit("allowCommandBufferQueryCopies",
                     &properties->allowCommandBufferQueryCopies);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePipelineBinaryFeaturesKHR* features) {
  return

      visitor->Visit("pipelineBinaries", &features->pipelineBinaries);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePipelineBinaryPropertiesKHR* properties) {
  return

      visitor->Visit("pipelineBinaryInternalCache",
                     &properties->pipelineBinaryInternalCache) &&
      visitor->Visit("pipelineBinaryInternalCacheControl",
                     &properties->pipelineBinaryInternalCacheControl) &&
      visitor->Visit("pipelineBinaryPrefersInternalCache",
                     &properties->pipelineBinaryPrefersInternalCache) &&
      visitor->Visit("pipelineBinaryPrecompiledInternalCache",
                     &properties->pipelineBinaryPrecompiledInternalCache) &&
      visitor->Visit("pipelineBinaryCompressedData",
                     &properties->pipelineBinaryCompressedData);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePipelineCreationCacheControlFeatures* features) {
  return

      visitor->Visit("pipelineCreationCacheControl",
                     &features->pipelineCreationCacheControl);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* properties) {
  return

      visitor->Visit("pipelineExecutableInfo",
                     &properties->pipelineExecutableInfo);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT* features) {
  return

      visitor->Visit("pipelineLibraryGroupHandles",
                     &features->pipelineLibraryGroupHandles);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePipelineOpacityMicromapFeaturesARM* features) {
  return

      visitor->Visit("pipelineOpacityMicromap",
                     &features->pipelineOpacityMicromap);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePipelinePropertiesFeaturesEXT* properties) {
  return

      visitor->Visit("pipelinePropertiesIdentifier",
                     &properties->pipelinePropertiesIdentifier);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePipelineProtectedAccessFeatures* features) {
  return

      visitor->Visit("pipelineProtectedAccess",
                     &features->pipelineProtectedAccess);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePipelineRobustnessFeatures* features) {
  return

      visitor->Visit("pipelineRobustness", &features->pipelineRobustness);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePipelineRobustnessProperties* properties) {
  return

      visitor->Visit("defaultRobustnessStorageBuffers",
                     &properties->defaultRobustnessStorageBuffers) &&
      visitor->Visit("defaultRobustnessUniformBuffers",
                     &properties->defaultRobustnessUniformBuffers) &&
      visitor->Visit("defaultRobustnessVertexInputs",
                     &properties->defaultRobustnessVertexInputs) &&
      visitor->Visit("defaultRobustnessImages",
                     &properties->defaultRobustnessImages);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePointClippingProperties* properties) {
  return

      visitor->Visit("pointClippingBehavior",
                     &properties->pointClippingBehavior);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePresentBarrierFeaturesNV* features) {
  return

      visitor->Visit("presentBarrier", &features->presentBarrier);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePresentId2FeaturesKHR* features) {
  return

      visitor->Visit("presentId2", &features->presentId2);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePresentIdFeaturesKHR* features) {
  return

      visitor->Visit("presentId", &features->presentId);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT* features) {
  return

      visitor->Visit("presentModeFifoLatestReady",
                     &features->presentModeFifoLatestReady);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePresentWait2FeaturesKHR* features) {
  return

      visitor->Visit("presentWait2", &features->presentWait2);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePresentWaitFeaturesKHR* features) {
  return

      visitor->Visit("presentWait", &features->presentWait);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* features) {
  return

      visitor->Visit("primitiveTopologyListRestart",
                     &features->primitiveTopologyListRestart) &&
      visitor->Visit("primitiveTopologyPatchListRestart",
                     &features->primitiveTopologyPatchListRestart);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* features) {
  return

      visitor->Visit("primitivesGeneratedQuery",
                     &features->primitivesGeneratedQuery) &&
      visitor->Visit(
          "primitivesGeneratedQueryWithRasterizerDiscard",
          &features->primitivesGeneratedQueryWithRasterizerDiscard) &&
      visitor->Visit("primitivesGeneratedQueryWithNonZeroStreams",
                     &features->primitivesGeneratedQueryWithNonZeroStreams);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePrivateDataFeatures* features) {
  return

      visitor->Visit("privateData", &features->privateData);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceProtectedMemoryFeatures* features) {
  return

      visitor->Visit("protectedMemory", &features->protectedMemory);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceProtectedMemoryProperties* properties) {
  return

      visitor->Visit("protectedNoFault", &properties->protectedNoFault);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceProvokingVertexFeaturesEXT* features) {
  return

      visitor->Visit("provokingVertexLast", &features->provokingVertexLast) &&
      visitor->Visit("transformFeedbackPreservesProvokingVertex",
                     &features->transformFeedbackPreservesProvokingVertex);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceProvokingVertexPropertiesEXT* properties) {
  return

      visitor->Visit("provokingVertexModePerPipeline",
                     &properties->provokingVertexModePerPipeline) &&
      visitor->Visit(
          "transformFeedbackPreservesTriangleFanProvokingVertex",
          &properties->transformFeedbackPreservesTriangleFanProvokingVertex);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDevicePushDescriptorProperties* properties) {
  return

      visitor->Visit("maxPushDescriptors", &properties->maxPushDescriptors);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* features) {
  return

      visitor->Visit("formatRgba10x6WithoutYCbCrSampler",
                     &features->formatRgba10x6WithoutYCbCrSampler);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT* features) {
  return

      visitor->Visit("rasterizationOrderColorAttachmentAccess",
                     &features->rasterizationOrderColorAttachmentAccess) &&
      visitor->Visit("rasterizationOrderDepthAttachmentAccess",
                     &features->rasterizationOrderDepthAttachmentAccess) &&
      visitor->Visit("rasterizationOrderStencilAttachmentAccess",
                     &features->rasterizationOrderStencilAttachmentAccess);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRawAccessChainsFeaturesNV* features) {
  return

      visitor->Visit("shaderRawAccessChains", &features->shaderRawAccessChains);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRayQueryFeaturesKHR* features) {
  return

      visitor->Visit("rayQuery", &features->rayQuery);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV* features) {
  return

      visitor->Visit("rayTracingInvocationReorder",
                     &features->rayTracingInvocationReorder);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV* properties) {
  return

      visitor->Visit("rayTracingInvocationReorderReorderingHint",
                     &properties->rayTracingInvocationReorderReorderingHint);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV* features) {
  return

      visitor->Visit("spheres", &features->spheres) &&
      visitor->Visit("linearSweptSpheres", &features->linearSweptSpheres);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR* features) {
  return

      visitor->Visit("rayTracingMaintenance1",
                     &features->rayTracingMaintenance1) &&
      visitor->Visit("rayTracingPipelineTraceRaysIndirect2",
                     &features->rayTracingPipelineTraceRaysIndirect2);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* features) {
  return

      visitor->Visit("rayTracingMotionBlur", &features->rayTracingMotionBlur) &&
      visitor->Visit("rayTracingMotionBlurPipelineTraceRaysIndirect",
                     &features->rayTracingMotionBlurPipelineTraceRaysIndirect);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* features) {
  return

      visitor->Visit("rayTracingPipeline", &features->rayTracingPipeline) &&
      visitor->Visit(
          "rayTracingPipelineShaderGroupHandleCaptureReplay",
          &features->rayTracingPipelineShaderGroupHandleCaptureReplay) &&
      visitor->Visit(
          "rayTracingPipelineShaderGroupHandleCaptureReplayMixed",
          &features->rayTracingPipelineShaderGroupHandleCaptureReplayMixed) &&
      visitor->Visit("rayTracingPipelineTraceRaysIndirect",
                     &features->rayTracingPipelineTraceRaysIndirect) &&
      visitor->Visit("rayTraversalPrimitiveCulling",
                     &features->rayTraversalPrimitiveCulling);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* properties) {
  return

      visitor->Visit("shaderGroupHandleSize",
                     &properties->shaderGroupHandleSize) &&
      visitor->Visit("maxRayRecursionDepth",
                     &properties->maxRayRecursionDepth) &&
      visitor->Visit("maxShaderGroupStride",
                     &properties->maxShaderGroupStride) &&
      visitor->Visit("shaderGroupBaseAlignment",
                     &properties->shaderGroupBaseAlignment) &&
      visitor->Visit("shaderGroupHandleCaptureReplaySize",
                     &properties->shaderGroupHandleCaptureReplaySize) &&
      visitor->Visit("maxRayDispatchInvocationCount",
                     &properties->maxRayDispatchInvocationCount) &&
      visitor->Visit("shaderGroupHandleAlignment",
                     &properties->shaderGroupHandleAlignment) &&
      visitor->Visit("maxRayHitAttributeSize",
                     &properties->maxRayHitAttributeSize);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR* features) {
  return

      visitor->Visit("rayTracingPositionFetch",
                     &features->rayTracingPositionFetch);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRayTracingPropertiesNV* properties) {
  return

      visitor->Visit("shaderGroupHandleSize",
                     &properties->shaderGroupHandleSize) &&
      visitor->Visit("maxRecursionDepth", &properties->maxRecursionDepth) &&
      visitor->Visit("maxShaderGroupStride",
                     &properties->maxShaderGroupStride) &&
      visitor->Visit("shaderGroupBaseAlignment",
                     &properties->shaderGroupBaseAlignment) &&
      visitor->Visit("maxGeometryCount", &properties->maxGeometryCount) &&
      visitor->Visit("maxInstanceCount", &properties->maxInstanceCount) &&
      visitor->Visit("maxTriangleCount", &properties->maxTriangleCount) &&
      visitor->Visit("maxDescriptorSetAccelerationStructures",
                     &properties->maxDescriptorSetAccelerationStructures);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRayTracingValidationFeaturesNV* features) {
  return

      visitor->Visit("rayTracingValidation", &features->rayTracingValidation);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG* features) {
  return

      visitor->Visit("relaxedLineRasterization",
                     &features->relaxedLineRasterization);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRenderPassStripedFeaturesARM* features) {
  return

      visitor->Visit("renderPassStriped", &features->renderPassStriped);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRenderPassStripedPropertiesARM* properties) {
  return

      visitor->Visit("renderPassStripeGranularity",
                     &properties->renderPassStripeGranularity) &&
      visitor->Visit("maxRenderPassStripes", &properties->maxRenderPassStripes);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* features) {
  return

      visitor->Visit("representativeFragmentTest",
                     &features->representativeFragmentTest);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRobustness2FeaturesKHR* features) {
  return

      visitor->Visit("robustBufferAccess2", &features->robustBufferAccess2) &&
      visitor->Visit("robustImageAccess2", &features->robustImageAccess2) &&
      visitor->Visit("nullDescriptor", &features->nullDescriptor);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceRobustness2PropertiesKHR* properties) {
  return

      visitor->Visit("robustStorageBufferAccessSizeAlignment",
                     &properties->robustStorageBufferAccessSizeAlignment) &&
      visitor->Visit("robustUniformBufferAccessSizeAlignment",
                     &properties->robustUniformBufferAccessSizeAlignment);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSampleLocationsPropertiesEXT* properties) {
  return

      visitor->Visit("sampleLocationSampleCounts",
                     &properties->sampleLocationSampleCounts) &&
      visitor->Visit("maxSampleLocationGridSize",
                     &properties->maxSampleLocationGridSize) &&
      visitor->Visit("sampleLocationCoordinateRange",
                     &properties->sampleLocationCoordinateRange) &&
      visitor->Visit("sampleLocationSubPixelBits",
                     &properties->sampleLocationSubPixelBits) &&
      visitor->Visit("variableSampleLocations",
                     &properties->variableSampleLocations);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSamplerFilterMinmaxProperties* properties) {
  return

      visitor->Visit("filterMinmaxSingleComponentFormats",
                     &properties->filterMinmaxSingleComponentFormats) &&
      visitor->Visit("filterMinmaxImageComponentMapping",
                     &properties->filterMinmaxImageComponentMapping);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSamplerYcbcrConversionFeatures* features) {
  return

      visitor->Visit("samplerYcbcrConversion",
                     &features->samplerYcbcrConversion);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceScalarBlockLayoutFeatures* features) {
  return

      visitor->Visit("scalarBlockLayout", &features->scalarBlockLayout);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSchedulingControlsFeaturesARM* features) {
  return

      visitor->Visit("schedulingControls", &features->schedulingControls);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceSchedulingControlsPropertiesARM* properties) {
  return

      visitor->Visit("schedulingControlsFlags",
                     &properties->schedulingControlsFlags);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* features) {
  return

      visitor->Visit("separateDepthStencilLayouts",
                     &features->separateDepthStencilLayouts);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV* features) {
  return

      visitor->Visit("shaderFloat16VectorAtomics",
                     &features->shaderFloat16VectorAtomics);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* features) {
  return

      visitor->Visit("shaderBufferFloat16Atomics",
                     &features->shaderBufferFloat16Atomics) &&
      visitor->Visit("shaderBufferFloat16AtomicAdd",
                     &features->shaderBufferFloat16AtomicAdd) &&
      visitor->Visit("shaderBufferFloat16AtomicMinMax",
                     &features->shaderBufferFloat16AtomicMinMax) &&
      visitor->Visit("shaderBufferFloat32AtomicMinMax",
                     &features->shaderBufferFloat32AtomicMinMax) &&
      visitor->Visit("shaderBufferFloat64AtomicMinMax",
                     &features->shaderBufferFloat64AtomicMinMax) &&
      visitor->Visit("shaderSharedFloat16Atomics",
                     &features->shaderSharedFloat16Atomics) &&
      visitor->Visit("shaderSharedFloat16AtomicAdd",
                     &features->shaderSharedFloat16AtomicAdd) &&
      visitor->Visit("shaderSharedFloat16AtomicMinMax",
                     &features->shaderSharedFloat16AtomicMinMax) &&
      visitor->Visit("shaderSharedFloat32AtomicMinMax",
                     &features->shaderSharedFloat32AtomicMinMax) &&
      visitor->Visit("shaderSharedFloat64AtomicMinMax",
                     &features->shaderSharedFloat64AtomicMinMax) &&
      visitor->Visit("shaderImageFloat32AtomicMinMax",
                     &features->shaderImageFloat32AtomicMinMax) &&
      visitor->Visit("sparseImageFloat32AtomicMinMax",
                     &features->sparseImageFloat32AtomicMinMax);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* features) {
  return

      visitor->Visit("shaderBufferFloat32Atomics",
                     &features->shaderBufferFloat32Atomics) &&
      visitor->Visit("shaderBufferFloat32AtomicAdd",
                     &features->shaderBufferFloat32AtomicAdd) &&
      visitor->Visit("shaderBufferFloat64Atomics",
                     &features->shaderBufferFloat64Atomics) &&
      visitor->Visit("shaderBufferFloat64AtomicAdd",
                     &features->shaderBufferFloat64AtomicAdd) &&
      visitor->Visit("shaderSharedFloat32Atomics",
                     &features->shaderSharedFloat32Atomics) &&
      visitor->Visit("shaderSharedFloat32AtomicAdd",
                     &features->shaderSharedFloat32AtomicAdd) &&
      visitor->Visit("shaderSharedFloat64Atomics",
                     &features->shaderSharedFloat64Atomics) &&
      visitor->Visit("shaderSharedFloat64AtomicAdd",
                     &features->shaderSharedFloat64AtomicAdd) &&
      visitor->Visit("shaderImageFloat32Atomics",
                     &features->shaderImageFloat32Atomics) &&
      visitor->Visit("shaderImageFloat32AtomicAdd",
                     &features->shaderImageFloat32AtomicAdd) &&
      visitor->Visit("sparseImageFloat32Atomics",
                     &features->sparseImageFloat32Atomics) &&
      visitor->Visit("sparseImageFloat32AtomicAdd",
                     &features->sparseImageFloat32AtomicAdd);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderAtomicInt64Features* features) {
  return

      visitor->Visit("shaderBufferInt64Atomics",
                     &features->shaderBufferInt64Atomics) &&
      visitor->Visit("shaderSharedInt64Atomics",
                     &features->shaderSharedInt64Atomics);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderBfloat16FeaturesKHR* features) {
  return

      visitor->Visit("shaderBFloat16Type", &features->shaderBFloat16Type) &&
      visitor->Visit("shaderBFloat16DotProduct",
                     &features->shaderBFloat16DotProduct) &&
      visitor->Visit("shaderBFloat16CooperativeMatrix",
                     &features->shaderBFloat16CooperativeMatrix);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderClockFeaturesKHR* features) {
  return

      visitor->Visit("shaderSubgroupClock", &features->shaderSubgroupClock) &&
      visitor->Visit("shaderDeviceClock", &features->shaderDeviceClock);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM* features) {
  return

      visitor->Visit("shaderCoreBuiltins", &features->shaderCoreBuiltins);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM* properties) {
  return

      visitor->Visit("shaderCoreMask", &properties->shaderCoreMask) &&
      visitor->Visit("shaderCoreCount", &properties->shaderCoreCount) &&
      visitor->Visit("shaderWarpsPerCore", &properties->shaderWarpsPerCore);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderCoreProperties2AMD* properties) {
  return

      visitor->Visit("shaderCoreFeatures", &properties->shaderCoreFeatures) &&
      visitor->Visit("activeComputeUnitCount",
                     &properties->activeComputeUnitCount);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderCorePropertiesAMD* properties) {
  return

      visitor->Visit("shaderEngineCount", &properties->shaderEngineCount) &&
      visitor->Visit("shaderArraysPerEngineCount",
                     &properties->shaderArraysPerEngineCount) &&
      visitor->Visit("computeUnitsPerShaderArray",
                     &properties->computeUnitsPerShaderArray) &&
      visitor->Visit("simdPerComputeUnit", &properties->simdPerComputeUnit) &&
      visitor->Visit("wavefrontsPerSimd", &properties->wavefrontsPerSimd) &&
      visitor->Visit("wavefrontSize", &properties->wavefrontSize) &&
      visitor->Visit("sgprsPerSimd", &properties->sgprsPerSimd) &&
      visitor->Visit("minSgprAllocation", &properties->minSgprAllocation) &&
      visitor->Visit("maxSgprAllocation", &properties->maxSgprAllocation) &&
      visitor->Visit("sgprAllocationGranularity",
                     &properties->sgprAllocationGranularity) &&
      visitor->Visit("vgprsPerSimd", &properties->vgprsPerSimd) &&
      visitor->Visit("minVgprAllocation", &properties->minVgprAllocation) &&
      visitor->Visit("maxVgprAllocation", &properties->maxVgprAllocation) &&
      visitor->Visit("vgprAllocationGranularity",
                     &properties->vgprAllocationGranularity);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderCorePropertiesARM* properties) {
  return

      visitor->Visit("pixelRate", &properties->pixelRate) &&
      visitor->Visit("texelRate", &properties->texelRate) &&
      visitor->Visit("fmaRate", &properties->fmaRate);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures* features) {
  return

      visitor->Visit("shaderDemoteToHelperInvocation",
                     &features->shaderDemoteToHelperInvocation);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderDrawParametersFeatures* features) {
  return

      visitor->Visit("shaderDrawParameters", &features->shaderDrawParameters);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD* features) {
  return

      visitor->Visit("shaderEarlyAndLateFragmentTests",
                     &features->shaderEarlyAndLateFragmentTests);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderExpectAssumeFeatures* features) {
  return

      visitor->Visit("shaderExpectAssume", &features->shaderExpectAssume);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderFloat8FeaturesEXT* features) {
  return

      visitor->Visit("shaderFloat8", &features->shaderFloat8) &&
      visitor->Visit("shaderFloat8CooperativeMatrix",
                     &features->shaderFloat8CooperativeMatrix);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderFloatControls2Features* features) {
  return

      visitor->Visit("shaderFloatControls2", &features->shaderFloatControls2);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* features) {
  return

      visitor->Visit("shaderImageInt64Atomics",
                     &features->shaderImageInt64Atomics) &&
      visitor->Visit("sparseImageInt64Atomics",
                     &features->sparseImageInt64Atomics);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderImageFootprintFeaturesNV* features) {
  return

      visitor->Visit("imageFootprint", &features->imageFootprint);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderIntegerDotProductFeatures* features) {
  return

      visitor->Visit("shaderIntegerDotProduct",
                     &features->shaderIntegerDotProduct);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderIntegerDotProductProperties* properties) {
  return

      visitor->Visit("integerDotProduct8BitUnsignedAccelerated",
                     &properties->integerDotProduct8BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct8BitSignedAccelerated",
                     &properties->integerDotProduct8BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct8BitMixedSignednessAccelerated",
          &properties->integerDotProduct8BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProduct4x8BitPackedUnsignedAccelerated",
          &properties->integerDotProduct4x8BitPackedUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct4x8BitPackedSignedAccelerated",
          &properties->integerDotProduct4x8BitPackedSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct4x8BitPackedMixedSignednessAccelerated",
          &properties
               ->integerDotProduct4x8BitPackedMixedSignednessAccelerated) &&
      visitor->Visit("integerDotProduct16BitUnsignedAccelerated",
                     &properties->integerDotProduct16BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct16BitSignedAccelerated",
                     &properties->integerDotProduct16BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct16BitMixedSignednessAccelerated",
          &properties->integerDotProduct16BitMixedSignednessAccelerated) &&
      visitor->Visit("integerDotProduct32BitUnsignedAccelerated",
                     &properties->integerDotProduct32BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct32BitSignedAccelerated",
                     &properties->integerDotProduct32BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct32BitMixedSignednessAccelerated",
          &properties->integerDotProduct32BitMixedSignednessAccelerated) &&
      visitor->Visit("integerDotProduct64BitUnsignedAccelerated",
                     &properties->integerDotProduct64BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct64BitSignedAccelerated",
                     &properties->integerDotProduct64BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct64BitMixedSignednessAccelerated",
          &properties->integerDotProduct64BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating8BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating8BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating8BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerate"
          "d",
          &properties
               ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerate"
          "d",
          &properties
               ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAc"
          "celerated",
          &properties
               ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating16BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating16BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating16BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating32BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating32BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating32BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating64BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating64BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating64BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* features) {
  return

      visitor->Visit("shaderIntegerFunctions2",
                     &features->shaderIntegerFunctions2);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR* features) {
  return

      visitor->Visit("shaderMaximalReconvergence",
                     &features->shaderMaximalReconvergence);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT* features) {
  return

      visitor->Visit("shaderModuleIdentifier",
                     &features->shaderModuleIdentifier);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT* properties) {
  return

      visitor->Visit("shaderModuleIdentifierAlgorithmUUID",
                     &properties->shaderModuleIdentifierAlgorithmUUID);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderObjectFeaturesEXT* features) {
  return

      visitor->Visit("shaderObject", &features->shaderObject);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderObjectPropertiesEXT* properties) {
  return

      visitor->Visit("shaderBinaryUUID", &properties->shaderBinaryUUID) &&
      visitor->Visit("shaderBinaryVersion", &properties->shaderBinaryVersion);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderQuadControlFeaturesKHR* features) {
  return

      visitor->Visit("shaderQuadControl", &features->shaderQuadControl);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR* features) {
  return

      visitor->Visit("shaderRelaxedExtendedInstruction",
                     &features->shaderRelaxedExtendedInstruction);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT* features) {
  return

      visitor->Visit("shaderReplicatedComposites",
                     &features->shaderReplicatedComposites);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* features) {
  return

      visitor->Visit("shaderSMBuiltins", &features->shaderSMBuiltins);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* properties) {
  return

      visitor->Visit("shaderSMCount", &properties->shaderSMCount) &&
      visitor->Visit("shaderWarpsPerSM", &properties->shaderWarpsPerSM);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* features) {
  return

      visitor->Visit("shaderSubgroupExtendedTypes",
                     &features->shaderSubgroupExtendedTypes);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderSubgroupRotateFeatures* features) {
  return

      visitor->Visit("shaderSubgroupRotate", &features->shaderSubgroupRotate) &&
      visitor->Visit("shaderSubgroupRotateClustered",
                     &features->shaderSubgroupRotateClustered);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* features) {
  return

      visitor->Visit("shaderSubgroupUniformControlFlow",
                     &features->shaderSubgroupUniformControlFlow);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceShaderTerminateInvocationFeatures* features) {
  return

      visitor->Visit("shaderTerminateInvocation",
                     &features->shaderTerminateInvocation);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderTileImageFeaturesEXT* features) {
  return

      visitor->Visit("shaderTileImageColorReadAccess",
                     &features->shaderTileImageColorReadAccess) &&
      visitor->Visit("shaderTileImageDepthReadAccess",
                     &features->shaderTileImageDepthReadAccess) &&
      visitor->Visit("shaderTileImageStencilReadAccess",
                     &features->shaderTileImageStencilReadAccess);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShaderTileImagePropertiesEXT* properties) {
  return

      visitor->Visit("shaderTileImageCoherentReadAccelerated",
                     &properties->shaderTileImageCoherentReadAccelerated) &&
      visitor->Visit(
          "shaderTileImageReadSampleFromPixelRateInvocation",
          &properties->shaderTileImageReadSampleFromPixelRateInvocation) &&
      visitor->Visit("shaderTileImageReadFromHelperInvocation",
                     &properties->shaderTileImageReadFromHelperInvocation);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShadingRateImageFeaturesNV* features) {
  return

      visitor->Visit("shadingRateImage", &features->shadingRateImage) &&
      visitor->Visit("shadingRateCoarseSampleOrder",
                     &features->shadingRateCoarseSampleOrder);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceShadingRateImagePropertiesNV* properties) {
  return

      visitor->Visit("shadingRateTexelSize",
                     &properties->shadingRateTexelSize) &&
      visitor->Visit("shadingRatePaletteSize",
                     &properties->shadingRatePaletteSize) &&
      visitor->Visit("shadingRateMaxCoarseSamples",
                     &properties->shadingRateMaxCoarseSamples);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSubgroupProperties* properties) {
  return

      visitor->Visit("subgroupSize", &properties->subgroupSize) &&
      visitor->Visit("supportedStages", &properties->supportedStages) &&
      visitor->Visit("supportedOperations", &properties->supportedOperations) &&
      visitor->Visit("quadOperationsInAllStages",
                     &properties->quadOperationsInAllStages);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSubgroupSizeControlFeatures* features) {
  return

      visitor->Visit("subgroupSizeControl", &features->subgroupSizeControl) &&
      visitor->Visit("computeFullSubgroups", &features->computeFullSubgroups);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSubgroupSizeControlProperties* properties) {
  return

      visitor->Visit("minSubgroupSize", &properties->minSubgroupSize) &&
      visitor->Visit("maxSubgroupSize", &properties->maxSubgroupSize) &&
      visitor->Visit("maxComputeWorkgroupSubgroups",
                     &properties->maxComputeWorkgroupSubgroups) &&
      visitor->Visit("requiredSubgroupSizeStages",
                     &properties->requiredSubgroupSizeStages);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT* features) {
  return

      visitor->Visit("subpassMergeFeedback", &features->subpassMergeFeedback);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* features) {
  return

      visitor->Visit("subpassShading", &features->subpassShading);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* properties) {
  return

      visitor->Visit("maxSubpassShadingWorkgroupSizeAspectRatio",
                     &properties->maxSubpassShadingWorkgroupSizeAspectRatio);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* features) {
  return

      visitor->Visit("swapchainMaintenance1", &features->swapchainMaintenance1);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSynchronization2Features* features) {
  return

      visitor->Visit("synchronization2", &features->synchronization2);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTensorFeaturesARM* features) {
  return

      visitor->Visit("tensorNonPacked", &features->tensorNonPacked) &&
      visitor->Visit("shaderTensorAccess", &features->shaderTensorAccess) &&
      visitor->Visit("shaderStorageTensorArrayDynamicIndexing",
                     &features->shaderStorageTensorArrayDynamicIndexing) &&
      visitor->Visit("shaderStorageTensorArrayNonUniformIndexing",
                     &features->shaderStorageTensorArrayNonUniformIndexing) &&
      visitor->Visit(
          "descriptorBindingStorageTensorUpdateAfterBind",
          &features->descriptorBindingStorageTensorUpdateAfterBind) &&
      visitor->Visit("tensors", &features->tensors);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTensorPropertiesARM* properties) {
  return

      visitor->Visit("maxTensorDimensionCount",
                     &properties->maxTensorDimensionCount) &&
      visitor->Visit("maxTensorElements", &properties->maxTensorElements) &&
      visitor->Visit("maxPerDimensionTensorElements",
                     &properties->maxPerDimensionTensorElements) &&
      visitor->Visit("maxTensorStride", &properties->maxTensorStride) &&
      visitor->Visit("maxTensorSize", &properties->maxTensorSize) &&
      visitor->Visit("maxTensorShaderAccessArrayLength",
                     &properties->maxTensorShaderAccessArrayLength) &&
      visitor->Visit("maxTensorShaderAccessSize",
                     &properties->maxTensorShaderAccessSize) &&
      visitor->Visit("maxDescriptorSetStorageTensors",
                     &properties->maxDescriptorSetStorageTensors) &&
      visitor->Visit("maxPerStageDescriptorSetStorageTensors",
                     &properties->maxPerStageDescriptorSetStorageTensors) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageTensors",
          &properties->maxDescriptorSetUpdateAfterBindStorageTensors) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindStorageTensors",
          &properties->maxPerStageDescriptorUpdateAfterBindStorageTensors) &&
      visitor->Visit(
          "shaderStorageTensorArrayNonUniformIndexingNative",
          &properties->shaderStorageTensorArrayNonUniformIndexingNative) &&
      visitor->Visit("shaderTensorSupportedStages",
                     &properties->shaderTensorSupportedStages);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* features) {
  return

      visitor->Visit("texelBufferAlignment", &features->texelBufferAlignment);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceTexelBufferAlignmentProperties* properties) {
  return

      visitor->Visit("storageTexelBufferOffsetAlignmentBytes",
                     &properties->storageTexelBufferOffsetAlignmentBytes) &&
      visitor->Visit(
          "storageTexelBufferOffsetSingleTexelAlignment",
          &properties->storageTexelBufferOffsetSingleTexelAlignment) &&
      visitor->Visit("uniformTexelBufferOffsetAlignmentBytes",
                     &properties->uniformTexelBufferOffsetAlignmentBytes) &&
      visitor->Visit("uniformTexelBufferOffsetSingleTexelAlignment",
                     &properties->uniformTexelBufferOffsetSingleTexelAlignment);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceTextureCompressionASTCHDRFeatures* features) {
  return

      visitor->Visit("textureCompressionASTC_HDR",
                     &features->textureCompressionASTC_HDR);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTileMemoryHeapFeaturesQCOM* features) {
  return

      visitor->Visit("tileMemoryHeap", &features->tileMemoryHeap);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTileMemoryHeapPropertiesQCOM* properties) {
  return

      visitor->Visit("queueSubmitBoundary", &properties->queueSubmitBoundary) &&
      visitor->Visit("tileBufferTransfers", &properties->tileBufferTransfers);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTilePropertiesFeaturesQCOM* properties) {
  return

      visitor->Visit("tileProperties", &properties->tileProperties);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTileShadingFeaturesQCOM* features) {
  return

      visitor->Visit("tileShading", &features->tileShading) &&
      visitor->Visit("tileShadingFragmentStage",
                     &features->tileShadingFragmentStage) &&
      visitor->Visit("tileShadingColorAttachments",
                     &features->tileShadingColorAttachments) &&
      visitor->Visit("tileShadingDepthAttachments",
                     &features->tileShadingDepthAttachments) &&
      visitor->Visit("tileShadingStencilAttachments",
                     &features->tileShadingStencilAttachments) &&
      visitor->Visit("tileShadingInputAttachments",
                     &features->tileShadingInputAttachments) &&
      visitor->Visit("tileShadingSampledAttachments",
                     &features->tileShadingSampledAttachments) &&
      visitor->Visit("tileShadingPerTileDraw",
                     &features->tileShadingPerTileDraw) &&
      visitor->Visit("tileShadingPerTileDispatch",
                     &features->tileShadingPerTileDispatch) &&
      visitor->Visit("tileShadingDispatchTile",
                     &features->tileShadingDispatchTile) &&
      visitor->Visit("tileShadingApron", &features->tileShadingApron) &&
      visitor->Visit("tileShadingAnisotropicApron",
                     &features->tileShadingAnisotropicApron) &&
      visitor->Visit("tileShadingAtomicOps", &features->tileShadingAtomicOps) &&
      visitor->Visit("tileShadingImageProcessing",
                     &features->tileShadingImageProcessing);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTileShadingPropertiesQCOM* properties) {
  return

      visitor->Visit("maxApronSize", &properties->maxApronSize) &&
      visitor->Visit("preferNonCoherent", &properties->preferNonCoherent) &&
      visitor->Visit("tileGranularity", &properties->tileGranularity) &&
      visitor->Visit("maxTileShadingRate", &properties->maxTileShadingRate);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTimelineSemaphoreFeatures* features) {
  return

      visitor->Visit("timelineSemaphore", &features->timelineSemaphore);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTimelineSemaphoreProperties* properties) {
  return

      visitor->Visit("maxTimelineSemaphoreValueDifference",
                     &properties->maxTimelineSemaphoreValueDifference);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceTransformFeedbackFeaturesEXT* features) {
  return

      visitor->Visit("transformFeedback", &features->transformFeedback) &&
      visitor->Visit("geometryStreams", &features->geometryStreams);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceTransformFeedbackPropertiesEXT* properties) {
  return

      visitor->Visit("maxTransformFeedbackStreams",
                     &properties->maxTransformFeedbackStreams) &&
      visitor->Visit("maxTransformFeedbackBuffers",
                     &properties->maxTransformFeedbackBuffers) &&
      visitor->Visit("maxTransformFeedbackBufferSize",
                     &properties->maxTransformFeedbackBufferSize) &&
      visitor->Visit("maxTransformFeedbackStreamDataSize",
                     &properties->maxTransformFeedbackStreamDataSize) &&
      visitor->Visit("maxTransformFeedbackBufferDataSize",
                     &properties->maxTransformFeedbackBufferDataSize) &&
      visitor->Visit("maxTransformFeedbackBufferDataStride",
                     &properties->maxTransformFeedbackBufferDataStride) &&
      visitor->Visit("transformFeedbackQueries",
                     &properties->transformFeedbackQueries) &&
      visitor->Visit("transformFeedbackStreamsLinesTriangles",
                     &properties->transformFeedbackStreamsLinesTriangles) &&
      visitor->Visit("transformFeedbackRasterizationStreamSelect",
                     &properties->transformFeedbackRasterizationStreamSelect) &&
      visitor->Visit("transformFeedbackDraw",
                     &properties->transformFeedbackDraw);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR* features) {
  return

      visitor->Visit("unifiedImageLayouts", &features->unifiedImageLayouts) &&
      visitor->Visit("unifiedImageLayoutsVideo",
                     &features->unifiedImageLayoutsVideo);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* features) {
  return

      visitor->Visit("uniformBufferStandardLayout",
                     &features->uniformBufferStandardLayout);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVariablePointersFeatures* features) {
  return

      visitor->Visit("variablePointersStorageBuffer",
                     &features->variablePointersStorageBuffer) &&
      visitor->Visit("variablePointers", &features->variablePointers);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVertexAttributeDivisorFeatures* features) {
  return

      visitor->Visit("vertexAttributeInstanceRateDivisor",
                     &features->vertexAttributeInstanceRateDivisor) &&
      visitor->Visit("vertexAttributeInstanceRateZeroDivisor",
                     &features->vertexAttributeInstanceRateZeroDivisor);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceVertexAttributeDivisorProperties* properties) {
  return

      visitor->Visit("maxVertexAttribDivisor",
                     &properties->maxVertexAttribDivisor) &&
      visitor->Visit("supportsNonZeroFirstInstance",
                     &properties->supportsNonZeroFirstInstance);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* properties) {
  return

      visitor->Visit("maxVertexAttribDivisor",
                     &properties->maxVertexAttribDivisor);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT* features) {
  return

      visitor->Visit("vertexAttributeRobustness",
                     &features->vertexAttributeRobustness);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* features) {
  return

      visitor->Visit("vertexInputDynamicState",
                     &features->vertexInputDynamicState);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVideoDecodeVP9FeaturesKHR* features) {
  return

      visitor->Visit("videoDecodeVP9", &features->videoDecodeVP9);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVideoEncodeAV1FeaturesKHR* features) {
  return

      visitor->Visit("videoEncodeAV1", &features->videoEncodeAV1);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR* features) {
  return

      visitor->Visit("videoEncodeQuantizationMap",
                     &features->videoEncodeQuantizationMap);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVideoMaintenance1FeaturesKHR* features) {
  return

      visitor->Visit("videoMaintenance1", &features->videoMaintenance1);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVideoMaintenance2FeaturesKHR* features) {
  return

      visitor->Visit("videoMaintenance2", &features->videoMaintenance2);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan11Features* features) {
  return

      visitor->Visit("storageBuffer16BitAccess",
                     &features->storageBuffer16BitAccess) &&
      visitor->Visit("uniformAndStorageBuffer16BitAccess",
                     &features->uniformAndStorageBuffer16BitAccess) &&
      visitor->Visit("storagePushConstant16",
                     &features->storagePushConstant16) &&
      visitor->Visit("storageInputOutput16", &features->storageInputOutput16) &&
      visitor->Visit("multiview", &features->multiview) &&
      visitor->Visit("multiviewGeometryShader",
                     &features->multiviewGeometryShader) &&
      visitor->Visit("multiviewTessellationShader",
                     &features->multiviewTessellationShader) &&
      visitor->Visit("variablePointersStorageBuffer",
                     &features->variablePointersStorageBuffer) &&
      visitor->Visit("variablePointers", &features->variablePointers) &&
      visitor->Visit("protectedMemory", &features->protectedMemory) &&
      visitor->Visit("samplerYcbcrConversion",
                     &features->samplerYcbcrConversion) &&
      visitor->Visit("shaderDrawParameters", &features->shaderDrawParameters);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan11Properties* properties) {
  return

      visitor->Visit("deviceUUID", &properties->deviceUUID) &&
      visitor->Visit("driverUUID", &properties->driverUUID) &&
      visitor->Visit("deviceLUID", &properties->deviceLUID) &&
      visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
      visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid) &&
      visitor->Visit("subgroupSize", &properties->subgroupSize) &&
      visitor->Visit("subgroupSupportedStages",
                     &properties->subgroupSupportedStages) &&
      visitor->Visit("subgroupSupportedOperations",
                     &properties->subgroupSupportedOperations) &&
      visitor->Visit("subgroupQuadOperationsInAllStages",
                     &properties->subgroupQuadOperationsInAllStages) &&
      visitor->Visit("pointClippingBehavior",
                     &properties->pointClippingBehavior) &&
      visitor->Visit("maxMultiviewViewCount",
                     &properties->maxMultiviewViewCount) &&
      visitor->Visit("maxMultiviewInstanceIndex",
                     &properties->maxMultiviewInstanceIndex) &&
      visitor->Visit("protectedNoFault", &properties->protectedNoFault) &&
      visitor->Visit("maxPerSetDescriptors",
                     &properties->maxPerSetDescriptors) &&
      visitor->Visit("maxMemoryAllocationSize",
                     &properties->maxMemoryAllocationSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan12Features* features) {
  return

      visitor->Visit("samplerMirrorClampToEdge",
                     &features->samplerMirrorClampToEdge) &&
      visitor->Visit("drawIndirectCount", &features->drawIndirectCount) &&
      visitor->Visit("storageBuffer8BitAccess",
                     &features->storageBuffer8BitAccess) &&
      visitor->Visit("uniformAndStorageBuffer8BitAccess",
                     &features->uniformAndStorageBuffer8BitAccess) &&
      visitor->Visit("storagePushConstant8", &features->storagePushConstant8) &&
      visitor->Visit("shaderBufferInt64Atomics",
                     &features->shaderBufferInt64Atomics) &&
      visitor->Visit("shaderSharedInt64Atomics",
                     &features->shaderSharedInt64Atomics) &&
      visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
      visitor->Visit("shaderInt8", &features->shaderInt8) &&
      visitor->Visit("descriptorIndexing", &features->descriptorIndexing) &&
      visitor->Visit("shaderInputAttachmentArrayDynamicIndexing",
                     &features->shaderInputAttachmentArrayDynamicIndexing) &&
      visitor->Visit("shaderUniformTexelBufferArrayDynamicIndexing",
                     &features->shaderUniformTexelBufferArrayDynamicIndexing) &&
      visitor->Visit("shaderStorageTexelBufferArrayDynamicIndexing",
                     &features->shaderStorageTexelBufferArrayDynamicIndexing) &&
      visitor->Visit("shaderUniformBufferArrayNonUniformIndexing",
                     &features->shaderUniformBufferArrayNonUniformIndexing) &&
      visitor->Visit("shaderSampledImageArrayNonUniformIndexing",
                     &features->shaderSampledImageArrayNonUniformIndexing) &&
      visitor->Visit("shaderStorageBufferArrayNonUniformIndexing",
                     &features->shaderStorageBufferArrayNonUniformIndexing) &&
      visitor->Visit("shaderStorageImageArrayNonUniformIndexing",
                     &features->shaderStorageImageArrayNonUniformIndexing) &&
      visitor->Visit("shaderInputAttachmentArrayNonUniformIndexing",
                     &features->shaderInputAttachmentArrayNonUniformIndexing) &&
      visitor->Visit(
          "shaderUniformTexelBufferArrayNonUniformIndexing",
          &features->shaderUniformTexelBufferArrayNonUniformIndexing) &&
      visitor->Visit(
          "shaderStorageTexelBufferArrayNonUniformIndexing",
          &features->shaderStorageTexelBufferArrayNonUniformIndexing) &&
      visitor->Visit(
          "descriptorBindingUniformBufferUpdateAfterBind",
          &features->descriptorBindingUniformBufferUpdateAfterBind) &&
      visitor->Visit("descriptorBindingSampledImageUpdateAfterBind",
                     &features->descriptorBindingSampledImageUpdateAfterBind) &&
      visitor->Visit("descriptorBindingStorageImageUpdateAfterBind",
                     &features->descriptorBindingStorageImageUpdateAfterBind) &&
      visitor->Visit(
          "descriptorBindingStorageBufferUpdateAfterBind",
          &features->descriptorBindingStorageBufferUpdateAfterBind) &&
      visitor->Visit(
          "descriptorBindingUniformTexelBufferUpdateAfterBind",
          &features->descriptorBindingUniformTexelBufferUpdateAfterBind) &&
      visitor->Visit(
          "descriptorBindingStorageTexelBufferUpdateAfterBind",
          &features->descriptorBindingStorageTexelBufferUpdateAfterBind) &&
      visitor->Visit("descriptorBindingUpdateUnusedWhilePending",
                     &features->descriptorBindingUpdateUnusedWhilePending) &&
      visitor->Visit("descriptorBindingPartiallyBound",
                     &features->descriptorBindingPartiallyBound) &&
      visitor->Visit("descriptorBindingVariableDescriptorCount",
                     &features->descriptorBindingVariableDescriptorCount) &&
      visitor->Visit("runtimeDescriptorArray",
                     &features->runtimeDescriptorArray) &&
      visitor->Visit("samplerFilterMinmax", &features->samplerFilterMinmax) &&
      visitor->Visit("scalarBlockLayout", &features->scalarBlockLayout) &&
      visitor->Visit("imagelessFramebuffer", &features->imagelessFramebuffer) &&
      visitor->Visit("uniformBufferStandardLayout",
                     &features->uniformBufferStandardLayout) &&
      visitor->Visit("shaderSubgroupExtendedTypes",
                     &features->shaderSubgroupExtendedTypes) &&
      visitor->Visit("separateDepthStencilLayouts",
                     &features->separateDepthStencilLayouts) &&
      visitor->Visit("hostQueryReset", &features->hostQueryReset) &&
      visitor->Visit("timelineSemaphore", &features->timelineSemaphore) &&
      visitor->Visit("bufferDeviceAddress", &features->bufferDeviceAddress) &&
      visitor->Visit("bufferDeviceAddressCaptureReplay",
                     &features->bufferDeviceAddressCaptureReplay) &&
      visitor->Visit("bufferDeviceAddressMultiDevice",
                     &features->bufferDeviceAddressMultiDevice) &&
      visitor->Visit("vulkanMemoryModel", &features->vulkanMemoryModel) &&
      visitor->Visit("vulkanMemoryModelDeviceScope",
                     &features->vulkanMemoryModelDeviceScope) &&
      visitor->Visit(
          "vulkanMemoryModelAvailabilityVisibilityChains",
          &features->vulkanMemoryModelAvailabilityVisibilityChains) &&
      visitor->Visit("shaderOutputViewportIndex",
                     &features->shaderOutputViewportIndex) &&
      visitor->Visit("shaderOutputLayer", &features->shaderOutputLayer) &&
      visitor->Visit("subgroupBroadcastDynamicId",
                     &features->subgroupBroadcastDynamicId);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan12Properties* properties) {
  return

      visitor->Visit("driverID", &properties->driverID) &&
      visitor->Visit("driverName", &properties->driverName) &&
      visitor->Visit("driverInfo", &properties->driverInfo) &&
      visitor->Visit("conformanceVersion", &properties->conformanceVersion) &&
      visitor->Visit("denormBehaviorIndependence",
                     &properties->denormBehaviorIndependence) &&
      visitor->Visit("roundingModeIndependence",
                     &properties->roundingModeIndependence) &&
      visitor->Visit("shaderSignedZeroInfNanPreserveFloat16",
                     &properties->shaderSignedZeroInfNanPreserveFloat16) &&
      visitor->Visit("shaderSignedZeroInfNanPreserveFloat32",
                     &properties->shaderSignedZeroInfNanPreserveFloat32) &&
      visitor->Visit("shaderSignedZeroInfNanPreserveFloat64",
                     &properties->shaderSignedZeroInfNanPreserveFloat64) &&
      visitor->Visit("shaderDenormPreserveFloat16",
                     &properties->shaderDenormPreserveFloat16) &&
      visitor->Visit("shaderDenormPreserveFloat32",
                     &properties->shaderDenormPreserveFloat32) &&
      visitor->Visit("shaderDenormPreserveFloat64",
                     &properties->shaderDenormPreserveFloat64) &&
      visitor->Visit("shaderDenormFlushToZeroFloat16",
                     &properties->shaderDenormFlushToZeroFloat16) &&
      visitor->Visit("shaderDenormFlushToZeroFloat32",
                     &properties->shaderDenormFlushToZeroFloat32) &&
      visitor->Visit("shaderDenormFlushToZeroFloat64",
                     &properties->shaderDenormFlushToZeroFloat64) &&
      visitor->Visit("shaderRoundingModeRTEFloat16",
                     &properties->shaderRoundingModeRTEFloat16) &&
      visitor->Visit("shaderRoundingModeRTEFloat32",
                     &properties->shaderRoundingModeRTEFloat32) &&
      visitor->Visit("shaderRoundingModeRTEFloat64",
                     &properties->shaderRoundingModeRTEFloat64) &&
      visitor->Visit("shaderRoundingModeRTZFloat16",
                     &properties->shaderRoundingModeRTZFloat16) &&
      visitor->Visit("shaderRoundingModeRTZFloat32",
                     &properties->shaderRoundingModeRTZFloat32) &&
      visitor->Visit("shaderRoundingModeRTZFloat64",
                     &properties->shaderRoundingModeRTZFloat64) &&
      visitor->Visit("maxUpdateAfterBindDescriptorsInAllPools",
                     &properties->maxUpdateAfterBindDescriptorsInAllPools) &&
      visitor->Visit(
          "shaderUniformBufferArrayNonUniformIndexingNative",
          &properties->shaderUniformBufferArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderSampledImageArrayNonUniformIndexingNative",
          &properties->shaderSampledImageArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderStorageBufferArrayNonUniformIndexingNative",
          &properties->shaderStorageBufferArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderStorageImageArrayNonUniformIndexingNative",
          &properties->shaderStorageImageArrayNonUniformIndexingNative) &&
      visitor->Visit(
          "shaderInputAttachmentArrayNonUniformIndexingNative",
          &properties->shaderInputAttachmentArrayNonUniformIndexingNative) &&
      visitor->Visit("robustBufferAccessUpdateAfterBind",
                     &properties->robustBufferAccessUpdateAfterBind) &&
      visitor->Visit("quadDivergentImplicitLod",
                     &properties->quadDivergentImplicitLod) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindSamplers",
          &properties->maxPerStageDescriptorUpdateAfterBindSamplers) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindUniformBuffers",
          &properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindStorageBuffers",
          &properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindSampledImages",
          &properties->maxPerStageDescriptorUpdateAfterBindSampledImages) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindStorageImages",
          &properties->maxPerStageDescriptorUpdateAfterBindStorageImages) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindInputAttachments",
          &properties->maxPerStageDescriptorUpdateAfterBindInputAttachments) &&
      visitor->Visit("maxPerStageUpdateAfterBindResources",
                     &properties->maxPerStageUpdateAfterBindResources) &&
      visitor->Visit("maxDescriptorSetUpdateAfterBindSamplers",
                     &properties->maxDescriptorSetUpdateAfterBindSamplers) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindUniformBuffers",
          &properties->maxDescriptorSetUpdateAfterBindUniformBuffers) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic",
          &properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageBuffers",
          &properties->maxDescriptorSetUpdateAfterBindStorageBuffers) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic",
          &properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindSampledImages",
          &properties->maxDescriptorSetUpdateAfterBindSampledImages) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindStorageImages",
          &properties->maxDescriptorSetUpdateAfterBindStorageImages) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindInputAttachments",
          &properties->maxDescriptorSetUpdateAfterBindInputAttachments) &&
      visitor->Visit("supportedDepthResolveModes",
                     &properties->supportedDepthResolveModes) &&
      visitor->Visit("supportedStencilResolveModes",
                     &properties->supportedStencilResolveModes) &&
      visitor->Visit("independentResolveNone",
                     &properties->independentResolveNone) &&
      visitor->Visit("independentResolve", &properties->independentResolve) &&
      visitor->Visit("filterMinmaxSingleComponentFormats",
                     &properties->filterMinmaxSingleComponentFormats) &&
      visitor->Visit("filterMinmaxImageComponentMapping",
                     &properties->filterMinmaxImageComponentMapping) &&
      visitor->Visit("maxTimelineSemaphoreValueDifference",
                     &properties->maxTimelineSemaphoreValueDifference) &&
      visitor->Visit("framebufferIntegerColorSampleCounts",
                     &properties->framebufferIntegerColorSampleCounts);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan13Features* features) {
  return

      visitor->Visit("robustImageAccess", &features->robustImageAccess) &&
      visitor->Visit("inlineUniformBlock", &features->inlineUniformBlock) &&
      visitor->Visit(
          "descriptorBindingInlineUniformBlockUpdateAfterBind",
          &features->descriptorBindingInlineUniformBlockUpdateAfterBind) &&
      visitor->Visit("pipelineCreationCacheControl",
                     &features->pipelineCreationCacheControl) &&
      visitor->Visit("privateData", &features->privateData) &&
      visitor->Visit("shaderDemoteToHelperInvocation",
                     &features->shaderDemoteToHelperInvocation) &&
      visitor->Visit("shaderTerminateInvocation",
                     &features->shaderTerminateInvocation) &&
      visitor->Visit("subgroupSizeControl", &features->subgroupSizeControl) &&
      visitor->Visit("computeFullSubgroups", &features->computeFullSubgroups) &&
      visitor->Visit("synchronization2", &features->synchronization2) &&
      visitor->Visit("textureCompressionASTC_HDR",
                     &features->textureCompressionASTC_HDR) &&
      visitor->Visit("shaderZeroInitializeWorkgroupMemory",
                     &features->shaderZeroInitializeWorkgroupMemory) &&
      visitor->Visit("dynamicRendering", &features->dynamicRendering) &&
      visitor->Visit("shaderIntegerDotProduct",
                     &features->shaderIntegerDotProduct) &&
      visitor->Visit("maintenance4", &features->maintenance4);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan13Properties* properties) {
  return

      visitor->Visit("minSubgroupSize", &properties->minSubgroupSize) &&
      visitor->Visit("maxSubgroupSize", &properties->maxSubgroupSize) &&
      visitor->Visit("maxComputeWorkgroupSubgroups",
                     &properties->maxComputeWorkgroupSubgroups) &&
      visitor->Visit("requiredSubgroupSizeStages",
                     &properties->requiredSubgroupSizeStages) &&
      visitor->Visit("maxInlineUniformBlockSize",
                     &properties->maxInlineUniformBlockSize) &&
      visitor->Visit("maxPerStageDescriptorInlineUniformBlocks",
                     &properties->maxPerStageDescriptorInlineUniformBlocks) &&
      visitor->Visit(
          "maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks",
          &properties
               ->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) &&
      visitor->Visit("maxDescriptorSetInlineUniformBlocks",
                     &properties->maxDescriptorSetInlineUniformBlocks) &&
      visitor->Visit(
          "maxDescriptorSetUpdateAfterBindInlineUniformBlocks",
          &properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks) &&
      visitor->Visit("maxInlineUniformTotalSize",
                     &properties->maxInlineUniformTotalSize) &&
      visitor->Visit("integerDotProduct8BitUnsignedAccelerated",
                     &properties->integerDotProduct8BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct8BitSignedAccelerated",
                     &properties->integerDotProduct8BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct8BitMixedSignednessAccelerated",
          &properties->integerDotProduct8BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProduct4x8BitPackedUnsignedAccelerated",
          &properties->integerDotProduct4x8BitPackedUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct4x8BitPackedSignedAccelerated",
          &properties->integerDotProduct4x8BitPackedSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct4x8BitPackedMixedSignednessAccelerated",
          &properties
               ->integerDotProduct4x8BitPackedMixedSignednessAccelerated) &&
      visitor->Visit("integerDotProduct16BitUnsignedAccelerated",
                     &properties->integerDotProduct16BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct16BitSignedAccelerated",
                     &properties->integerDotProduct16BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct16BitMixedSignednessAccelerated",
          &properties->integerDotProduct16BitMixedSignednessAccelerated) &&
      visitor->Visit("integerDotProduct32BitUnsignedAccelerated",
                     &properties->integerDotProduct32BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct32BitSignedAccelerated",
                     &properties->integerDotProduct32BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct32BitMixedSignednessAccelerated",
          &properties->integerDotProduct32BitMixedSignednessAccelerated) &&
      visitor->Visit("integerDotProduct64BitUnsignedAccelerated",
                     &properties->integerDotProduct64BitUnsignedAccelerated) &&
      visitor->Visit("integerDotProduct64BitSignedAccelerated",
                     &properties->integerDotProduct64BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProduct64BitMixedSignednessAccelerated",
          &properties->integerDotProduct64BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating8BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating8BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating8BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerate"
          "d",
          &properties
               ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerate"
          "d",
          &properties
               ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAc"
          "celerated",
          &properties
               ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating16BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating16BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating16BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating32BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating32BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating32BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating64BitUnsignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating64BitSignedAccelerated",
          &properties
               ->integerDotProductAccumulatingSaturating64BitSignedAccelerated) &&
      visitor->Visit(
          "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerat"
          "ed",
          &properties
               ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated) &&
      visitor->Visit("storageTexelBufferOffsetAlignmentBytes",
                     &properties->storageTexelBufferOffsetAlignmentBytes) &&
      visitor->Visit(
          "storageTexelBufferOffsetSingleTexelAlignment",
          &properties->storageTexelBufferOffsetSingleTexelAlignment) &&
      visitor->Visit("uniformTexelBufferOffsetAlignmentBytes",
                     &properties->uniformTexelBufferOffsetAlignmentBytes) &&
      visitor->Visit(
          "uniformTexelBufferOffsetSingleTexelAlignment",
          &properties->uniformTexelBufferOffsetSingleTexelAlignment) &&
      visitor->Visit("maxBufferSize", &properties->maxBufferSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan14Features* features) {
  return

      visitor->Visit("globalPriorityQuery", &features->globalPriorityQuery) &&
      visitor->Visit("shaderSubgroupRotate", &features->shaderSubgroupRotate) &&
      visitor->Visit("shaderSubgroupRotateClustered",
                     &features->shaderSubgroupRotateClustered) &&
      visitor->Visit("shaderFloatControls2", &features->shaderFloatControls2) &&
      visitor->Visit("shaderExpectAssume", &features->shaderExpectAssume) &&
      visitor->Visit("rectangularLines", &features->rectangularLines) &&
      visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
      visitor->Visit("smoothLines", &features->smoothLines) &&
      visitor->Visit("stippledRectangularLines",
                     &features->stippledRectangularLines) &&
      visitor->Visit("stippledBresenhamLines",
                     &features->stippledBresenhamLines) &&
      visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines) &&
      visitor->Visit("vertexAttributeInstanceRateDivisor",
                     &features->vertexAttributeInstanceRateDivisor) &&
      visitor->Visit("vertexAttributeInstanceRateZeroDivisor",
                     &features->vertexAttributeInstanceRateZeroDivisor) &&
      visitor->Visit("indexTypeUint8", &features->indexTypeUint8) &&
      visitor->Visit("dynamicRenderingLocalRead",
                     &features->dynamicRenderingLocalRead) &&
      visitor->Visit("maintenance5", &features->maintenance5) &&
      visitor->Visit("maintenance6", &features->maintenance6) &&
      visitor->Visit("pipelineProtectedAccess",
                     &features->pipelineProtectedAccess) &&
      visitor->Visit("pipelineRobustness", &features->pipelineRobustness) &&
      visitor->Visit("hostImageCopy", &features->hostImageCopy) &&
      visitor->Visit("pushDescriptor", &features->pushDescriptor);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkan14Properties* properties) {
  return

      visitor->Visit("lineSubPixelPrecisionBits",
                     &properties->lineSubPixelPrecisionBits) &&
      visitor->Visit("maxVertexAttribDivisor",
                     &properties->maxVertexAttribDivisor) &&
      visitor->Visit("supportsNonZeroFirstInstance",
                     &properties->supportsNonZeroFirstInstance) &&
      visitor->Visit("maxPushDescriptors", &properties->maxPushDescriptors) &&
      visitor->Visit(
          "dynamicRenderingLocalReadDepthStencilAttachments",
          &properties->dynamicRenderingLocalReadDepthStencilAttachments) &&
      visitor->Visit(
          "dynamicRenderingLocalReadMultisampledAttachments",
          &properties->dynamicRenderingLocalReadMultisampledAttachments) &&
      visitor->Visit(
          "earlyFragmentMultisampleCoverageAfterSampleCounting",
          &properties->earlyFragmentMultisampleCoverageAfterSampleCounting) &&
      visitor->Visit(
          "earlyFragmentSampleMaskTestBeforeSampleCounting",
          &properties->earlyFragmentSampleMaskTestBeforeSampleCounting) &&
      visitor->Visit("depthStencilSwizzleOneSupport",
                     &properties->depthStencilSwizzleOneSupport) &&
      visitor->Visit("polygonModePointSize",
                     &properties->polygonModePointSize) &&
      visitor->Visit(
          "nonStrictSinglePixelWideLinesUseParallelogram",
          &properties->nonStrictSinglePixelWideLinesUseParallelogram) &&
      visitor->Visit("nonStrictWideLinesUseParallelogram",
                     &properties->nonStrictWideLinesUseParallelogram) &&
      visitor->Visit("blockTexelViewCompatibleMultipleLayers",
                     &properties->blockTexelViewCompatibleMultipleLayers) &&
      visitor->Visit("maxCombinedImageSamplerDescriptorCount",
                     &properties->maxCombinedImageSamplerDescriptorCount) &&
      visitor->Visit("fragmentShadingRateClampCombinerInputs",
                     &properties->fragmentShadingRateClampCombinerInputs) &&
      visitor->Visit("defaultRobustnessStorageBuffers",
                     &properties->defaultRobustnessStorageBuffers) &&
      visitor->Visit("defaultRobustnessUniformBuffers",
                     &properties->defaultRobustnessUniformBuffers) &&
      visitor->Visit("defaultRobustnessVertexInputs",
                     &properties->defaultRobustnessVertexInputs) &&
      visitor->Visit("defaultRobustnessImages",
                     &properties->defaultRobustnessImages) &&
      visitor->Visit("copySrcLayoutCount", &properties->copySrcLayoutCount) &&
      visitor->VisitArray("pCopySrcLayouts", properties->copySrcLayoutCount,
                          &properties->pCopySrcLayouts) &&
      visitor->Visit("copyDstLayoutCount", &properties->copyDstLayoutCount) &&
      visitor->VisitArray("pCopyDstLayouts", properties->copyDstLayoutCount,
                          &properties->pCopyDstLayouts) &&
      visitor->Visit("optimalTilingLayoutUUID",
                     &properties->optimalTilingLayoutUUID) &&
      visitor->Visit("identicalMemoryTypeRequirements",
                     &properties->identicalMemoryTypeRequirements);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceVulkanMemoryModelFeatures* features) {
  return

      visitor->Visit("vulkanMemoryModel", &features->vulkanMemoryModel) &&
      visitor->Visit("vulkanMemoryModelDeviceScope",
                     &features->vulkanMemoryModelDeviceScope) &&
      visitor->Visit("vulkanMemoryModelAvailabilityVisibilityChains",
                     &features->vulkanMemoryModelAvailabilityVisibilityChains);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* features) {
  return

      visitor->Visit("workgroupMemoryExplicitLayout",
                     &features->workgroupMemoryExplicitLayout) &&
      visitor->Visit(
          "workgroupMemoryExplicitLayoutScalarBlockLayout",
          &features->workgroupMemoryExplicitLayoutScalarBlockLayout) &&
      visitor->Visit("workgroupMemoryExplicitLayout8BitAccess",
                     &features->workgroupMemoryExplicitLayout8BitAccess) &&
      visitor->Visit("workgroupMemoryExplicitLayout16BitAccess",
                     &features->workgroupMemoryExplicitLayout16BitAccess);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* features) {
  return

      visitor->Visit("ycbcr2plane444Formats", &features->ycbcr2plane444Formats);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceYcbcrDegammaFeaturesQCOM* features) {
  return

      visitor->Visit("ycbcrDegamma", &features->ycbcrDegamma);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* features) {
  return

      visitor->Visit("ycbcrImageArrays", &features->ycbcrImageArrays);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT* features) {
  return

      visitor->Visit("zeroInitializeDeviceMemory",
                     &features->zeroInitializeDeviceMemory);
}

template <typename Visitor>
inline bool Iterate(
    Visitor* visitor,
    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures* features) {
  return

      visitor->Visit("shaderZeroInitializeWorkgroupMemory",
                     &features->shaderZeroInitializeWorkgroupMemory);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkPhysicalDeviceProperties* properties) {
  return

      visitor->Visit("apiVersion", &properties->apiVersion) &&
      visitor->Visit("driverVersion", &properties->driverVersion) &&
      visitor->Visit("vendorID", &properties->vendorID) &&
      visitor->Visit("deviceID", &properties->deviceID) &&
      visitor->Visit("deviceType", &properties->deviceType) &&
      visitor->Visit("deviceName", &properties->deviceName) &&
      visitor->Visit("pipelineCacheUUID", &properties->pipelineCacheUUID) &&
      visitor->Visit("limits", &properties->limits) &&
      visitor->Visit("sparseProperties", &properties->sparseProperties);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceMemoryProperties* properties) {
  return

      visitor->Visit("memoryTypeCount", &properties->memoryTypeCount) &&
      visitor->VisitArray("memoryTypes", properties->memoryTypeCount,
                          &properties->memoryTypes) &&
      visitor->Visit("memoryHeapCount", &properties->memoryHeapCount) &&
      visitor->VisitArray("memoryHeaps", properties->memoryHeapCount,
                          &properties->memoryHeaps);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkPhysicalDeviceSparseProperties* properties) {
  return

      visitor->Visit("residencyStandard2DBlockShape",
                     &properties->residencyStandard2DBlockShape) &&
      visitor->Visit("residencyStandard2DMultisampleBlockShape",
                     &properties->residencyStandard2DMultisampleBlockShape) &&
      visitor->Visit("residencyStandard3DBlockShape",
                     &properties->residencyStandard3DBlockShape) &&
      visitor->Visit("residencyAlignedMipSize",
                     &properties->residencyAlignedMipSize) &&
      visitor->Visit("residencyNonResidentStrict",
                     &properties->residencyNonResidentStrict);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkImageFormatProperties* properties) {
  return

      visitor->Visit("maxExtent", &properties->maxExtent) &&
      visitor->Visit("maxMipLevels", &properties->maxMipLevels) &&
      visitor->Visit("maxArrayLayers", &properties->maxArrayLayers) &&
      visitor->Visit("sampleCounts", &properties->sampleCounts) &&
      visitor->Visit("maxResourceSize", &properties->maxResourceSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkQueueFamilyProperties* properties) {
  return

      visitor->Visit("queueFlags", &properties->queueFlags) &&
      visitor->Visit("queueCount", &properties->queueCount) &&
      visitor->Visit("timestampValidBits", &properties->timestampValidBits) &&
      visitor->Visit("minImageTransferGranularity",
                     &properties->minImageTransferGranularity);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkExtensionProperties* properties) {
  return

      visitor->Visit("extensionName", &properties->extensionName) &&
      visitor->Visit("specVersion", &properties->specVersion);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkLayerProperties* properties) {
  return

      visitor->Visit("layerName", &properties->layerName) &&
      visitor->Visit("specVersion", &properties->specVersion) &&
      visitor->Visit("implementationVersion",
                     &properties->implementationVersion) &&
      visitor->Visit("description", &properties->description);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkFormatProperties* properties) {
  return

      visitor->Visit("linearTilingFeatures",
                     &properties->linearTilingFeatures) &&
      visitor->Visit("optimalTilingFeatures",
                     &properties->optimalTilingFeatures) &&
      visitor->Visit("bufferFeatures", &properties->bufferFeatures);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkPhysicalDeviceLimits* limits) {
  return

      visitor->Visit("maxImageDimension1D", &limits->maxImageDimension1D) &&
      visitor->Visit("maxImageDimension2D", &limits->maxImageDimension2D) &&
      visitor->Visit("maxImageDimension3D", &limits->maxImageDimension3D) &&
      visitor->Visit("maxImageDimensionCube", &limits->maxImageDimensionCube) &&
      visitor->Visit("maxImageArrayLayers", &limits->maxImageArrayLayers) &&
      visitor->Visit("maxTexelBufferElements",
                     &limits->maxTexelBufferElements) &&
      visitor->Visit("maxUniformBufferRange", &limits->maxUniformBufferRange) &&
      visitor->Visit("maxStorageBufferRange", &limits->maxStorageBufferRange) &&
      visitor->Visit("maxPushConstantsSize", &limits->maxPushConstantsSize) &&
      visitor->Visit("maxMemoryAllocationCount",
                     &limits->maxMemoryAllocationCount) &&
      visitor->Visit("maxSamplerAllocationCount",
                     &limits->maxSamplerAllocationCount) &&
      visitor->Visit("bufferImageGranularity",
                     &limits->bufferImageGranularity) &&
      visitor->Visit("sparseAddressSpaceSize",
                     &limits->sparseAddressSpaceSize) &&
      visitor->Visit("maxBoundDescriptorSets",
                     &limits->maxBoundDescriptorSets) &&
      visitor->Visit("maxPerStageDescriptorSamplers",
                     &limits->maxPerStageDescriptorSamplers) &&
      visitor->Visit("maxPerStageDescriptorUniformBuffers",
                     &limits->maxPerStageDescriptorUniformBuffers) &&
      visitor->Visit("maxPerStageDescriptorStorageBuffers",
                     &limits->maxPerStageDescriptorStorageBuffers) &&
      visitor->Visit("maxPerStageDescriptorSampledImages",
                     &limits->maxPerStageDescriptorSampledImages) &&
      visitor->Visit("maxPerStageDescriptorStorageImages",
                     &limits->maxPerStageDescriptorStorageImages) &&
      visitor->Visit("maxPerStageDescriptorInputAttachments",
                     &limits->maxPerStageDescriptorInputAttachments) &&
      visitor->Visit("maxPerStageResources", &limits->maxPerStageResources) &&
      visitor->Visit("maxDescriptorSetSamplers",
                     &limits->maxDescriptorSetSamplers) &&
      visitor->Visit("maxDescriptorSetUniformBuffers",
                     &limits->maxDescriptorSetUniformBuffers) &&
      visitor->Visit("maxDescriptorSetUniformBuffersDynamic",
                     &limits->maxDescriptorSetUniformBuffersDynamic) &&
      visitor->Visit("maxDescriptorSetStorageBuffers",
                     &limits->maxDescriptorSetStorageBuffers) &&
      visitor->Visit("maxDescriptorSetStorageBuffersDynamic",
                     &limits->maxDescriptorSetStorageBuffersDynamic) &&
      visitor->Visit("maxDescriptorSetSampledImages",
                     &limits->maxDescriptorSetSampledImages) &&
      visitor->Visit("maxDescriptorSetStorageImages",
                     &limits->maxDescriptorSetStorageImages) &&
      visitor->Visit("maxDescriptorSetInputAttachments",
                     &limits->maxDescriptorSetInputAttachments) &&
      visitor->Visit("maxVertexInputAttributes",
                     &limits->maxVertexInputAttributes) &&
      visitor->Visit("maxVertexInputBindings",
                     &limits->maxVertexInputBindings) &&
      visitor->Visit("maxVertexInputAttributeOffset",
                     &limits->maxVertexInputAttributeOffset) &&
      visitor->Visit("maxVertexInputBindingStride",
                     &limits->maxVertexInputBindingStride) &&
      visitor->Visit("maxVertexOutputComponents",
                     &limits->maxVertexOutputComponents) &&
      visitor->Visit("maxTessellationGenerationLevel",
                     &limits->maxTessellationGenerationLevel) &&
      visitor->Visit("maxTessellationPatchSize",
                     &limits->maxTessellationPatchSize) &&
      visitor->Visit("maxTessellationControlPerVertexInputComponents",
                     &limits->maxTessellationControlPerVertexInputComponents) &&
      visitor->Visit(
          "maxTessellationControlPerVertexOutputComponents",
          &limits->maxTessellationControlPerVertexOutputComponents) &&
      visitor->Visit("maxTessellationControlPerPatchOutputComponents",
                     &limits->maxTessellationControlPerPatchOutputComponents) &&
      visitor->Visit("maxTessellationControlTotalOutputComponents",
                     &limits->maxTessellationControlTotalOutputComponents) &&
      visitor->Visit("maxTessellationEvaluationInputComponents",
                     &limits->maxTessellationEvaluationInputComponents) &&
      visitor->Visit("maxTessellationEvaluationOutputComponents",
                     &limits->maxTessellationEvaluationOutputComponents) &&
      visitor->Visit("maxGeometryShaderInvocations",
                     &limits->maxGeometryShaderInvocations) &&
      visitor->Visit("maxGeometryInputComponents",
                     &limits->maxGeometryInputComponents) &&
      visitor->Visit("maxGeometryOutputComponents",
                     &limits->maxGeometryOutputComponents) &&
      visitor->Visit("maxGeometryOutputVertices",
                     &limits->maxGeometryOutputVertices) &&
      visitor->Visit("maxGeometryTotalOutputComponents",
                     &limits->maxGeometryTotalOutputComponents) &&
      visitor->Visit("maxFragmentInputComponents",
                     &limits->maxFragmentInputComponents) &&
      visitor->Visit("maxFragmentOutputAttachments",
                     &limits->maxFragmentOutputAttachments) &&
      visitor->Visit("maxFragmentDualSrcAttachments",
                     &limits->maxFragmentDualSrcAttachments) &&
      visitor->Visit("maxFragmentCombinedOutputResources",
                     &limits->maxFragmentCombinedOutputResources) &&
      visitor->Visit("maxComputeSharedMemorySize",
                     &limits->maxComputeSharedMemorySize) &&
      visitor->Visit("maxComputeWorkGroupCount",
                     &limits->maxComputeWorkGroupCount) &&
      visitor->Visit("maxComputeWorkGroupInvocations",
                     &limits->maxComputeWorkGroupInvocations) &&
      visitor->Visit("maxComputeWorkGroupSize",
                     &limits->maxComputeWorkGroupSize) &&
      visitor->Visit("subPixelPrecisionBits", &limits->subPixelPrecisionBits) &&
      visitor->Visit("subTexelPrecisionBits", &limits->subTexelPrecisionBits) &&
      visitor->Visit("mipmapPrecisionBits", &limits->mipmapPrecisionBits) &&
      visitor->Visit("maxDrawIndexedIndexValue",
                     &limits->maxDrawIndexedIndexValue) &&
      visitor->Visit("maxDrawIndirectCount", &limits->maxDrawIndirectCount) &&
      visitor->Visit("maxSamplerLodBias", &limits->maxSamplerLodBias) &&
      visitor->Visit("maxSamplerAnisotropy", &limits->maxSamplerAnisotropy) &&
      visitor->Visit("maxViewports", &limits->maxViewports) &&
      visitor->Visit("maxViewportDimensions", &limits->maxViewportDimensions) &&
      visitor->Visit("viewportBoundsRange", &limits->viewportBoundsRange) &&
      visitor->Visit("viewportSubPixelBits", &limits->viewportSubPixelBits) &&
      visitor->Visit("minMemoryMapAlignment", &limits->minMemoryMapAlignment) &&
      visitor->Visit("minTexelBufferOffsetAlignment",
                     &limits->minTexelBufferOffsetAlignment) &&
      visitor->Visit("minUniformBufferOffsetAlignment",
                     &limits->minUniformBufferOffsetAlignment) &&
      visitor->Visit("minStorageBufferOffsetAlignment",
                     &limits->minStorageBufferOffsetAlignment) &&
      visitor->Visit("minTexelOffset", &limits->minTexelOffset) &&
      visitor->Visit("maxTexelOffset", &limits->maxTexelOffset) &&
      visitor->Visit("minTexelGatherOffset", &limits->minTexelGatherOffset) &&
      visitor->Visit("maxTexelGatherOffset", &limits->maxTexelGatherOffset) &&
      visitor->Visit("minInterpolationOffset",
                     &limits->minInterpolationOffset) &&
      visitor->Visit("maxInterpolationOffset",
                     &limits->maxInterpolationOffset) &&
      visitor->Visit("subPixelInterpolationOffsetBits",
                     &limits->subPixelInterpolationOffsetBits) &&
      visitor->Visit("maxFramebufferWidth", &limits->maxFramebufferWidth) &&
      visitor->Visit("maxFramebufferHeight", &limits->maxFramebufferHeight) &&
      visitor->Visit("maxFramebufferLayers", &limits->maxFramebufferLayers) &&
      visitor->Visit("framebufferColorSampleCounts",
                     &limits->framebufferColorSampleCounts) &&
      visitor->Visit("framebufferDepthSampleCounts",
                     &limits->framebufferDepthSampleCounts) &&
      visitor->Visit("framebufferStencilSampleCounts",
                     &limits->framebufferStencilSampleCounts) &&
      visitor->Visit("framebufferNoAttachmentsSampleCounts",
                     &limits->framebufferNoAttachmentsSampleCounts) &&
      visitor->Visit("maxColorAttachments", &limits->maxColorAttachments) &&
      visitor->Visit("sampledImageColorSampleCounts",
                     &limits->sampledImageColorSampleCounts) &&
      visitor->Visit("sampledImageIntegerSampleCounts",
                     &limits->sampledImageIntegerSampleCounts) &&
      visitor->Visit("sampledImageDepthSampleCounts",
                     &limits->sampledImageDepthSampleCounts) &&
      visitor->Visit("sampledImageStencilSampleCounts",
                     &limits->sampledImageStencilSampleCounts) &&
      visitor->Visit("storageImageSampleCounts",
                     &limits->storageImageSampleCounts) &&
      visitor->Visit("maxSampleMaskWords", &limits->maxSampleMaskWords) &&
      visitor->Visit("timestampComputeAndGraphics",
                     &limits->timestampComputeAndGraphics) &&
      visitor->Visit("timestampPeriod", &limits->timestampPeriod) &&
      visitor->Visit("maxClipDistances", &limits->maxClipDistances) &&
      visitor->Visit("maxCullDistances", &limits->maxCullDistances) &&
      visitor->Visit("maxCombinedClipAndCullDistances",
                     &limits->maxCombinedClipAndCullDistances) &&
      visitor->Visit("discreteQueuePriorities",
                     &limits->discreteQueuePriorities) &&
      visitor->Visit("pointSizeRange", &limits->pointSizeRange) &&
      visitor->Visit("lineWidthRange", &limits->lineWidthRange) &&
      visitor->Visit("pointSizeGranularity", &limits->pointSizeGranularity) &&
      visitor->Visit("lineWidthGranularity", &limits->lineWidthGranularity) &&
      visitor->Visit("strictLines", &limits->strictLines) &&
      visitor->Visit("standardSampleLocations",
                     &limits->standardSampleLocations) &&
      visitor->Visit("optimalBufferCopyOffsetAlignment",
                     &limits->optimalBufferCopyOffsetAlignment) &&
      visitor->Visit("optimalBufferCopyRowPitchAlignment",
                     &limits->optimalBufferCopyRowPitchAlignment) &&
      visitor->Visit("nonCoherentAtomSize", &limits->nonCoherentAtomSize);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkPhysicalDeviceFeatures* features) {
  return

      visitor->Visit("robustBufferAccess", &features->robustBufferAccess) &&
      visitor->Visit("fullDrawIndexUint32", &features->fullDrawIndexUint32) &&
      visitor->Visit("imageCubeArray", &features->imageCubeArray) &&
      visitor->Visit("independentBlend", &features->independentBlend) &&
      visitor->Visit("geometryShader", &features->geometryShader) &&
      visitor->Visit("tessellationShader", &features->tessellationShader) &&
      visitor->Visit("sampleRateShading", &features->sampleRateShading) &&
      visitor->Visit("dualSrcBlend", &features->dualSrcBlend) &&
      visitor->Visit("logicOp", &features->logicOp) &&
      visitor->Visit("multiDrawIndirect", &features->multiDrawIndirect) &&
      visitor->Visit("drawIndirectFirstInstance",
                     &features->drawIndirectFirstInstance) &&
      visitor->Visit("depthClamp", &features->depthClamp) &&
      visitor->Visit("depthBiasClamp", &features->depthBiasClamp) &&
      visitor->Visit("fillModeNonSolid", &features->fillModeNonSolid) &&
      visitor->Visit("depthBounds", &features->depthBounds) &&
      visitor->Visit("wideLines", &features->wideLines) &&
      visitor->Visit("largePoints", &features->largePoints) &&
      visitor->Visit("alphaToOne", &features->alphaToOne) &&
      visitor->Visit("multiViewport", &features->multiViewport) &&
      visitor->Visit("samplerAnisotropy", &features->samplerAnisotropy) &&
      visitor->Visit("textureCompressionETC2",
                     &features->textureCompressionETC2) &&
      visitor->Visit("textureCompressionASTC_LDR",
                     &features->textureCompressionASTC_LDR) &&
      visitor->Visit("textureCompressionBC", &features->textureCompressionBC) &&
      visitor->Visit("occlusionQueryPrecise",
                     &features->occlusionQueryPrecise) &&
      visitor->Visit("pipelineStatisticsQuery",
                     &features->pipelineStatisticsQuery) &&
      visitor->Visit("vertexPipelineStoresAndAtomics",
                     &features->vertexPipelineStoresAndAtomics) &&
      visitor->Visit("fragmentStoresAndAtomics",
                     &features->fragmentStoresAndAtomics) &&
      visitor->Visit("shaderTessellationAndGeometryPointSize",
                     &features->shaderTessellationAndGeometryPointSize) &&
      visitor->Visit("shaderImageGatherExtended",
                     &features->shaderImageGatherExtended) &&
      visitor->Visit("shaderStorageImageExtendedFormats",
                     &features->shaderStorageImageExtendedFormats) &&
      visitor->Visit("shaderStorageImageMultisample",
                     &features->shaderStorageImageMultisample) &&
      visitor->Visit("shaderStorageImageReadWithoutFormat",
                     &features->shaderStorageImageReadWithoutFormat) &&
      visitor->Visit("shaderStorageImageWriteWithoutFormat",
                     &features->shaderStorageImageWriteWithoutFormat) &&
      visitor->Visit("shaderUniformBufferArrayDynamicIndexing",
                     &features->shaderUniformBufferArrayDynamicIndexing) &&
      visitor->Visit("shaderSampledImageArrayDynamicIndexing",
                     &features->shaderSampledImageArrayDynamicIndexing) &&
      visitor->Visit("shaderStorageBufferArrayDynamicIndexing",
                     &features->shaderStorageBufferArrayDynamicIndexing) &&
      visitor->Visit("shaderStorageImageArrayDynamicIndexing",
                     &features->shaderStorageImageArrayDynamicIndexing) &&
      visitor->Visit("shaderClipDistance", &features->shaderClipDistance) &&
      visitor->Visit("shaderCullDistance", &features->shaderCullDistance) &&
      visitor->Visit("shaderFloat64", &features->shaderFloat64) &&
      visitor->Visit("shaderInt64", &features->shaderInt64) &&
      visitor->Visit("shaderInt16", &features->shaderInt16) &&
      visitor->Visit("shaderResourceResidency",
                     &features->shaderResourceResidency) &&
      visitor->Visit("shaderResourceMinLod", &features->shaderResourceMinLod) &&
      visitor->Visit("sparseBinding", &features->sparseBinding) &&
      visitor->Visit("sparseResidencyBuffer",
                     &features->sparseResidencyBuffer) &&
      visitor->Visit("sparseResidencyImage2D",
                     &features->sparseResidencyImage2D) &&
      visitor->Visit("sparseResidencyImage3D",
                     &features->sparseResidencyImage3D) &&
      visitor->Visit("sparseResidency2Samples",
                     &features->sparseResidency2Samples) &&
      visitor->Visit("sparseResidency4Samples",
                     &features->sparseResidency4Samples) &&
      visitor->Visit("sparseResidency8Samples",
                     &features->sparseResidency8Samples) &&
      visitor->Visit("sparseResidency16Samples",
                     &features->sparseResidency16Samples) &&
      visitor->Visit("sparseResidencyAliased",
                     &features->sparseResidencyAliased) &&
      visitor->Visit("variableMultisampleRate",
                     &features->variableMultisampleRate) &&
      visitor->Visit("inheritedQueries", &features->inheritedQueries);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkExternalFenceProperties* properties) {
  return visitor->Visit("exportFromImportedHandleTypes",
                        &properties->exportFromImportedHandleTypes) &&
         visitor->Visit("compatibleHandleTypes",
                        &properties->compatibleHandleTypes) &&
         visitor->Visit("externalFenceFeatures",
                        &properties->externalFenceFeatures);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor,
                    VkExternalSemaphoreProperties* properties) {
  return visitor->Visit("exportFromImportedHandleTypes",
                        &properties->exportFromImportedHandleTypes) &&
         visitor->Visit("compatibleHandleTypes",
                        &properties->compatibleHandleTypes) &&
         visitor->Visit("externalSemaphoreFeatures",
                        &properties->externalSemaphoreFeatures);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonLayer* layer) {
  return visitor->Visit("properties", &layer->properties) &&
         visitor->Visit("extensions", &layer->extensions);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonDeviceGroup* device_group) {
  return visitor->Visit("devices", &device_group->device_inds) &&
         visitor->Visit("subsetAllocation",
                        &device_group->properties.subsetAllocation);
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonDevice* device) {
  bool ret = true;
  switch (device->properties.apiVersion ^
          VK_API_VERSION_PATCH(device->properties.apiVersion)) {
    case VK_API_VERSION_1_4:
      ret &= visitor->Visit("globalPriorityQueryFeatures",
                            &device->global_priority_query_features) &&
             visitor->Visit("shaderSubgroupRotateFeatures",
                            &device->shader_subgroup_rotate_features) &&
             visitor->Visit("shaderFloatControls2Features",
                            &device->shader_float_controls2_features) &&
             visitor->Visit("shaderExpectAssumeFeatures",
                            &device->shader_expect_assume_features) &&
             visitor->Visit("lineRasterizationFeatures",
                            &device->line_rasterization_features) &&
             visitor->Visit("lineRasterizationProperties",
                            &device->line_rasterization_properties) &&
             visitor->Visit("vertexAttributeDivisorProperties",
                            &device->vertex_attribute_divisor_properties) &&
             visitor->Visit("vertexAttributeDivisorFeatures",
                            &device->vertex_attribute_divisor_features) &&
             visitor->Visit("indexTypeUint8Features",
                            &device->index_type_uint8_features) &&
             visitor->Visit("maintenance5Features",
                            &device->maintenance5_features) &&
             visitor->Visit("maintenance5Properties",
                            &device->maintenance5_properties) &&
             visitor->Visit("pushDescriptorProperties",
                            &device->push_descriptor_properties) &&
             visitor->Visit("dynamicRenderingLocalReadFeatures",
                            &device->dynamic_rendering_local_read_features) &&
             visitor->Visit("maintenance6Features",
                            &device->maintenance6_features) &&
             visitor->Visit("maintenance6Properties",
                            &device->maintenance6_properties) &&
             visitor->Visit("pipelineProtectedAccessFeatures",
                            &device->pipeline_protected_access_features) &&
             visitor->Visit("pipelineRobustnessFeatures",
                            &device->pipeline_robustness_features) &&
             visitor->Visit("pipelineRobustnessProperties",
                            &device->pipeline_robustness_properties) &&
             visitor->Visit("hostImageCopyFeatures",
                            &device->host_image_copy_features) &&
             visitor->Visit("hostImageCopyProperties",
                            &device->host_image_copy_properties) &&
             visitor->Visit("core14", &device->core14);
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_3:
      ret &=
          visitor->Visit("shaderTerminateInvocationFeatures",
                         &device->shader_terminate_invocation_features) &&
          visitor->Visit(
              "shaderDemoteToHelperInvocationFeatures",
              &device->shader_demote_to_helper_invocation_features) &&
          visitor->Visit("privateDataFeatures",
                         &device->private_data_features) &&
          visitor->Visit("pipelineCreationCacheControlFeatures",
                         &device->pipeline_creation_cache_control_features) &&
          visitor->Visit("synchronization2Features",
                         &device->synchronization2_features) &&
          visitor->Visit("zeroInitializeWorkgroupMemoryFeatures",
                         &device->zero_initialize_workgroup_memory_features) &&
          visitor->Visit("imageRobustnessFeatures",
                         &device->image_robustness_features) &&
          visitor->Visit("subgroupSizeControlFeatures",
                         &device->subgroup_size_control_features) &&
          visitor->Visit("subgroupSizeControlProperties",
                         &device->subgroup_size_control_properties) &&
          visitor->Visit("inlineUniformBlockFeatures",
                         &device->inline_uniform_block_features) &&
          visitor->Visit("inlineUniformBlockProperties",
                         &device->inline_uniform_block_properties) &&
          visitor->Visit("textureCompressionAstchdrFeatures",
                         &device->texture_compression_astchdr_features) &&
          visitor->Visit("dynamicRenderingFeatures",
                         &device->dynamic_rendering_features) &&
          visitor->Visit("shaderIntegerDotProductFeatures",
                         &device->shader_integer_dot_product_features) &&
          visitor->Visit("shaderIntegerDotProductProperties",
                         &device->shader_integer_dot_product_properties) &&
          visitor->Visit("texelBufferAlignmentProperties",
                         &device->texel_buffer_alignment_properties) &&
          visitor->Visit("maintenance4Features",
                         &device->maintenance4_features) &&
          visitor->Visit("maintenance4Properties",
                         &device->maintenance4_properties) &&
          visitor->Visit("core13", &device->core13);
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_2:
      ret &= visitor->Visit("bit8StorageFeatures",
                            &device->bit8_storage_features) &&
             visitor->Visit("driverProperties", &device->driver_properties) &&
             visitor->Visit("shaderAtomicInt64Features",
                            &device->shader_atomic_int64_features) &&
             visitor->Visit("shaderFloat16Int8Features",
                            &device->shader_float16_int8_features) &&
             visitor->Visit("floatControlsProperties",
                            &device->float_controls_properties) &&
             visitor->Visit("descriptorIndexingFeatures",
                            &device->descriptor_indexing_features) &&
             visitor->Visit("descriptorIndexingProperties",
                            &device->descriptor_indexing_properties) &&
             visitor->Visit("depthStencilResolveProperties",
                            &device->depth_stencil_resolve_properties) &&
             visitor->Visit("scalarBlockLayoutFeatures",
                            &device->scalar_block_layout_features) &&
             visitor->Visit("samplerFilterMinmaxProperties",
                            &device->sampler_filter_minmax_properties) &&
             visitor->Visit("vulkanMemoryModelFeatures",
                            &device->vulkan_memory_model_features) &&
             visitor->Visit("imagelessFramebufferFeatures",
                            &device->imageless_framebuffer_features) &&
             visitor->Visit("uniformBufferStandardLayoutFeatures",
                            &device->uniform_buffer_standard_layout_features) &&
             visitor->Visit("shaderSubgroupExtendedTypesFeatures",
                            &device->shader_subgroup_extended_types_features) &&
             visitor->Visit("separateDepthStencilLayoutsFeatures",
                            &device->separate_depth_stencil_layouts_features) &&
             visitor->Visit("hostQueryResetFeatures",
                            &device->host_query_reset_features) &&
             visitor->Visit("timelineSemaphoreFeatures",
                            &device->timeline_semaphore_features) &&
             visitor->Visit("timelineSemaphoreProperties",
                            &device->timeline_semaphore_properties) &&
             visitor->Visit("bufferDeviceAddressFeatures",
                            &device->buffer_device_address_features) &&

             visitor->Visit("core11", &device->core11);
      ret &= visitor->Visit("core12", &device->core12);
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_1:
      ret &=
          visitor->Visit("subgroupProperties", &device->subgroup_properties) &&
          visitor->Visit("bit16StorageFeatures",
                         &device->bit16_storage_features) &&
          visitor->Visit("pointClippingProperties",
                         &device->point_clipping_properties) &&
          visitor->Visit("multiviewFeatures", &device->multiview_features) &&
          visitor->Visit("multiviewProperties",
                         &device->multiview_properties) &&
          visitor->Visit("variablePointerFeatures",
                         &device->variable_pointer_features) &&
          visitor->Visit("variablePointersFeatures",
                         &device->variable_pointers_features) &&
          visitor->Visit("protectedMemoryFeatures",
                         &device->protected_memory_features) &&
          visitor->Visit("protectedMemoryProperties",
                         &device->protected_memory_properties) &&
          visitor->Visit("samplerYcbcrConversionFeatures",
                         &device->sampler_ycbcr_conversion_features) &&
          visitor->Visit("idProperties", &device->id_properties) &&
          visitor->Visit("maintenance3Properties",
                         &device->maintenance3_properties) &&
          visitor->Visit("shaderDrawParameterFeatures",
                         &device->shader_draw_parameter_features) &&
          visitor->Visit("shaderDrawParametersFeatures",
                         &device->shader_draw_parameters_features) &&
          visitor->Visit("externalFenceProperties",
                         &device->external_fence_properties) &&
          visitor->Visit("externalSemaphoreProperties",
                         &device->external_semaphore_properties);
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_0:
      ret &= visitor->Visit("properties", &device->properties) &&
             visitor->Visit("features", &device->features) &&
             visitor->Visit("memory", &device->memory) &&
             visitor->Visit("queues", &device->queues) &&
             visitor->Visit("extensions", &device->extensions) &&
             visitor->Visit("layers", &device->layers) &&
             visitor->Visit("formats", &device->formats);

      if (device->amd_anti_lag.reported) {
        ret &= visitor->Visit("VK_AMD_anti_lag", &device->amd_anti_lag);
      }
      if (device->amd_device_coherent_memory.reported) {
        ret &= visitor->Visit("VK_AMD_device_coherent_memory",
                              &device->amd_device_coherent_memory);
      }
      if (device->amd_shader_core_properties.reported) {
        ret &= visitor->Visit("VK_AMD_shader_core_properties",
                              &device->amd_shader_core_properties);
      }
      if (device->amd_shader_core_properties2.reported) {
        ret &= visitor->Visit("VK_AMD_shader_core_properties2",
                              &device->amd_shader_core_properties2);
      }
      if (device->amd_shader_early_and_late_fragment_tests.reported) {
        ret &=
            visitor->Visit("VK_AMD_shader_early_and_late_fragment_tests",
                           &device->amd_shader_early_and_late_fragment_tests);
      }
      if (device->android_external_format_resolve.reported) {
        ret &= visitor->Visit("VK_ANDROID_external_format_resolve",
                              &device->android_external_format_resolve);
      }
      if (device->arm_format_pack.reported) {
        ret &= visitor->Visit("VK_ARM_format_pack", &device->arm_format_pack);
      }
      if (device->arm_pipeline_opacity_micromap.reported) {
        ret &= visitor->Visit("VK_ARM_pipeline_opacity_micromap",
                              &device->arm_pipeline_opacity_micromap);
      }
      if (device->arm_rasterization_order_attachment_access.reported) {
        ret &=
            visitor->Visit("VK_ARM_rasterization_order_attachment_access",
                           &device->arm_rasterization_order_attachment_access);
      }
      if (device->arm_render_pass_striped.reported) {
        ret &= visitor->Visit("VK_ARM_render_pass_striped",
                              &device->arm_render_pass_striped);
      }
      if (device->arm_scheduling_controls.reported) {
        ret &= visitor->Visit("VK_ARM_scheduling_controls",
                              &device->arm_scheduling_controls);
      }
      if (device->arm_shader_core_builtins.reported) {
        ret &= visitor->Visit("VK_ARM_shader_core_builtins",
                              &device->arm_shader_core_builtins);
      }
      if (device->arm_shader_core_properties.reported) {
        ret &= visitor->Visit("VK_ARM_shader_core_properties",
                              &device->arm_shader_core_properties);
      }
      if (device->arm_tensors.reported) {
        ret &= visitor->Visit("VK_ARM_tensors", &device->arm_tensors);
      }
      if (device->ext_formats_4444.reported) {
        ret &= visitor->Visit("VK_EXT_4444_formats", &device->ext_formats_4444);
      }
      if (device->ext_astc_decode_mode.reported) {
        ret &= visitor->Visit("VK_EXT_astc_decode_mode",
                              &device->ext_astc_decode_mode);
      }
      if (device->ext_attachment_feedback_loop_dynamic_state.reported) {
        ret &=
            visitor->Visit("VK_EXT_attachment_feedback_loop_dynamic_state",
                           &device->ext_attachment_feedback_loop_dynamic_state);
      }
      if (device->ext_attachment_feedback_loop_layout.reported) {
        ret &= visitor->Visit("VK_EXT_attachment_feedback_loop_layout",
                              &device->ext_attachment_feedback_loop_layout);
      }
      if (device->ext_blend_operation_advanced.reported) {
        ret &= visitor->Visit("VK_EXT_blend_operation_advanced",
                              &device->ext_blend_operation_advanced);
      }
      if (device->ext_border_color_swizzle.reported) {
        ret &= visitor->Visit("VK_EXT_border_color_swizzle",
                              &device->ext_border_color_swizzle);
      }
      if (device->ext_buffer_device_address.reported) {
        ret &= visitor->Visit("VK_EXT_buffer_device_address",
                              &device->ext_buffer_device_address);
      }
      if (device->ext_color_write_enable.reported) {
        ret &= visitor->Visit("VK_EXT_color_write_enable",
                              &device->ext_color_write_enable);
      }
      if (device->ext_conditional_rendering.reported) {
        ret &= visitor->Visit("VK_EXT_conditional_rendering",
                              &device->ext_conditional_rendering);
      }
      if (device->ext_conservative_rasterization.reported) {
        ret &= visitor->Visit("VK_EXT_conservative_rasterization",
                              &device->ext_conservative_rasterization);
      }
      if (device->ext_custom_border_color.reported) {
        ret &= visitor->Visit("VK_EXT_custom_border_color",
                              &device->ext_custom_border_color);
      }
      if (device->ext_depth_bias_control.reported) {
        ret &= visitor->Visit("VK_EXT_depth_bias_control",
                              &device->ext_depth_bias_control);
      }
      if (device->ext_depth_clamp_control.reported) {
        ret &= visitor->Visit("VK_EXT_depth_clamp_control",
                              &device->ext_depth_clamp_control);
      }
      if (device->ext_depth_clip_control.reported) {
        ret &= visitor->Visit("VK_EXT_depth_clip_control",
                              &device->ext_depth_clip_control);
      }
      if (device->ext_depth_clip_enable.reported) {
        ret &= visitor->Visit("VK_EXT_depth_clip_enable",
                              &device->ext_depth_clip_enable);
      }
      if (device->ext_descriptor_buffer.reported) {
        ret &= visitor->Visit("VK_EXT_descriptor_buffer",
                              &device->ext_descriptor_buffer);
      }
      if (device->ext_descriptor_indexing.reported) {
        ret &= visitor->Visit("VK_EXT_descriptor_indexing",
                              &device->ext_descriptor_indexing);
      }
      if (device->ext_device_address_binding_report.reported) {
        ret &= visitor->Visit("VK_EXT_device_address_binding_report",
                              &device->ext_device_address_binding_report);
      }
      if (device->ext_device_fault.reported) {
        ret &= visitor->Visit("VK_EXT_device_fault", &device->ext_device_fault);
      }
      if (device->ext_device_generated_commands.reported) {
        ret &= visitor->Visit("VK_EXT_device_generated_commands",
                              &device->ext_device_generated_commands);
      }
      if (device->ext_device_memory_report.reported) {
        ret &= visitor->Visit("VK_EXT_device_memory_report",
                              &device->ext_device_memory_report);
      }
      if (device->ext_discard_rectangles.reported) {
        ret &= visitor->Visit("VK_EXT_discard_rectangles",
                              &device->ext_discard_rectangles);
      }
      if (device->ext_dynamic_rendering_unused_attachments.reported) {
        ret &=
            visitor->Visit("VK_EXT_dynamic_rendering_unused_attachments",
                           &device->ext_dynamic_rendering_unused_attachments);
      }
      if (device->ext_extended_dynamic_state.reported) {
        ret &= visitor->Visit("VK_EXT_extended_dynamic_state",
                              &device->ext_extended_dynamic_state);
      }
      if (device->ext_extended_dynamic_state2.reported) {
        ret &= visitor->Visit("VK_EXT_extended_dynamic_state2",
                              &device->ext_extended_dynamic_state2);
      }
      if (device->ext_extended_dynamic_state3.reported) {
        ret &= visitor->Visit("VK_EXT_extended_dynamic_state3",
                              &device->ext_extended_dynamic_state3);
      }
      if (device->ext_external_memory_host.reported) {
        ret &= visitor->Visit("VK_EXT_external_memory_host",
                              &device->ext_external_memory_host);
      }
      if (device->ext_fragment_density_map.reported) {
        ret &= visitor->Visit("VK_EXT_fragment_density_map",
                              &device->ext_fragment_density_map);
      }
      if (device->ext_fragment_density_map2.reported) {
        ret &= visitor->Visit("VK_EXT_fragment_density_map2",
                              &device->ext_fragment_density_map2);
      }
      if (device->ext_fragment_density_map_offset.reported) {
        ret &= visitor->Visit("VK_EXT_fragment_density_map_offset",
                              &device->ext_fragment_density_map_offset);
      }
      if (device->ext_fragment_shader_interlock.reported) {
        ret &= visitor->Visit("VK_EXT_fragment_shader_interlock",
                              &device->ext_fragment_shader_interlock);
      }
      if (device->ext_frame_boundary.reported) {
        ret &= visitor->Visit("VK_EXT_frame_boundary",
                              &device->ext_frame_boundary);
      }
      if (device->ext_global_priority_query.reported) {
        ret &= visitor->Visit("VK_EXT_global_priority_query",
                              &device->ext_global_priority_query);
      }
      if (device->ext_graphics_pipeline_library.reported) {
        ret &= visitor->Visit("VK_EXT_graphics_pipeline_library",
                              &device->ext_graphics_pipeline_library);
      }
      if (device->ext_host_image_copy.reported) {
        ret &= visitor->Visit("VK_EXT_host_image_copy",
                              &device->ext_host_image_copy);
      }
      if (device->ext_host_query_reset.reported) {
        ret &= visitor->Visit("VK_EXT_host_query_reset",
                              &device->ext_host_query_reset);
      }
      if (device->ext_image_2d_view_of_3d.reported) {
        ret &= visitor->Visit("VK_EXT_image_2d_view_of_3d",
                              &device->ext_image_2d_view_of_3d);
      }
      if (device->ext_image_compression_control.reported) {
        ret &= visitor->Visit("VK_EXT_image_compression_control",
                              &device->ext_image_compression_control);
      }
      if (device->ext_image_compression_control_swapchain.reported) {
        ret &= visitor->Visit("VK_EXT_image_compression_control_swapchain",
                              &device->ext_image_compression_control_swapchain);
      }
      if (device->ext_image_robustness.reported) {
        ret &= visitor->Visit("VK_EXT_image_robustness",
                              &device->ext_image_robustness);
      }
      if (device->ext_image_sliced_view_of_3d.reported) {
        ret &= visitor->Visit("VK_EXT_image_sliced_view_of_3d",
                              &device->ext_image_sliced_view_of_3d);
      }
      if (device->ext_image_view_min_lod.reported) {
        ret &= visitor->Visit("VK_EXT_image_view_min_lod",
                              &device->ext_image_view_min_lod);
      }
      if (device->ext_index_type_uint8.reported) {
        ret &= visitor->Visit("VK_EXT_index_type_uint8",
                              &device->ext_index_type_uint8);
      }
      if (device->ext_inline_uniform_block.reported) {
        ret &= visitor->Visit("VK_EXT_inline_uniform_block",
                              &device->ext_inline_uniform_block);
      }
      if (device->ext_legacy_dithering.reported) {
        ret &= visitor->Visit("VK_EXT_legacy_dithering",
                              &device->ext_legacy_dithering);
      }
      if (device->ext_legacy_vertex_attributes.reported) {
        ret &= visitor->Visit("VK_EXT_legacy_vertex_attributes",
                              &device->ext_legacy_vertex_attributes);
      }
      if (device->ext_line_rasterization.reported) {
        ret &= visitor->Visit("VK_EXT_line_rasterization",
                              &device->ext_line_rasterization);
      }
      if (device->ext_map_memory_placed.reported) {
        ret &= visitor->Visit("VK_EXT_map_memory_placed",
                              &device->ext_map_memory_placed);
      }
      if (device->ext_memory_priority.reported) {
        ret &= visitor->Visit("VK_EXT_memory_priority",
                              &device->ext_memory_priority);
      }
      if (device->ext_mesh_shader.reported) {
        ret &= visitor->Visit("VK_EXT_mesh_shader", &device->ext_mesh_shader);
      }
      if (device->ext_multi_draw.reported) {
        ret &= visitor->Visit("VK_EXT_multi_draw", &device->ext_multi_draw);
      }
      if (device->ext_multisampled_render_to_single_sampled.reported) {
        ret &=
            visitor->Visit("VK_EXT_multisampled_render_to_single_sampled",
                           &device->ext_multisampled_render_to_single_sampled);
      }
      if (device->ext_mutable_descriptor_type.reported) {
        ret &= visitor->Visit("VK_EXT_mutable_descriptor_type",
                              &device->ext_mutable_descriptor_type);
      }
      if (device->ext_nested_command_buffer.reported) {
        ret &= visitor->Visit("VK_EXT_nested_command_buffer",
                              &device->ext_nested_command_buffer);
      }
      if (device->ext_non_seamless_cube_map.reported) {
        ret &= visitor->Visit("VK_EXT_non_seamless_cube_map",
                              &device->ext_non_seamless_cube_map);
      }
      if (device->ext_opacity_micromap.reported) {
        ret &= visitor->Visit("VK_EXT_opacity_micromap",
                              &device->ext_opacity_micromap);
      }
      if (device->ext_pageable_device_local_memory.reported) {
        ret &= visitor->Visit("VK_EXT_pageable_device_local_memory",
                              &device->ext_pageable_device_local_memory);
      }
      if (device->ext_pci_bus_info.reported) {
        ret &= visitor->Visit("VK_EXT_pci_bus_info", &device->ext_pci_bus_info);
      }
      if (device->ext_physical_device_drm.reported) {
        ret &= visitor->Visit("VK_EXT_physical_device_drm",
                              &device->ext_physical_device_drm);
      }
      if (device->ext_pipeline_creation_cache_control.reported) {
        ret &= visitor->Visit("VK_EXT_pipeline_creation_cache_control",
                              &device->ext_pipeline_creation_cache_control);
      }
      if (device->ext_pipeline_library_group_handles.reported) {
        ret &= visitor->Visit("VK_EXT_pipeline_library_group_handles",
                              &device->ext_pipeline_library_group_handles);
      }
      if (device->ext_pipeline_properties.reported) {
        ret &= visitor->Visit("VK_EXT_pipeline_properties",
                              &device->ext_pipeline_properties);
      }
      if (device->ext_pipeline_protected_access.reported) {
        ret &= visitor->Visit("VK_EXT_pipeline_protected_access",
                              &device->ext_pipeline_protected_access);
      }
      if (device->ext_pipeline_robustness.reported) {
        ret &= visitor->Visit("VK_EXT_pipeline_robustness",
                              &device->ext_pipeline_robustness);
      }
      if (device->ext_present_mode_fifo_latest_ready.reported) {
        ret &= visitor->Visit("VK_EXT_present_mode_fifo_latest_ready",
                              &device->ext_present_mode_fifo_latest_ready);
      }
      if (device->ext_primitive_topology_list_restart.reported) {
        ret &= visitor->Visit("VK_EXT_primitive_topology_list_restart",
                              &device->ext_primitive_topology_list_restart);
      }
      if (device->ext_primitives_generated_query.reported) {
        ret &= visitor->Visit("VK_EXT_primitives_generated_query",
                              &device->ext_primitives_generated_query);
      }
      if (device->ext_private_data.reported) {
        ret &= visitor->Visit("VK_EXT_private_data", &device->ext_private_data);
      }
      if (device->ext_provoking_vertex.reported) {
        ret &= visitor->Visit("VK_EXT_provoking_vertex",
                              &device->ext_provoking_vertex);
      }
      if (device->ext_rasterization_order_attachment_access.reported) {
        ret &=
            visitor->Visit("VK_EXT_rasterization_order_attachment_access",
                           &device->ext_rasterization_order_attachment_access);
      }
      if (device->ext_rgba10x6_formats.reported) {
        ret &= visitor->Visit("VK_EXT_rgba10x6_formats",
                              &device->ext_rgba10x6_formats);
      }
      if (device->ext_robustness2.reported) {
        ret &= visitor->Visit("VK_EXT_robustness2", &device->ext_robustness2);
      }
      if (device->ext_sample_locations.reported) {
        ret &= visitor->Visit("VK_EXT_sample_locations",
                              &device->ext_sample_locations);
      }
      if (device->ext_sampler_filter_minmax.reported) {
        ret &= visitor->Visit("VK_EXT_sampler_filter_minmax",
                              &device->ext_sampler_filter_minmax);
      }
      if (device->ext_scalar_block_layout.reported) {
        ret &= visitor->Visit("VK_EXT_scalar_block_layout",
                              &device->ext_scalar_block_layout);
      }
      if (device->ext_shader_atomic_float.reported) {
        ret &= visitor->Visit("VK_EXT_shader_atomic_float",
                              &device->ext_shader_atomic_float);
      }
      if (device->ext_shader_atomic_float2.reported) {
        ret &= visitor->Visit("VK_EXT_shader_atomic_float2",
                              &device->ext_shader_atomic_float2);
      }
      if (device->ext_shader_demote_to_helper_invocation.reported) {
        ret &= visitor->Visit("VK_EXT_shader_demote_to_helper_invocation",
                              &device->ext_shader_demote_to_helper_invocation);
      }
      if (device->ext_shader_float8.reported) {
        ret &=
            visitor->Visit("VK_EXT_shader_float8", &device->ext_shader_float8);
      }
      if (device->ext_shader_image_atomic_int64.reported) {
        ret &= visitor->Visit("VK_EXT_shader_image_atomic_int64",
                              &device->ext_shader_image_atomic_int64);
      }
      if (device->ext_shader_module_identifier.reported) {
        ret &= visitor->Visit("VK_EXT_shader_module_identifier",
                              &device->ext_shader_module_identifier);
      }
      if (device->ext_shader_object.reported) {
        ret &=
            visitor->Visit("VK_EXT_shader_object", &device->ext_shader_object);
      }
      if (device->ext_shader_replicated_composites.reported) {
        ret &= visitor->Visit("VK_EXT_shader_replicated_composites",
                              &device->ext_shader_replicated_composites);
      }
      if (device->ext_shader_tile_image.reported) {
        ret &= visitor->Visit("VK_EXT_shader_tile_image",
                              &device->ext_shader_tile_image);
      }
      if (device->ext_subgroup_size_control.reported) {
        ret &= visitor->Visit("VK_EXT_subgroup_size_control",
                              &device->ext_subgroup_size_control);
      }
      if (device->ext_subpass_merge_feedback.reported) {
        ret &= visitor->Visit("VK_EXT_subpass_merge_feedback",
                              &device->ext_subpass_merge_feedback);
      }
      if (device->ext_swapchain_maintenance1.reported) {
        ret &= visitor->Visit("VK_EXT_swapchain_maintenance1",
                              &device->ext_swapchain_maintenance1);
      }
      if (device->ext_texel_buffer_alignment.reported) {
        ret &= visitor->Visit("VK_EXT_texel_buffer_alignment",
                              &device->ext_texel_buffer_alignment);
      }
      if (device->ext_texture_compression_astc_hdr.reported) {
        ret &= visitor->Visit("VK_EXT_texture_compression_astc_hdr",
                              &device->ext_texture_compression_astc_hdr);
      }
      if (device->ext_transform_feedback.reported) {
        ret &= visitor->Visit("VK_EXT_transform_feedback",
                              &device->ext_transform_feedback);
      }
      if (device->ext_vertex_attribute_divisor.reported) {
        ret &= visitor->Visit("VK_EXT_vertex_attribute_divisor",
                              &device->ext_vertex_attribute_divisor);
      }
      if (device->ext_vertex_attribute_robustness.reported) {
        ret &= visitor->Visit("VK_EXT_vertex_attribute_robustness",
                              &device->ext_vertex_attribute_robustness);
      }
      if (device->ext_vertex_input_dynamic_state.reported) {
        ret &= visitor->Visit("VK_EXT_vertex_input_dynamic_state",
                              &device->ext_vertex_input_dynamic_state);
      }
      if (device->ext_ycbcr_2plane_444_formats.reported) {
        ret &= visitor->Visit("VK_EXT_ycbcr_2plane_444_formats",
                              &device->ext_ycbcr_2plane_444_formats);
      }
      if (device->ext_ycbcr_image_arrays.reported) {
        ret &= visitor->Visit("VK_EXT_ycbcr_image_arrays",
                              &device->ext_ycbcr_image_arrays);
      }
      if (device->ext_zero_initialize_device_memory.reported) {
        ret &= visitor->Visit("VK_EXT_zero_initialize_device_memory",
                              &device->ext_zero_initialize_device_memory);
      }
      if (device->huawei_cluster_culling_shader.reported) {
        ret &= visitor->Visit("VK_HUAWEI_cluster_culling_shader",
                              &device->huawei_cluster_culling_shader);
      }
      if (device->huawei_hdr_vivid.reported) {
        ret &= visitor->Visit("VK_HUAWEI_hdr_vivid", &device->huawei_hdr_vivid);
      }
      if (device->huawei_invocation_mask.reported) {
        ret &= visitor->Visit("VK_HUAWEI_invocation_mask",
                              &device->huawei_invocation_mask);
      }
      if (device->huawei_subpass_shading.reported) {
        ret &= visitor->Visit("VK_HUAWEI_subpass_shading",
                              &device->huawei_subpass_shading);
      }
      if (device->img_relaxed_line_rasterization.reported) {
        ret &= visitor->Visit("VK_IMG_relaxed_line_rasterization",
                              &device->img_relaxed_line_rasterization);
      }
      if (device->vk_intel_shader_integer_functions2.reported) {
        ret &= visitor->Visit("VK_INTEL_shader_integer_functions2",
                              &device->vk_intel_shader_integer_functions2);
      }
      if (device->khr_16bit_storage.reported) {
        ret &=
            visitor->Visit("VK_KHR_16bit_storage", &device->khr_16bit_storage);
      }
      if (device->khr_8bit_storage.reported) {
        ret &= visitor->Visit("VK_KHR_8bit_storage", &device->khr_8bit_storage);
      }
      if (device->khr_acceleration_structure.reported) {
        ret &= visitor->Visit("VK_KHR_acceleration_structure",
                              &device->khr_acceleration_structure);
      }
      if (device->khr_buffer_device_address.reported) {
        ret &= visitor->Visit("VK_KHR_buffer_device_address",
                              &device->khr_buffer_device_address);
      }
      if (device->khr_compute_shader_derivatives.reported) {
        ret &= visitor->Visit("VK_KHR_compute_shader_derivatives",
                              &device->khr_compute_shader_derivatives);
      }
      if (device->khr_cooperative_matrix.reported) {
        ret &= visitor->Visit("VK_KHR_cooperative_matrix",
                              &device->khr_cooperative_matrix);
      }
      if (device->khr_depth_clamp_zero_one.reported) {
        ret &= visitor->Visit("VK_KHR_depth_clamp_zero_one",
                              &device->khr_depth_clamp_zero_one);
      }
      if (device->khr_depth_stencil_resolve.reported) {
        ret &= visitor->Visit("VK_KHR_depth_stencil_resolve",
                              &device->khr_depth_stencil_resolve);
      }
      if (device->khr_driver_properties.reported) {
        ret &= visitor->Visit("VK_KHR_driver_properties",
                              &device->khr_driver_properties);
      }
      if (device->khr_dynamic_rendering.reported) {
        ret &= visitor->Visit("VK_KHR_dynamic_rendering",
                              &device->khr_dynamic_rendering);
      }
      if (device->khr_dynamic_rendering_local_read.reported) {
        ret &= visitor->Visit("VK_KHR_dynamic_rendering_local_read",
                              &device->khr_dynamic_rendering_local_read);
      }
      if (device->khr_external_fence_capabilities.reported) {
        ret &= visitor->Visit("VK_KHR_external_fence_capabilities",
                              &device->khr_external_fence_capabilities);
      }
      if (device->khr_external_memory_capabilities.reported) {
        ret &= visitor->Visit("VK_KHR_external_memory_capabilities",
                              &device->khr_external_memory_capabilities);
      }
      if (device->khr_external_semaphore_capabilities.reported) {
        ret &= visitor->Visit("VK_KHR_external_semaphore_capabilities",
                              &device->khr_external_semaphore_capabilities);
      }
      if (device->khr_fragment_shader_barycentric.reported) {
        ret &= visitor->Visit("VK_KHR_fragment_shader_barycentric",
                              &device->khr_fragment_shader_barycentric);
      }
      if (device->khr_fragment_shading_rate.reported) {
        ret &= visitor->Visit("VK_KHR_fragment_shading_rate",
                              &device->khr_fragment_shading_rate);
      }
      if (device->khr_global_priority.reported) {
        ret &= visitor->Visit("VK_KHR_global_priority",
                              &device->khr_global_priority);
      }
      if (device->khr_imageless_framebuffer.reported) {
        ret &= visitor->Visit("VK_KHR_imageless_framebuffer",
                              &device->khr_imageless_framebuffer);
      }
      if (device->khr_index_type_uint8.reported) {
        ret &= visitor->Visit("VK_KHR_index_type_uint8",
                              &device->khr_index_type_uint8);
      }
      if (device->khr_line_rasterization.reported) {
        ret &= visitor->Visit("VK_KHR_line_rasterization",
                              &device->khr_line_rasterization);
      }
      if (device->khr_maintenance2.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance2", &device->khr_maintenance2);
      }
      if (device->khr_maintenance3.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance3", &device->khr_maintenance3);
      }
      if (device->khr_maintenance4.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance4", &device->khr_maintenance4);
      }
      if (device->khr_maintenance5.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance5", &device->khr_maintenance5);
      }
      if (device->khr_maintenance6.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance6", &device->khr_maintenance6);
      }
      if (device->khr_maintenance7.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance7", &device->khr_maintenance7);
      }
      if (device->khr_maintenance8.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance8", &device->khr_maintenance8);
      }
      if (device->khr_maintenance9.reported) {
        ret &= visitor->Visit("VK_KHR_maintenance9", &device->khr_maintenance9);
      }
      if (device->khr_multiview.reported) {
        ret &= visitor->Visit("VK_KHR_multiview", &device->khr_multiview);
      }
      if (device->khr_performance_query.reported) {
        ret &= visitor->Visit("VK_KHR_performance_query",
                              &device->khr_performance_query);
      }
      if (device->khr_pipeline_binary.reported) {
        ret &= visitor->Visit("VK_KHR_pipeline_binary",
                              &device->khr_pipeline_binary);
      }
      if (device->khr_pipeline_executable_properties.reported) {
        ret &= visitor->Visit("VK_KHR_pipeline_executable_properties",
                              &device->khr_pipeline_executable_properties);
      }
      if (device->khr_present_id.reported) {
        ret &= visitor->Visit("VK_KHR_present_id", &device->khr_present_id);
      }
      if (device->khr_present_id2.reported) {
        ret &= visitor->Visit("VK_KHR_present_id2", &device->khr_present_id2);
      }
      if (device->khr_present_wait.reported) {
        ret &= visitor->Visit("VK_KHR_present_wait", &device->khr_present_wait);
      }
      if (device->khr_present_wait2.reported) {
        ret &=
            visitor->Visit("VK_KHR_present_wait2", &device->khr_present_wait2);
      }
      if (device->khr_push_descriptor.reported) {
        ret &= visitor->Visit("VK_KHR_push_descriptor",
                              &device->khr_push_descriptor);
      }
      if (device->khr_ray_query.reported) {
        ret &= visitor->Visit("VK_KHR_ray_query", &device->khr_ray_query);
      }
      if (device->khr_ray_tracing_maintenance1.reported) {
        ret &= visitor->Visit("VK_KHR_ray_tracing_maintenance1",
                              &device->khr_ray_tracing_maintenance1);
      }
      if (device->khr_ray_tracing_pipeline.reported) {
        ret &= visitor->Visit("VK_KHR_ray_tracing_pipeline",
                              &device->khr_ray_tracing_pipeline);
      }
      if (device->khr_ray_tracing_position_fetch.reported) {
        ret &= visitor->Visit("VK_KHR_ray_tracing_position_fetch",
                              &device->khr_ray_tracing_position_fetch);
      }
      if (device->khr_robustness2.reported) {
        ret &= visitor->Visit("VK_KHR_robustness2", &device->khr_robustness2);
      }
      if (device->khr_sampler_ycbcr_conversion.reported) {
        ret &= visitor->Visit("VK_KHR_sampler_ycbcr_conversion",
                              &device->khr_sampler_ycbcr_conversion);
      }
      if (device->khr_separate_depth_stencil_layouts.reported) {
        ret &= visitor->Visit("VK_KHR_separate_depth_stencil_layouts",
                              &device->khr_separate_depth_stencil_layouts);
      }
      if (device->khr_shader_atomic_int64.reported) {
        ret &= visitor->Visit("VK_KHR_shader_atomic_int64",
                              &device->khr_shader_atomic_int64);
      }
      if (device->khr_shader_bfloat16.reported) {
        ret &= visitor->Visit("VK_KHR_shader_bfloat16",
                              &device->khr_shader_bfloat16);
      }
      if (device->khr_shader_clock.reported) {
        ret &= visitor->Visit("VK_KHR_shader_clock", &device->khr_shader_clock);
      }
      if (device->khr_shader_expect_assume.reported) {
        ret &= visitor->Visit("VK_KHR_shader_expect_assume",
                              &device->khr_shader_expect_assume);
      }
      if (device->khr_shader_float16_int8.reported) {
        ret &= visitor->Visit("VK_KHR_shader_float16_int8",
                              &device->khr_shader_float16_int8);
      }
      if (device->khr_shader_float_controls.reported) {
        ret &= visitor->Visit("VK_KHR_shader_float_controls",
                              &device->khr_shader_float_controls);
      }
      if (device->khr_shader_float_controls2.reported) {
        ret &= visitor->Visit("VK_KHR_shader_float_controls2",
                              &device->khr_shader_float_controls2);
      }
      if (device->khr_shader_integer_dot_product.reported) {
        ret &= visitor->Visit("VK_KHR_shader_integer_dot_product",
                              &device->khr_shader_integer_dot_product);
      }
      if (device->khr_shader_maximal_reconvergence.reported) {
        ret &= visitor->Visit("VK_KHR_shader_maximal_reconvergence",
                              &device->khr_shader_maximal_reconvergence);
      }
      if (device->khr_shader_quad_control.reported) {
        ret &= visitor->Visit("VK_KHR_shader_quad_control",
                              &device->khr_shader_quad_control);
      }
      if (device->khr_shader_relaxed_extended_instruction.reported) {
        ret &= visitor->Visit("VK_KHR_shader_relaxed_extended_instruction",
                              &device->khr_shader_relaxed_extended_instruction);
      }
      if (device->khr_shader_subgroup_extended_types.reported) {
        ret &= visitor->Visit("VK_KHR_shader_subgroup_extended_types",
                              &device->khr_shader_subgroup_extended_types);
      }
      if (device->khr_shader_subgroup_rotate.reported) {
        ret &= visitor->Visit("VK_KHR_shader_subgroup_rotate",
                              &device->khr_shader_subgroup_rotate);
      }
      if (device->khr_shader_subgroup_uniform_control_flow.reported) {
        ret &=
            visitor->Visit("VK_KHR_shader_subgroup_uniform_control_flow",
                           &device->khr_shader_subgroup_uniform_control_flow);
      }
      if (device->khr_shader_terminate_invocation.reported) {
        ret &= visitor->Visit("VK_KHR_shader_terminate_invocation",
                              &device->khr_shader_terminate_invocation);
      }
      if (device->khr_synchronization2.reported) {
        ret &= visitor->Visit("VK_KHR_synchronization2",
                              &device->khr_synchronization2);
      }
      if (device->khr_timeline_semaphore.reported) {
        ret &= visitor->Visit("VK_KHR_timeline_semaphore",
                              &device->khr_timeline_semaphore);
      }
      if (device->khr_unified_image_layouts.reported) {
        ret &= visitor->Visit("VK_KHR_unified_image_layouts",
                              &device->khr_unified_image_layouts);
      }
      if (device->khr_uniform_buffer_standard_layout.reported) {
        ret &= visitor->Visit("VK_KHR_uniform_buffer_standard_layout",
                              &device->khr_uniform_buffer_standard_layout);
      }
      if (device->khr_variable_pointers.reported) {
        ret &= visitor->Visit("VK_KHR_variable_pointers",
                              &device->khr_variable_pointers);
      }
      if (device->khr_vertex_attribute_divisor.reported) {
        ret &= visitor->Visit("VK_KHR_vertex_attribute_divisor",
                              &device->khr_vertex_attribute_divisor);
      }
      if (device->khr_video_decode_vp9.reported) {
        ret &= visitor->Visit("VK_KHR_video_decode_vp9",
                              &device->khr_video_decode_vp9);
      }
      if (device->khr_video_encode_av1.reported) {
        ret &= visitor->Visit("VK_KHR_video_encode_av1",
                              &device->khr_video_encode_av1);
      }
      if (device->khr_video_encode_quantization_map.reported) {
        ret &= visitor->Visit("VK_KHR_video_encode_quantization_map",
                              &device->khr_video_encode_quantization_map);
      }
      if (device->khr_video_maintenance1.reported) {
        ret &= visitor->Visit("VK_KHR_video_maintenance1",
                              &device->khr_video_maintenance1);
      }
      if (device->khr_video_maintenance2.reported) {
        ret &= visitor->Visit("VK_KHR_video_maintenance2",
                              &device->khr_video_maintenance2);
      }
      if (device->khr_vulkan_memory_model.reported) {
        ret &= visitor->Visit("VK_KHR_vulkan_memory_model",
                              &device->khr_vulkan_memory_model);
      }
      if (device->khr_workgroup_memory_explicit_layout.reported) {
        ret &= visitor->Visit("VK_KHR_workgroup_memory_explicit_layout",
                              &device->khr_workgroup_memory_explicit_layout);
      }
      if (device->khr_zero_initialize_workgroup_memory.reported) {
        ret &= visitor->Visit("VK_KHR_zero_initialize_workgroup_memory",
                              &device->khr_zero_initialize_workgroup_memory);
      }
      if (device->mesa_image_alignment_control.reported) {
        ret &= visitor->Visit("VK_MESA_image_alignment_control",
                              &device->mesa_image_alignment_control);
      }
      if (device->msft_layered_driver.reported) {
        ret &= visitor->Visit("VK_MSFT_layered_driver",
                              &device->msft_layered_driver);
      }
      if (device->nvx_multiview_per_view_attributes.reported) {
        ret &= visitor->Visit("VK_NVX_multiview_per_view_attributes",
                              &device->nvx_multiview_per_view_attributes);
      }
      if (device->nv_cluster_acceleration_structure.reported) {
        ret &= visitor->Visit("VK_NV_cluster_acceleration_structure",
                              &device->nv_cluster_acceleration_structure);
      }
      if (device->nv_command_buffer_inheritance.reported) {
        ret &= visitor->Visit("VK_NV_command_buffer_inheritance",
                              &device->nv_command_buffer_inheritance);
      }
      if (device->nv_compute_shader_derivatives.reported) {
        ret &= visitor->Visit("VK_NV_compute_shader_derivatives",
                              &device->nv_compute_shader_derivatives);
      }
      if (device->nv_cooperative_matrix.reported) {
        ret &= visitor->Visit("VK_NV_cooperative_matrix",
                              &device->nv_cooperative_matrix);
      }
      if (device->nv_cooperative_matrix2.reported) {
        ret &= visitor->Visit("VK_NV_cooperative_matrix2",
                              &device->nv_cooperative_matrix2);
      }
      if (device->nv_cooperative_vector.reported) {
        ret &= visitor->Visit("VK_NV_cooperative_vector",
                              &device->nv_cooperative_vector);
      }
      if (device->nv_copy_memory_indirect.reported) {
        ret &= visitor->Visit("VK_NV_copy_memory_indirect",
                              &device->nv_copy_memory_indirect);
      }
      if (device->nv_corner_sampled_image.reported) {
        ret &= visitor->Visit("VK_NV_corner_sampled_image",
                              &device->nv_corner_sampled_image);
      }
      if (device->nv_coverage_reduction_mode.reported) {
        ret &= visitor->Visit("VK_NV_coverage_reduction_mode",
                              &device->nv_coverage_reduction_mode);
      }
      if (device->nv_dedicated_allocation_image_aliasing.reported) {
        ret &= visitor->Visit("VK_NV_dedicated_allocation_image_aliasing",
                              &device->nv_dedicated_allocation_image_aliasing);
      }
      if (device->nv_descriptor_pool_overallocation.reported) {
        ret &= visitor->Visit("VK_NV_descriptor_pool_overallocation",
                              &device->nv_descriptor_pool_overallocation);
      }
      if (device->nv_device_diagnostics_config.reported) {
        ret &= visitor->Visit("VK_NV_device_diagnostics_config",
                              &device->nv_device_diagnostics_config);
      }
      if (device->nv_device_generated_commands.reported) {
        ret &= visitor->Visit("VK_NV_device_generated_commands",
                              &device->nv_device_generated_commands);
      }
      if (device->nv_device_generated_commands_compute.reported) {
        ret &= visitor->Visit("VK_NV_device_generated_commands_compute",
                              &device->nv_device_generated_commands_compute);
      }
      if (device->nv_extended_sparse_address_space.reported) {
        ret &= visitor->Visit("VK_NV_extended_sparse_address_space",
                              &device->nv_extended_sparse_address_space);
      }
      if (device->nv_external_compute_queue.reported) {
        ret &= visitor->Visit("VK_NV_external_compute_queue",
                              &device->nv_external_compute_queue);
      }
      if (device->nv_external_memory_rdma.reported) {
        ret &= visitor->Visit("VK_NV_external_memory_rdma",
                              &device->nv_external_memory_rdma);
      }
      if (device->nv_fragment_shading_rate_enums.reported) {
        ret &= visitor->Visit("VK_NV_fragment_shading_rate_enums",
                              &device->nv_fragment_shading_rate_enums);
      }
      if (device->nv_inherited_viewport_scissor.reported) {
        ret &= visitor->Visit("VK_NV_inherited_viewport_scissor",
                              &device->nv_inherited_viewport_scissor);
      }
      if (device->nv_linear_color_attachment.reported) {
        ret &= visitor->Visit("VK_NV_linear_color_attachment",
                              &device->nv_linear_color_attachment);
      }
      if (device->nv_memory_decompression.reported) {
        ret &= visitor->Visit("VK_NV_memory_decompression",
                              &device->nv_memory_decompression);
      }
      if (device->nv_mesh_shader.reported) {
        ret &= visitor->Visit("VK_NV_mesh_shader", &device->nv_mesh_shader);
      }
      if (device->nv_optical_flow.reported) {
        ret &= visitor->Visit("VK_NV_optical_flow", &device->nv_optical_flow);
      }
      if (device->nv_partitioned_acceleration_structure.reported) {
        ret &= visitor->Visit("VK_NV_partitioned_acceleration_structure",
                              &device->nv_partitioned_acceleration_structure);
      }
      if (device->nv_per_stage_descriptor_set.reported) {
        ret &= visitor->Visit("VK_NV_per_stage_descriptor_set",
                              &device->nv_per_stage_descriptor_set);
      }
      if (device->nv_present_barrier.reported) {
        ret &= visitor->Visit("VK_NV_present_barrier",
                              &device->nv_present_barrier);
      }
      if (device->nv_raw_access_chains.reported) {
        ret &= visitor->Visit("VK_NV_raw_access_chains",
                              &device->nv_raw_access_chains);
      }
      if (device->nv_ray_tracing.reported) {
        ret &= visitor->Visit("VK_NV_ray_tracing", &device->nv_ray_tracing);
      }
      if (device->nv_ray_tracing_invocation_reorder.reported) {
        ret &= visitor->Visit("VK_NV_ray_tracing_invocation_reorder",
                              &device->nv_ray_tracing_invocation_reorder);
      }
      if (device->nv_ray_tracing_linear_swept_spheres.reported) {
        ret &= visitor->Visit("VK_NV_ray_tracing_linear_swept_spheres",
                              &device->nv_ray_tracing_linear_swept_spheres);
      }
      if (device->nv_ray_tracing_motion_blur.reported) {
        ret &= visitor->Visit("VK_NV_ray_tracing_motion_blur",
                              &device->nv_ray_tracing_motion_blur);
      }
      if (device->nv_ray_tracing_validation.reported) {
        ret &= visitor->Visit("VK_NV_ray_tracing_validation",
                              &device->nv_ray_tracing_validation);
      }
      if (device->nv_representative_fragment_test.reported) {
        ret &= visitor->Visit("VK_NV_representative_fragment_test",
                              &device->nv_representative_fragment_test);
      }
      if (device->nv_scissor_exclusive.reported) {
        ret &= visitor->Visit("VK_NV_scissor_exclusive",
                              &device->nv_scissor_exclusive);
      }
      if (device->nv_shader_atomic_float16_vector.reported) {
        ret &= visitor->Visit("VK_NV_shader_atomic_float16_vector",
                              &device->nv_shader_atomic_float16_vector);
      }
      if (device->nv_shader_image_footprint.reported) {
        ret &= visitor->Visit("VK_NV_shader_image_footprint",
                              &device->nv_shader_image_footprint);
      }
      if (device->nv_shader_sm_builtins.reported) {
        ret &= visitor->Visit("VK_NV_shader_sm_builtins",
                              &device->nv_shader_sm_builtins);
      }
      if (device->nv_shading_rate_image.reported) {
        ret &= visitor->Visit("VK_NV_shading_rate_image",
                              &device->nv_shading_rate_image);
      }
      if (device->qcom_filter_cubic_clamp.reported) {
        ret &= visitor->Visit("VK_QCOM_filter_cubic_clamp",
                              &device->qcom_filter_cubic_clamp);
      }
      if (device->qcom_filter_cubic_weights.reported) {
        ret &= visitor->Visit("VK_QCOM_filter_cubic_weights",
                              &device->qcom_filter_cubic_weights);
      }
      if (device->qcom_fragment_density_map_offset.reported) {
        ret &= visitor->Visit("VK_QCOM_fragment_density_map_offset",
                              &device->qcom_fragment_density_map_offset);
      }
      if (device->qcom_image_processing.reported) {
        ret &= visitor->Visit("VK_QCOM_image_processing",
                              &device->qcom_image_processing);
      }
      if (device->qcom_image_processing2.reported) {
        ret &= visitor->Visit("VK_QCOM_image_processing2",
                              &device->qcom_image_processing2);
      }
      if (device->qcom_multiview_per_view_render_areas.reported) {
        ret &= visitor->Visit("VK_QCOM_multiview_per_view_render_areas",
                              &device->qcom_multiview_per_view_render_areas);
      }
      if (device->qcom_multiview_per_view_viewports.reported) {
        ret &= visitor->Visit("VK_QCOM_multiview_per_view_viewports",
                              &device->qcom_multiview_per_view_viewports);
      }
      if (device->qcom_tile_memory_heap.reported) {
        ret &= visitor->Visit("VK_QCOM_tile_memory_heap",
                              &device->qcom_tile_memory_heap);
      }
      if (device->qcom_tile_properties.reported) {
        ret &= visitor->Visit("VK_QCOM_tile_properties",
                              &device->qcom_tile_properties);
      }
      if (device->qcom_tile_shading.reported) {
        ret &=
            visitor->Visit("VK_QCOM_tile_shading", &device->qcom_tile_shading);
      }
      if (device->qcom_ycbcr_degamma.reported) {
        ret &= visitor->Visit("VK_QCOM_ycbcr_degamma",
                              &device->qcom_ycbcr_degamma);
      }
      if (device->sec_amigo_profiling.reported) {
        ret &= visitor->Visit("VK_SEC_amigo_profiling",
                              &device->sec_amigo_profiling);
      }
      if (device->valve_descriptor_set_host_mapping.reported) {
        ret &= visitor->Visit("VK_VALVE_descriptor_set_host_mapping",
                              &device->valve_descriptor_set_host_mapping);
      }
      if (device->valve_mutable_descriptor_type.reported) {
        ret &= visitor->Visit("VK_VALVE_mutable_descriptor_type",
                              &device->valve_mutable_descriptor_type);
      }
  }
  return ret;
}

template <typename Visitor>
inline bool Iterate(Visitor* visitor, VkJsonInstance* instance) {
  bool ret = true;
  switch (instance->api_version ^ VK_API_VERSION_PATCH(instance->api_version)) {
    case VK_API_VERSION_1_4:
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_3:
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_2:
      ret &= visitor->Visit("apiVersion", &instance->api_version);
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_1:
      ret &= visitor->Visit("deviceGroups", &instance->device_groups);
      FALLTHROUGH_INTENDED;
    case VK_API_VERSION_1_0:
      ret &= visitor->Visit("layers", &instance->layers) &&
             visitor->Visit("extensions", &instance->extensions) &&
             visitor->Visit("devices", &instance->devices);
  }
  return ret;
}

template <typename T>
using EnableForArithmetic =
    typename std::enable_if<std::is_arithmetic<T>::value, void>::type;

template <typename T>
using EnableForStruct =
    typename std::enable_if<std::is_class<T>::value, void>::type;

template <typename T>
using EnableForEnum =
    typename std::enable_if<std::is_enum<T>::value, void>::type;

template <typename T, typename = EnableForStruct<T>, typename = void>
Json::Value ToJsonValue(const T& value);

template <typename T, typename = EnableForArithmetic<T>>
inline Json::Value ToJsonValue(const T& value) {
  return Json::Value(
      std::clamp(static_cast<double>(value), SAFE_DOUBLE_MIN, SAFE_DOUBLE_MAX));
}

inline Json::Value ToJsonValue(const uint64_t& value) {
  char string[19] = {0};  // "0x" + 16 digits + terminal \0
  snprintf(string, sizeof(string), "0x%016" PRIx64, value);
  return Json::Value(string);
}

template <typename T,
          typename = EnableForEnum<T>,
          typename = void,
          typename = void>
inline Json::Value ToJsonValue(const T& value) {
  return Json::Value(static_cast<double>(value));
}

template <typename T>
inline Json::Value ArrayToJsonValue(uint32_t count, const T* values) {
  Json::Value array(Json::arrayValue);
  for (unsigned int i = 0; i < count; ++i)
    array.append(ToJsonValue(values[i]));
  return array;
}

template <typename T, size_t N>
inline Json::Value ToJsonValue(const T (&value)[N]) {
  return ArrayToJsonValue(N, value);
}

template <size_t N>
inline Json::Value ToJsonValue(const char (&value)[N]) {
  assert(strlen(value) < N);
  return Json::Value(value);
}

template <typename T>
inline Json::Value ToJsonValue(const std::vector<T>& value) {
  assert(value.size() <= std::numeric_limits<uint32_t>::max());
  return ArrayToJsonValue(static_cast<uint32_t>(value.size()), value.data());
}

template <typename F, typename S>
inline Json::Value ToJsonValue(const std::pair<F, S>& value) {
  Json::Value array(Json::arrayValue);
  array.append(ToJsonValue(value.first));
  array.append(ToJsonValue(value.second));
  return array;
}

template <typename F, typename S>
inline Json::Value ToJsonValue(const std::map<F, S>& value) {
  Json::Value array(Json::arrayValue);
  for (auto& kv : value)
    array.append(ToJsonValue(kv));
  return array;
}

class JsonWriterVisitor {
 public:
  JsonWriterVisitor() : object_(Json::objectValue) {}

  ~JsonWriterVisitor() {}

  template <typename T>
  bool Visit(const char* key, const T* value) {
    object_[key] = ToJsonValue(*value);
    return true;
  }

  template <typename T, uint32_t N>
  bool VisitArray(const char* key, uint32_t count, const T (*value)[N]) {
    assert(count <= N);
    object_[key] = ArrayToJsonValue(count, *value);
    return true;
  }

  template <typename T>
  bool VisitArray(const char* key, uint32_t count, const T* value) {
    object_[key] = ArrayToJsonValue(count, *value);
    return true;
  }

  Json::Value get_object() const { return object_; }

 private:
  Json::Value object_;
};

template <typename Visitor, typename T>
inline void VisitForWrite(Visitor* visitor, const T& t) {
  Iterate(visitor, const_cast<T*>(&t));
}

template <typename T, typename /*= EnableForStruct<T>*/, typename /*= void*/>
Json::Value ToJsonValue(const T& value) {
  JsonWriterVisitor visitor;
  VisitForWrite(&visitor, value);
  return visitor.get_object();
}

template <typename T, typename = EnableForStruct<T>>
bool AsValue(Json::Value* json_value, T* t);

inline bool AsValue(Json::Value* json_value, int32_t* value) {
  if (json_value->type() != Json::realValue)
    return false;
  double d = json_value->asDouble();
  if (!IsIntegral(d) ||
      d < static_cast<double>(std::numeric_limits<int32_t>::min()) ||
      d > static_cast<double>(std::numeric_limits<int32_t>::max()))
    return false;
  *value = static_cast<int32_t>(d);
  return true;
}

inline bool AsValue(Json::Value* json_value, int64_t* value) {
  if (json_value->type() != Json::realValue)
    return false;
  double d = json_value->asDouble();
  if (!IsIntegral(d) ||
      d < static_cast<double>(std::numeric_limits<int64_t>::min()) ||
      d > static_cast<double>(std::numeric_limits<int64_t>::max()))
    return false;
  *value = static_cast<int64_t>(d);
  return true;
}

inline bool AsValue(Json::Value* json_value, uint64_t* value) {
  if (json_value->type() != Json::stringValue)
    return false;
  int result =
      std::sscanf(json_value->asString().c_str(), "0x%016" PRIx64, value);
  return result == 1;
}

inline bool AsValue(Json::Value* json_value, uint32_t* value) {
  if (json_value->type() != Json::realValue)
    return false;
  double d = json_value->asDouble();
  if (!IsIntegral(d) || d < 0.0 ||
      d > static_cast<double>(std::numeric_limits<uint32_t>::max()))
    return false;
  *value = static_cast<uint32_t>(d);
  return true;
}

inline bool AsValue(Json::Value* json_value, uint8_t* value) {
  uint32_t value32 = 0;
  AsValue(json_value, &value32);
  if (value32 > std::numeric_limits<uint8_t>::max())
    return false;
  *value = static_cast<uint8_t>(value32);
  return true;
}

inline bool AsValue(Json::Value* json_value, float* value) {
  if (json_value->type() != Json::realValue)
    return false;
  *value = static_cast<float>(json_value->asDouble());
  return true;
}

inline bool AsValue(Json::Value* json_value, VkImageLayout* t) {
  uint32_t value = 0;
  if (!AsValue(json_value, &value))
    return false;
  if (!EnumTraits<VkImageLayout>::exist(value))
    return false;
  *t = static_cast<VkImageLayout>(value);
  return true;
}

template <typename T>
inline bool AsArray(Json::Value* json_value, uint32_t count, T* values) {
  if (json_value->type() != Json::arrayValue || json_value->size() != count)
    return false;
  for (uint32_t i = 0; i < count; ++i) {
    if (!AsValue(&(*json_value)[i], values + i))
      return false;
  }
  return true;
}

template <typename T, size_t N>
inline bool AsValue(Json::Value* json_value, T (*value)[N]) {
  return AsArray(json_value, N, *value);
}

template <size_t N>
inline bool AsValue(Json::Value* json_value, char (*value)[N]) {
  if (json_value->type() != Json::stringValue)
    return false;
  size_t len = json_value->asString().length();
  if (len >= N)
    return false;
  memcpy(*value, json_value->asString().c_str(), len);
  memset(*value + len, 0, N - len);
  return true;
}

template <typename T, typename = EnableForEnum<T>, typename = void>
inline bool AsValue(Json::Value* json_value, T* t) {
  uint32_t value = 0;
  if (!AsValue(json_value, &value))
    return false;
  if (!EnumTraits<T>::exist(value))
    return false;
  *t = static_cast<T>(value);
  return true;
}

template <typename T>
inline bool AsValue(Json::Value* json_value, std::vector<T>* value) {
  if (json_value->type() != Json::arrayValue)
    return false;
  int size = json_value->size();
  value->resize(size);
  return AsArray(json_value, size, value->data());
}

template <typename F, typename S>
inline bool AsValue(Json::Value* json_value, std::pair<F, S>* value) {
  if (json_value->type() != Json::arrayValue || json_value->size() != 2)
    return false;
  return AsValue(&(*json_value)[0], &value->first) &&
         AsValue(&(*json_value)[1], &value->second);
}

template <typename F, typename S>
inline bool AsValue(Json::Value* json_value, std::map<F, S>* value) {
  if (json_value->type() != Json::arrayValue)
    return false;
  int size = json_value->size();
  for (int i = 0; i < size; ++i) {
    std::pair<F, S> elem;
    if (!AsValue(&(*json_value)[i], &elem))
      return false;
    if (!value->insert(elem).second)
      return false;
  }
  return true;
}

template <typename T>
bool ReadValue(Json::Value* object,
               const char* key,
               T* value,
               std::string* errors) {
  Json::Value json_value = (*object)[key];
  if (!json_value) {
    if (errors)
      *errors = std::string(key) + " missing.";
    return false;
  }
  if (AsValue(&json_value, value))
    return true;
  if (errors)
    *errors = std::string("Wrong type for ") + std::string(key) + ".";
  return false;
}

template <typename Visitor, typename T>
inline bool VisitForRead(Visitor* visitor, T* t) {
  return Iterate(visitor, t);
}

class JsonReaderVisitor {
 public:
  JsonReaderVisitor(Json::Value* object, std::string* errors)
      : object_(object), errors_(errors) {}

  template <typename T>
  bool Visit(const char* key, T* value) const {
    return ReadValue(object_, key, value, errors_);
  }

  template <typename T, uint32_t N>
  bool VisitArray(const char* key, uint32_t count, T (*value)[N]) {
    if (count > N)
      return false;
    Json::Value json_value = (*object_)[key];
    if (!json_value) {
      if (errors_)
        *errors_ = std::string(key) + " missing.";
      return false;
    }
    if (AsArray(&json_value, count, *value))
      return true;
    if (errors_)
      *errors_ = std::string("Wrong type for ") + std::string(key) + ".";
    return false;
  }

  template <typename T>
  bool VisitArray(const char* key, uint32_t count, T* value) {
    Json::Value json_value = (*object_)[key];
    if (!json_value) {
      if (errors_)
        *errors_ = std::string(key) + " missing.";
      return false;
    }
    if (AsArray(&json_value, count, *value))
      return true;
    if (errors_)
      *errors_ = std::string("Wrong type for ") + std::string(key) + ".";
    return false;
  }

 private:
  Json::Value* object_;
  std::string* errors_;
};

template <typename T, typename /*= EnableForStruct<T>*/>
bool AsValue(Json::Value* json_value, T* t) {
  if (json_value->type() != Json::objectValue)
    return false;
  JsonReaderVisitor visitor(json_value, nullptr);
  return VisitForRead(&visitor, t);
}

template <typename T>
std::string VkTypeToJson(const T& t) {
  JsonWriterVisitor visitor;
  VisitForWrite(&visitor, t);
  return visitor.get_object().toStyledString();
}

template <typename T>
bool VkTypeFromJson(const std::string& json, T* t, std::string* errors) {
  *t = T();
  Json::Value object(Json::objectValue);
  Json::CharReaderBuilder builder;
  builder["collectComments"] = false;
  std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
  if (!reader->parse(json.data(), json.data() + json.size(), &object, errors)) {
    return false;
  }
  return AsValue(&object, t);
}

}  // anonymous namespace

std::string VkJsonInstanceToJson(const VkJsonInstance& instance) {
  return VkTypeToJson(instance);
}

bool VkJsonInstanceFromJson(const std::string& json,
                            VkJsonInstance* instance,
                            std::string* errors) {
  return VkTypeFromJson(json, instance, errors);
}

std::string VkJsonDeviceToJson(const VkJsonDevice& device) {
  return VkTypeToJson(device);
}

bool VkJsonDeviceFromJson(const std::string& json,
                          VkJsonDevice* device,
                          std::string* errors) {
  return VkTypeFromJson(json, device, errors);
};

std::string VkJsonImageFormatPropertiesToJson(
    const VkImageFormatProperties& properties) {
  return VkTypeToJson(properties);
}

bool VkJsonImageFormatPropertiesFromJson(const std::string& json,
                                         VkImageFormatProperties* properties,
                                         std::string* errors) {
  return VkTypeFromJson(json, properties, errors);
};
