clean-up: complement and modernise basic type-lists

- provide complete conversion paths old-style ⟷ new-style
- switch the basic tests to the new variadic sequences
- modernise the code; replace typedefs by `using`
- change some struct-style ''meta-functions'' into
  constexpr or compile-time constants
This commit is contained in:
Fischlurch 2025-06-02 19:07:05 +02:00
parent f8517b7011
commit c8187bdf88
12 changed files with 293 additions and 98 deletions

View file

@ -496,7 +496,7 @@ namespace func{
using BoundFunc = function<Ret()>;
enum { ARG_CNT = count<typename Args::List>::value };
enum { ARG_CNT = count<typename Args::List>() };
/** storing a ref to the parameter tuple */
@ -577,8 +577,8 @@ namespace func{
using ValList = typename VAL::List;
using ValTypes = typename TyOLD<ValList>::Seq;
enum { ARG_CNT = count<ArgsList>::value
, VAL_CNT = count<ValList> ::value
enum { ARG_CNT = count<ArgsList>()
, VAL_CNT = count<ValList>()
, ROFFSET = (VAL_CNT < ARG_CNT)? ARG_CNT-VAL_CNT : 0
};
@ -681,7 +681,7 @@ namespace func{
using ArgsList = typename Args::List;
using ValList = typename TyOLD<X>::List;
enum { ARG_CNT = count<ArgsList>::value };
enum { ARG_CNT = count<ArgsList>() };
using RemainingFront = typename Splice<ArgsList, ValList, pos>::Front;
using RemainingBack = typename Splice<ArgsList, ValList, pos>::Back;
@ -910,7 +910,7 @@ namespace func{
typename _PapE<SIG>::FunType::Functor
bindLast (SIG& f, TERM&& arg)
{
enum { LAST_POS = -1 + count<typename _Fun<SIG>::Args::List>::value };
enum { LAST_POS = -1 + count<typename _Fun<SIG>::Args>() };
return BindToArgument<SIG,TERM,LAST_POS>::reduced (f, std::forward<TERM> (arg));
}

View file

@ -193,7 +193,7 @@ namespace meta {
struct ElementExtractor<lib::diff::Rec, std::tuple<TYPES...>>
{
template<size_t i>
using TargetType = typename Pick<TyOLD<TYPES...>, i>::Type;
using TargetType = typename Pick<TySeq<TYPES...>, i>::Type;
template<size_t i>

View file

@ -22,7 +22,7 @@
**
** The "meta functions" defined here are templates; to access the "result" of
** such a meta function, we instantiate the template and then access one of the
** embedded constant definitions (usually the enum constant named \c value)
** embedded constant definitions (usually the compile-time constant named `value`)
**
** @see generator.hpp
** @see TypelistUtil_test
@ -39,6 +39,9 @@
#include "lib/meta/typelist.hpp"
#include "lib/meta/util.hpp"
#include <algorithm>
namespace lib {
namespace meta {
@ -46,20 +49,20 @@ namespace meta {
/**
* Metafunction counting the number of Types in the collection
* @return an embedded constant \c value holding the result
* @return an std::integral_constant type, which can be used
* as constexpr value.
* @note typeseq-util.hpp defines a specialisation for type-seq
*/
template<class TYPES>
template<class... TYPES>
struct count;
template<>
struct count<Nil>
{
enum{ value = 0 };
};
: SizConst<0>
{ };
template<class TY, class TYPES>
struct count<Node<TY,TYPES>>
{
enum{ value = 1 + count<TYPES>::value };
};
: SizConst<1 + count<TYPES>()>
{ };
/**
@ -69,16 +72,12 @@ namespace meta {
struct maxSize;
template<>
struct maxSize<Nil>
{
static constexpr int value = 0;
};
: SizConst<0>
{ };
template<class TY, class TYPES>
struct maxSize<Node<TY,TYPES>>
{
static constexpr size_t thisval = sizeof(TY);
static constexpr size_t nextval = maxSize<TYPES>::value;
static constexpr size_t value = nextval > thisval? nextval:thisval;
};
: SizConst<std::max (sizeof(TY), maxSize<TYPES>::value)>
{ };
/**
@ -88,16 +87,12 @@ namespace meta {
struct maxAlign;
template<>
struct maxAlign<Nil>
{
static constexpr int value = 0;
};
: SizConst<0>
{ };
template<class TY, class TYPES>
struct maxAlign<Node<TY,TYPES>>
{
static constexpr size_t thisval = alignof(TY);
static constexpr size_t nextval = maxAlign<TYPES>::value;
static constexpr size_t value = nextval > thisval? nextval:thisval;
};
: SizConst<std::max (alignof(TY), maxAlign<TYPES>::value)>
{ };
/**
@ -105,30 +100,20 @@ namespace meta {
* in a given typelist. Only exact match is detected.
*/
template<typename TY, typename TYPES>
struct IsInList
{
enum{ value = false };
};
struct isInList
: std::false_type
{ };
template<typename TY, typename TYPES>
struct IsInList<TY, Node<TY,TYPES>>
{
enum{ value = true };
};
struct isInList<TY, Node<TY,TYPES>>
: std::true_type
{ };
template<typename TY, typename XX, typename TYPES>
struct IsInList<TY, Node<XX,TYPES>>
{
enum{ value = IsInList<TY,TYPES>::value };
};
struct isInList<TY, Node<XX,TYPES>>
: std::bool_constant<isInList<TY,TYPES>::value>
{ };
/** convenience shortcut: query function */
template<typename TY, typename TYPES>
constexpr bool
isInList()
{
return IsInList<TY,TYPES>::value;
}
/**
@ -146,7 +131,7 @@ namespace meta {
template<typename TY, typename TYPES>
struct ConstAll<Node<TY,TYPES>>
{
using List = Node<const TY, typename ConstAll<TYPES>::List>;
using List = Node<std::add_const_t<TY>, typename ConstAll<TYPES>::List>;
};

View file

@ -79,6 +79,23 @@ namespace meta {
return 1 + indexOfType<X,TYPES...>();
}
/** series of definitions to level across variadics,
* type-sequences and type-lists
* @see typelist-util.hpp
*/
template<class... TYPES>
struct count
: SizConst<sizeof...(TYPES)>
{ };
template<class... TYPES>
struct count<TySeq<TYPES...>>
: SizConst<sizeof...(TYPES)>
{ };
template<class... TYPES>
struct count<TyOLD<TYPES...>>
: SizConst<sizeof...(TYPES)>
{ };
/**
* Helper: prepend a type to an existing type sequence,
@ -128,6 +145,7 @@ namespace meta {
//////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #987 temporary WORKAROUND -- to be obsoleted
/**
* Additional specialisation of the basic type sequence type,
* allowing to re-create a (flat) type sequence from a typelist.
@ -157,6 +175,12 @@ namespace meta {
using List = typename TyOLD<T, TYPES...>::List;
};
/**
* Additional specialisation of the basic type sequence type,
* allowing to re-create a (flat) type sequence from a typelist.
*/
template<class H, class T>
struct TySeq< Node<H,T> >
{
@ -171,9 +195,9 @@ namespace meta {
using List = Nil;
using Seq = TySeq<>;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #987 temporary WORKAROUND -- to be obsoleted
/**
* temporary workaround: strip trailing Nil entries from a
* type sequence, to make it compatible with new-style variadic

View file

@ -52,6 +52,10 @@ namespace lib {
namespace meta {
template<size_t siz>
using SizConst = std::integral_constant<size_t, siz>;
/* === conditional definition selector === */
template <bool B, class T = void>

View file

@ -306,11 +306,11 @@ namespace meta {
return size_t(std::tuple_size<TTX>::value);
else
if constexpr (lib::meta::is_Typelist<TTX>::value)
return lib::meta::count<typename TTX::List>::value;
return lib::meta::count<typename TTX::List>();
else
{ // Fallback: rebind template arguments into a type sequence
using Seq = typename RebindVariadic<TySeq, TTX>::Type;
return size_t(count<typename Seq::List>::value);
return size_t(count<Seq>());
}
};

View file

@ -216,8 +216,8 @@ namespace lib {
{
public:
enum { SIZ = meta::maxSize<typename TYPES::List>::value
, ALIGN = meta::maxAlign<typename TYPES::List>::value
enum { SIZ = meta::maxSize<typename TYPES::List>()
, ALIGN = meta::maxAlign<typename TYPES::List>()
};
template<typename RET>

View file

@ -113,7 +113,7 @@ namespace mobject {
{ VTABLE = sizeof(size_t)
, SPEC_SIZ = VTABLE
+ mp::maxSize<
mp::TyOLD< PID, lumiera_uid, uint>::List>::value
mp::TyOLD< PID, lumiera_uid, uint>::List>()
};
typedef lib::OpaqueHolder<TargetSpec, SPEC_SIZ> SpecBuff;

View file

@ -335,19 +335,18 @@ return: 0
END
TEST "TypeList_test" TypeList_test <<END
out: - 1 -- 2 -- 3 -- 5 -- 8 -- 13 -- The End -
out: ..Size of = 1
TEST "Loki Type-List" TypeList_test <<END
out-lit: - 21 -- 13 -- 8 -- 5 -- 3 -- 2 -- 1 -- The End -
return: 0
END
TEST "simple typelist utils" TypeListUtil_test <<END
TEST "Simple Type-List utilities" TypeListUtil_test <<END
return: 0
END
TEST "TypeListGenerator_test" TypeListGenerator_test <<END
TEST "Type driven class generation" TypeListGenerator_test <<END
out: ctor DoIt<Block<13> >
out: ctor DoIt<Block< 8> >
out: ctor DoIt<Block< 5> >
@ -368,7 +367,7 @@ return: 0
END
TEST "typelist manipulation" TypeListManip_test <<END
TEST "Typelist manipulation" TypeListManip_test <<END
out-lit: List1 :-<1>-<2>-<3>-
out-lit: List2 :-<5>-<6>-<7>-
out-lit: Added2 :-<3>-<4>-<5>-

View file

@ -21,8 +21,8 @@
#include <iostream>
using std::string;
using std::cout;
using std::endl;
namespace lib {
@ -34,19 +34,21 @@ namespace test {
{
Block() { cout << "- "<<I<<" -"; }
};
struct Zero
struct Ending
{
Zero() { cout << "- The End -"; }
Ending(){ cout << "- The End -" <<endl; }
};
typedef TyOLD< Block<1>
, Block<2>
, Block<3>
, Block<5>
, Block<8>
, Block<13>
>::List TheList;
using SequenceOfTypes = TySeq< Block<21>
, Block<13>
, Block<8>
, Block<5>
, Block<3>
, Block<2>
, Block<1>
>;
using ListOfTypes = typename SequenceOfTypes::List;
template<class X, class P>
@ -60,7 +62,8 @@ namespace test {
{ }
;
typedef Chain<TheList,Zero> AssembledClass;
using AssembledClass = Chain<ListOfTypes, Ending>;
/*********************************************************************//**
* @test try out Loki-style typelist metaprogramming.
@ -73,10 +76,9 @@ namespace test {
void
run (Arg)
{
AssembledClass wow_me_haz_numbers;
AssembledClass me_haz_numbers;
cout << "\n..Size of = "
<< sizeof(wow_me_haz_numbers) <<"\n";
CHECK (1 == sizeof(me_haz_numbers));
}
};

View file

@ -27,13 +27,13 @@ namespace test {
typedef TyOLD< int
, uint
, int64_t
, uint64_t
>::List TheList;
using TheList = TySeq< int
, uint
, int64_t
, uint64_t
>::List;
typedef TyOLD< >::List EmptyList;
using EmptyList = TySeq< >::List;
@ -52,20 +52,22 @@ namespace test {
void
run (Arg)
{
CHECK (4 == count<TheList>::value);
CHECK (0 == count<EmptyList>::value);
CHECK (4 == count<TheList>() );
CHECK (0 == count<EmptyList>());
CHECK (sizeof(int64_t) == maxSize<TheList>::value);
CHECK (0 == maxSize<EmptyList>::value);
CHECK (sizeof(int64_t) == maxSize<TheList>() );
CHECK (0 == maxSize<EmptyList>() );
CHECK (alignof(int64_t) == maxAlign<TheList>() );
CHECK (0 == maxAlign<EmptyList>());
CHECK ( bool(IsInList<int , TheList>::value));
CHECK ( bool(IsInList<uint , TheList>::value));
CHECK ( bool(IsInList<int64_t , TheList>::value));
CHECK ( bool(IsInList<uint64_t, TheList>::value));
CHECK ( bool(isInList<int , TheList>()));
CHECK ( bool(isInList<uint , TheList>()));
CHECK ( bool(isInList<int64_t , TheList>()));
CHECK ( bool(isInList<uint64_t, TheList>()));
CHECK (!bool(IsInList<double , TheList>::value));
CHECK (!bool(IsInList<int , EmptyList>::value));
CHECK (!bool(IsInList<int , int>::value)); // Note: not-a-typelist yields false too
CHECK (!bool(isInList<double , TheList>()));
CHECK (!bool(isInList<int , EmptyList>()));
CHECK (!bool(isInList<int , int>())); // Note: not-a-typelist yields false too
}
};

View file

@ -164231,6 +164231,185 @@ Since then others have made contributions, see the log for the history.</font></
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1748826894390" ID="ID_1736451439" MODIFIED="1748826903420" TEXT="Zonen f&#xfc;r Umstellung identifizieren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1748827924638" ID="ID_1710277250" MODIFIED="1748869708456" TEXT="Manipulations-Funktionen">
<node CREATED="1748827943942" ID="ID_1841252518" MODIFIED="1748828044902" TEXT="Tuple-Builder, Split, Prepend und Pick unterst&#xfc;tzen bereits beide Varianten"/>
<node CREATED="1748828081030" ID="ID_780708642" MODIFIED="1748828109653" TEXT="damit k&#xf6;nnen alle typeseq-util bereits f&#xfc;r beide Varianten verwendet werden">
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1748828247849" ID="ID_476644412" MODIFIED="1748869713383" TEXT="Verbindung mit Typelisten">
<node COLOR="#435e98" CREATED="1748828313009" ID="ID_1470463237" MODIFIED="1748869832016" TEXT="R&#xfc;ckweg Typelist &#x27f6; Typsequenz">
<arrowlink DESTINATION="ID_281104576" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_351374746" STARTARROW="None" STARTINCLINATION="458;41;"/>
<node CREATED="1748828416378" ID="ID_1994646495" MODIFIED="1748869656471" TEXT="es gibt eine Spezialisierung von TyOLD">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
in typeseq-util (etwas versteckt zwischen den Spezialisierungen von Prepend, was wiederum Vorraussetzung ist, so einen R&#252;ckweg konstruieren zu k&#246;nnen)
</p>
</body>
</html>
</richcontent>
</node>
<node COLOR="#338800" CREATED="1748828427985" ID="ID_819357004" MODIFIED="1748869657923" TEXT="auch eine f&#xfc;r TySeq hinzuf&#xfc;gen">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1748828579825" ID="ID_873142911" MODIFIED="1748869733060" TEXT="typelist-manip ist v&#xf6;llig eigenst&#xe4;ndig">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
d.h arbeitet ausschlie&#223;lich auf Typlisten und bezieht sich nirgends auf Typ-Sequenzen
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1748828920169" ID="ID_511778446" MODIFIED="1748869770714" TEXT="generator.hpp arbeitet ebenfalls nur auf Typlisten">
<arrowlink DESTINATION="ID_803058969" ENDARROW="Default" ENDINCLINATION="852;0;" ID="Arrow_ID_1971292758" STARTARROW="None" STARTINCLINATION="302;17;"/>
<node CREATED="1748828953483" ID="ID_1328523415" MODIFIED="1748828958980" TEXT="das kommt mir nun zugute"/>
<node CREATED="1748828933676" ID="ID_1716238563" MODIFIED="1748828952655" TEXT="man k&#xf6;nnte dann convenience-Front-End definieren"/>
</node>
<node CREATED="1748828754106" ID="ID_138237629" MODIFIED="1748869733060" TEXT="typelist-diagnostic ebenso">
<node CREATED="1748828767089" ID="ID_1047311703" MODIFIED="1748828818895" TEXT="meta::is_Typelist ist geschickt definiert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
es stellt n&#228;mllich nur auf einen nested&#160;&#160;X::List ab
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1748828781783" ID="ID_691444823" MODIFIED="1748828794388" TEXT="sollte also f&#xfc;r alle Varianten gleicherma&#xdf;en greifen"/>
</node>
</node>
<node CREATED="1748829095135" ID="ID_1295682918" MODIFIED="1748829098145" TEXT="Funktionen">
<node CREATED="1748829099022" ID="ID_766756688" MODIFIED="1748829101916" TEXT="Signatur-Utils">
<node CREATED="1748829959670" ID="ID_1188075291" MODIFIED="1748829968228" TEXT="sind bereits mit beiden kompatibel"/>
</node>
<node CREATED="1748829102455" ID="ID_1254282139" MODIFIED="1748829106392" TEXT="Closure">
<node CREATED="1748829838133" ID="ID_1933174501" MODIFIED="1748829845923" TEXT="hat nur wenige Verwendungen">
<node CREATED="1748829860803" ID="ID_517247632" MODIFIED="1748829863739" TEXT="Commands"/>
<node CREATED="1748829872320" ID="ID_568804131" MODIFIED="1748829875428" TEXT="Random-Draw"/>
<node CREATED="1748829881837" ID="ID_1354679657" MODIFIED="1748829885400" TEXT="tuple-closure"/>
<node CREATED="1748829890844" ID="ID_1803577911" MODIFIED="1748829894782" TEXT="view-spec-dsl"/>
</node>
<node CREATED="1748829733384" ID="ID_83679265" MODIFIED="1748829744922" TEXT="sollte sich bereits ohne weiteres schwenken lassen"/>
<node CREATED="1748829745682" ID="ID_61352432" MODIFIED="1748829759664" TEXT="erzeugt nur Tuple, oder macht Split / Prepend"/>
<node CREATED="1748829779637" ID="ID_1158113558" MODIFIED="1748829835939" TEXT="man k&#xf6;nnte dann im Nachgang die Apply-Definition eliminieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...aber nur wenn's einfach geht; eigentlich ist das au&#223;erhalb vom Scope und k&#246;nnte auch sp&#228;ter mal gemacht werden (ist nur ein Implementierungsdetail), sofern die bestehende Impl mit den neuen Typlisten arbeitet
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
<node CREATED="1748829133428" ID="ID_266502224" MODIFIED="1748829134942" TEXT="Tuple">
<node CREATED="1748829135672" ID="ID_1078202790" MODIFIED="1748829142923" TEXT="tuple-record-init">
<node CREATED="1748869115796" ID="ID_508891239" MODIFIED="1748869125930" TEXT="sehr wichtig f&#xfc;r GenNode via UI-Bus"/>
<node CREATED="1748869126637" ID="ID_1892597632" MODIFIED="1748869141216" TEXT="verwendet Type-Sequenze lediglich zum Re-binding eines Tuple-Typs"/>
<node COLOR="#338800" CREATED="1748869141825" ID="ID_893825351" MODIFIED="1748869166877" TEXT="kann man einfach auf die neue Variante schwenken">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node CREATED="1748829164245" ID="ID_1618911636" MODIFIED="1748829167991" TEXT="variadic-helper">
<node CREATED="1748830128123" ID="ID_450144323" MODIFIED="1748830132130" TEXT="(nur am Rande)"/>
<node CREATED="1748830132883" ID="ID_1589913777" MODIFIED="1748830138854" TEXT="IndexIter unterst&#xfc;tzt beide"/>
<node CREATED="1748830139501" ID="ID_622177889" MODIFIED="1748830160252" TEXT="ElmTypes ist nur f&#xfc;r neue (variadisch) definiert"/>
</node>
<node CREATED="1748829176262" ID="ID_1246318914" MODIFIED="1748829178958" TEXT="Variant"/>
<node CREATED="1748829201135" ID="ID_1330371655" MODIFIED="1748829203111" TEXT="Visitor"/>
<node CREATED="1748829220424" ID="ID_795696886" MODIFIED="1748829224836" TEXT="Session-Command">
<node CREATED="1748829229664" ID="ID_214343950" MODIFIED="1748829240967" TEXT="AcceptArg und AcceptBind umstellen"/>
<node CREATED="1748829241698" ID="ID_1502522588" MODIFIED="1748829249189" TEXT="dann sollte big-Bang m&#xf6;glich sein"/>
</node>
<node CREATED="1748829278917" ID="ID_250508253" MODIFIED="1748829282736" TEXT="Session &amp; Builder">
<node CREATED="1748829283559" ID="ID_373354659" MODIFIED="1748829291711" TEXT="h&#xe4;ngt vermutlich an Variant bzw. Visitor"/>
</node>
<node CREATED="1748829316732" ID="ID_733906672" MODIFIED="1748829324434" TEXT="Timecode-formate"/>
<node CREATED="1748829331775" ID="ID_1553022384" MODIFIED="1748829333067" TEXT="Tests">
<node CREATED="1748829335663" ID="ID_953757498" MODIFIED="1748829343651" TEXT="jeweils bei Bezug mit umstellen"/>
<node CREATED="1748829344620" ID="ID_1034418764" MODIFIED="1748883769361" TEXT="im Einzelnen">
<icon BUILTIN="list"/>
<node CREATED="1748829369449" MODIFIED="1748829369449" TEXT="FormatSupport_test"/>
<node CREATED="1748829384655" MODIFIED="1748829384655" TEXT="TimeControl_test"/>
<node CREATED="1748829402514" MODIFIED="1748829402514" TEXT="VisitingTool_test"/>
<node CREATED="1748829412897" MODIFIED="1748829412897" TEXT="CommandCloneBuilder_test"/>
<node CREATED="1748829420654" MODIFIED="1748829420654" TEXT="CommandEquality_test"/>
<node CREATED="1748829427640" MODIFIED="1748829427640" TEXT="CommandMutation_test"/>
<node CREATED="1748829435006" MODIFIED="1748829435006" TEXT="CommandRegistry_test"/>
<node CREATED="1748829442778" MODIFIED="1748829442778" TEXT="HandlingPatternBasics_test"/>
<node CREATED="1748829453011" MODIFIED="1748829453011" TEXT="BuilderTool_test"/>
<node CREATED="1748829468217" MODIFIED="1748829468217" TEXT="SessionServiceAccess_test"/>
<node CREATED="1748829480048" MODIFIED="1748829480048" TEXT="FunctionClosure_test"/>
<node CREATED="1748829502213" MODIFIED="1748829502213" TEXT="FunctionComposition_test"/>
<node CREATED="1748829512571" MODIFIED="1748829512571" TEXT="GeneratorCombinations_test"/>
<node COLOR="#435e98" CREATED="1748829523737" ID="ID_803058969" MODIFIED="1748883754992" TEXT="TypeListGenerator_test">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_803058969" ENDARROW="Default" ENDINCLINATION="852;0;" ID="Arrow_ID_1971292758" SOURCE="ID_511778446" STARTARROW="None" STARTINCLINATION="302;17;"/>
</node>
<node CREATED="1748829534601" MODIFIED="1748829534601" TEXT="MetaUtils_test"/>
<node CREATED="1748829542074" MODIFIED="1748829542074" TEXT="TupleHelper_test"/>
<node CREATED="1748829551216" MODIFIED="1748829551216" TEXT="TupleRecordInit_test"/>
<node CREATED="1748829559066" MODIFIED="1748829559066" TEXT="TypeListManip_test"/>
<node CREATED="1748829567920" MODIFIED="1748829567920" TEXT="TypeList_test"/>
<node COLOR="#435e98" CREATED="1748829576396" ID="ID_281104576" MODIFIED="1748883754992" TEXT="TypeListUtil_test">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_281104576" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_351374746" SOURCE="ID_1470463237" STARTARROW="None" STARTINCLINATION="458;41;"/>
</node>
<node CREATED="1748829585985" MODIFIED="1748829585985" TEXT="TypeSeqManipl_test"/>
<node CREATED="1748829607017" MODIFIED="1748829607017" TEXT="Variant_test"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748871733811" ID="ID_1327114043" MODIFIED="1748871745451" TEXT="schrittweise umarbeiten...">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748871746934" ID="ID_1013283697" MODIFIED="1748883821476" TEXT="mit einfachen Typ-Listen anfangen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1748871760093" ID="ID_234969081" MODIFIED="1748883829134" TEXT="alle Konvertierungspfade aufgedoppelt">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748871777734" ID="ID_543292197" MODIFIED="1748883832925" TEXT="die zugeh&#xf6;rigen Tests auf die neuen Typ-Sequenzen umstellen">
<icon BUILTIN="pencil"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1748871811471" ID="ID_1037157310" MODIFIED="1748883848889" TEXT="bei der Gelegenheit auch modernisieren">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748871820220" ID="ID_446849123" MODIFIED="1748883860119" TEXT="typedefs durch using ersetzen">
<icon BUILTIN="pencil"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748871829578" ID="ID_308061484" MODIFIED="1748883860119" TEXT="Meta-Wertfunktionen in constexpr &#xfc;berf&#xfc;hren">
<icon BUILTIN="pencil"/>
</node>
<node CREATED="1748871856256" ID="ID_304666403" MODIFIED="1748871864810" TEXT="Tests vervollst&#xe4;ndigen"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1748873216115" ID="ID_1189899594" MODIFIED="1748879258348" TEXT="Big anti-Bang: NullType &#x27fc; Nil">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1748873298068" ID="ID_132055056" MODIFIED="1748873322310" TEXT="182 usages...">
<font NAME="SansSerif" SIZE="10"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1748873306616" ID="ID_906235553" MODIFIED="1748873326356" TEXT="jede Menge Code-Formatierung kaputt">
<font NAME="SansSerif" SIZE="7"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1748873250610" ID="ID_7395466" MODIFIED="1748873280467" TEXT="Big-Bang: TySeq &#x27fc; Types">
<icon BUILTIN="hourglass"/>
</node>
</node>
</node>