Add cast operator to reference of UniqueHandle of ResultValue<UniqueHandle>.

This commit is contained in:
asuessenbach 2020-06-17 10:10:57 +02:00
parent e83bd40ab5
commit 3724bfd0f5
5 changed files with 49 additions and 48 deletions

@ -1 +1 @@
Subproject commit 9d2dfca53b754dd3ab916899fed567a5290c30aa Subproject commit f31524575668c6c483356bd54ca974590e31be8e

View File

@ -7955,15 +7955,6 @@ namespace std
template <typename Type, typename Dispatch> template <typename Type, typename Dispatch>
struct ResultValue<UniqueHandle<Type,Dispatch>> struct ResultValue<UniqueHandle<Type,Dispatch>>
{ {
#ifdef VULKAN_HPP_HAS_NOEXCEPT
ResultValue(Result r, UniqueHandle<Type, Dispatch> & v) VULKAN_HPP_NOEXCEPT
#else
ResultValue(Result r, UniqueHandle<Type, Dispatch>& v)
#endif
: result(r)
, value(v)
{}
#ifdef VULKAN_HPP_HAS_NOEXCEPT #ifdef VULKAN_HPP_HAS_NOEXCEPT
ResultValue(Result r, UniqueHandle<Type, Dispatch> && v) VULKAN_HPP_NOEXCEPT ResultValue(Result r, UniqueHandle<Type, Dispatch> && v) VULKAN_HPP_NOEXCEPT
#else #else
@ -7978,6 +7969,11 @@ namespace std
operator std::tuple<Result&, UniqueHandle<Type, Dispatch>&>() VULKAN_HPP_NOEXCEPT { return std::tuple<Result&, UniqueHandle<Type, Dispatch>&>(result, value); } operator std::tuple<Result&, UniqueHandle<Type, Dispatch>&>() VULKAN_HPP_NOEXCEPT { return std::tuple<Result&, UniqueHandle<Type, Dispatch>&>(result, value); }
operator UniqueHandle<Type, Dispatch>& () & VULKAN_HPP_NOEXCEPT
{
return value;
}
operator UniqueHandle<Type, Dispatch>() VULKAN_HPP_NOEXCEPT operator UniqueHandle<Type, Dispatch>() VULKAN_HPP_NOEXCEPT
{ {
return std::move(value); return std::move(value);

View File

@ -26,13 +26,9 @@ set(SOURCES
source_group(headers FILES ${HEADERS}) source_group(headers FILES ${HEADERS})
source_group(sources FILES ${SOURCES}) source_group(sources FILES ${SOURCES})
add_library(ResultValue add_executable(ResultValue
${HEADERS} ${HEADERS}
${SOURCES} ${SOURCES}
) )
if (UNIX)
target_link_libraries(ResultValue "-ldl")
endif()
set_target_properties(ResultValue PROPERTIES FOLDER "Tests") set_target_properties(ResultValue PROPERTIES FOLDER "Tests")

View File

@ -21,34 +21,47 @@
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
// Compile only test for issue 589. void as_value( int ) {}
void test_conversion() void as_ref( int & ) {}
{ void as_rvref( int && ) {}
#if defined(VULKAN_DISABLE_IMPLICIT_RESULT_VALUE_CAST) void as_cref( const int & ) {}
static_assert(false, "Conversions not enabled"); void as_crvref( const int && ) {}
#endif
void as_value(int); void as_cref( const vk::UniquePipeline & ) {}
void as_ref(int&);
void as_cref(const int&); int main( int /*argc*/, char ** /*argv*/ )
void as_rvref(int&&); {
void as_crvref(const int&&); #if defined( VULKAN_DISABLE_IMPLICIT_RESULT_VALUE_CAST )
static_assert( false, "Conversions not enabled" );
#endif
using result = vk::ResultValue<int>; using result = vk::ResultValue<int>;
auto val = result {vk::Result{}, 42}; auto val = result{ vk::Result{}, 42 };
const auto cval = result {vk::Result{}, 42}; const auto cval = result{ vk::Result{}, 42 };
as_value(val); as_value( val );
as_value(cval); as_value( cval );
as_ref(val); as_ref( val );
//as_ref(cval); // should fail // as_ref(cval); // should fail
as_cref(val); as_cref( val );
as_cref(cval); as_cref( cval );
as_rvref(std::move(val)); as_rvref( std::move( val ) );
//as_rvref(std::move(cval)); // should fail // as_rvref(std::move(cval)); // should fail
as_crvref(std::move(val)); as_crvref( std::move( val ) );
as_crvref(std::move(cval)); as_crvref( std::move( cval ) );
vk::Pipeline pipe( VkPipeline( 0x8 ) ); // fake a Pipeline here, to have something different from zero
vk::UniquePipeline pipeline( pipe );
vk::ResultValue<vk::UniquePipeline> rv( {}, std::move( pipeline ) );
as_cref( rv ); // does not move out handle
assert( rv.value );
auto p = std::move( rv.value );
p.release(); // release the faked Pipeline, to prevent error on trying to destroy it
return 0;
} }

View File

@ -52,7 +52,7 @@
# include <compare> # include <compare>
#endif #endif
static_assert( VK_HEADER_VERSION == 143, "Wrong VK_HEADER_VERSION!" ); static_assert( VK_HEADER_VERSION == 144, "Wrong VK_HEADER_VERSION!" );
// 32-bit vulkan is not typesafe for handles, so don't allow copy constructors on this platform by default. // 32-bit vulkan is not typesafe for handles, so don't allow copy constructors on this platform by default.
// To enable this feature on 32-bit platforms please define VULKAN_HPP_TYPESAFE_CONVERSION // To enable this feature on 32-bit platforms please define VULKAN_HPP_TYPESAFE_CONVERSION
@ -15887,15 +15887,6 @@ namespace VULKAN_HPP_NAMESPACE
template <typename Type, typename Dispatch> template <typename Type, typename Dispatch>
struct ResultValue<UniqueHandle<Type, Dispatch>> struct ResultValue<UniqueHandle<Type, Dispatch>>
{ {
# ifdef VULKAN_HPP_HAS_NOEXCEPT
ResultValue( Result r, UniqueHandle<Type, Dispatch> & v ) VULKAN_HPP_NOEXCEPT
# else
ResultValue( Result r, UniqueHandle<Type, Dispatch> & v )
# endif
: result( r )
, value( v )
{}
# ifdef VULKAN_HPP_HAS_NOEXCEPT # ifdef VULKAN_HPP_HAS_NOEXCEPT
ResultValue( Result r, UniqueHandle<Type, Dispatch> && v ) VULKAN_HPP_NOEXCEPT ResultValue( Result r, UniqueHandle<Type, Dispatch> && v ) VULKAN_HPP_NOEXCEPT
# else # else
@ -15913,6 +15904,11 @@ namespace VULKAN_HPP_NAMESPACE
return std::tuple<Result &, UniqueHandle<Type, Dispatch> &>( result, value ); return std::tuple<Result &, UniqueHandle<Type, Dispatch> &>( result, value );
} }
operator UniqueHandle<Type, Dispatch> &() & VULKAN_HPP_NOEXCEPT
{
return value;
}
operator UniqueHandle<Type, Dispatch>() VULKAN_HPP_NOEXCEPT operator UniqueHandle<Type, Dispatch>() VULKAN_HPP_NOEXCEPT
{ {
return std::move( value ); return std::move( value );