SDL  2.0
VULKAN_HPP_NAMESPACE::StructureChain< ChainElements > Class Template Reference

#include <vulkan.hpp>

+ Inheritance diagram for VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >:
+ Collaboration diagram for VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >:

Data Structures

struct  ChainElementIndex
 
struct  ChainElementIndex< Index, T, 0, typename std::enable_if< std::is_same< T, First >::value, void >::type, First, Types... >
 
struct  ChainElementIndex< Index, T, Which, typename std::enable_if< std::is_same< T, First >::value, void >::type, First, Types... >
 
struct  ChainElementIndex< Index, T, Which, typename std::enable_if<!std::is_same< T, First >::value, void >::type, First, Types... >
 

Public Member Functions

 StructureChain () VULKAN_HPP_NOEXCEPT
 
 StructureChain (StructureChain const &rhs) VULKAN_HPP_NOEXCEPT
 
 StructureChain (StructureChain &&rhs) VULKAN_HPP_NOEXCEPT
 
 StructureChain (ChainElements const &... elems) VULKAN_HPP_NOEXCEPT
 
StructureChainoperator= (StructureChain const &rhs) VULKAN_HPP_NOEXCEPT
 
StructureChainoperator= (StructureChain &&rhs)=delete
 
template<typename T , size_t Which = 0>
Tget () VULKAN_HPP_NOEXCEPT
 
template<typename T , size_t Which = 0>
T const & get () const VULKAN_HPP_NOEXCEPT
 
template<typename T0 , typename T1 , typename... Ts>
std::tuple< T0 &, T1 &, Ts &... > get () VULKAN_HPP_NOEXCEPT
 
template<typename T0 , typename T1 , typename... Ts>
std::tuple< T0 const &, T1 const &, Ts const &... > get () const VULKAN_HPP_NOEXCEPT
 
template<typename ClassType , size_t Which = 0>
void relink () VULKAN_HPP_NOEXCEPT
 
template<typename ClassType , size_t Which = 0>
void unlink () VULKAN_HPP_NOEXCEPT
 

Private Member Functions

bool isLinked (VkBaseInStructure const *pNext)
 
template<size_t Index>
std::enable_if< Index !=0, void >::type link () VULKAN_HPP_NOEXCEPT
 
template<size_t Index>
std::enable_if< Index==0, void >::type link () VULKAN_HPP_NOEXCEPT
 
template<size_t Index>
std::enable_if< Index !=0, void >::type unlink (VkBaseOutStructure const *pNext) VULKAN_HPP_NOEXCEPT
 
template<size_t Index>
std::enable_if< Index==0, void >::type unlink (VkBaseOutStructure const *pNext) VULKAN_HPP_NOEXCEPT
 

Detailed Description

template<typename... ChainElements>
class VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >

Definition at line 913 of file vulkan.hpp.

Constructor & Destructor Documentation

◆ StructureChain() [1/4]

template<typename... ChainElements>
VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::StructureChain ( )
inline

Definition at line 916 of file vulkan.hpp.

917  {
918  static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid,
919  "The structure chain is not valid!" );
920  link<sizeof...( ChainElements ) - 1>();
921  }
std::enable_if< Index !=0, void >::type link() VULKAN_HPP_NOEXCEPT
Definition: vulkan.hpp:1053

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link().

◆ StructureChain() [2/4]

template<typename... ChainElements>
VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::StructureChain ( StructureChain< ChainElements > const &  rhs)
inline

Definition at line 923 of file vulkan.hpp.

923  : std::tuple<ChainElements...>( rhs )
924  {
925  static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid,
926  "The structure chain is not valid!" );
927  link<sizeof...( ChainElements ) - 1>();
928  }

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link().

◆ StructureChain() [3/4]

template<typename... ChainElements>
VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::StructureChain ( StructureChain< ChainElements > &&  rhs)
inline

Definition at line 930 of file vulkan.hpp.

