little uvalue fixes

This commit is contained in:
BlackMATov
2023-02-16 17:06:26 +07:00
parent 8ba7a71e6b
commit c0c81c80ac
5 changed files with 52 additions and 14 deletions

View File

@@ -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*> {

View File

@@ -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*>);

View File

@@ -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{}") {

View File

@@ -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*>;

View File

@@ -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*> {