/******************************************************************************* * 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-2024, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include #include namespace { template < auto v0 > struct v {}; template < typename t0 > struct t {}; template < auto v1, auto v0 > struct vv {}; template < auto v0, typename t0 > struct vt {}; template < typename t0, auto v0 > struct tv {}; template < typename t1, typename t0 > struct tt {}; template < auto v2, auto v1, auto v0 > struct vvv {}; template < auto v1, auto v0, typename t0 > struct vvt {}; template < auto v1, typename t0, auto v0 > struct vtv {}; template < auto v0, typename t1, typename t0 > struct vtt {}; template < typename t0, auto v1, auto v0 > struct tvv {}; template < typename t1, auto v0, typename t0 > struct tvt {}; template < typename t1, typename t0, auto v0 > struct ttv {}; template < typename t2, typename t1, typename t0 > struct ttt {}; template < auto v2, auto v1, auto v0, typename t0, typename t1 > struct vvvtt {}; template < typename t2, typename t1, typename t0, auto v0, auto v1 > struct tttvv {}; } TEST_CASE("meta/meta_issues/random/6") { namespace meta = meta_hpp; { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type()}); CHECK(type.get_argument_value(0).is()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type()}); CHECK_FALSE(type.get_argument_value(0)); } // { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type()}); CHECK(type.get_argument_value(0).is()); CHECK(type.get_argument_value(1).is()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type()}); CHECK(type.get_argument_value(0).is()); CHECK_FALSE(type.get_argument_value(1).has_value()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type()}); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK(type.get_argument_value(1).is()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type()}); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK_FALSE(type.get_argument_value(1).has_value()); } // { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK(type.get_argument_value(0).as() == 42); CHECK(type.get_argument_value(1).as() == 21); CHECK(type.get_argument_value(2).as() == 10); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK(type.get_argument_value(0).as() == 42); CHECK(type.get_argument_value(1).as() == 21); CHECK_FALSE(type.get_argument_value(2).has_value()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK(type.get_argument_value(0).as() == 42); CHECK_FALSE(type.get_argument_value(1).has_value()); CHECK(type.get_argument_value(2).as() == 21); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK(type.get_argument_value(0).as() == 42); CHECK_FALSE(type.get_argument_value(1).has_value()); CHECK_FALSE(type.get_argument_value(2).has_value()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK(type.get_argument_value(1).as() == 42); CHECK(type.get_argument_value(2).as() == 21); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK(type.get_argument_value(1).as() == 42); CHECK_FALSE(type.get_argument_value(2).has_value()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK_FALSE(type.get_argument_value(1).has_value()); CHECK(type.get_argument_value(2).as() == 42); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK_FALSE(type.get_argument_value(1).has_value()); CHECK_FALSE(type.get_argument_value(2).has_value()); } // { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK(type.get_argument_value(0).as() == 42); CHECK(type.get_argument_value(1).as() == 21); CHECK(type.get_argument_value(2).as() == 10); CHECK_FALSE(type.get_argument_value(3).has_value()); CHECK_FALSE(type.get_argument_value(4).has_value()); } { meta::class_type type = meta::resolve_type>(); CHECK(type.get_argument_types() == meta::any_type_list{ meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), meta::resolve_type(), }); CHECK_FALSE(type.get_argument_value(0).has_value()); CHECK_FALSE(type.get_argument_value(1).has_value()); CHECK_FALSE(type.get_argument_value(2).has_value()); CHECK(type.get_argument_value(3).as() == 42); CHECK(type.get_argument_value(4).as() == 21); } }