template 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 const & value ) VULKAN_HPP_NOEXCEPT : m_count( 1 ) , m_ptr( &value ) {} ArrayProxy( uint32_t count, T const * ptr ) VULKAN_HPP_NOEXCEPT : m_count( count ) , m_ptr( ptr ) {} template ArrayProxy( T const ( &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 const & list ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( list.size() ) ) , m_ptr( list.begin() ) {} template ::value, int>::type = 0> ArrayProxy( std::initializer_list::type> const & list ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( 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 ().data() ), T *>::value && std::is_convertible().size() ), std::size_t>::value>::type * = nullptr> ArrayProxy( V const & v ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( 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 const * data() const VULKAN_HPP_NOEXCEPT { return m_ptr; } private: uint32_t m_count; T const * m_ptr; };