remove uvalue::can_get_as

This commit is contained in:
BlackMATov
2022-11-06 18:25:06 +07:00
parent a630d89e96
commit 291e165ca4
5 changed files with 23 additions and 134 deletions

View File

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

View File

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

View File

@@ -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 = &rect; val = &rect;
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*>() ) {
}
} }

View File

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

View File

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