diff --git a/VulkanHppGenerator.cpp b/VulkanHppGenerator.cpp index 950b06c..da3e8c3 100644 --- a/VulkanHppGenerator.cpp +++ b/VulkanHppGenerator.cpp @@ -9846,12 +9846,22 @@ int main( int argc, char ** argv ) , m_ptr( nullptr ) {} + ArrayProxyNoTemporaries( T & value ) VULKAN_HPP_NOEXCEPT + : m_count( 1 ) + , m_ptr( &value ) + {} + + ArrayProxyNoTemporaries( T && value ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( typename std::remove_const::type & value ) VULKAN_HPP_NOEXCEPT : m_count( 1 ) , m_ptr( &value ) {} + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( typename std::remove_const::type && value ) = delete; + ArrayProxyNoTemporaries( uint32_t count, T * ptr ) VULKAN_HPP_NOEXCEPT : m_count( count ) , m_ptr( ptr ) @@ -9868,25 +9878,33 @@ int main( int argc, char ** argv ) , m_ptr( list.begin() ) {} + ArrayProxyNoTemporaries( std::initializer_list const && list ) = delete; + template ::value, int>::type = 0> - ArrayProxyNoTemporaries( std::initializer_list::type> const & list ) VULKAN_HPP_NOEXCEPT + ArrayProxyNoTemporaries( std::initializer_list::type> const & list ) + VULKAN_HPP_NOEXCEPT : m_count( static_cast( list.size() ) ) , m_ptr( list.begin() ) {} + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::initializer_list::type> const && list ) = delete; + ArrayProxyNoTemporaries( std::initializer_list & list ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( list.size() ) ) , m_ptr( list.begin() ) {} + ArrayProxyNoTemporaries( std::initializer_list && list ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::initializer_list::type> & list ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( list.size() ) ) , m_ptr( list.begin() ) {} - ArrayProxyNoTemporaries( std::initializer_list const && list ) VULKAN_HPP_NOEXCEPT = delete; - ArrayProxyNoTemporaries( std::initializer_list && list ) VULKAN_HPP_NOEXCEPT = delete; + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::initializer_list::type> && list ) = delete; template ArrayProxyNoTemporaries( std::array const & data ) VULKAN_HPP_NOEXCEPT @@ -9894,28 +9912,35 @@ int main( int argc, char ** argv ) , m_ptr( data.data() ) {} + template + ArrayProxyNoTemporaries( std::array const && data ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::array::type, N> const & data ) VULKAN_HPP_NOEXCEPT : m_count( N ) , m_ptr( data.data() ) {} + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::array::type, N> const && data ) = delete; + template ArrayProxyNoTemporaries( std::array & data ) VULKAN_HPP_NOEXCEPT : m_count( N ) , m_ptr( data.data() ) {} + template + ArrayProxyNoTemporaries( std::array && data ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::array::type, N> & data ) VULKAN_HPP_NOEXCEPT : m_count( N ) , m_ptr( data.data() ) {} - template - ArrayProxyNoTemporaries( std::array const && data ) VULKAN_HPP_NOEXCEPT = delete; - template - ArrayProxyNoTemporaries( std::array && data ) VULKAN_HPP_NOEXCEPT = delete; + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::array::type, N> && data ) = delete; template ::type>> ArrayProxyNoTemporaries( std::vector const & data ) VULKAN_HPP_NOEXCEPT @@ -9923,20 +9948,32 @@ int main( int argc, char ** argv ) , m_ptr( data.data() ) {} + template ::type>> + ArrayProxyNoTemporaries( std::vector const && data ) = delete; + template ::type>, typename B = T, typename std::enable_if::value, int>::type = 0> - ArrayProxyNoTemporaries( std::vector::type, Allocator> const & data ) VULKAN_HPP_NOEXCEPT + ArrayProxyNoTemporaries( std::vector::type, Allocator> const & data ) + VULKAN_HPP_NOEXCEPT : m_count( static_cast( data.size() ) ) , m_ptr( data.data() ) {} + template ::type>, + typename B = T, + typename std::enable_if::value, int>::type = 0> + ArrayProxyNoTemporaries( std::vector::type, Allocator> const && data ) = delete; + template ::type>> ArrayProxyNoTemporaries( std::vector & data ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( data.size() ) ) , m_ptr( data.data() ) {} + template ::type>> + ArrayProxyNoTemporaries( std::vector && data ) = delete; + template ::type>, typename B = T, typename std::enable_if::value, int>::type = 0> @@ -9945,8 +9982,10 @@ int main( int argc, char ** argv ) , m_ptr( data.data() ) {} - ArrayProxyNoTemporaries( std::vector const && data ) VULKAN_HPP_NOEXCEPT = delete; - ArrayProxyNoTemporaries( std::vector && data ) VULKAN_HPP_NOEXCEPT = delete; + template ::type>, + typename B = T, + typename std::enable_if::value, int>::type = 0> + ArrayProxyNoTemporaries( std::vector::type, Allocator> && data ) = delete; const T * begin() const VULKAN_HPP_NOEXCEPT { diff --git a/tests/ArrayProxyNoTemporaries/ArrayProxyNoTemporaries.cpp b/tests/ArrayProxyNoTemporaries/ArrayProxyNoTemporaries.cpp new file mode 100644 index 0000000..be27ecc --- /dev/null +++ b/tests/ArrayProxyNoTemporaries/ArrayProxyNoTemporaries.cpp @@ -0,0 +1,233 @@ +// Copyright(c) 2018, NVIDIA CORPORATION. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// VulkanHpp Samples : ArrayProxyNoTemporaries +// Compile test on using vk::ArrayProxyNoTemporaries + +#include "vulkan/vulkan.hpp" +#include + +static char const* AppName = "ArrayProxyNoTemporaries"; +static char const* EngineName = "Vulkan.hpp"; + +void fct(vk::ArrayProxyNoTemporaries /*ap*/) +{} + +void fctc(vk::ArrayProxyNoTemporaries /*ap*/) +{} + +int getInt() +{ + return 1; +} + +std::array getArray() +{ + return { 1, 2 }; +} + +std::array const getConstArray() +{ + return { 1, 2 }; +} + +std::vector getVector() +{ + return { 1, 2 }; +} + +std::vector const getConstVector() +{ + return { 1, 2 }; +} + +std::initializer_list getInitializerList() +{ + return { 1, 2 }; +} + +std::initializer_list const getConstInitializerList() +{ + return { 1, 2 }; +} + +int main( int /*argc*/, char ** /*argv*/ ) +{ + try + { + // nullptr_t + fct(nullptr); + fctc(nullptr); + + vk::ArrayProxyNoTemporaries ap0 = nullptr; + assert(ap0.size() == 0); + + // Type + //fct(2); // not supported: attempting to reference a deleted function + //fctc(1); // not supported: attempting to reference a deleted function + + // getInt() + //fct( getInt() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( T && value ) + //fctc( getInt() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( typename std::remove_const::type && value ) + + int i0 = 1; + fct(i0); + fctc(i0); + + const int i1 = 2; + //fct(i1); // not supported: cannot convert argument 1 from 'const int' to 'vk::ArrayProxyNoTemporaries' + fctc(i1); + + // count, T * + int* i0p = &i0; + fct({ 1, i0p }); + fctc({ 1, i0p }); + + // count, T const* + int const* i1p = &i1; + //fct({ 1, i1p }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxyNoTemporaries' + fctc({ 1, i1p }); + + // std::array + std::array sa0 = { 0, 1 }; + fct(sa0); + fctc(sa0); + + // std::array + std::array sa1 = { 0, 1 }; + //fct(sa1); // not supported: cannot convert argument 1 from 'std::array' to 'vk::ArrayProxyNoTemporaries' + fctc(sa1); + + // std::array const + std::array const sa2 = { 1, 2 }; + //fct(sa2); // not supported: cannot convert from 'const int *' to 'int *' + fctc(sa2); + + // std::array const + std::array const sa3 = { 1, 2 }; + //fct(sa3); // not supported: cannot convert argument 1 from 'const std::array' to 'vk::ArrayProxyNoTemporaries' + fctc(sa3); + + // getArray + //fct( getConstArray() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::array const && data ) + //fctc( getConstArray() ); // // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::array::type> const && data ) + //fct( getArray() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::array && data ) + //fctc( getArray() ); // // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::array::type, N> && data ) + + // from std::array constructors + vk::ArrayProxyNoTemporaries ap2 = sa0; + assert(ap2.size() == 2); + //vk::ArrayProxyNoTemporaries ap3 = sa1; // not supported: cannot convert from 'std::array' to 'vk::ArrayProxyNoTemporaries' + //vk::ArrayProxyNoTemporaries ap4 = sa2; // not supported: cannot convert from 'int *' to 'int *' + //vk::ArrayProxyNoTemporaries ap5 = sa3; // not supported: cannot convert from 'const std::array' to 'vk::ArrayProxyNoTemporaries' + + vk::ArrayProxyNoTemporaries ap6 = sa0; + assert(ap6.size() == 2); + vk::ArrayProxyNoTemporaries ap7 = sa1; + assert(ap7.size() == 2); + vk::ArrayProxyNoTemporaries ap8 = sa2; + assert(ap8.size() == 2); + vk::ArrayProxyNoTemporaries ap9 = sa3; + assert(ap9.size() == 2); + + // std::vector + std::vector sv0 = { 0, 1 }; + fct(sv0); + fctc(sv0); + + // std::vector const + std::vector const sv1 = { 0, 1 }; + //fct(sv1); // not supported: cannot convert from 'const int *' to 'int *' + fctc(sv1); + + vk::ArrayProxyNoTemporaries ap10 = sv0; + assert(ap10.size() == 2); + //vk::ArrayProxyNoTemporaries ap11 = sv1; // not supported: cannot convert from 'int *' to 'int *' + + // getVector + //fct( getConstVector() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::vector const && data ) + //fctc( getConstVector() ); // // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::vector::type, Allocator> const && data ) + //fct( getVector() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::vector && data ) + //fctc( getVector() ); // // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::vector::type> && data ) + + vk::ArrayProxyNoTemporaries ap12 = sv0; + assert(ap12.size() == 2); + vk::ArrayProxyNoTemporaries ap13 = sv1; + assert(ap13.size() == 2); + + // std::initializer_list + fct({}); + fctc({}); + + //fct({ 0, 1 }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxyNoTemporaries' + //fctc({ 0, 1 }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxyNoTemporaries' + + //int a = 0; + //int b = 1; + //fct({ a, b }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxyNoTemporaries' + //fctc({ a,b }); // not supported: cannot convert argument 1 from 'initializer list' to 'vk::ArrayProxyNoTemporaries' + + auto il0 = { 0, 1 }; // -> std::initializer_list + //fct(il0); // not supported: cannot convert from 'const int *' to 'int *' + fctc(il0); + + std::initializer_list il1 = { 0, 1 }; + //fct(il1); // not supported: cannot convert from 'const int *' to 'int *' + fctc(il1); + + std::initializer_list il2 = { 0, 1 }; + //fct(il2); // not supported: cannot convert argument 1 from 'std::initializer_list' to 'vk::ArrayProxyNoTemporaries' + fctc(il2); + + std::initializer_list const il3 = { 0, 1 }; + //fct(il3); // not supported: cannot convert from 'const int *' to 'int *' + fctc(il3); + + std::initializer_list const il4 = { 0, 1 }; + //fct(il4); // not supported: cannot convert argument 1 from 'const std::initializer_list' to 'vk::ArrayProxyNoTemporaries' + fctc(il4); + + // getInitializerList + //fct( getConstInitializerList() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::initializer_list const && list ) + //fctc( getConstInitializerList() ); // // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::initializer_list::type> const && list ) + //fct( getInitializerList() ); // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::initializer_list && list ) + //fctc( getInitializerList() ); // // not supported: attempting to reference a deleted function: ArrayProxyNoTemporaries( std::initializer_list::type> && list ) + + //vk::ArrayProxyNoTemporaries ap14 = il1; // not supported: cannot convert from 'const int *' to 'int *' + //vk::ArrayProxyNoTemporaries ap15 = il2; // not supported: cannot convert from 'std::initializer_list' to 'vk::ArrayProxyNoTemporaries' + //vk::ArrayProxyNoTemporaries ap16 = il3; // not supported: cannot convert from 'const int *' to 'int *' + //vk::ArrayProxyNoTemporaries ap17 = il4; // not supported: cannot convert from 'const std::initializer_list' to 'vk::ArrayProxyNoTemporaries' + + vk::ArrayProxyNoTemporaries ap18 = il1; + assert(ap18.size() == 2); + vk::ArrayProxyNoTemporaries ap19 = il2; + assert(ap19.size() == 2); + vk::ArrayProxyNoTemporaries ap20 = il3; + assert(ap20.size() == 2); + vk::ArrayProxyNoTemporaries ap21 = il4; + assert(ap21.size() == 2); + } + catch (vk::SystemError const& err) + { + std::cout << "vk::SystemError: " << err.what() << std::endl; + exit(-1); + } + catch (...) + { + std::cout << "unknown error\n"; + exit(-1); + } + + return 0; +} diff --git a/tests/ArrayProxyNoTemporaries/CMakeLists.txt b/tests/ArrayProxyNoTemporaries/CMakeLists.txt new file mode 100644 index 0000000..3e4a4b7 --- /dev/null +++ b/tests/ArrayProxyNoTemporaries/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright(c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required(VERSION 3.2) + +if (NOT TESTS_BUILD_ONLY_DYNAMIC) + project(ArrayProxyNoTemporaries) + + set(HEADERS + ) + + set(SOURCES + ArrayProxyNoTemporaries.cpp + ) + + source_group(headers FILES ${HEADERS}) + source_group(sources FILES ${SOURCES}) + + add_executable(ArrayProxyNoTemporaries + ${HEADERS} + ${SOURCES} + ) + + set_target_properties(ArrayProxyNoTemporaries PROPERTIES FOLDER "Tests") + target_link_libraries(ArrayProxyNoTemporaries "${Vulkan_LIBRARIES}") +endif() \ No newline at end of file diff --git a/vulkan/vulkan.hpp b/vulkan/vulkan.hpp index 2ecc679..5b4299c 100644 --- a/vulkan/vulkan.hpp +++ b/vulkan/vulkan.hpp @@ -382,12 +382,22 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( nullptr ) {} + ArrayProxyNoTemporaries( T & value ) VULKAN_HPP_NOEXCEPT + : m_count( 1 ) + , m_ptr( &value ) + {} + + ArrayProxyNoTemporaries( T && value ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( typename std::remove_const::type & value ) VULKAN_HPP_NOEXCEPT : m_count( 1 ) , m_ptr( &value ) {} + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( typename std::remove_const::type && value ) = delete; + ArrayProxyNoTemporaries( uint32_t count, T * ptr ) VULKAN_HPP_NOEXCEPT : m_count( count ) , m_ptr( ptr ) @@ -404,6 +414,8 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( list.begin() ) {} + ArrayProxyNoTemporaries( std::initializer_list const && list ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::initializer_list::type> const & list ) VULKAN_HPP_NOEXCEPT @@ -411,19 +423,24 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( list.begin() ) {} + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::initializer_list::type> const && list ) = delete; + ArrayProxyNoTemporaries( std::initializer_list & list ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( list.size() ) ) , m_ptr( list.begin() ) {} + ArrayProxyNoTemporaries( std::initializer_list && list ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::initializer_list::type> & list ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( list.size() ) ) , m_ptr( list.begin() ) {} - ArrayProxyNoTemporaries( std::initializer_list const && list ) VULKAN_HPP_NOEXCEPT = delete; - ArrayProxyNoTemporaries( std::initializer_list && list ) VULKAN_HPP_NOEXCEPT = delete; + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::initializer_list::type> && list ) = delete; template ArrayProxyNoTemporaries( std::array const & data ) VULKAN_HPP_NOEXCEPT @@ -431,28 +448,35 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( data.data() ) {} + template + ArrayProxyNoTemporaries( std::array const && data ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::array::type, N> const & data ) VULKAN_HPP_NOEXCEPT : m_count( N ) , m_ptr( data.data() ) {} + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::array::type, N> const && data ) = delete; + template ArrayProxyNoTemporaries( std::array & data ) VULKAN_HPP_NOEXCEPT : m_count( N ) , m_ptr( data.data() ) {} + template + ArrayProxyNoTemporaries( std::array && data ) = delete; + template ::value, int>::type = 0> ArrayProxyNoTemporaries( std::array::type, N> & data ) VULKAN_HPP_NOEXCEPT : m_count( N ) , m_ptr( data.data() ) {} - template - ArrayProxyNoTemporaries( std::array const && data ) VULKAN_HPP_NOEXCEPT = delete; - template - ArrayProxyNoTemporaries( std::array && data ) VULKAN_HPP_NOEXCEPT = delete; + template ::value, int>::type = 0> + ArrayProxyNoTemporaries( std::array::type, N> && data ) = delete; template ::type>> ArrayProxyNoTemporaries( std::vector const & data ) VULKAN_HPP_NOEXCEPT @@ -460,6 +484,9 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( data.data() ) {} + template ::type>> + ArrayProxyNoTemporaries( std::vector const && data ) = delete; + template ::type>, typename B = T, typename std::enable_if::value, int>::type = 0> @@ -469,12 +496,20 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( data.data() ) {} + template ::type>, + typename B = T, + typename std::enable_if::value, int>::type = 0> + ArrayProxyNoTemporaries( std::vector::type, Allocator> const && data ) = delete; + template ::type>> ArrayProxyNoTemporaries( std::vector & data ) VULKAN_HPP_NOEXCEPT : m_count( static_cast( data.size() ) ) , m_ptr( data.data() ) {} + template ::type>> + ArrayProxyNoTemporaries( std::vector && data ) = delete; + template ::type>, typename B = T, typename std::enable_if::value, int>::type = 0> @@ -483,8 +518,10 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr( data.data() ) {} - ArrayProxyNoTemporaries( std::vector const && data ) VULKAN_HPP_NOEXCEPT = delete; - ArrayProxyNoTemporaries( std::vector && data ) VULKAN_HPP_NOEXCEPT = delete; + template ::type>, + typename B = T, + typename std::enable_if::value, int>::type = 0> + ArrayProxyNoTemporaries( std::vector::type, Allocator> && data ) = delete; const T * begin() const VULKAN_HPP_NOEXCEPT {