/******************************************************************************* * This file is part of the "https://github.com/blackmatov/meta.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md * Copyright (C) 2021-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include #include namespace { struct A1 { std::string a1{"a1"}; }; struct B1 : A1 { std::string b1{"b1"}; }; struct C1 : A1 { std::string c1{"c1"}; }; struct D1 : B1, C1 { std::string d1{"d1"}; }; struct A2 { std::string a2{"a2"}; }; struct B2 : virtual A2 { std::string b2{"b2"}; }; struct C2 : virtual A2 { std::string c2{"c2"}; }; struct D2 : B2, C2 { std::string d2{"d2"}; }; struct A3 { std::string a3{"a3"}; }; struct B3 : virtual A3 { std::string b3{"b3"}; }; struct C3 : A3 { std::string c3{"c3"}; }; struct D3 : B3, C3 { std::string d3{"d3"}; }; } TEST_CASE("meta/meta_features/ambiguous") { namespace meta = meta_hpp; { meta::class_().base_(); meta::class_().base_(); meta::class_().base_(); // A1 < B1 // < D1 // A1 < C1 static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); static_assert(!std::is_invocable_v); CHECK(meta::is_invocable_with(+[](const A1&){}, A1{})); CHECK(meta::is_invocable_with(+[](const A1&){}, B1{})); CHECK(meta::is_invocable_with(+[](const A1&){}, C1{})); CHECK_FALSE(meta::is_invocable_with(+[](const A1&){}, D1{})); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); } { meta::class_().base_(); meta::class_().base_(); meta::class_().base_(); // A2 <= B2 // < D2 // A2 <= C2 static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); CHECK(meta::is_invocable_with(+[](const A2&){}, A2{})); CHECK(meta::is_invocable_with(+[](const A2&){}, B2{})); CHECK(meta::is_invocable_with(+[](const A2&){}, C2{})); CHECK(meta::is_invocable_with(+[](const A2&){}, D2{})); CHECK(meta::resolve_type().is_virtual_base_of()); CHECK(meta::resolve_type().is_virtual_base_of()); CHECK(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); } { meta::class_().base_(); meta::class_().base_(); meta::class_().base_(); // A3 <= B3 // < D3 // A3 < C3 static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); static_assert(!std::is_invocable_v); CHECK(meta::is_invocable_with(+[](const A3&){}, A3{})); CHECK(meta::is_invocable_with(+[](const A3&){}, B3{})); CHECK(meta::is_invocable_with(+[](const A3&){}, C3{})); CHECK_FALSE(meta::is_invocable_with(+[](const A3&){}, D3{})); CHECK(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); CHECK_FALSE(meta::resolve_type().is_virtual_base_of()); } }