931  : std::tuple<ChainElements...>( std::forward<std::tuple<ChainElements...>>( rhs ) )
932  {
933  static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid,
934  "The structure chain is not valid!" );
935  link<sizeof...( ChainElements ) - 1>();
936  }

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link().

◆ StructureChain() [4/4]

template<typename... ChainElements>
VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::StructureChain ( ChainElements const &...  elems)
inline

Definition at line 938 of file vulkan.hpp.

938  : std::tuple<ChainElements...>( elems... )
939  {
940  static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid,
941  "The structure chain is not valid!" );
942  link<sizeof...( ChainElements ) - 1>();
943  }

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link().

Member Function Documentation

◆ get() [1/4]

template<typename... ChainElements>
template<typename T , size_t Which = 0>
T const& VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::get ( ) const
inline

Definition at line 961 of file vulkan.hpp.

962  {
963  return std::get<ChainElementIndex<0, T, Which, void, ChainElements...>::value>( static_cast<std::tuple<ChainElements...>&>( *this ) );
964  }
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
GLsizei const GLfloat * value
EGLSetBlobFuncANDROID EGLGetBlobFuncANDROID get
Definition: eglext.h:470
static const double T[]
Definition: k_tan.c:53

References T, and void.

◆ get() [2/4]

template<typename... ChainElements>
template<typename T0 , typename T1 , typename... Ts>
std::tuple<T0 const &, T1 const &, Ts const &...> VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::get ( ) const
inline

Definition at line 973 of file vulkan.hpp.

974  {
975  return std::tie( get<T0>(), get<T1>(), get<Ts>()... );
976  }

◆ get() [3/4]

template<typename... ChainElements>
template<typename T , size_t Which = 0>
T& VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::get ( )
inline

Definition at line 955 of file vulkan.hpp.

956  {
957  return std::get<ChainElementIndex<0, T, Which, void, ChainElements...>::value>( static_cast<std::tuple<ChainElements...>&>( *this ) );
958  }

References T, and void.

◆ get() [4/4]

template<typename... ChainElements>
template<typename T0 , typename T1 , typename... Ts>
std::tuple<T0 &, T1 &, Ts &...> VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::get ( )
inline

Definition at line 967 of file vulkan.hpp.

968  {
969  return std::tie( get<T0>(), get<T1>(), get<Ts>()... );
970  }

◆ isLinked()

template<typename... ChainElements>
bool VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::isLinked ( VkBaseInStructure const *  pNext)
inlineprivate

Definition at line 1038 of file vulkan.hpp.

1039  {
1040  VkBaseInStructure const * elementPtr = reinterpret_cast<VkBaseInStructure const*>(&std::get<0>( static_cast<std::tuple<ChainElements...>&>( *this ) ) );
1041  while ( elementPtr )
1042  {
1043  if ( elementPtr->pNext == pNext )
1044  {
1045  return true;
1046  }
1047  elementPtr = elementPtr->pNext;
1048  }
1049  return false;
1050  }
const struct VkBaseInStructure * pNext
Definition: vulkan_core.h:2022

References VkBaseInStructure::pNext.

Referenced by VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::relink().

◆ link() [1/2]

template<typename... ChainElements>
template<size_t Index>
std::enable_if<Index != 0, void>::type VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link ( )
inlineprivate

Definition at line 1053 of file vulkan.hpp.

1054  {
1055  auto & x = std::get<Index - 1>( static_cast<std::tuple<ChainElements...>&>( *this ) );
1056  x.pNext = &std::get<Index>( static_cast<std::tuple<ChainElements...>&>( *this ) );
1057  link<Index - 1>();
1058  }
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574

Referenced by VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::operator=(), and VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::StructureChain().

◆ link() [2/2]

template<typename... ChainElements>
template<size_t Index>
std::enable_if<Index == 0, void>::type VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link ( )
inlineprivate

