Add specializations of std::tuple_element and std::tuple_size for vk::StructureChain...
authorAndreas Süßenbach <asuessenbach@nvidia.com>
Thu, 22 Jun 2023 12:02:39 +0000 (14:02 +0200)
committerGitHub <noreply@github.com>
Thu, 22 Jun 2023 12:02:39 +0000 (14:02 +0200)
snippets/StructureChain.hpp
tests/StructureChain/StructureChain.cpp
vulkan/vulkan.hpp

index 8aa535f..c1d9d00 100644 (file)
       }
     }
   };
+  // interupt the VULKAN_HPP_NAMESPACE for a moment to add specializations of std::tuple_size and std::tuple_element for the StructureChain!
+}
+
+namespace std
+{
+  template <typename... Elements>
+  struct tuple_size<VULKAN_HPP_NAMESPACE::StructureChain<Elements...>>
+  {
+    static constexpr size_t value = std::tuple_size<std::tuple<Elements...>>::value;
+  };
+
+  template <std::size_t Index, typename... Elements>
+  struct tuple_element<Index, VULKAN_HPP_NAMESPACE::StructureChain<Elements...>>
+  {
+    using type = typename std::tuple_element<Index, std::tuple<Elements...>>::type;
+  };
+}  // namespace std
+
+namespace VULKAN_HPP_NAMESPACE
+{
index 455183e..0f5f02d 100644 (file)
@@ -67,13 +67,19 @@ int main( int /*argc*/, char ** /*argv*/ )
                        vk::PhysicalDevicePushDescriptorPropertiesKHR>
       sc7;
 
-#if !defined(NDEBUG)
+#if ( 17 <= VULKAN_HPP_CPP_VERSION )
+    // test for structured binding from a StructureChain
+    auto const & [p0, p1] = sc1;
+    auto & [p2, p3]       = sc2;
+#endif
+
+#if !defined( NDEBUG )
     void * pNext = sc7.get<vk::PhysicalDeviceIDProperties>().pNext;
 #endif
     sc7.assign<vk::PhysicalDeviceIDProperties>( {} );
     assert( pNext == sc7.get<vk::PhysicalDeviceIDProperties>().pNext );
 
-#if !defined(NDEBUG)
+#if !defined( NDEBUG )
     void * pNext1 = sc7.get<vk::PhysicalDeviceMaintenance3Properties>().pNext;
 #endif
     sc7.assign<vk::PhysicalDeviceMaintenance3Properties>( {} ).assign<vk::PhysicalDeviceIDProperties>( {} );
index c6283c0..38514d7 100644 (file)
@@ -1181,6 +1181,27 @@ namespace VULKAN_HPP_NAMESPACE
     }
   };
 
+  // interupt the VULKAN_HPP_NAMESPACE for a moment to add specializations of std::tuple_size and std::tuple_element for the StructureChain!
+}
+
+namespace std
+{
+  template <typename... Elements>
+  struct tuple_size<VULKAN_HPP_NAMESPACE::StructureChain<Elements...>>
+  {
+    static constexpr size_t value = std::tuple_size<std::tuple<Elements...>>::value;
+  };
+
+  template <std::size_t Index, typename... Elements>
+  struct tuple_element<Index, VULKAN_HPP_NAMESPACE::StructureChain<Elements...>>
+  {
+    using type = typename std::tuple_element<Index, std::tuple<Elements...>>::type;
+  };
+}  // namespace std
+
+namespace VULKAN_HPP_NAMESPACE
+{
+
 #  if !defined( VULKAN_HPP_NO_SMART_HANDLE )
   template <typename Type, typename Dispatch>
   class UniqueHandleTraits;