From 18da9fdcfd2374c742c5a20d00239c62527aa599 Mon Sep 17 00:00:00 2001 From: Alexandros Frantzis Date: Fri, 1 May 2020 15:11:26 +0300 Subject: [PATCH] Provide rvalue cast operator for ResultValue Allows objects returned as ResultValue (instead of ResultValueType::type) to be moved without requiring additional casting or explicit use of ResultValue::value. Resolves #589 --- VulkanHppGenerator.cpp | 5 +++ tests/ResultValueRValue/CMakeLists.txt | 38 +++++++++++++++++++ tests/ResultValueRValue/ResultValueRValue.cpp | 38 +++++++++++++++++++ vulkan/vulkan.hpp | 5 +++ 4 files changed, 86 insertions(+) create mode 100644 tests/ResultValueRValue/CMakeLists.txt create mode 100644 tests/ResultValueRValue/ResultValueRValue.cpp diff --git a/VulkanHppGenerator.cpp b/VulkanHppGenerator.cpp index ab40f7a..dcf77bd 100644 --- a/VulkanHppGenerator.cpp +++ b/VulkanHppGenerator.cpp @@ -7859,6 +7859,11 @@ namespace std { return value; } + + operator T&& () && VULKAN_HPP_NOEXCEPT + { + return std::move( value ); + } #endif }; diff --git a/tests/ResultValueRValue/CMakeLists.txt b/tests/ResultValueRValue/CMakeLists.txt new file mode 100644 index 0000000..e28f03e --- /dev/null +++ b/tests/ResultValueRValue/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright(c) 2020, Collabora Ltd. 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) + +project(ResultValueRValue) + +set(HEADERS +) + +set(SOURCES + ResultValueRValue.cpp +) + +source_group(headers FILES ${HEADERS}) +source_group(sources FILES ${SOURCES}) + +add_library(ResultValueRValue + ${HEADERS} + ${SOURCES} +) + +if (UNIX) + target_link_libraries(ResultValueRValue "-ldl") +endif() + +set_target_properties(ResultValueRValue PROPERTIES FOLDER "Tests") diff --git a/tests/ResultValueRValue/ResultValueRValue.cpp b/tests/ResultValueRValue/ResultValueRValue.cpp new file mode 100644 index 0000000..d3e89ea --- /dev/null +++ b/tests/ResultValueRValue/ResultValueRValue.cpp @@ -0,0 +1,38 @@ +// Copyright(c) 2020, Collabora Ltd. 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 Test: Compile only test for issue 589. + +#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 + +#include "vulkan/vulkan.hpp" + +VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE + +template +struct Wrapper +{ + Wrapper( T && raw ) : raw{ raw } {} + + T raw; +}; + +void test() +{ + auto device = vk::Device{}; + // We should be able to move created vk objects, regardless of the + // result type they were returned in. + Wrapper{ device.createImage( {} ) }; + Wrapper{ device.createGraphicsPipeline( {}, {} ) }; +} diff --git a/vulkan/vulkan.hpp b/vulkan/vulkan.hpp index 17ac8c9..952040a 100644 --- a/vulkan/vulkan.hpp +++ b/vulkan/vulkan.hpp @@ -15864,6 +15864,11 @@ namespace VULKAN_HPP_NAMESPACE { return value; } + + operator T &&() && VULKAN_HPP_NOEXCEPT + { + return std::move( value ); + } #endif };