Merge pull request #1288 from phantom10111/array-proxy-with-raw-arrays

Add ArrayProxy constructors with support for raw array with size
This commit is contained in:
Andreas Süßenbach 2022-04-19 17:38:31 +02:00 committed by GitHub
commit 828ac8e246
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 226 additions and 66 deletions

View File

@ -185,6 +185,10 @@ c.setScissor(0, scissorRect);
// pass a temporary value.
c.setScissor(0, { { 0, 0 },{ 640, 480 } });
// pass a fixed size array
vk::Rect2D scissorRects[2] = { { { 0, 0 }, { 320, 240 } }, { { 320, 240 }, { 320, 240 } } };
c.setScissor(0, scissorRects);
// generate a std::initializer_list using two rectangles from the stack. This might generate a copy of the rectangles.
vk::Rect2D scissorRect1 = { { 0, 0 },{ 320, 240 } };
vk::Rect2D scissorRect2 = { { 320, 240 },{ 320, 240 } };

View File

@ -14860,6 +14860,18 @@ int main( int argc, char ** argv )
, 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"
@ -14995,6 +15007,24 @@ int main( int argc, char ** argv )
, m_ptr( ptr )
{}
template <std::size_t C>
ArrayProxyNoTemporaries( T (& ptr)[C] ) VULKAN_HPP_NOEXCEPT
: m_count( C )
, m_ptr( ptr )
{}
template <std::size_t C>
ArrayProxyNoTemporaries( T (&& ptr)[C] ) = delete;
template <std::size_t C, typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
ArrayProxyNoTemporaries( typename std::remove_const<T>::type (& 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>
ArrayProxyNoTemporaries( typename std::remove_const<T>::type (&& ptr)[C] ) = delete;
ArrayProxyNoTemporaries( std::initializer_list<T> const & list ) VULKAN_HPP_NOEXCEPT
: m_count( static_cast<uint32_t>( list.size() ) )
, m_ptr( list.begin() )

View File

@ -52,6 +52,13 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct(i1); // not supported: cannot convert argument 1 from 'const int' to 'vk::ArrayProxy<int>'
fctc( i1 );
vk::ArrayProxy<const int> ap1 = 1;
assert( ap1.size() == 1 );
vk::ArrayProxy<const int> ap2 = i0;
assert( ap2.size() == 1 );
vk::ArrayProxy<const int> ap3 = i1;
assert( ap3.size() == 1 );
// count, T *
int * i0p = &i0;
fct( { 1, i0p } );
@ -62,6 +69,26 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct({ 1, i1p }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxy<int>'
fctc( { 1, i1p } );
vk::ArrayProxy<const int> ap4 = { 1, i0p };
assert( ap4.size() == 1 );
vk::ArrayProxy<const int> ap5 = { 1, i1p };
assert( ap5.size() == 1 );
// T[count]
int ia0[2] = { 0, 1 };
fct( ia0 );
fctc( ia0 );
// const T[count]
const int ia1[2] = { 0, 1 };
// fct( ia1 ); // not supported: cannot convert argument 1 from 'const int [2]' to 'vk::ArrayProxy<int>'
fctc( ia1 );
vk::ArrayProxy<const int> ap6 = ia0;
assert( ap6.size() == 2 );
vk::ArrayProxy<const int> ap7 = ia1;
assert( ap7.size() == 2 );
// std::array<T,N>
std::array<int, 2> sa0 = { 0, 1 };
fct( sa0 );
@ -80,20 +107,20 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct(sa3); // not supported: cannot convert argument 1 from 'const std::array<const int,2>' to 'vk::ArrayProxy<int>'
fctc( sa3 );
vk::ArrayProxy<int> ap2 = sa0;
assert( ap2.size() == 2 );
// vk::ArrayProxy<int> ap3 = sa1; // not supported: cannot convert from 'std::array<const int,2>' to 'vk::ArrayProxy<int>'
// vk::ArrayProxy<int> ap4 = sa2; // not supported: cannot convert from '_Ty *' to 'T *'
// vk::ArrayProxy<int> ap5 = sa3; // not supported: cannot convert from 'const std::array<const int,2>' to 'vk::ArrayProxy<int>'
vk::ArrayProxy<const int> ap6 = sa0;
assert( ap6.size() == 2 );
vk::ArrayProxy<const int> ap7 = sa1;
assert( ap7.size() == 2 );
vk::ArrayProxy<const int> ap8 = sa2;
vk::ArrayProxy<int> ap8 = sa0;
assert( ap8.size() == 2 );
vk::ArrayProxy<const int> ap9 = sa3;
assert( ap9.size() == 2 );
// vk::ArrayProxy<int> ap9 = sa1; // not supported: cannot convert from 'std::array<const int,2>' to 'vk::ArrayProxy<int>'
// vk::ArrayProxy<int> ap10 = sa2; // not supported: cannot convert from '_Ty *' to 'T *'
// vk::ArrayProxy<int> ap11 = sa3; // not supported: cannot convert from 'const std::array<const int,2>' to 'vk::ArrayProxy<int>'
vk::ArrayProxy<const int> ap12 = sa0;
assert( ap12.size() == 2 );
vk::ArrayProxy<const int> ap13 = sa1;
assert( ap13.size() == 2 );
vk::ArrayProxy<const int> ap14 = sa2;
assert( ap14.size() == 2 );
vk::ArrayProxy<const int> ap15 = sa3;
assert( ap15.size() == 2 );
// std::vector<T>
std::vector<int> sv0 = { 0, 1 };
@ -104,14 +131,14 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct(sv1); // not supported: cannot convert from 'const _Ty *' to 'T *'
fctc( sv1 );
vk::ArrayProxy<int> ap10 = sv0;
assert( ap10.size() == 2 );
// vk::ArrayProxy<int> ap11 = sv1; // not supported: cannot convert from '_Ty *' to 'T *'
vk::ArrayProxy<int> ap16 = sv0;
assert( ap16.size() == 2 );
// vk::ArrayProxy<int> ap17 = sv1; // not supported: cannot convert from '_Ty *' to 'T *'
vk::ArrayProxy<const int> ap12 = sv0;
assert( ap12.size() == 2 );
vk::ArrayProxy<const int> ap13 = sv1;
assert( ap13.size() == 2 );
vk::ArrayProxy<const int> ap18 = sv0;
assert( ap18.size() == 2 );
vk::ArrayProxy<const int> ap19 = sv1;
assert( ap19.size() == 2 );
// std::initializer_list
fct( {} );
@ -145,19 +172,23 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct(il4); // not supported: cannot convert argument 1 from 'const std::initializer_list<T>' to 'vk::ArrayProxy<int>'
fctc( il4 );
// vk::ArrayProxy<int> ap14 = il1; // not supported: cannot convert from 'const _Elem *' to 'T *'
// vk::ArrayProxy<int> ap15 = il2; // not supported: cannot convert from 'std::initializer_list<T>' to 'vk::ArrayProxy<int>'
// vk::ArrayProxy<int> ap16 = il3; // not supported: cannot convert from 'const _Elem *' to 'T *'
// vk::ArrayProxy<int> ap17 = il4; // not supported: cannot convert from 'const std::initializer_list<T>' to 'vk::ArrayProxy<int>'
// vk::ArrayProxy<int> ap20 = il1; // not supported: cannot convert from 'const _Elem *' to 'T *'
// vk::ArrayProxy<int> ap21 = il2; // not supported: cannot convert from 'std::initializer_list<T>' to 'vk::ArrayProxy<int>'
// vk::ArrayProxy<int> ap22 = il3; // not supported: cannot convert from 'const _Elem *' to 'T *'
// vk::ArrayProxy<int> ap23 = il4; // not supported: cannot convert from 'const std::initializer_list<T>' to 'vk::ArrayProxy<int>'
vk::ArrayProxy<const int> ap18 = il1;
assert( ap18.size() == 2 );
vk::ArrayProxy<const int> ap19 = il2;
assert( ap19.size() == 2 );
vk::ArrayProxy<const int> ap20 = il3;
assert( ap20.size() == 2 );
vk::ArrayProxy<const int> ap21 = il4;
assert( ap21.size() == 2 );
vk::ArrayProxy<const int> ap24 = {};
assert( ap24.size() == 0 );
vk::ArrayProxy<const int> ap25 = { 0, 1 };
assert( ap25.size() == 2 );
vk::ArrayProxy<const int> ap26 = il1;
assert( ap26.size() == 2 );
vk::ArrayProxy<const int> ap27 = il2;
assert( ap27.size() == 2 );
vk::ArrayProxy<const int> ap28 = il3;
assert( ap28.size() == 2 );
vk::ArrayProxy<const int> ap29 = il4;
assert( ap29.size() == 2 );
#if defined( VULKAN_HPP_SUPPORT_SPAN )
// std::span<T, N>
@ -177,6 +208,15 @@ int main( int /*argc*/, char ** /*argv*/ )
std::span<const int> const ss3( sa3.begin(), sa3.end() );
// fct(ss3); // not supported: cannot convert from 'const std::span<const int>' to 'vk::ArrayProxy<int>'
fctc( ss3 );
vk::ArrayProxy<const int> ap30 = ss0;
assert( ap30.size() == 2 );
vk::ArrayProxy<const int> ap31 = ss1;
assert( ap31.size() == 2 );
vk::ArrayProxy<const int> ap32 = ss2;
assert( ap32.size() == 2 );
vk::ArrayProxy<const int> ap33 = ss3;
assert( ap33.size() == 2 );
#endif
}
catch ( vk::SystemError const & err )

View File

@ -38,6 +38,18 @@ int getInt()
return 1;
}
int( &&getArrayReference() )[2]
{
static int arr[2] = { 1, 2 };
return std::move( arr );
}
int const( &&getConstArrayReference() )[2]
{
static int const arr[2] = { 1, 2 };
return std::move( arr );
}
std::array<int, 2> getArray()
{
return { 1, 2 };
@ -98,6 +110,13 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct(i1); // not supported: ArrayProxyNoTemporaries<const int&>(const int &)
fctc( i1 );
// vk::ArrayProxyNoTemporaries<const int> ap1 = 1; // not supported: ArrayProxyNoTemporaries<const int>::ArrayProxyNoTemporaries<T,0>(int &&)
vk::ArrayProxyNoTemporaries<const int> ap2 = i0;
assert( ap2.size() == 1 );
vk::ArrayProxyNoTemporaries<const int> ap3 = i1;
assert( ap3.size() == 1 );
// count, T *
int * i0p = &i0;
fct( { 1, i0p } );
@ -108,6 +127,32 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct({ 1, i1p }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxyNoTemporaries<int>'
fctc( { 1, i1p } );
vk::ArrayProxyNoTemporaries<const int> ap4 = { 1, i0p };
assert( ap4.size() == 1 );
vk::ArrayProxyNoTemporaries<const int> ap5 = { 1, i1p };
assert( ap5.size() == 1 );
// T[count]
int ia0[2] = { 0, 1 };
fct( ia0 );
fctc( ia0 );
// const T[count]
const int ia1[2] = { 0, 1 };
// fct( ia1 ); // not supported: cannot convert argument 1 from 'const int [2]' to 'vk::ArrayProxyNoTemporaries<int>'
fctc( ia1 );
vk::ArrayProxyNoTemporaries<const int> ap6 = ia0;
assert( ap6.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap7 = ia1;
assert( ap7.size() == 2 );
// getArrayReference
// fct( getConstArrayReference() ); // not supported
// fctc( getConstArrayReference() ); // not supported
// fct( getArrayReference() ); // not supported
// fctc( getArrayReference() ); // not supported
// std::array<T,N>
std::array<int, 2> sa0 = { 0, 1 };
fct( sa0 );
@ -135,21 +180,22 @@ int main( int /*argc*/, char ** /*argv*/ )
// fctc( getArray() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<std::array<int,2>>(V &&)
// from std::array constructors
vk::ArrayProxyNoTemporaries<int> ap2 = sa0;
assert( ap2.size() == 2 );
// vk::ArrayProxyNoTemporaries<int> ap3 = sa1; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<std::array<const
// int,2>&>(V) vk::ArrayProxyNoTemporaries<int> ap4 = sa2; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// std::array<int,2>&>(V) vk::ArrayProxyNoTemporaries<int> ap5 = sa3; // not supported: attempting to reference a deleted function:
vk::ArrayProxyNoTemporaries<int> ap8 = sa0;
assert( ap8.size() == 2 );
// vk::ArrayProxyNoTemporaries<int> ap9 = sa1; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<std::array<const
// int,2>&>(V) vk::ArrayProxyNoTemporaries<int> ap10 = sa2; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// std::array<int,2>&>(V) vk::ArrayProxyNoTemporaries<int> ap11 = sa3; // not supported: attempting to reference a deleted function:
// ArrayProxyNoTemporaries<const std::array<const int,2>&>(V)
vk::ArrayProxyNoTemporaries<const int> ap6 = sa0;
assert( ap6.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap7 = sa1;
assert( ap7.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap8 = sa2;
assert( ap8.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap9 = sa3;
assert( ap9.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap12 = sa0;
assert( ap12.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap13 = sa1;
assert( ap13.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap14 = sa2;
assert( ap14.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap15 = sa3;
assert( ap15.size() == 2 );
// std::vector<T>
std::vector<int> sv0 = { 0, 1 };
@ -161,11 +207,6 @@ int main( int /*argc*/, char ** /*argv*/ )
// fct(sv1); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const std::vector<int,std::allocator<int>>&>(V)
fctc( sv1 );
vk::ArrayProxyNoTemporaries<int> ap10 = sv0;
assert( ap10.size() == 2 );
// vk::ArrayProxyNoTemporaries<int> ap11 = sv1; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// std::vector<int,std::allocator<int>>&>(V)
// getVector
// fct( getConstVector() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// std::vector<int,std::allocator<int>>>(V &&) fctc( getConstVector() ); // not supported: attempting to reference a deleted function:
@ -173,10 +214,16 @@ int main( int /*argc*/, char ** /*argv*/ )
// function: ArrayProxyNoTemporaries<std::vector<int,std::allocator<int>>>(V &&) fctc( getVector() ); // not supported: attempting to reference a
// deleted function: ArrayProxyNoTemporaries<std::vector<int,std::allocator<int>>>(V &&)
vk::ArrayProxyNoTemporaries<const int> ap12 = sv0;
assert( ap12.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap13 = sv1;
assert( ap13.size() == 2 );
vk::ArrayProxyNoTemporaries<int> ap16 = sv0;
assert( ap16.size() == 2 );
// vk::ArrayProxyNoTemporaries<int> ap17 = sv1; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// std::vector<int,std::allocator<int>>&>(V)
vk::ArrayProxyNoTemporaries<const int> ap18 = sv0;
assert( ap18.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap19 = sv1;
assert( ap19.size() == 2 );
// std::initializer_list
fct( {} );
@ -217,20 +264,25 @@ int main( int /*argc*/, char ** /*argv*/ )
// deleted function: ArrayProxyNoTemporaries(std::initializer_list<int> &&) fctc( getInitializerList() ); // not supported: attempting to reference
// a deleted function: ArrayProxyNoTemporaries<T,0>(std::initializer_list<int> &&)
// vk::ArrayProxyNoTemporaries<int> ap14 = il1; // not supported: cannot convert from 'const int *' to 'int *'
// vk::ArrayProxyNoTemporaries<int> ap15 = il2; // not supported: attempting to reference a deleted function:
// ArrayProxyNoTemporaries<std::initializer_list<T>&>(V) vk::ArrayProxyNoTemporaries<int> ap16 = il3; // not supported: cannot convert from 'const int *'
// to 'int *' vk::ArrayProxyNoTemporaries<int> ap17 = il4; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// vk::ArrayProxyNoTemporaries<int> ap20 = il1; // not supported: cannot convert from 'const int *' to 'int *'
// vk::ArrayProxyNoTemporaries<int> ap21 = il2; // not supported: attempting to reference a deleted function:
// ArrayProxyNoTemporaries<std::initializer_list<T>&>(V) vk::ArrayProxyNoTemporaries<int> ap22 = il3; // not supported: cannot convert from 'const int *'
// to 'int *' vk::ArrayProxyNoTemporaries<int> ap23 = il4; // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries<const
// std::initializer_list<T>&>(V)
vk::ArrayProxyNoTemporaries<const int> ap18 = il1;
assert( ap18.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap19 = il2;
assert( ap19.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap20 = il3;
assert( ap20.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap21 = il4;
assert( ap21.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap24 = {};
assert( ap24.size() == 0 );
//vk::ArrayProxyNoTemporaries<const int> ap25 = { 0, 1 }; // not supported
vk::ArrayProxyNoTemporaries<const int> ap26 = il1;
assert( ap26.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap27 = il2;
assert( ap27.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap28 = il3;
assert( ap28.size() == 2 );
vk::ArrayProxyNoTemporaries<const int> ap29 = il4;
assert( ap29.size() == 2 );
}
catch ( vk::SystemError const & err )
{

View File

@ -283,6 +283,20 @@ namespace VULKAN_HPP_NAMESPACE
{
}
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"
@ -428,6 +442,26 @@ namespace VULKAN_HPP_NAMESPACE
{
}
template <std::size_t C>
ArrayProxyNoTemporaries( T ( &ptr )[C] ) VULKAN_HPP_NOEXCEPT
: m_count( C )
, m_ptr( ptr )
{
}
template <std::size_t C>
ArrayProxyNoTemporaries( T( &&ptr )[C] ) = delete;
template <std::size_t C, typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
ArrayProxyNoTemporaries( typename std::remove_const<T>::type ( &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>
ArrayProxyNoTemporaries( typename std::remove_const<T>::type( &&ptr )[C] ) = delete;
ArrayProxyNoTemporaries( std::initializer_list<T> const & list ) VULKAN_HPP_NOEXCEPT
: m_count( static_cast<uint32_t>( list.size() ) )
, m_ptr( list.begin() )