Invocation: pave a way for more generic processing via ''type-sequence''

Tuples and the ''C++ tuple protocol'' build upon variadic arguments
and are thus rather tedious to handle, especially in this situation here,
where the argument can ''sometimes be a tuple...''

Several years ago I made the observation that processing by explicit ''type sequences''
(Loki-style) is much simpler to handle and easier to lift to a generic level of processing.
Thus I'll attempt now to extract the ''iteration and extraction part'' of the logic into a new helper.

`lib::meta::ElmTypes<TUP>` allows to process all ''tuple-like types'' and generic ''type sequences'' uniformely
and enables to use both styles interchangably (btw, it is quite common to ''abuse'' `std::tuple` as a type sequence).
With this helper, we can now
- build a ''type sequence'' from any ''tuple-like'' object (and vice-versa)
- re-bind (i.e. transfer the template parameters to another template)
- apply some wrapper
- create AND / OR evaluations over the types
This commit is contained in:
Fischlurch 2024-12-18 03:54:31 +01:00
parent cf4bc380b0
commit 844aa7f3d7
6 changed files with 489 additions and 102 deletions

View file

@ -232,6 +232,8 @@ namespace meta {
/* ==== Rebinding Variadic Arguments ==== **/
/**
@ -259,6 +261,100 @@ namespace meta {
/* ==== Build and Rebuild variadic type sequences ==== **/
/**
* Variadic type sequence builder.
* This metaprogramming helper template provides an unified view
* to handle _»tuple-like« types and variadic _type sequences._
* - the constant #SIZ gives the number of elements
* - the nested type #Idx can be used as _index sequence_
* - #Seq is a _variadic type sequence_ with the extracted types
* - #Tup is a std::tuple over these types
* - the nested template #Apply wraps each type into another template
* - #Rebind likewise instantiates another template with the element types
* - #AndAll applies a predicate and combines the result with _logical and_
* - #OrAll similarly evaluates _logical or_ on the application results
*/
template<class X, typename =void>
struct ElmTypes
{
static constexpr size_t SIZ = 1;
using Idx = std::index_sequence<SIZ>;
using Seq = TySeq<X>;
using Tup = std::tuple<X>;
template<template<class> class META>
using Apply = TySeq<META<X>>;
template<template<typename...> class O>
using Rebind = O<X>;
template<template<class> class PRED>
using AndAll = std::__and_<PRED<X>>;
template<template<class> class PRED>
using OrAll = std::__or_<PRED<X>>;
};
/** Partial specialisation to handle type sequences */
template<typename...TYPES>
struct ElmTypes<TySeq<TYPES...>>
{
static constexpr size_t SIZ = sizeof...(TYPES);
using Idx = std::make_index_sequence<SIZ>;
using Seq = TySeq<TYPES...>;
using Tup = std::tuple<TYPES...>;
template<template<class> class META>
using Apply = TySeq<META<TYPES>...>;
template<template<typename...> class O>
using Rebind = typename lib::meta::RebindVariadic<O, Seq>::Type;
template<template<class> class PRED>
using AndAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__and_>;
template<template<class> class PRED>
using OrAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__or_>;
};
/** partial specialisation to handle types
* supporting the C++ »tuple protocol«
*/
template<class TUP>
struct ElmTypes<TUP, enable_if_TupleProtocol<TUP>>
{
template<typename>
struct Extract;
template<size_t...idx>
struct Extract<std::index_sequence<idx...>>
{
using ElmTypes = TySeq<typename std::tuple_element<idx,TUP>::type ...>;
};
static constexpr size_t SIZ = std::tuple_size<TUP>::value;
using Idx = std::make_index_sequence<SIZ>;
using Seq = typename Extract<Idx>::ElmTypes;
using Tup = typename RebindVariadic<std::tuple, Seq>::Type;
template<template<class> class META>
using Apply = typename ElmTypes<Seq>::template Apply<META>;
template<template<typename...> class O>
using Rebind = typename RebindVariadic<O, Seq>::Type;
template<template<class> class PRED>
using AndAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__and_>;
template<template<class> class PRED>
using OrAll = typename ElmTypes<Apply<PRED>>::template Rebind<std::__or_>;
};
/* ==== Invoke with index from variadic ==== **/
/** helper to invoke a functor, passing instances of std::integral_constant

View file

@ -144,6 +144,7 @@ namespace engine {
template<class TUP, template<class> class COND>
struct isAllElements
{
@ -173,8 +174,6 @@ namespace engine {
template<class X, typename SEL = void>
struct StructType
{
// static lib::test::TypeDebugger<X> kacki;
using Seq = TySeq<X>;
using Tup = std::tuple<X>;
};
@ -182,8 +181,6 @@ namespace engine {
template<class TUP>
struct StructType<TUP, enable_if<is_Structured<TUP>> >
{
// static lib::test::TypeDebugger<TUP> drecky;
template<typename>
struct AllZ;
template<size_t...idx>

View file

@ -671,6 +671,11 @@ return: 0
END
TEST "variadic type manipulations" VariadicHelper_test <<END
return: 0
END
TEST "variadic argument manipulation" VariadicArgumentPicker_test <<END
out: 4╎N<1>──.─┼N<2>──.─┼N<3>──.─┼N<3>──.─┤
out: 4╎N<0>──.─┼N<1>──.─┼N<2>──.─┼N<3>──.─┤

View file

@ -27,12 +27,13 @@
#include "steam/engine/buffhandle-attach.hpp"
//#include "lib/format-cout.hpp"
#include "lib/test/diagnostic-output.hpp"/////////////////////TODO
//#include "lib/util.hpp"
#include "lib/util.hpp"
//using std::string;
using std::tuple;/////////////TODO
using std::array;
using util::isSameAdr;
namespace steam {
@ -78,22 +79,42 @@ namespace test {
// some random numbers to test...
long r1 = rani(100);
// Type setup to build a suitable FeedManifold
// Prepare setup to build a suitable FeedManifold
using Buffer = long;
/////////////////////////////////////////////////////////////////////////////////TODO
using T1 = tuple<int,double>;
using T2 = array<int*,3>;
using T3 = int;
using T4 = int*;
using T5 = lib::HeteroData<int*>;
using T5 = lib::HeteroData<int*,long,double*>;
/////////////////////////////////////////////////////////////////////////////////TODO
using lib::meta::ElmTypes;
using S1 = ElmTypes<T5>;
SHOW_TYPE(S1)
SHOW_TYPE(S1::Seq)
SHOW_TYPE(S1::Tup)
SHOW_TYPE(S1::Idx)
using S1A = S1::Apply<is_Buffer>;
SHOW_TYPE(S1A)
using S1AR = ElmTypes<S1A>::Rebind<std::__and_>;
SHOW_TYPE(S1AR)
SHOW_EXPR(S1AR::value)
using S1AA = S1::AndAll<is_Buffer>;
SHOW_TYPE(S1AA)
SHOW_EXPR(bool(S1AA()))
using S1OA = S1::OrAll<is_Buffer>;
SHOW_TYPE(S1OA)
SHOW_EXPR(S1OA::value)
auto fun_singleOut = [&](Buffer* buff) { *buff = r1; };
// Example-1: a FeedManifold to adapt a simple generator function
using M1 = FeedManifold<decltype(fun_singleOut)>;
CHECK (not M1::hasInput());
CHECK (not M1::hasParam());
// instantiate...
M1 m1{fun_singleOut};
CHECK (1 == m1.outBuff.array().size());
SHOW_EXPR(m1.outArgs)
CHECK (nullptr == m1.outArgs );
// CHECK (m1.inArgs ); // does not compile because storage field is not provided
// CHECK (m1.param );
@ -103,19 +124,31 @@ SHOW_EXPR(m1.outArgs)
CHECK (buff.isValid());
CHECK (buff.accessAs<long>() == -55);
m1.outBuff.createAt (0, buff);
m1.outBuff.createAt (0, buff); // plant a copy of the BuffHandle into the output slot
CHECK (m1.outBuff[0].isValid());
CHECK (m1.outBuff[0].accessAs<long>() == -55);
SHOW_TYPE(M1::ArgI)
SHOW_TYPE(M1::TupI)
SHOW_TYPE(M1::ArgO)
SHOW_TYPE(M1::TupO)
m1.connect();
SHOW_EXPR(m1.outArgs)
SHOW_EXPR(m1.outBuff[0])
SHOW_EXPR(util::showAdr(*buff))
SHOW_EXPR(util::showAdr(*m1.outBuff[0]))
m1.connect(); // instruct the manifold to connect buffers to arguments
CHECK (isSameAdr (m1.outArgs, *buff));
CHECK (*m1.outArgs == -55);
m1.invoke(); // invoke the adapted processing function (fun_singleOut)
CHECK (buff.accessAs<long>() == r1); // result: the random number r1 was written into the buffer.
// Example-2: adapt a function to process input -> output buffer
auto fun_singleInOut = [](Buffer* in, Buffer* out) { *out = *in; };
using M2 = FeedManifold<decltype(fun_singleInOut)>;
CHECK ( M2::hasInput());///////////////////////////TODO broken due to overly convoluted logic!!!!
CHECK (not M2::hasParam());
CHECK (1 == M2::FAN_I);
CHECK (1 == M2::FAN_O);
// instantiate...
M2 m2{fun_singleInOut};
// CHECK (1 == m2.inBuff.array().size()); ///////////TODO : need to »lift« plain types for simplfied logic!!!!
CHECK (1 == m2.outBuff.array().size());
// CHECK (nullptr == m2.inArgs );
CHECK (nullptr == m2.outArgs );
}
};

View file

@ -0,0 +1,169 @@
/*
VariadicHelper(Test) - verify helpers for transforming variadics and tuple-like types
Copyright (C)
2024, Hermann Vosseler <Ichthyostega@web.de>
  **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 variadic-helper-test.cpp
** THe unit test \ref VariadicHelper_test demonstrates the usage of metaprogramming
** helpers to handle _tuple-like_ types and type sequences in a uniform way.
** @see variadic-helper.hpp
** @see tuple-helper.hpp
** @see feed-manifold.hpp real-world usage scenario
**
*/
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/meta/variadic-helper.hpp"
#include "lib/hetero-data.hpp"
#include "lib/test/diagnostic-output.hpp"////////////TODO
#include <tuple>
#include <array>
using lib::test::showType;
using std::array;
using std::tuple;
namespace lib {
namespace meta {
namespace test {
/*********************************************************************//**
* @test Cover some advanced metaprogramming helpers to support working
* with _tuple like_ types together with simple types.
*/
class VariadicHelper_test : public Test
{
virtual void
run (Arg)
{
rebuild_variadic();
}
/** @test demonstrate uniform handling of...
* - simple types,
* - _tuple-like_ types (usable for structured binding)
* - _generic type sequences_
*/
void
rebuild_variadic()
{
// CASE-1 : a tuple....
using T1 = tuple<int,double>;
using S1 = ElmTypes<T1>;
CHECK (2 == S1::SIZ);
CHECK (showType< S1 >() == "ElmTypes<tuple<int, double>, void>"_expect);
CHECK (showType< S1::Seq >() == "TySeq<int, double>"_expect);
CHECK (showType< S1::Tup >() == "tuple<int, double>"_expect);
CHECK (showType< S1::Idx >() == "integer_sequence<ulong, 0ul, 1ul>"_expect);
using S1A = S1::Apply<std::is_pointer>;
CHECK (showType< S1A >() == "TySeq<is_pointer<int>, is_pointer<double> >"_expect);
using S1AR = ElmTypes<S1A>::Rebind<std::__and_>;
CHECK (showType< S1AR >() == "__and_<is_pointer<int>, is_pointer<double> >"_expect);
CHECK (false == S1AR::value);
using S1AA = S1::AndAll<std::is_pointer>;
CHECK (showType< S1AA >() == "__and_<is_pointer<int>, is_pointer<double> >"_expect);
CHECK (false == S1AA::value);
using S1OA = S1::OrAll<std::is_pointer>;
CHECK (showType< S1OA >() == "__or_<is_pointer<int>, is_pointer<double> >"_expect);
CHECK (false == S1OA::value);
// CASE-0 : handling an unstructured simple type....
using T0 = int*;
using S0 = ElmTypes<T0>;
CHECK (1 == S0::SIZ);
CHECK (showType< S0 >() == "ElmTypes<int*, void>"_expect);
CHECK (showType< S0::Seq >() == "TySeq<int*>"_expect);
CHECK (showType< S0::Tup >() == "tuple<int*>"_expect);
CHECK (showType< S0::Idx >() == "integer_sequence<ulong, 1ul>"_expect);
using S0A = S0::Apply<std::is_pointer>;
CHECK (showType< S0A >() == "TySeq<is_pointer<int*> >"_expect);
using S0AA = S0::AndAll<std::is_pointer>;
CHECK (showType< S0AA >() == "__and_<is_pointer<int*> >"_expect);
CHECK (true == S0AA::value);
using S0OA = S0::OrAll<std::is_pointer>;
CHECK (showType< S0OA >() == "__or_<is_pointer<int*> >"_expect);
CHECK (true == S0OA::value);
// CASE-2 : can also handle a std::array....
using T2 = array<int*,3>;
using S2 = ElmTypes<T2>;
CHECK (3 == S2::SIZ);
CHECK (showType< S2 >() == "ElmTypes<array<int*, 3ul>, void>"_expect);
CHECK (showType< S2::Seq >() == "TySeq<int*, int*, int*>"_expect);
CHECK (showType< S2::Tup >() == "tuple<int*, int*, int*>"_expect);
CHECK (showType< S2::Idx >() == "integer_sequence<ulong, 0ul, 1ul, 2ul>"_expect);
using S2A = S2::Apply<std::is_pointer>;
CHECK (showType< S2A >() == "TySeq<is_pointer<int*>, is_pointer<int*>, is_pointer<int*> >"_expect);
using S2AA = S2::AndAll<std::is_pointer>;
CHECK (showType< S2AA >() == "__and_<is_pointer<int*>, is_pointer<int*>, is_pointer<int*> >"_expect);
CHECK (true == S2AA::value);
using S2OA = S2::OrAll<std::is_pointer>;
CHECK (showType< S2OA >() == "__or_<is_pointer<int*>, is_pointer<int*>, is_pointer<int*> >"_expect);
CHECK (true == S2OA::value);
// CASE-3 : a custom type which implements the C++ »tuple protocol«....
using T3 = lib::HeteroData<int*,long,double*>;
using S3 = ElmTypes<T3>;
CHECK (3 == S3::SIZ);
CHECK (showType< S3 >() == "ElmTypes<HeteroData<int*, long, double*>, void>"_expect);
CHECK (showType< S3::Seq >() == "TySeq<int*, long, double*>"_expect);
CHECK (showType< S3::Idx >() == "integer_sequence<ulong, 0ul, 1ul, 2ul>"_expect);
using S3A = S3::Apply<std::is_pointer>;
CHECK (showType< S3A >() == "TySeq<is_pointer<int*>, is_pointer<long>, is_pointer<double*> >"_expect);
using S3AA = S3::AndAll<std::is_pointer>;
CHECK (showType< S3AA >() == "__and_<is_pointer<int*>, is_pointer<long>, is_pointer<double*> >"_expect);
CHECK (false == S3AA::value);
using S3OA = S3::OrAll<std::is_pointer>;
CHECK (showType< S3OA >() == "__or_<is_pointer<int*>, is_pointer<long>, is_pointer<double*> >"_expect);
CHECK (true == S3OA::value);
}
};
/** Register this test class... */
LAUNCHER (VariadicHelper_test, "unit meta");
}}} // namespace lib::meta::test

View file

@ -24795,9 +24795,7 @@
<node CREATED="1675383853090" ID="ID_1092222582" MODIFIED="1675383860604" TEXT="wird direkt zum Zeichnen verwendet"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1675383862097" ID="ID_93556948" MODIFIED="1679085432286" TEXT="TODO: w&#xe4;chst derzeit monoton">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...es sollte an geeigneter Stelle einen Reset geben, da jeder DisplayEvalutaionPass grunds&#228;tzlich das ganze Layout sauber ausrechnen kann
@ -25486,9 +25484,7 @@
</node>
<node CREATED="1540511389686" ID="ID_1017315025" MODIFIED="1576282358074" TEXT="Anker-Widgets explizit &#xfc;bergeben">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -25944,9 +25940,7 @@
</node>
<node COLOR="#338800" CREATED="1575063986126" FOLDED="true" ID="ID_237283777" MODIFIED="1582930967369" TEXT="konkretisiert: als ViewHook-Mechanismus">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das ist zun&#228;chst ein Versuch, ein m&#252;hsam errungenes Design zu verifizieren...
@ -26800,9 +26794,7 @@
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1676045162558" ID="ID_1938495472" LINK="#ID_1978068021" MODIFIED="1676046631665" TEXT="brauche Ausdehnng des Widgets">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar die konkret wirksame Ausdehnung &#10233; meiner Analyse zufolge ist das get_width|height()
@ -27666,9 +27658,7 @@
</node>
<node CREATED="1678028693313" ID="ID_1210494901" MODIFIED="1678028703577">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<font face="Monospaced" size="2">TrackHeadWidget::accommodateOverallHeight(uint overallHeight)</font>
@ -27803,9 +27793,7 @@
<node COLOR="#435e98" CREATED="1678054437780" ID="ID_289152885" MODIFIED="1678054518905" TEXT="brauche eine scharfe Gehrung (&quot;miter&quot;)">
<node CREATED="1678054454505" ID="ID_829025847" MODIFIED="1678054489675" TEXT="miter_limit auf 20 hochsetzen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...der default ist 10, und das erzeugt eine Gehrung nur bis ca 20&#176;
@ -29573,9 +29561,7 @@
<node CREATED="1561150569779" FOLDED="true" ID="ID_1587537475" MODIFIED="1561827482929" TEXT="ich will aber den Standardfall irgendwie erhalten">
<node CREATED="1561150585582" ID="ID_791249238" MODIFIED="1561150668295" TEXT="und sei es blo&#xdf; zur Dokumentation">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
d.h. ich will den Standardfall als Standardfall sichtbar haben,
@ -32037,9 +32023,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Core-Entwickler von GTK
@ -34579,9 +34563,7 @@
<linktarget COLOR="#4b557b" DESTINATION="ID_1090402146" ENDARROW="Default" ENDINCLINATION="-1035;0;" ID="Arrow_ID_1722473168" SOURCE="ID_634897151" STARTARROW="None" STARTINCLINATION="-385;32;"/>
<node CREATED="1661696072514" ID="ID_1764427475" MODIFIED="1661696199675" TEXT="Verwaltung der pop-Up-Men&#xfc;(s)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das ist ein &#252;bergreifendes Thema zum UI-Verhalten
@ -34686,9 +34668,7 @@
</node>
<node CREATED="1611954396933" ID="ID_1771085068" MODIFIED="1611954498300" TEXT="Alternative w&#xe4;re: Datencontainer per Pointer anh&#xe4;ngen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
diese Alternative w&#252;rde dann attraktiv, wenn es h&#228;ufig vorkommt, da&#223; zwischen einem Clip-Widget und einer anderen Repr&#228;sentation des ClipDelegate dynamisch hin- und hergeschaltet werden mu&#223;. Weil man dann den relativ schwergewichtigen Datencontainer einfach umh&#228;ngen k&#246;nnte
@ -35948,9 +35928,7 @@
</node>
<node CREATED="1544241590705" ID="ID_1914479382" MODIFIED="1557498707232">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
demnach w&#252;rde startup sauber beendet,
@ -36762,9 +36740,7 @@
<icon BUILTIN="idea"/>
<node CREATED="1539134201394" ID="ID_1071210666" MODIFIED="1576282358025" TEXT="UI-Komponente realisiert sich selbst">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -37271,9 +37247,7 @@
</node>
<node CREATED="1614545319978" ID="ID_819484059" MODIFIED="1614546053325" TEXT="L&#xf6;sung-2: Drag-Geste manipuliert nur die Pixel/Canvas-Koordinaten">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das hei&#223;t, durch die Drag-Geste entstehen vor&#252;bergehend lokal inkonsistente Koordinaten; der n&#228;chste DisplayEvaluation-Pass w&#252;rde dies wieder beseitigen. Dieser Ansatz w&#228;re rein logisch der konsistentere Weg, denn erst durch eine R&#252;ckmeldung von der Session wird eine neue Position auch offiziell. Allerdings m&#252;&#223;te man bei diesem Ansatz vorsichtig vorgehen, und m&#246;gliche Interferenzen mit der DisplayEvaluation und dem Layout-Managment bedenken; besonders wenn man eine weite Strecke zur&#252;cklegt, k&#246;nnte es passieren, da&#223; der Clip dann pl&#246;tzlich aus der Anzeige verschwindet und den Fokus verliert, weil eine DisplayEvaluation ihn wieder an seine gegenw&#228;rtig nominelle Position geschoben hat.
@ -37503,9 +37477,7 @@
<icon BUILTIN="hourglass"/>
<node COLOR="#338800" CREATED="1616684903452" ID="ID_1953335093" MODIFIED="1679362063109">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
1.Schritt: <i>irgendwie implementieren</i>
@ -55972,8 +55944,7 @@
soll sowohl einfache Tyen, alsauch &#187;<b>strukturierte Typen</b>&#171; (tuple-like) akzeptieren
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -56001,8 +55972,7 @@
deshalb ist es sinnvoll, einen &#955;-closed Code-Block <i>f&#252;r jeden Index zu instantiieren</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1734473468024" HGAP="41" ID="ID_1159486680" MODIFIED="1734473478720" TEXT="definiert in variadic-helper.cpp">
@ -56017,17 +55987,32 @@
</node>
</node>
</node>
<node CREATED="1734474134102" FOLDED="true" ID="ID_1942900317" MODIFIED="1734474336372" TEXT="Hilfsmittel f&#xfc;r Tuple-Protocol">
<node CREATED="1734474134102" ID="ID_1942900317" MODIFIED="1734496125500" TEXT="Hilfsmittel f&#xfc;r Tuple-Protocol">
<node COLOR="#435e98" CREATED="1734474149788" ID="ID_1392132639" MODIFIED="1734474304945" TEXT="is_Structured">
<arrowlink COLOR="#65a0c8" DESTINATION="ID_1962318483" ENDARROW="Default" ENDINCLINATION="-561;59;" ID="Arrow_ID_1253919416" STARTARROW="None" STARTINCLINATION="4095;820;"/>
<node CREATED="1734474272972" HGAP="45" ID="ID_752241989" MODIFIED="1734474297902" TEXT="erkennt ob ein Typ std::tuple_size&lt;T&gt; unterst&#xfc;tzt" VSHIFT="2">
<font NAME="SansSerif" SIZE="10"/>
</node>
<node CREATED="1734474272972" HGAP="45" ID="ID_764776222" MODIFIED="1734496311742" VSHIFT="2">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced" size="2" color="#948484">lib::meta::</font><font face="Monospaced" size="2" color="#5c3528"><b>enable_if_TupleProtocol</b></font><font face="Monospaced" size="2" color="#948484">&lt;</font><font face="Monospaced" size="2" color="#9a0f0f">TY</font><font face="Monospaced" size="2" color="#948484">&gt;</font>
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
<node COLOR="#435e98" CREATED="1734474159266" ID="ID_458414563" LINK="#ID_1710377001" MODIFIED="1734474304945" TEXT="StructType">
</node>
<node COLOR="#435e98" CREATED="1734495942965" ID="ID_1890096800" MODIFIED="1734496349526" TEXT="ElmTypes">
<arrowlink COLOR="#458adc" DESTINATION="ID_894985782" ENDARROW="Default" ENDINCLINATION="-2245;0;" ID="Arrow_ID_1598804519" STARTARROW="None" STARTINCLINATION="5222;1394;"/>
<node CREATED="1734474272972" HGAP="45" ID="ID_1114931809" MODIFIED="1734474326928" TEXT="&#xbb;hebt&#xab; einen einfachen Typ in ein Tupel" VSHIFT="2">
<font NAME="SansSerif" SIZE="10"/>
</node>
<node CREATED="1734474272972" HGAP="45" ID="ID_1913456215" MODIFIED="1734496204882" TEXT="erlaubt uniforme Iteration und Pr&#xe4;dikat-Anwendung" VSHIFT="-9">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
<node CREATED="1697906135803" ID="ID_47415467" MODIFIED="1697927623614" TEXT="Function utils">
@ -88658,8 +88643,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
will sagen ... das ist nicht das Problem; der Compiler macht hier eine verwirrende Transformation, die den Typ eines Funktionspointers mit Template-Argumenten instaniiert. Leider hat das aber zur Folge, da&#223; man das eigentliche Problem nicht sieht (selbst wenn man endlos drauf starrt...)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#802361" CREATED="1734390724212" HGAP="25" ID="ID_1829336783" MODIFIED="1734390924760" TEXT="(ja das tats&#xe4;chliche Problem w&#xe4;re hier versteckt gewesen)" VSHIFT="-15">
<richcontent TYPE="NOTE"><html>
@ -88751,8 +88735,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
void (*(std::_Placeholder&lt;1&gt;, int))(void*, <b><font color="#e00219">int&amp;&amp;</font></b>)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734378652331" ID="ID_804249162" MODIFIED="1734378687327" TEXT="&#x2260;">
<font NAME="SansSerif" SIZE="14"/>
@ -88765,8 +88748,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
(void (*)(void*, int&amp;&amp;)) (std::_Placeholder&lt;1&gt;, <b><font color="#a90404">int</font></b>)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node COLOR="#5b280f" CREATED="1734380583440" ID="ID_944972328" MODIFIED="1734386726726" TEXT="Nein! das ist es nicht">
@ -88865,8 +88847,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734381356576" ID="ID_217508249" MODIFIED="1734386742771" TEXT="...und die gebundene Funktion wurde aber f&#xfc;r RValues instantiiert">
<linktarget COLOR="#fde3e9" DESTINATION="ID_217508249" ENDARROW="Default" ENDINCLINATION="464;20;" ID="Arrow_ID_891244985" SOURCE="ID_944972328" STARTARROW="None" STARTINCLINATION="-86;10;"/>
<linktarget COLOR="#f7dffd" DESTINATION="ID_217508249" ENDARROW="Default" ENDINCLINATION="420;13;" ID="Arrow_ID_1048587640" SOURCE="ID_1829336783" STARTARROW="None" STARTINCLINATION="171;10;"/>
<linktarget COLOR="#fde3e9" DESTINATION="ID_217508249" ENDARROW="Default" ENDINCLINATION="464;20;" ID="Arrow_ID_891244985" SOURCE="ID_944972328" STARTARROW="None" STARTINCLINATION="-86;10;"/>
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1734385977834" ID="ID_1426672931" MODIFIED="1734385991397" TEXT="Das ist wohl ein inh&#xe4;rentes Problem">
@ -91862,7 +91844,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="smiley-neutral"/>
</node>
</node>
<node CREATED="1734300344699" ID="ID_660526050" MODIFIED="1734300363029" TEXT="strukturierte Typen in einem zweiten Schritt hinzuf&#xfc;gen"/>
<node CREATED="1734300344699" ID="ID_660526050" MODIFIED="1734300363029" TEXT="strukturierte Typen in einem zweiten Schritt hinzuf&#xfc;gen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734483863501" ID="ID_1884890390" MODIFIED="1734484068908" TEXT="sollte nochmal restukturieren....">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...wenn m&#246;glich alles auf strukturierte Typen <i>heben</i>
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#c8022e" DESTINATION="ID_1884890390" ENDARROW="Default" ENDINCLINATION="-1263;97;" ID="Arrow_ID_232119446" SOURCE="ID_1086476352" STARTARROW="None" STARTINCLINATION="-517;-18;"/>
<icon BUILTIN="yes"/>
<node COLOR="#236883" CREATED="1734496443007" ID="ID_1580496045" LINK="#ID_1734731182" MODIFIED="1734496487271" TEXT="generisches Verarbeitungs-Schema: ElmTypes&lt;TUP&gt;">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1734458417453" ID="ID_1458239434" MODIFIED="1734458430809" TEXT="struktuierte Argumente korrekt klassifizieren">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734458433484" ID="ID_569916262" MODIFIED="1734458448795" TEXT="Frage: wie umgehen mit leeren Strukturen?">
@ -91878,8 +91877,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
man k&#246;nnte nun sagen: <i>det sollen se halt nit machen!</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1734458587984" ID="ID_402660303" MODIFIED="1734458899210" TEXT="sekund&#xe4;re Schwierigkeit: wir klassifizieren die Use-Cases anhand der &#xbb;Art&#xab; eines Arguments">
<richcontent TYPE="NOTE"><html>
@ -91895,8 +91893,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Beispielsweise in der aktuellen Logik pr&#252;fen wir ob der 1.Slot ein &#187;Valu&#171; ist, was dann bei einer leeren Struct dazu f&#252;hren w&#252;rde, diese als ein leeres Param-Tupel zu behandeln. Kommt dann darauf an, ob das tats&#228;chlich einen Schaden im Code anrichtet, oder auch <i>leer durchl&#228;uft.</i>&#160;Denn an sich sollte es ja egal sein, sofern dann nur dieser Slot auch tats&#228;chlich keine Behandlung bekommt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734458906909" ID="ID_53372671" MODIFIED="1734458916675" TEXT="sp&#xe4;ter nochmal beurteilen">
@ -92045,7 +92042,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#435e98" CREATED="1734214260094" ID="ID_1731140529" MODIFIED="1734397828794" TEXT="mu&#xdf; die Storage neu bestimmen">
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1734214271580" ID="ID_1045815708" MODIFIED="1734397811621" TEXT="Nochmal &#xfc;ber die Rolle der FeedManifold nachdenken">
<node COLOR="#435e98" CREATED="1734214271580" FOLDED="true" ID="ID_1045815708" MODIFIED="1734397811621" TEXT="Nochmal &#xfc;ber die Rolle der FeedManifold nachdenken">
<linktarget COLOR="#2e2c57" DESTINATION="ID_1045815708" ENDARROW="Default" ENDINCLINATION="-98;-400;" ID="Arrow_ID_639104343" SOURCE="ID_525858909" STARTARROW="None" STARTINCLINATION="-367;14;"/>
<icon BUILTIN="yes"/>
<node CREATED="1734214319422" ID="ID_405803529" MODIFIED="1734214333944" TEXT="sie ist und bleibt die dynamische Invocation-Storage"/>
@ -92067,7 +92064,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1734214838441" ID="ID_1382984783" MODIFIED="1734214854714" TEXT="k&#xf6;nnte durch das WeavingPattern gesteuert werden"/>
</node>
</node>
<node CREATED="1734221531913" ID="ID_403160908" MODIFIED="1734221552785" TEXT="verschmelzen mit dem InvocationAdapter">
<node CREATED="1734221531913" ID="ID_403160908" MODIFIED="1734483823864" TEXT="verschmelzen mit dem InvocationAdapter">
<arrowlink COLOR="#858c9d" DESTINATION="ID_152918477" ENDARROW="Default" ENDINCLINATION="23;-56;" ID="Arrow_ID_1086373449" STARTARROW="None" STARTINCLINATION="-45;3;"/>
<node CREATED="1734221555701" ID="ID_1326995703" MODIFIED="1734224314109" TEXT="im Grund war sie das doch schon immer">
<richcontent TYPE="NOTE"><html>
<head/>
@ -92111,7 +92109,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1734226154995" ID="ID_1824135693" MODIFIED="1734397838296" TEXT="Konsequenzen">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="forward"/>
<node CREATED="1734226167432" ID="ID_152918477" MODIFIED="1734226177431" TEXT="FeedManifold ist der InvocationAdapter"/>
<node CREATED="1734226167432" ID="ID_152918477" MODIFIED="1734483815750" TEXT="FeedManifold ist der InvocationAdapter">
<linktarget COLOR="#858c9d" DESTINATION="ID_152918477" ENDARROW="Default" ENDINCLINATION="23;-56;" ID="Arrow_ID_1086373449" SOURCE="ID_403160908" STARTARROW="None" STARTINCLINATION="-45;3;"/>
</node>
<node CREATED="1734226179091" ID="ID_656635473" MODIFIED="1734226192693" TEXT="Parametrisiert wird mit dem konkreten Funktor"/>
<node CREATED="1734226218750" ID="ID_1815522792" MODIFIED="1734226239453" TEXT="daraus mu&#xdf; sich FeedManifold komplett selbst konfigurieren"/>
<node CREATED="1734226245002" ID="ID_1729798414" MODIFIED="1734226264004" TEXT="so wie praktisch bereits implementiert &#x2014; per Traits-Template"/>
@ -92122,8 +92122,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734226596427" ID="ID_1730595360" MODIFIED="1734397856015" TEXT="Struktur neu aufbauen">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734226295084" ID="ID_43554059" MODIFIED="1734397850135" TEXT="FeedManifold wird aus mehreren Layern zusammengesetzt">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1734226295084" ID="ID_43554059" MODIFIED="1734483723539" TEXT="FeedManifold wird aus mehreren Layern zusammengesetzt">
<icon BUILTIN="button_ok"/>
<node CREATED="1734226447447" ID="ID_1121321956" MODIFIED="1734226473215" TEXT="Param-Storage (optional)"/>
<node CREATED="1734226474754" ID="ID_334989563" MODIFIED="1734226483630" TEXT="Input-Storage (optional)"/>
<node CREATED="1734226485049" ID="ID_1102989908" MODIFIED="1734226491735" TEXT="Output-Storage (mandatory)"/>
@ -92199,8 +92199,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#16a2aa" DESTINATION="ID_1710382999" ENDARROW="Default" ENDINCLINATION="539;-32;" ID="Arrow_ID_129574515" STARTARROW="None" STARTINCLINATION="183;11;"/>
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1734286523651" ID="ID_132315841" MODIFIED="1734286531775" TEXT="Fall-Unterscheidungen f&#xfc;r die Storage einf&#xfc;hren"/>
<node CREATED="1734286560983" ID="ID_431464065" MODIFIED="1734300414607" TEXT="auf die flexible Funktor-Signatur schwenken"/>
<node COLOR="#338800" CREATED="1734286523651" ID="ID_132315841" MODIFIED="1734480723031" TEXT="Fall-Unterscheidungen f&#xfc;r die Storage einf&#xfc;hren">
<linktarget COLOR="#75a8d1" DESTINATION="ID_132315841" ENDARROW="Default" ENDINCLINATION="532;28;" ID="Arrow_ID_791254362" SOURCE="ID_718171059" STARTARROW="None" STARTINCLINATION="115;5;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734286560983" ID="ID_431464065" MODIFIED="1734480210827" TEXT="auf die flexible Funktor-Signatur schwenken">
<icon BUILTIN="pencil"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734300380799" ID="ID_782708625" MODIFIED="1734300402299" TEXT="dann die Erweiterung auf strukturierte Typen dazunehmen">
<icon BUILTIN="flag-yellow"/>
@ -92222,6 +92227,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734398371276" ID="ID_1513818427" MODIFIED="1734474043348" TEXT="brauche forEach(IndexTuple)">
<linktarget COLOR="#4ab2e5" DESTINATION="ID_1513818427" ENDARROW="Default" ENDINCLINATION="-120;11;" ID="Arrow_ID_668892948" SOURCE="ID_81517996" STARTARROW="None" STARTINCLINATION="-103;-9;"/>
<icon BUILTIN="yes"/>
<node CREATED="1734399341087" ID="ID_763559603" MODIFIED="1734399361894" TEXT="sollte aber auch f&#xfc;r frei stehenden Einzeltyp funktionieren"/>
<node COLOR="#5b280f" CREATED="1734399363642" ID="ID_535610409" MODIFIED="1734471924041" TEXT="Verwende das gute alte InstantiateWithIndex aus generator.hpp">
@ -92234,7 +92240,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734399930258" ID="ID_552320825" MODIFIED="1734471981106" TEXT="oder doch nur einen Index-Generator &#x27f6; &#x3bb;">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734471983248" ID="ID_180764617" MODIFIED="1734472002527" TEXT="geht das &#xfc;berhaupt mit einem Lambda?">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#3d1981" CREATED="1734471983248" ID="ID_180764617" MODIFIED="1734475355476" TEXT="geht das &#xfc;berhaupt mit einem Lambda?">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="help"/>
<node COLOR="#5b280f" CREATED="1734472004853" ID="ID_1548338453" MODIFIED="1734472034734" TEXT="im Body wird der Index als constexpr gebraucht">
@ -92255,13 +92261,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Hut ab f&#252;r den Poster auf Stackoverflow: der hat diese M&#246;glichkeit gesehen und ist dann nur an ein paar Kleinigkeiten gescheitert.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1734472285111" ID="ID_576227286" MODIFIED="1734473972771" TEXT="in generischen Library-Helper einbauen">
<node COLOR="#338800" CREATED="1734472285111" FOLDED="true" ID="ID_576227286" MODIFIED="1734473972771" TEXT="in generischen Library-Helper einbauen">
<icon BUILTIN="yes"/>
<node CREATED="1734472314563" ID="ID_878985358" MODIFIED="1734472355171" TEXT="weil &#x2014; mu&#xdf; hier Komplexit&#xe4;t verbergen">
<richcontent TYPE="NOTE"><html>
@ -92286,8 +92291,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
...denn diese Mechanik ist im Grunde komplett unabh&#228;ngig von Tuples (oder auch sonstigen Strukturen)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node COLOR="#5b280f" CREATED="1734472482636" ID="ID_1888534617" MODIFIED="1734472501560" TEXT="k&#xf6;nnte sogar in meta/utils">
<icon BUILTIN="stop-sign"/>
@ -92326,16 +92330,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1734473996312" ID="ID_970193220" MODIFIED="1734474093813" TEXT="zusammen mit einem Access-Helper &#x27f9; Basis-Funktionalit&#xe4;t bereitgestellt">
<linktarget COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="7;120;" ID="Arrow_ID_633874673" SOURCE="ID_971023481" STARTARROW="None" STARTINCLINATION="30;-94;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1734403556414" ID="ID_971023481" MODIFIED="1734474109401" TEXT="mu&#xdf; dazu den Einzelfall-Typ auf einen structured-Type &#xbb;heben&#xab;">
<arrowlink COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="7;120;" ID="Arrow_ID_633874673" STARTARROW="None" STARTINCLINATION="30;-94;"/>
<node COLOR="#338800" CREATED="1734403583091" ID="ID_1710377001" MODIFIED="1734474118087" TEXT="StructType&lt;TY&gt;">
<node CREATED="1734403556414" ID="ID_971023481" MODIFIED="1734480652825" TEXT="mu&#xdf; dazu den Einzelfall-Typ auf einen structured-Type &#xbb;heben&#xab;">
<arrowlink COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="149;9;" ID="Arrow_ID_633874673" STARTARROW="None" STARTINCLINATION="60;3;"/>
<node COLOR="#338800" CREATED="1734403583091" ID="ID_1710377001" MODIFIED="1734484112886" TEXT="StructType&lt;TY&gt;">
<linktarget COLOR="#5583b2" DESTINATION="ID_1710377001" ENDARROW="Default" ENDINCLINATION="113;86;" ID="Arrow_ID_1043919586" SOURCE="ID_1533580969" STARTARROW="None" STARTINCLINATION="103;6;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1734403595048" ID="ID_496079267" MODIFIED="1734450365546" TEXT="spricht falsch an im Compile">
<node COLOR="#435e98" CREATED="1734403595048" FOLDED="true" ID="ID_496079267" MODIFIED="1734450365546" TEXT="spricht falsch an im Compile">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734403634332" ID="ID_817342705" MODIFIED="1734451117928" TEXT="funktioniert enable_if&lt;is_Structured&lt;long*&gt; &gt; korrekt?"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734450087903" ID="ID_1588306692" MODIFIED="1734450379412" TEXT="is_Structured war naiv implementiert">
@ -92365,8 +92366,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
MetaUtils_test::detect_tupleProtocol()
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -92377,6 +92377,93 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1734480338809" ID="ID_1051007990" MODIFIED="1734480347674" TEXT="connect-Funktion umstellen">
<node CREATED="1734480363094" ID="ID_81517996" MODIFIED="1734480413909" TEXT="gemischte Iteration &#xfc;ber Tupel und Array">
<arrowlink COLOR="#4ab2e5" DESTINATION="ID_1513818427" ENDARROW="Default" ENDINCLINATION="-120;11;" ID="Arrow_ID_668892948" STARTARROW="None" STARTINCLINATION="-103;-9;"/>
</node>
<node COLOR="#338800" CREATED="1734473996312" ID="ID_970193220" MODIFIED="1734480654577" TEXT="Iteration &#xbb;heben&#xab; &#x27f9; immer auf Tupel arbeiten">
<linktarget COLOR="#419bab" DESTINATION="ID_970193220" ENDARROW="Default" ENDINCLINATION="149;9;" ID="Arrow_ID_633874673" SOURCE="ID_971023481" STARTARROW="None" STARTINCLINATION="60;3;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1734480514238" ID="ID_718171059" MODIFIED="1734480740846" TEXT="verwende Access-Helper f&#xfc;r den Zugriff auf die Argument-Storage">
<arrowlink COLOR="#75a8d1" DESTINATION="ID_132315841" ENDARROW="Default" ENDINCLINATION="532;28;" ID="Arrow_ID_791254362" STARTARROW="None" STARTINCLINATION="115;5;"/>
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1734480540142" ID="ID_323630818" MODIFIED="1734480558479" TEXT="&#x27f9; Basis-Funktionalit&#xe4;t bereitgestellt"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734480964996" ID="ID_806319334" MODIFIED="1734480977083" TEXT="schrittweise auf komplexere Signaturen erweitern">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734483925269" ID="ID_1086476352" MODIFIED="1734484068908" TEXT="m&#xf6;glichst Fallunterscheidungen durch &#xbb;Heben&#xab; vermeiden">
<arrowlink COLOR="#c8022e" DESTINATION="ID_1884890390" ENDARROW="Default" ENDINCLINATION="-1263;97;" ID="Arrow_ID_232119446" STARTARROW="None" STARTINCLINATION="-517;-18;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1734483987277" ID="ID_1841429759" MODIFIED="1734483994879" TEXT="wir haben zu viele Einzelf&#xe4;lle"/>
<node CREATED="1734483996540" ID="ID_249201624" MODIFIED="1734484013365" TEXT="es besteht die Gefahr, Typ-Struktur und Nutzen zu vermischen"/>
<node CREATED="1734484014897" ID="ID_1533580969" MODIFIED="1734484112886" TEXT="Idee: alles per Iteration &#xfc;ber StructType&lt;T&gt;">
<arrowlink COLOR="#5583b2" DESTINATION="ID_1710377001" ENDARROW="Default" ENDINCLINATION="113;86;" ID="Arrow_ID_1043919586" STARTARROW="None" STARTINCLINATION="103;6;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734484966366" ID="ID_1734731182" MODIFIED="1734496372644" TEXT="Hilfsmittel zur Iteration &#xfc;ber Element-Typen">
<icon BUILTIN="pencil"/>
<node CREATED="1734484982190" ID="ID_1667690583" MODIFIED="1734485007124">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<i>das</i>&#160;ist doch der Teil der immer so m&#252;hsam ist....
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734495414985" ID="ID_210402667" MODIFIED="1734495431237" TEXT="k&#xf6;nnte man analog zu meinen Index-Sequenz-Buildern aufbauen"/>
<node CREATED="1734495432991" ID="ID_1441320520" MODIFIED="1734495457547" TEXT="es braucht nur ein einziges nested-Pattern-Matching-Template">
<icon BUILTIN="idea"/>
<node CREATED="1734495460136" ID="ID_1374426569" MODIFIED="1734495479732" TEXT="das ist leider unvermeidbar f&#xfc;r Variadics"/>
<node CREATED="1734495480968" ID="ID_12372584" MODIFIED="1734495491299" TEXT="aber damit haben wir eine Type-Sequenz"/>
<node CREATED="1734495499566" ID="ID_149362953" MODIFIED="1734495533643" TEXT="&#x27f9; von dort kreuzweise in eine andere Template-Spezialisierung einsteigen"/>
</node>
<node CREATED="1734495536169" ID="ID_1864980172" MODIFIED="1734495551427" TEXT="kann nun sogar Apply und Rebind mit einbinden"/>
<node CREATED="1734495552679" ID="ID_1393017492" MODIFIED="1734495574582" TEXT="HA! die UND- und ODER- Verkn&#xfc;pfung l&#xe4;&#xdf;t sich durch Rebind und Apply ausdr&#xfc;cken">
<node CREATED="1734495683581" ID="ID_824689493" MODIFIED="1734495691665" TEXT="happy happy we">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node CREATED="1734495723336" HGAP="3" ID="ID_894985782" MODIFIED="1734496349526" STYLE="bubble" VSHIFT="32">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<u>extrahiert</u>:&#160;&#160;<font face="Monospaced" color="#3220a2"><b>ElmTypes</b></font><font face="Monospaced" color="#a18383">&lt;</font><font face="Monospaced" color="#992525">X</font><font face="Monospaced" color="#a18383">&gt;</font>&#160;&#160;in variadic-helper.hpp
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#458adc" DESTINATION="ID_894985782" ENDARROW="Default" ENDINCLINATION="-2245;0;" ID="Arrow_ID_1598804519" SOURCE="ID_1890096800" STARTARROW="None" STARTINCLINATION="5222;1394;"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1734495808108" ID="ID_1573254062" MODIFIED="1734495987215" TEXT="Verwendung...">
<icon BUILTIN="forward"/>
<node CREATED="1734495828614" ID="ID_602278483" MODIFIED="1734495977610" TEXT="ElmTypes&lt;TUP&gt;::SIZ"/>
<node CREATED="1734495816942" ID="ID_1179885121" MODIFIED="1734495977610" TEXT="ElmTypes&lt;TUP&gt;::Seq"/>
<node CREATED="1734495852862" ID="ID_119541829" MODIFIED="1734495977611" TEXT="ElmTypes&lt;TUP&gt;::AndAll&lt;std::is_pointer&gt;"/>
</node>
<node BACKGROUND_COLOR="#c2caad" COLOR="#338800" CREATED="1734495887994" ID="ID_176307315" MODIFIED="1734496076740" TEXT="VariadicHelper_test">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1734495900248" ID="ID_1290090407" MODIFIED="1734496001035" STYLE="fork" TEXT="alle wichtigen F&#xe4;lle durchspielen">
<font NAME="SansSerif" SIZE="10"/>
</node>
<node COLOR="#435e98" CREATED="1734495909199" ID="ID_1348331645" MODIFIED="1734496001034" STYLE="fork" TEXT="demonstrieren mit _expect - Strings">
<font NAME="SansSerif" SIZE="10"/>
</node>
<node COLOR="#435e98" CREATED="1734495909199" ID="ID_577064924" MODIFIED="1734496053357" STYLE="fork" TEXT="&#x2227; bzw. &#x2228; mit interessanten Misch-F&#xe4;llen">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734496383891" ID="ID_352066932" MODIFIED="1734496422850" TEXT="damit sollte hoffentlich das _ProcFun-Traits-Template wesentlich einfacher werden....">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133400400" ID="ID_1364724277" MODIFIED="1734141875620" TEXT="zus&#xe4;tzlichen Funktor f&#xfc;r die Parameter akzeptieren">