Definition at line 1061 of file vulkan.hpp.

1062  {}

◆ operator=() [1/2]

template<typename... ChainElements>
StructureChain& VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::operator= ( StructureChain< ChainElements > &&  rhs)
delete

◆ operator=() [2/2]

template<typename... ChainElements>
StructureChain& VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::operator= ( StructureChain< ChainElements > const &  rhs)
inline

Definition at line 945 of file vulkan.hpp.

946  {
947  std::tuple<ChainElements...>::operator=( rhs );
948  link<sizeof...( ChainElements ) - 1>();
949  return *this;
950  }

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::link().

◆ relink()

template<typename... ChainElements>
template<typename ClassType , size_t Which = 0>
void VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::relink ( )
inline

Definition at line 979 of file vulkan.hpp.

980  {
982  "Can't relink Structure that's not part of this StructureChain!" );
983  static_assert(
984  !std::is_same<ClassType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value || (Which != 0),
985  "It's not allowed to have the first element unlinked!" );
986 
987  auto pNext = reinterpret_cast<VkBaseInStructure *>( &get<ClassType, Which>() );
988  VULKAN_HPP_ASSERT( !isLinked( pNext ) );
989  auto & headElement = std::get<0>( static_cast<std::tuple<ChainElements...>&>( *this ) );
990  pNext->pNext = reinterpret_cast<VkBaseInStructure const*>(headElement.pNext);
991  headElement.pNext = pNext;
992  }
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
bool isLinked(VkBaseInStructure const *pNext)
Definition: vulkan.hpp:1038
#define VULKAN_HPP_ASSERT
Definition: vulkan.hpp:57

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::isLinked(), VkBaseInStructure::pNext, and VULKAN_HPP_ASSERT.

◆ unlink() [1/3]

template<typename... ChainElements>
template<typename ClassType , size_t Which = 0>
void VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::unlink ( )
inline

Definition at line 995 of file vulkan.hpp.

996  {
998  "Can't unlink Structure that's not part of this StructureChain!" );
999  static_assert(
1000  !std::is_same<ClassType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value || (Which != 0),
1001  "It's not allowed to unlink the first element!" );
1002 
1003  unlink<sizeof...( ChainElements ) - 1>( reinterpret_cast<VkBaseOutStructure const *>( &get<ClassType, Which>() ) );
1004  }
void unlink() VULKAN_HPP_NOEXCEPT
Definition: vulkan.hpp:995

Referenced by VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::unlink().

◆ unlink() [2/3]

template<typename... ChainElements>
template<size_t Index>
std::enable_if<Index != 0, void>::type VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::unlink ( VkBaseOutStructure const *  pNext)
inlineprivate

Definition at line 1065 of file vulkan.hpp.

1066  {
1067  auto & element = std::get<Index>( static_cast<std::tuple<ChainElements...>&>( *this ) );
1068  if ( element.pNext == pNext )
1069  {
1070  element.pNext = pNext->pNext;
1071  }
1072  else
1073  {
1074  unlink<Index - 1>( pNext );
1075  }
1076  }

References VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::unlink().

◆ unlink() [3/3]

template<typename... ChainElements>
template<size_t Index>
std::enable_if<Index == 0, void>::type VULKAN_HPP_NAMESPACE::StructureChain< ChainElements >::unlink ( VkBaseOutStructure const *  pNext)
inlineprivate

Definition at line 1079 of file vulkan.hpp.

1080  {
1081  auto & element = std::get<0>( static_cast<std::tuple<ChainElements...>&>( *this ) );
1082  if ( element.pNext == pNext )
1083  {
1084  element.pNext = pNext->pNext;
1085  }
1086  else
1087  {
1088  VULKAN_HPP_ASSERT( false ); // fires, if the ClassType member has already been unlinked !
1089  }
1090  }

References VULKAN_HPP_ASSERT.


The documentation for this class was generated from the following file: