mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-13 19:18:01 +07:00
little uvalue fixes
This commit is contained in:
@@ -2904,15 +2904,14 @@ namespace meta_hpp
|
||||
uvalue& operator=(const uvalue& other);
|
||||
|
||||
template < typename T, typename Tp = std::decay_t<T> >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
// NOLINTNEXTLINE(*-forwarding-reference-overload)
|
||||
uvalue(T&& val);
|
||||
|
||||
template < typename T, typename Tp = std::decay_t<T> >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
uvalue& operator=(T&& val);
|
||||
|
||||
@@ -2968,6 +2967,10 @@ namespace meta_hpp
|
||||
[[nodiscard]] auto get_as() const& //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, const T&>;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] auto get_as() const&& //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, const T&&>;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] auto try_get_as() noexcept //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, T*>;
|
||||
@@ -8600,7 +8603,7 @@ namespace meta_hpp
|
||||
}
|
||||
|
||||
template < typename T, typename Tp >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
// NOLINTNEXTLINE(*-forwarding-reference-overload)
|
||||
@@ -8609,8 +8612,7 @@ namespace meta_hpp
|
||||
}
|
||||
|
||||
template < typename T, typename Tp >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
uvalue& uvalue::operator=(T&& val) {
|
||||
vtable_t::do_reset(*this);
|
||||
@@ -8807,6 +8809,23 @@ namespace meta_hpp
|
||||
throw_generic_exception(generic_error::bad_uvalue_cast);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
auto uvalue::get_as() const&& -> std::conditional_t<detail::pointer_kind<T>, T, const T&&> {
|
||||
static_assert(std::is_same_v<T, std::decay_t<T>>);
|
||||
|
||||
if constexpr ( detail::pointer_kind<T> ) {
|
||||
if ( T ptr = try_get_as<T>(); ptr || get_type().is_nullptr() ) {
|
||||
return ptr;
|
||||
}
|
||||
} else {
|
||||
if ( const T* ptr = try_get_as<T>() ) {
|
||||
return std::move(*ptr);
|
||||
}
|
||||
}
|
||||
|
||||
throw_generic_exception(generic_error::bad_uvalue_cast);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
// NOLINTNEXTLINE(*-cognitive-complexity)
|
||||
auto uvalue::try_get_as() noexcept -> std::conditional_t<detail::pointer_kind<T>, T, T*> {
|
||||
|
||||
@@ -94,7 +94,7 @@ TEST_CASE("meta/meta_utilities/value3/get_as") {
|
||||
static_assert(std::is_same_v<decltype(std::declval<meta::uvalue&>().get_as<derived>()), derived&>);
|
||||
static_assert(std::is_same_v<decltype(std::declval<meta::uvalue&&>().get_as<derived>()), derived>);
|
||||
static_assert(std::is_same_v<decltype(std::declval<const meta::uvalue&>().get_as<derived>()), const derived&>);
|
||||
static_assert(std::is_same_v<decltype(std::declval<const meta::uvalue&&>().get_as<derived>()), const derived&>);
|
||||
static_assert(std::is_same_v<decltype(std::declval<const meta::uvalue&&>().get_as<derived>()), const derived&&>);
|
||||
|
||||
static_assert(std::is_same_v<decltype(std::declval<meta::uvalue&>().get_as<derived*>()), derived*>);
|
||||
static_assert(std::is_same_v<decltype(std::declval<meta::uvalue&&>().get_as<derived*>()), derived*>);
|
||||
|
||||
@@ -151,7 +151,7 @@ TEST_CASE("meta/meta_utilities/value") {
|
||||
const ivec2&>);
|
||||
static_assert(std::is_same_v<
|
||||
decltype(std::declval<const meta::uvalue&&>().get_as<ivec2>()),
|
||||
const ivec2&>);
|
||||
const ivec2&&>);
|
||||
}
|
||||
|
||||
SUBCASE("ivec2{}") {
|
||||
|
||||
@@ -38,15 +38,14 @@ namespace meta_hpp
|
||||
uvalue& operator=(const uvalue& other);
|
||||
|
||||
template < typename T, typename Tp = std::decay_t<T> >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
// NOLINTNEXTLINE(*-forwarding-reference-overload)
|
||||
uvalue(T&& val);
|
||||
|
||||
template < typename T, typename Tp = std::decay_t<T> >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
uvalue& operator=(T&& val);
|
||||
|
||||
@@ -102,6 +101,10 @@ namespace meta_hpp
|
||||
[[nodiscard]] auto get_as() const& //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, const T&>;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] auto get_as() const&& //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, const T&&>;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] auto try_get_as() noexcept //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, T*>;
|
||||
|
||||
@@ -283,7 +283,7 @@ namespace meta_hpp
|
||||
}
|
||||
|
||||
template < typename T, typename Tp >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
// NOLINTNEXTLINE(*-forwarding-reference-overload)
|
||||
@@ -292,8 +292,7 @@ namespace meta_hpp
|
||||
}
|
||||
|
||||
template < typename T, typename Tp >
|
||||
requires(!detail::any_uvalue_kind<Tp>) //
|
||||
&& (!detail::is_in_place_type_v<Tp>) //
|
||||
requires(!std::is_same_v<Tp, uvalue>) //
|
||||
&& (std::is_copy_constructible_v<Tp>) //
|
||||
uvalue& uvalue::operator=(T&& val) {
|
||||
vtable_t::do_reset(*this);
|
||||
@@ -490,6 +489,23 @@ namespace meta_hpp
|
||||
throw_generic_exception(generic_error::bad_uvalue_cast);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
auto uvalue::get_as() const&& -> std::conditional_t<detail::pointer_kind<T>, T, const T&&> {
|
||||
static_assert(std::is_same_v<T, std::decay_t<T>>);
|
||||
|
||||
if constexpr ( detail::pointer_kind<T> ) {
|
||||
if ( T ptr = try_get_as<T>(); ptr || get_type().is_nullptr() ) {
|
||||
return ptr;
|
||||
}
|
||||
} else {
|
||||
if ( const T* ptr = try_get_as<T>() ) {
|
||||
return std::move(*ptr);
|
||||
}
|
||||
}
|
||||
|
||||
throw_generic_exception(generic_error::bad_uvalue_cast);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
// NOLINTNEXTLINE(*-cognitive-complexity)
|
||||
auto uvalue::try_get_as() noexcept -> std::conditional_t<detail::pointer_kind<T>, T, T*> {
|
||||
|
||||
Reference in New Issue
Block a user