#include "catch_tmp.h" #include using namespace tmp; namespace { template struct IdentityImpl { using type = T; }; template using Identity = typename IdentityImpl::type; template struct UnpackImpl; template struct UnpackImpl> { using type = T; }; template using Unpack = typename UnpackImpl::type; template struct Unsigneds; template struct MakeSizeListImpl; template struct MakeSizeListImpl, T> { using type = Unsigneds; }; template using MakeSizeList = typename MakeSizeListImpl::type; template using CalcHeight = std::integral_constant>; struct A {}; struct B {}; struct C {}; struct D {}; struct E {}; struct F {}; struct G {}; struct H {}; struct I {}; using T0 = Tree<>; using T1 = Tree; using T2 = Tree, Tree>; using T3 = Tree, Tree, Tree>, Tree>>; using T4 = Tree, Tree>>, Tree>>, Tree >; } TEST_CASE("TreeTransform") { SECTION("empty input") { using Result = TreeTransform, Identity>; REQUIRE_SAME(Tree<>, Result); } using Input1 = Tree>; using Input2 = Tree, Tree, Tree>>, Tree>>; SECTION("Identity") { REQUIRE(std::is_same>{}); REQUIRE(std::is_same>{}); } SECTION("Unpack") { using Expected = Tree>, Tree>; using Result = TreeTransform; REQUIRE_SAME(Expected, Result); } } TEST_CASE("TreeAccumulate") { using Default = std::integral_constant; SECTION("empty input") { using Result = TreeAccumulate, CalcHeight, Default>; REQUIRE_SAME(Default, Result); } SECTION("Unpack") { REQUIRE(0 == TreeAccumulate::value); REQUIRE(1 == TreeAccumulate::value); REQUIRE(1 == TreeAccumulate, T1, T1>, CalcHeight, Default>::value); REQUIRE(2 == TreeAccumulate::value); } } TEST_CASE("TreeNLRAccumulate") { SECTION("empty input") { using Result = TreeNLRAccumulate, MakeSizeList, void>; REQUIRE_SAME(void, Result); } SECTION("MakeSizeList") { using Input = Tree>, Tree, Tree>; using Expected = Unsigneds; using Result = TreeNLRAccumulate>; REQUIRE_SAME(Expected, Result); } } TEST_CASE("TreeHeight") { REQUIRE(-1 == TreeHeight); REQUIRE(0 == TreeHeight); REQUIRE(1 == TreeHeight); REQUIRE(1 == TreeHeight, T1, T1>>); REQUIRE(2 == TreeHeight); } TEST_CASE("TreeAllRTLPaths") { SECTION("empty input") { using Result = TreeAllRTLPaths; REQUIRE_SAME(Pack<>, Result); } SECTION("only root") { using Expected = Pack>; using Result = TreeAllRTLPaths; REQUIRE_SAME(Expected, Result); } SECTION("general case") { using Expected = Pack, Pack, Pack, Pack>; using Result = TreeAllRTLPaths; REQUIRE_SAME(Expected, Result); } }