mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-15 03:45:30 +07:00
remove uvalue::can_get_as
This commit is contained in:
@@ -76,9 +76,6 @@ namespace meta_hpp
|
|||||||
[[nodiscard]] auto try_get_as() const noexcept
|
[[nodiscard]] auto try_get_as() const noexcept
|
||||||
-> std::conditional_t<detail::pointer_kind<T>, T, const T*>;
|
-> std::conditional_t<detail::pointer_kind<T>, T, const T*>;
|
||||||
|
|
||||||
template < typename T >
|
|
||||||
[[nodiscard]] bool can_get_as() const noexcept;
|
|
||||||
|
|
||||||
friend bool operator<(const uvalue& l, const uvalue& r);
|
friend bool operator<(const uvalue& l, const uvalue& r);
|
||||||
friend bool operator==(const uvalue& l, const uvalue& r);
|
friend bool operator==(const uvalue& l, const uvalue& r);
|
||||||
friend std::istream& operator>>(std::istream& is, uvalue& v);
|
friend std::istream& operator>>(std::istream& is, uvalue& v);
|
||||||
|
|||||||
@@ -489,23 +489,6 @@ namespace meta_hpp
|
|||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T >
|
|
||||||
bool uvalue::can_get_as() const noexcept {
|
|
||||||
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 true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( const T* ptr = try_get_as<T>() ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace meta_hpp
|
namespace meta_hpp
|
||||||
|
|||||||
@@ -75,9 +75,22 @@ TEST_CASE("meta/meta_examples/uvalue/usage") {
|
|||||||
// also, it supports upcasting for registered types
|
// also, it supports upcasting for registered types
|
||||||
CHECK(val.get_as<shape>().get_area() == 200);
|
CHECK(val.get_as<shape>().get_area() == 200);
|
||||||
|
|
||||||
|
// an exception will be thrown if we try to get a wrong type
|
||||||
|
CHECK_THROWS(std::ignore = val.get_as<int>());
|
||||||
|
|
||||||
|
// but we can use try_get_as for safe access
|
||||||
|
CHECK(val.try_get_as<shape>());
|
||||||
|
if ( shape* s = val.try_get_as<shape>() ) {
|
||||||
|
}
|
||||||
|
|
||||||
// upcasting is supported for pointers too
|
// upcasting is supported for pointers too
|
||||||
rectangle rect{3, 5};
|
rectangle rect{3, 5};
|
||||||
val = ▭
|
val = ▭
|
||||||
CHECK(val.get_as<shape*>()->get_area() == 15);
|
CHECK(val.get_as<shape*>()->get_area() == 15);
|
||||||
CHECK(val.get_type() == meta::resolve_type<rectangle*>());
|
CHECK(val.get_type() == meta::resolve_type<rectangle*>());
|
||||||
|
|
||||||
|
// but we can use try_get_as for pointers too
|
||||||
|
CHECK(val.try_get_as<shape*>());
|
||||||
|
if ( shape* s = val.try_get_as<shape*>() ) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -324,107 +324,3 @@ TEST_CASE("meta/meta_utilities/value4/try_get_as") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("meta/meta_utilities/value4/can_get_as") {
|
|
||||||
namespace meta = meta_hpp;
|
|
||||||
|
|
||||||
SUBCASE("derived to derived") {
|
|
||||||
{
|
|
||||||
meta::uvalue v{derived{}};
|
|
||||||
CHECK(v.can_get_as<derived>());
|
|
||||||
CHECK_FALSE(v.can_get_as<derived2>());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const meta::uvalue v{derived{}};
|
|
||||||
CHECK(v.can_get_as<derived>());
|
|
||||||
CHECK_FALSE(v.can_get_as<derived2>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SUBCASE("derived to base") {
|
|
||||||
{
|
|
||||||
meta::uvalue v{derived{}};
|
|
||||||
CHECK(v.can_get_as<base2>());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const meta::uvalue v{derived{}};
|
|
||||||
CHECK(v.can_get_as<base2>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SUBCASE("voidptr") {
|
|
||||||
{
|
|
||||||
derived d{};
|
|
||||||
meta::uvalue v{&d};
|
|
||||||
CHECK(v.can_get_as<void*>());
|
|
||||||
CHECK(v.can_get_as<const void*>());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const derived d{};
|
|
||||||
meta::uvalue v{&d};
|
|
||||||
CHECK_FALSE(v.can_get_as<void*>());
|
|
||||||
CHECK(v.can_get_as<const void*>());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
meta::uvalue v{derived{}};
|
|
||||||
CHECK_FALSE(v.can_get_as<void*>());
|
|
||||||
CHECK_FALSE(v.can_get_as<const void*>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SUBCASE("nullptr") {
|
|
||||||
{
|
|
||||||
meta::uvalue v{nullptr};
|
|
||||||
CHECK(v.can_get_as<void*>());
|
|
||||||
CHECK(v.can_get_as<const void*>());
|
|
||||||
CHECK(v.can_get_as<derived*>());
|
|
||||||
CHECK(v.can_get_as<const derived*>());
|
|
||||||
|
|
||||||
CHECK_FALSE(v.can_get_as<derived>());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const meta::uvalue v{nullptr};
|
|
||||||
CHECK(v.can_get_as<void*>());
|
|
||||||
CHECK(v.can_get_as<const void*>());
|
|
||||||
CHECK(v.can_get_as<derived*>());
|
|
||||||
CHECK(v.can_get_as<const derived*>());
|
|
||||||
|
|
||||||
CHECK_FALSE(v.can_get_as<derived>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SUBCASE("derived* to derived*") {
|
|
||||||
{
|
|
||||||
derived d{};
|
|
||||||
meta::uvalue v{&d};
|
|
||||||
CHECK(v.can_get_as<derived*>());
|
|
||||||
CHECK(v.can_get_as<const derived*>());
|
|
||||||
|
|
||||||
CHECK_FALSE(v.can_get_as<derived2*>());
|
|
||||||
CHECK_FALSE(v.can_get_as<const derived2*>());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const derived d{};
|
|
||||||
meta::uvalue v{&d};
|
|
||||||
CHECK(v.can_get_as<const derived*>());
|
|
||||||
|
|
||||||
CHECK_FALSE(v.can_get_as<const derived2*>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SUBCASE("derived* to base*") {
|
|
||||||
{
|
|
||||||
derived d{};
|
|
||||||
meta::uvalue v{&d};
|
|
||||||
CHECK(v.can_get_as<base2*>());
|
|
||||||
CHECK(v.can_get_as<const base2*>());
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const derived d{};
|
|
||||||
meta::uvalue v{&d};
|
|
||||||
CHECK_FALSE(v.can_get_as<base2*>());
|
|
||||||
CHECK(v.can_get_as<const base2*>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -133,8 +133,8 @@ TEST_CASE("meta/meta_utilities/value") {
|
|||||||
CHECK_FALSE(*val);
|
CHECK_FALSE(*val);
|
||||||
CHECK_FALSE(val[0]);
|
CHECK_FALSE(val[0]);
|
||||||
|
|
||||||
CHECK_FALSE(val.can_get_as<ivec2>());
|
CHECK_FALSE(val.try_get_as<ivec2>());
|
||||||
CHECK_FALSE(std::as_const(val).can_get_as<ivec2>());
|
CHECK_FALSE(std::as_const(val).try_get_as<ivec2>());
|
||||||
|
|
||||||
CHECK_THROWS(std::ignore = val.get_as<int>());
|
CHECK_THROWS(std::ignore = val.get_as<int>());
|
||||||
CHECK_THROWS(std::ignore = std::as_const(val).get_as<int>());
|
CHECK_THROWS(std::ignore = std::as_const(val).get_as<int>());
|
||||||
@@ -207,8 +207,8 @@ TEST_CASE("meta/meta_utilities/value") {
|
|||||||
|
|
||||||
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK_FALSE(val.can_get_as<ivec3>());
|
CHECK_FALSE(val.try_get_as<ivec3>());
|
||||||
CHECK_FALSE(std::as_const(val).can_get_as<ivec3>());
|
CHECK_FALSE(std::as_const(val).try_get_as<ivec3>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("const ivec2&") {
|
SUBCASE("const ivec2&") {
|
||||||
@@ -241,8 +241,8 @@ TEST_CASE("meta/meta_utilities/value") {
|
|||||||
|
|
||||||
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK_FALSE(val.can_get_as<ivec3>());
|
CHECK_FALSE(val.try_get_as<ivec3>());
|
||||||
CHECK_FALSE(std::as_const(val).can_get_as<ivec3>());
|
CHECK_FALSE(std::as_const(val).try_get_as<ivec3>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("ivec2&&") {
|
SUBCASE("ivec2&&") {
|
||||||
@@ -269,8 +269,8 @@ TEST_CASE("meta/meta_utilities/value") {
|
|||||||
|
|
||||||
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK_FALSE(val.can_get_as<ivec3>());
|
CHECK_FALSE(val.try_get_as<ivec3>());
|
||||||
CHECK_FALSE(std::as_const(val).can_get_as<ivec3>());
|
CHECK_FALSE(std::as_const(val).try_get_as<ivec3>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("const ivec2&&") {
|
SUBCASE("const ivec2&&") {
|
||||||
@@ -297,8 +297,8 @@ TEST_CASE("meta/meta_utilities/value") {
|
|||||||
|
|
||||||
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
CHECK(val.get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
CHECK(std::as_const(val).get_as<ivec2>() == ivec2{1,2});
|
||||||
CHECK_FALSE(val.can_get_as<ivec3>());
|
CHECK_FALSE(val.try_get_as<ivec3>());
|
||||||
CHECK_FALSE(std::as_const(val).can_get_as<ivec3>());
|
CHECK_FALSE(std::as_const(val).try_get_as<ivec3>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("value(value&&)") {
|
SUBCASE("value(value&&)") {
|
||||||
|
|||||||
Reference in New Issue
Block a user