Refactor top-level function to generate vulkan.hpp
This commit is contained in:
140
snippets/ArrayProxy.hpp
Normal file
140
snippets/ArrayProxy.hpp
Normal file
@@ -0,0 +1,140 @@
|
||||
template <typename T>
|
||||
class ArrayProxy
|
||||
{
|
||||
public:
|
||||
VULKAN_HPP_CONSTEXPR ArrayProxy() VULKAN_HPP_NOEXCEPT
|
||||
: m_count( 0 )
|
||||
, m_ptr( nullptr )
|
||||
{}
|
||||
|
||||
VULKAN_HPP_CONSTEXPR ArrayProxy( std::nullptr_t ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( 0 )
|
||||
, m_ptr( nullptr )
|
||||
{}
|
||||
|
||||
ArrayProxy( T & value ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( 1 )
|
||||
, m_ptr( &value )
|
||||
{}
|
||||
|
||||
template <typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
|
||||
ArrayProxy( typename std::remove_const<T>::type & value ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( 1 )
|
||||
, m_ptr( &value )
|
||||
{}
|
||||
|
||||
ArrayProxy( uint32_t count, T * ptr ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( count )
|
||||
, m_ptr( ptr )
|
||||
{}
|
||||
|
||||
template <typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
|
||||
ArrayProxy( uint32_t count, typename std::remove_const<T>::type * ptr ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( count )
|
||||
, m_ptr( ptr )
|
||||
{}
|
||||
|
||||
template <std::size_t C>
|
||||
ArrayProxy( T (& ptr)[C] ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( C )
|
||||
, m_ptr( ptr )
|
||||
{}
|
||||
|
||||
template <std::size_t C, typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
|
||||
ArrayProxy( typename std::remove_const<T>::type (& ptr)[C] ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( C )
|
||||
, m_ptr( ptr )
|
||||
{}
|
||||
|
||||
# if __GNUC__ >= 9
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Winit-list-lifetime"
|
||||
# endif
|
||||
|
||||
ArrayProxy( std::initializer_list<T> const & list ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( static_cast<uint32_t>( list.size() ) )
|
||||
, m_ptr( list.begin() )
|
||||
{}
|
||||
|
||||
template <typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
|
||||
ArrayProxy( std::initializer_list<typename std::remove_const<T>::type> const & list ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( static_cast<uint32_t>( list.size() ) )
|
||||
, m_ptr( list.begin() )
|
||||
{}
|
||||
|
||||
ArrayProxy( std::initializer_list<T> & list ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( static_cast<uint32_t>( list.size() ) )
|
||||
, m_ptr( list.begin() )
|
||||
{}
|
||||
|
||||
template <typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
|
||||
ArrayProxy( std::initializer_list<typename std::remove_const<T>::type> & list ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( static_cast<uint32_t>( list.size() ) )
|
||||
, m_ptr( list.begin() )
|
||||
{}
|
||||
|
||||
# if __GNUC__ >= 9
|
||||
# pragma GCC diagnostic pop
|
||||
# endif
|
||||
|
||||
// Any type with a .data() return type implicitly convertible to T*, and a .size() return type implicitly
|
||||
// convertible to size_t. The const version can capture temporaries, with lifetime ending at end of statement.
|
||||
template <typename V,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<decltype( std::declval<V>().data() ), T *>::value &&
|
||||
std::is_convertible<decltype( std::declval<V>().size() ), std::size_t>::value>::type * = nullptr>
|
||||
ArrayProxy( V const & v ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( static_cast<uint32_t>( v.size() ) )
|
||||
, m_ptr( v.data() )
|
||||
{}
|
||||
|
||||
template <typename V,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<decltype( std::declval<V>().data() ), T *>::value &&
|
||||
std::is_convertible<decltype( std::declval<V>().size() ), std::size_t>::value>::type * = nullptr>
|
||||
ArrayProxy( V & v ) VULKAN_HPP_NOEXCEPT
|
||||
: m_count( static_cast<uint32_t>( v.size() ) )
|
||||
, m_ptr( v.data() )
|
||||
{}
|
||||
|
||||
const T * begin() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
const T * end() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
return m_ptr + m_count;
|
||||
}
|
||||
|
||||
const T & front() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
VULKAN_HPP_ASSERT( m_count && m_ptr );
|
||||
return *m_ptr;
|
||||
}
|
||||
|
||||
const T & back() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
VULKAN_HPP_ASSERT( m_count && m_ptr );
|
||||
return *( m_ptr + m_count - 1 );
|
||||
}
|
||||
|
||||
bool empty() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
return ( m_count == 0 );
|
||||
}
|
||||
|
||||
uint32_t size() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
T * data() const VULKAN_HPP_NOEXCEPT
|
||||
{
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32_t m_count;
|
||||
T * m_ptr;
|
||||
};
|
||||
Reference in New Issue
Block a user