diff --git a/VulkanHppGenerator.cpp b/VulkanHppGenerator.cpp index e606cf3..2bf047b 100644 --- a/VulkanHppGenerator.cpp +++ b/VulkanHppGenerator.cpp @@ -5492,14 +5492,25 @@ int main(int argc, char **argv) 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(typename std::remove_reference::type & ptr) VULKAN_HPP_NOEXCEPT + ArrayProxy(T & value) VULKAN_HPP_NOEXCEPT : m_count(1) - , m_ptr(&ptr) + , m_ptr(&value) + {} + + template::value, int>::type = 0> + ArrayProxy(typename std::remove_const::type & value) VULKAN_HPP_NOEXCEPT + : m_count(1) + , m_ptr(&value) {} ArrayProxy(uint32_t count, T * ptr) VULKAN_HPP_NOEXCEPT @@ -5507,33 +5518,44 @@ int main(int argc, char **argv) , m_ptr(ptr) {} - template - ArrayProxy(std::array::type, N> & data) VULKAN_HPP_NOEXCEPT - : m_count(N) - , m_ptr(data.data()) + template::value, int>::type = 0> + ArrayProxy(uint32_t count, typename std::remove_const::type * ptr) VULKAN_HPP_NOEXCEPT + : m_count(count) + , m_ptr(ptr) {} - template - ArrayProxy(std::array::type, N> const& data) VULKAN_HPP_NOEXCEPT - : m_count(N) - , m_ptr(data.data()) + ArrayProxy(std::initializer_list const& list) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(list.size())) + , m_ptr(list.begin()) {} - template ::type>> - ArrayProxy(std::vector::type, Allocator> & data) VULKAN_HPP_NOEXCEPT - : m_count(static_cast(data.size())) - , m_ptr(data.data()) + 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()) {} - template ::type>> - ArrayProxy(std::vector::type, Allocator> const& data) VULKAN_HPP_NOEXCEPT - : m_count(static_cast(data.size())) - , m_ptr(data.data()) + ArrayProxy(std::initializer_list & list) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(list.size())) + , m_ptr(list.begin()) {} - ArrayProxy(std::initializer_list::type> const& data) VULKAN_HPP_NOEXCEPT - : m_count(static_cast(data.end() - data.begin())) - , m_ptr(data.begin()) + template::value, int>::type = 0> + ArrayProxy(std::initializer_list::type> & list) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(list.size())) + , m_ptr(list.begin()) + {} + + template + ArrayProxy(Container const& container) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(container.size())) + , m_ptr(container.data()) + {} + + template + ArrayProxy(Container & container) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(container.size())) + , m_ptr(container.data()) {} const T * begin() const VULKAN_HPP_NOEXCEPT diff --git a/tests/ArrayProxy/ArrayProxy.cpp b/tests/ArrayProxy/ArrayProxy.cpp new file mode 100644 index 0000000..19f5193 --- /dev/null +++ b/tests/ArrayProxy/ArrayProxy.cpp @@ -0,0 +1,172 @@ +// 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 : ArrayProxy +// Compile test on using vk::ArrayProxy + +#include "vulkan/vulkan.hpp" +#include + +static char const* AppName = "ArrayProxy"; +static char const* EngineName = "Vulkan.hpp"; + +void fct(vk::ArrayProxy /*ap*/) +{} + +void fctc(vk::ArrayProxy /*ap*/) +{} + +int main(int /*argc*/, char ** /*argv*/) +{ + try + { + // nullptr_t + fct(nullptr); + fctc(nullptr); + + vk::ArrayProxy ap0 = nullptr; + assert(ap0.size() == 0); + + // Type + //fct(2); // not supported: cannot convert from 'const int *' to 'T *' + fctc(1); + + int i0 = 1; + fct(i0); + fctc(i0); + + const int i1 = 2; + //fct(i1); // not supported: cannot convert from 'const int *' to 'T *' + 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 from 'const int *' to 'T *' + fctc({ 1, i1p }); + + // std::array + std::array sa0 = { 0, 1 }; + fct(sa0); + fctc(sa0); + + // std::array const + std::array sa1 = { 0, 1 }; + //fct(sa1); // not supported: cannot convert from '_Ty *' to 'T *' + fctc(sa1); + + std::array const sa2 = { 1, 2 }; + //fct(sa2); // not supported: cannot convert from 'const _Ty *' to 'T *' + fctc(sa2); + + std::array const sa3 = { 1, 2 }; + //fct(sa3); // not supported: cannot convert from '_Ty *' to 'T *' + fctc(sa3); + + vk::ArrayProxy ap2 = sa0; + assert(ap2.size() == 2); + //vk::ArrayProxy ap3 = sa1; // not supported: cannot convert from '_Ty *' to 'T *' + //vk::ArrayProxy ap4 = sa2; // not supported: cannot convert from '_Ty *' to 'T *' + //vk::ArrayProxy ap5 = sa3; // not supported: cannot convert from '_Ty *' to 'T *' + + vk::ArrayProxy ap6 = sa0; + assert(ap6.size() == 2); + vk::ArrayProxy ap7 = sa1; + assert(ap7.size() == 2); + vk::ArrayProxy ap8 = sa2; + assert(ap8.size() == 2); + vk::ArrayProxy ap9 = sa3; + assert(ap9.size() == 2); + + // std::vector + std::vector sv0 = { 0, 1 }; + fct(sv0); + fctc(sv0); + + std::vector const sv1 = { 0, 1 }; + //fct(sv1); // not supported: cannot convert from 'const _Ty *' to 'T *' + fctc(sv1); + + vk::ArrayProxy ap10 = sv0; + assert(ap10.size() == 2); + //vk::ArrayProxy ap11 = sv1; // not supported: cannot convert from '_Ty *' to 'T *' + + vk::ArrayProxy ap12 = sv0; + assert(ap12.size() == 2); + vk::ArrayProxy ap13 = sv1; + assert(ap13.size() == 2); + + // std::initializer_list + fct({}); + fctc({}); + + //fct({ 0, 1 }); // not supported: cannot convert from 'const _Elem *' to 'T *' + fctc({ 0, 1 }); + + int a = 0; + int b = 1; + //fct({ a, b }); // not supported: cannot convert from 'const _Elem *' to 'T *' + fctc({ a,b }); + + auto il0 = { 0, 1 }; // -> std::initializer_list + //fct(il0); // not supported: cannot convert from 'const _Elem *' to 'T *' + fctc(il0); + + std::initializer_list il1 = { 0, 1 }; + //fct(il1); // not supported: cannot convert from 'const _Elem *' to 'T *' + fctc(il1); + + std::initializer_list il2 = { 0, 1 }; + //fct(il2); // not supported: cannot convert from '_Elem *' to 'T *' + fctc(il2); + + std::initializer_list const il3 = { 0, 1 }; + //fct(il3); // not supported: cannot convert from 'const _Elem *' to 'T *' + fctc(il3); + + std::initializer_list const il4 = { 0, 1 }; + //fct(il4); // not supported: cannot convert from 'const _Elem *' to 'T *' + fctc(il4); + + //vk::ArrayProxy ap14 = il1; // not supported: cannot convert from 'const _Elem *' to 'T *' + //vk::ArrayProxy ap15 = il2; // not supported: cannot convert from '_Ty *' to 'T *' + //vk::ArrayProxy ap16 = il3; // not supported: cannot convert from '_Ty *' to 'T *' + //vk::ArrayProxy ap17 = il4; // not supported: cannot convert from '_Ty *' to 'T *' + + vk::ArrayProxy ap18 = il1; + assert(ap18.size() == 2); + vk::ArrayProxy ap19 = il2; + assert(ap19.size() == 2); + vk::ArrayProxy ap20 = il3; + assert(ap20.size() == 2); + vk::ArrayProxy 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/ArrayProxy/CMakeLists.txt b/tests/ArrayProxy/CMakeLists.txt new file mode 100644 index 0000000..0adcdc6 --- /dev/null +++ b/tests/ArrayProxy/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(ArrayProxy) + + set(HEADERS + ) + + set(SOURCES + ArrayProxy.cpp + ) + + source_group(headers FILES ${HEADERS}) + source_group(sources FILES ${SOURCES}) + + add_executable(ArrayProxy + ${HEADERS} + ${SOURCES} + ) + + set_target_properties(ArrayProxy PROPERTIES FOLDER "Tests") + target_link_libraries(ArrayProxy "${Vulkan_LIBRARIES}") +endif() \ No newline at end of file diff --git a/vulkan/vulkan.hpp b/vulkan/vulkan.hpp index 08be754..419ea33 100644 --- a/vulkan/vulkan.hpp +++ b/vulkan/vulkan.hpp @@ -185,14 +185,25 @@ namespace VULKAN_HPP_NAMESPACE 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(typename std::remove_reference::type & ptr) VULKAN_HPP_NOEXCEPT + ArrayProxy(T & value) VULKAN_HPP_NOEXCEPT : m_count(1) - , m_ptr(&ptr) + , m_ptr(&value) + {} + + template::value, int>::type = 0> + ArrayProxy(typename std::remove_const::type & value) VULKAN_HPP_NOEXCEPT + : m_count(1) + , m_ptr(&value) {} ArrayProxy(uint32_t count, T * ptr) VULKAN_HPP_NOEXCEPT @@ -200,33 +211,44 @@ namespace VULKAN_HPP_NAMESPACE , m_ptr(ptr) {} - template - ArrayProxy(std::array::type, N> & data) VULKAN_HPP_NOEXCEPT - : m_count(N) - , m_ptr(data.data()) + template::value, int>::type = 0> + ArrayProxy(uint32_t count, typename std::remove_const::type * ptr) VULKAN_HPP_NOEXCEPT + : m_count(count) + , m_ptr(ptr) {} - template - ArrayProxy(std::array::type, N> const& data) VULKAN_HPP_NOEXCEPT - : m_count(N) - , m_ptr(data.data()) + ArrayProxy(std::initializer_list const& list) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(list.size())) + , m_ptr(list.begin()) {} - template ::type>> - ArrayProxy(std::vector::type, Allocator> & data) VULKAN_HPP_NOEXCEPT - : m_count(static_cast(data.size())) - , m_ptr(data.data()) + 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()) {} - template ::type>> - ArrayProxy(std::vector::type, Allocator> const& data) VULKAN_HPP_NOEXCEPT - : m_count(static_cast(data.size())) - , m_ptr(data.data()) + ArrayProxy(std::initializer_list & list) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(list.size())) + , m_ptr(list.begin()) {} - ArrayProxy(std::initializer_list::type> const& data) VULKAN_HPP_NOEXCEPT - : m_count(static_cast(data.end() - data.begin())) - , m_ptr(data.begin()) + template::value, int>::type = 0> + ArrayProxy(std::initializer_list::type> & list) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(list.size())) + , m_ptr(list.begin()) + {} + + template + ArrayProxy(Container const& container) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(container.size())) + , m_ptr(container.data()) + {} + + template + ArrayProxy(Container & container) VULKAN_HPP_NOEXCEPT + : m_count(static_cast(container.size())) + , m_ptr(container.data()) {} const T * begin() const VULKAN_HPP_NOEXCEPT