mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-14 03:29:28 +07:00
new uvalue safe api
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <span>
|
||||
#include <string>
|
||||
|
||||
@@ -110,6 +110,15 @@ namespace meta_hpp
|
||||
[[nodiscard]] auto try_get_as() const noexcept //
|
||||
-> std::conditional_t<detail::pointer_kind<T>, T, const T*>;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] std::optional<T> safe_get_as() &&;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] std::optional<T> safe_get_as() &;
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] std::optional<T> safe_get_as() const&;
|
||||
|
||||
private:
|
||||
struct vtable_t;
|
||||
|
||||
|
||||
@@ -619,4 +619,55 @@ namespace meta_hpp
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
std::optional<T> uvalue::safe_get_as() && {
|
||||
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 ( T* ptr = try_get_as<T>() ) {
|
||||
return std::move(*ptr);
|
||||
}
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
std::optional<T> uvalue::safe_get_as() & {
|
||||
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 ( T* ptr = try_get_as<T>() ) {
|
||||
return *ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
std::optional<T> uvalue::safe_get_as() const& {
|
||||
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 *ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user