/* TupleHelper(Test) - verify helpers for working with tuples and type sequences Copyright (C) 2009, Hermann Vosseler   **Lumiera** is free software; you can redistribute it and/or modify it   under the terms of the GNU General Public License as published by the   Free Software Foundation; either version 2 of the License, or (at your   option) any later version. See the file COPYING for further details. * *****************************************************************/ /** @file tuple-helper-test.cpp ** Interplay of typelists, type tuples and std::tuple. ** ** @see tuple-helper.hpp ** @see function-closure.hpp ** @see control::CmdClosure real world usage example ** */ #include "lib/test/run.hpp" #include "lib/test/test-helper.hpp" #include "lib/meta/tuple-helper.hpp" #include "meta/typelist-diagnostics.hpp" #include "meta/tuple-diagnostics.hpp" #include "lib/format-cout.hpp" #include using lib::test::showSizeof; using util::toString; using std::get; namespace lib { namespace meta { namespace test { namespace { // test data typedef TySeq< Num<1> , Num<3> , Num<5> > Types1; typedef TySeq< Num<2> , Num<4> > Types2; typedef TySeq< Num<7>> Types3; } // (End) test data /*********************************************************************//** * @test Cover various aspects of the integration of our type sequences * with the tuple type from the standard library * - verify our generic tuple access decorator * - verify generating tuple types from type list processing * - TODO more helpers to come */ class TupleHelper_test : public Test { virtual void run (Arg) { check_diagnostics(); check_tuple_from_Typelist(); } /** verify the test input data * @see TypeListManip_test::check_diagnostics() * for an explanation of the DISPLAY macro */ void check_diagnostics () { typedef Types1::List L1; typedef Types2::List L2; typedef Types3::List L3; DISPLAY (L1); DISPLAY (L2); DISPLAY (L3); typedef Tuple Tup1; Tup1 tup1x (Num<1>(11), Num<3>(), 55); DISPLAY (Tup1); // prints the type DUMPVAL (Tup1()); // prints the contents DUMPVAL (tup1x); EXPECT (Types1, "-<1>-<3>-<5>-"); EXPECT (Tup1, "TUPLE-<1>-<3>-<5>-"); CHECK (get<2>(tup1x) == Num<5>{55}); CHECK (toString(tup1x) == "«tuple, Num<3>, Num<5> >»──({11},(3),{55})"_expect); } /** @test verify the ability to generate tuple types from typelist metaprogramming * - the resulting types are plain flat `std::tuple` instantiations * - memory layout is identical to a POD, as expected * - our generic string conversion is extended to work with tuples */ void check_tuple_from_Typelist() { using L1 = Types1::List; // ... start from existing Typelist... using T_L1 = Tuple; // derive a tuple type from this typelist using Seq1 = RebindTupleTypes::Seq; // extract the underlying type sequence EXPECT (T_L1, "TUPLE-<1>-<3>-<5>-"); EXPECT (Seq1, "-<1>-<3>-<5>-"); T_L1 tup1; // can be instantiated at runtime (and is just a std:tuple) CHECK (toString(tup1) == "«tuple, Num<3>, Num<5> >»──((1),(3),(5))"_expect); using Prepend = Tuple>; // another ListType based tuple created by prepending EXPECT (Prepend, "TUPLE--<1>-<3>-<5>-"); Prepend prep (22, 11,33,Num<5>()); CHECK (toString(prep) == "«tuple, Num<3>, Num<5> >»──(22,{11},{33},(5))"_expect); using NulT = Tuple >; // plain-flat empty Tuple using NulL = Tuple; // list-style empty Tuple NulT nulT; // and these, too, can be instantiated NulL nulL; CHECK (toString(nulT) == "«tuple<>»──()"_expect); CHECK (toString(nulL) == "«tuple<>»──()"_expect); CHECK ((is_same())); using S4 = struct{int a,b,c,d;}; // expect this to have the same memory layout CHECK (sizeof(S4) == sizeof(prep)); CHECK (1 == sizeof(nulL)); // ...minimal storage, as expected CHECK (is_Tuple()); CHECK (is_Tuple()); CHECK (is_Tuple()); CHECK (not is_Tuple()); cout << tup1 <)+sizeof(Num<3>)+sizeof(Num<5>)); } }; /** Register this test class... */ LAUNCHER (TupleHelper_test, "unit meta"); }}} // namespace lib::meta::test