Invocation: NodeBuilder now handles all cases of partial-closure

This is a crucial feature, discovered only late, while building
an overall integration test: it is quite common for processing functionality
to require both a technical, and an artistic parametrisation. Obviously,
both are configured from quite different sources, and thus we need a way
to pre-configure ''some parameter values,'' while addressing other ones
later by an automation function. Probably there will be further similar
requirements, regarding the combination of automation and fixed
user-provided settings (but I'll leave that for later to settle).

On a technical level, wiring such independent sources of information
can be quite a challenging organisational problem — which however can be
decomposed using ''partial function closure'' (as building a value tuple
can be packaged into a builder function). Thus in the end I was able to
delegate a highly technical problem to an existing generic library function.
This commit is contained in:
Fischlurch 2025-02-18 20:42:25 +01:00
parent e014d88b2c
commit b7fc2df478
5 changed files with 210 additions and 47 deletions

View file

@ -655,7 +655,7 @@ namespace func{
* `f(a,b,c)->res + (b,c)` yields `f(a)->res`
*
* @param f function, function pointer or functor
* @param arg value tuple, used to close function arguments starting from right
* @param arg value tuple, used to close function arguments, aligned to the right end.
* @return new function object, holding copies of the values and using them at the
* closed arguments; on invocation, only the remaining arguments need to be supplied.
*/

View file

@ -56,20 +56,30 @@ namespace meta{
* ones are supplied as function arguments.
*/
template<class PAR>
struct TupleClosureBuilder;
struct TupleClosureBuilder
{
static_assert (!sizeof(PAR),
"attempt to partially close something not tuple-like");
};
template<template<typename...> class TUP, typename...PARS>
struct TupleClosureBuilder<TUP<PARS...>>
{
static_assert (sizeof...(PARS)
,"attempt to partially close empty record");
using Tuple = TUP<PARS...>;
using TupleBuilderSig = Tuple(PARS...);
/** the builder function to be partially closed */
static Tuple
buildRecord (PARS ...params)
{
return {std::move(params)...};
}
/** preconfigure some elements to the given values,
* starting from left */
template<typename...VALS>
static auto
closeFront (VALS&& ...vs)
@ -79,15 +89,19 @@ namespace meta{
return wrapBuilder (func::PApply<TupleBuilderSig, ClosedTypes>::bindFront (buildRecord, move(boundArgs)));
}
/** preconfigure some elements to the given values,
* in forward order yet aligned to the tuple end */
template<typename...VALS>
static auto
closeBack (VALS&& ...vs)
{
using ClosedTypes = TySeq<std::decay_t<VALS>...>;
auto boundArgs = std::make_tuple (std::forward<VALS> (vs)...); // Note: must be passed by-val here
auto boundArgs = std::make_tuple (std::forward<VALS> (vs)...);
return wrapBuilder (func::PApply<TupleBuilderSig, ClosedTypes>::bindBack (buildRecord, move(boundArgs)));
}
/** preconfigure element to the given value
* @tparam idx zero-based position */
template<size_t idx, typename VAL>
static auto
close (VAL&& val)
@ -99,15 +113,15 @@ namespace meta{
private:
template<class CLO>
static auto
wrapBuilder (CLO partialClosure)
wrapBuilder (CLO closureFun)
{
using RemainingArgs = typename _Fun<CLO>::Args;
using RemainingParams = typename lib::meta::RebindVariadic<TUP, RemainingArgs>::Type;
return [closure = move(partialClosure)
return [partialClosure = move(closureFun)
]
(RemainingParams remPar)
{
return std::apply (closure, remPar);
return std::apply (partialClosure, remPar);
};
}
};
@ -121,7 +135,11 @@ namespace meta{
* on top of std::array, with N times the same type.
*/
template<typename...TTT>
struct ArrayAdapt;
struct ArrayAdapt
{
static_assert(sizeof...(TTT)
,"empty list ... attempting total (not partial) closure?");
};
/** Metafunction to detect if a type-sequence holds uniform types */
@ -145,6 +163,7 @@ namespace meta{
{
using NFold = typename Repeat<T,N>::Seq;
using Array = typename RebindVariadic<ArrayAdapt, NFold>::Type;
static_assert(N,"attempt to partially close empty array");
};
template<typename T, size_t N>

View file

@ -501,7 +501,30 @@ namespace engine {
closeParamFront (PAR v1, PARS ...vs)
{
return adaptParam(
WAB::ParamClosure::template closeFront (v1,vs...));
WAB::ParamClosure::template closeFront (forward<PAR> (v1)
,forward<PARS>(vs)...));
}
/** immediately close the rightmost parameter positions,
* applying the given values in forward order. */
template<typename PAR, typename...PARS>
auto
closeParamBack (PAR v1, PARS ...vs)
{
return adaptParam(
WAB::ParamClosure::template closeBack (forward<PAR> (v1)
,forward<PARS>(vs)...));
}
/** immediately close a single parameter at designated position
* @tparam idx zero-based index of the element in the param-tuple
*/
template<size_t idx, typename PAR>
auto
closeParam (PAR val)
{
return adaptParam(
WAB::ParamClosure::template close<idx> (forward<PAR> (val)));
}

View file

@ -195,7 +195,14 @@ namespace test {
/** @test build a node and partially close (≙ predefine) some parameters,
* while leaving other parameters open to be set on invocation
* through a parameter-functor.
* through a parameter-functor.
* - define a processing-function which takes an array of parameters,
* which will be handled similar as a tuple with uniform types.
* - demonstrate that several partial-closures can be cascaded;
* first close one parameter given by index, then close staring
* from the front and then aligned to the end
* - now a single param «slot» remains open, which can be wired
* to receive automation data (note: 1-tuple generated automatically)
* @remark it is quite common that processing functionality provided by an
* external library exposes both technical and artistic parameters, which
* leads to the situation that technical parameters can be predetermined
@ -212,14 +219,16 @@ namespace test {
ProcNode node{prepareNode("Test")
.preparePort()
.invoke ("fun()", procFun)
.closeParamFront (1,2,3,4)
.attachAutomation (autoFun)
.invoke ("fun()", procFun) // param(·,·,·,·,·)
.closeParam<2> (1) // param(·,·,1,·,·)
.closeParamFront(2) // param(2,·,1,·,·)
.closeParamBack (3,4) // param(2,·,1,3,4)
.attachAutomation (autoFun) // △
.completePort()
.build()};
Time timeOfEvil{5555,0};
CHECK (15 == invokeRenderNode(node,timeOfEvil));
CHECK (2+5+1+3+4 == invokeRenderNode (node, timeOfEvil));
}

View file

@ -58819,7 +58819,7 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1700669580665" FOLDED="true" ID="ID_1852128670" MODIFIED="1739826827488" TEXT="Funktor-Manipulationen">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1700669580665" FOLDED="true" ID="ID_1852128670" MODIFIED="1739901271086" TEXT="Funktor-Manipulationen">
<icon BUILTIN="hourglass"/>
<icon BUILTIN="pencil"/>
<node CREATED="1700669596447" ID="ID_1886923243" MODIFIED="1700669617888" TEXT="einige Werkzeuge hatte ich vor sehr langer Zeit schon gebaut....">
@ -58892,6 +58892,10 @@
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739901065885" ID="ID_314645109" LINK="https://issues.lumiera.org/ticket/1394" MODIFIED="1739901344418" TEXT="#1394 modernise partial-closure support">
<linktarget COLOR="#fe091d" DESTINATION="ID_314645109" ENDARROW="Default" ENDINCLINATION="2059;133;" ID="Arrow_ID_1085573551" SOURCE="ID_154602686" STARTARROW="None" STARTINCLINATION="827;-62;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1739577090376" ID="ID_1072629570" MODIFIED="1739577099267" TEXT="Einsichten / moderne Tools">
<icon BUILTIN="idea"/>
@ -105746,7 +105750,37 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1739229119334" ID="ID_144074931" MODIFIED="1739229138054" TEXT="es gibt ein einfaches Frame-Grid zur &#xdc;bersetzung in Frame-Nr"/>
<node CREATED="1739229092233" ID="ID_687505824" MODIFIED="1739229232886" TEXT="der ProcessingKey wird testhalber in den Mix-Parameter (0...100) &#xfc;bersetzt"/>
<node CREATED="1739229243685" ID="ID_1117664884" MODIFIED="1739229263638" TEXT="eine Param-Node demonstriert das Aufbauen synthetischer Parameter"/>
<node CREATED="1739229265043" ID="ID_1535044883" MODIFIED="1739229289864" TEXT="neues Feature: ein Param-Tupel im Builder partiell schlie&#xdf;en">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1739229265043" ID="ID_1535044883" MODIFIED="1739902107664" TEXT="neues Feature: ein Param-Tupel im Builder partiell schlie&#xdf;en">
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#a60e65" CREATED="1739229289864" ID="ID_719879915" MODIFIED="1739902084019">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<b><font size="5">AUA</font></b>!&#8252; Hammer auf den letzten Metern
</p>
</body>
</html>
</richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...wie so oft:
</p>
<p>
Du sagst Dir, anstandshalber sollte es noch einen kompletten Integrationstest geben, hast noch ein schlechtes Gewissen, da&#223; Du Dich &#8222;verspielst&#8220; &#8212; und dann das: das sorgf&#228;lig schrittweise aufgebaute Design kann ein ganz und gar <b>grundlegendes und sehr gel&#228;ufiges Problem nicht handhaben</b>!
</p>
<p>
</p>
<p>
<i><font size="2" color="#b0015f">Was mach ich jetzt blo&#223; ... der NodeBuilder ist doch schon so komplex, da&#223; ich ihn selber kaum noch stemmen kann..... Mu&#223; ich jetzt die grundelgende Systematik der Builder-DSL &#252;ber den Haufen werfen und alles nochmal von Grund auf implementieren....???</font></i>
</p>
</body>
</html></richcontent>
<icon BUILTIN="smily_bad"/>
</node>
<node CREATED="1739229510473" ID="ID_362663614" MODIFIED="1739229672781" TEXT="brauche daf&#xfc;r eine Adaptierung des Processing-Functors">
<richcontent TYPE="NOTE"><html>
<head/>
@ -105757,7 +105791,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</body>
</html></richcontent>
</node>
<node CREATED="1739229688225" ID="ID_735829344" MODIFIED="1739229726986">
<node COLOR="#435e98" CREATED="1739229688225" FOLDED="true" ID="ID_735829344" MODIFIED="1739901697128">
<richcontent TYPE="NODE"><html>
<head/>
<body>
@ -105766,6 +105800,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1739230163961" ID="ID_167078459" MODIFIED="1739230168732" TEXT="ja wirklich"/>
<node CREATED="1739230169888" ID="ID_1381527951" MODIFIED="1739230174349" TEXT="ist ganz einfach"/>
<node CREATED="1739230175479" ID="ID_1244437448" MODIFIED="1739230182793" TEXT="nur nicht die Nerven verlieren"/>
@ -105784,7 +105819,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node COLOR="#435e98" CREATED="1739242290552" ID="ID_575620979" MODIFIED="1739468093469" TEXT="spezielle Funktions-Komposition auf die Parameter-Stelle setzen">
<icon BUILTIN="full-2"/>
<node COLOR="#435e98" CREATED="1739242429615" ID="ID_1933481502" MODIFIED="1739467883768" TEXT="mu&#xdf; die verschiedenen Definitionsvarianten des Processing-Functors beachten">
<node COLOR="#435e98" CREATED="1739242429615" FOLDED="true" ID="ID_1933481502" MODIFIED="1739467883768" TEXT="mu&#xdf; die verschiedenen Definitionsvarianten des Processing-Functors beachten">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1739289987481" ID="ID_714942938" MODIFIED="1739290007177" TEXT="kann Variante mit Parameter voraussetzen">
<icon BUILTIN="idea"/>
@ -105819,14 +105854,15 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1739242477076" ID="ID_509590719" MODIFIED="1739242501812" TEXT="statische Fehlermeldung wenn es gar keine Parameter gibt">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1739242477076" ID="ID_509590719" MODIFIED="1739901662200" TEXT="statische Fehlermeldung wenn es gar keine Parameter gibt">
<arrowlink COLOR="#5785ad" DESTINATION="ID_330946433" ENDARROW="Default" ENDINCLINATION="-490;0;" ID="Arrow_ID_1762553934" STARTARROW="None" STARTINCLINATION="977;0;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1739242327059" ID="ID_1669934372" MODIFIED="1739242373123" TEXT="Adapter zum Binden bestimmter Argumente im Node-Builder generieren">
<node COLOR="#435e98" CREATED="1739242327059" ID="ID_1669934372" MODIFIED="1739905739088" TEXT="Adapter zum Binden bestimmter Argumente im Node-Builder generieren">
<icon BUILTIN="full-3"/>
<node CREATED="1739549014719" ID="ID_1456986239" MODIFIED="1739549029021" TEXT="Design-Frage: wie weit ausarbeiten?">
<node CREATED="1739549031081" ID="ID_1258607359" MODIFIED="1739549281465" TEXT="minimal-L&#xf6;sung: gar nix bieten &#x2014; User soll &#x3bb; bauen">
<node COLOR="#435e98" CREATED="1739549014719" ID="ID_1456986239" MODIFIED="1739901513065" TEXT="Design-Frage: wie weit ausarbeiten?">
<node CREATED="1739549031081" ID="ID_1258607359" MODIFIED="1739890680031" TEXT="minimal-L&#xf6;sung: gar nix bieten &#x2014; User soll &#x3bb; bauen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -105835,8 +105871,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</p>
</body>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1739549074693" ID="ID_189358758" MODIFIED="1739549443676" TEXT="direkt definiertes Template-&#x3bb; f&#xfc;r bind-to-first in NodeBuilder einbauen">
<node COLOR="#5b280f" CREATED="1739549074693" ID="ID_189358758" MODIFIED="1739890672708" TEXT="direkt definiertes Template-&#x3bb; f&#xfc;r bind-to-first in NodeBuilder einbauen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -105845,8 +105882,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</p>
</body>
</html></richcontent>
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1739549457748" ID="ID_1160952116" MODIFIED="1739581633828" TEXT="auf die alten function-closure-Utils zur&#xfc;ckgreifen und einen Wrapper daf&#xfc;r anbieten">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#3e5566" CREATED="1739549457748" FOLDED="true" ID="ID_1160952116" MODIFIED="1739890723567" TEXT="auf die alten function-closure-Utils zur&#xfc;ckgreifen und einen Wrapper daf&#xfc;r anbieten">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -105856,6 +105894,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</body>
</html></richcontent>
<arrowlink COLOR="#8a2963" DESTINATION="ID_753645097" ENDARROW="Default" ENDINCLINATION="-424;2942;" ID="Arrow_ID_621726759" STARTARROW="None" STARTINCLINATION="-1012;-37;"/>
<icon BUILTIN="forward"/>
<node CREATED="1739556113890" ID="ID_1805875630" MODIFIED="1739580594120" TEXT="im konkreten Fall w&#xe4;re die Beschr&#xe4;nkung dieser Utils wohl tragbar">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1805875630" ENDARROW="Default" ENDINCLINATION="331;15;" ID="Arrow_ID_275367387" SOURCE="ID_1748409648" STARTARROW="None" STARTINCLINATION="290;15;"/>
</node>
@ -105866,7 +105905,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1739557252012" ID="ID_82088219" MODIFIED="1739557259143" TEXT="closeArg&lt;i&gt;"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1739578460187" ID="ID_550537240" MODIFIED="1739580673731" TEXT="Analyse">
<node COLOR="#435e98" CREATED="1739578460187" FOLDED="true" ID="ID_550537240" MODIFIED="1739901471566" TEXT="Analyse">
<icon BUILTIN="info"/>
<node CREATED="1739578467409" ID="ID_1619628833" MODIFIED="1739580420196" TEXT="die zu bindende &#xbb;Funktion&#xab; ist std::make_tuple">
<font NAME="SansSerif" SIZE="12"/>
@ -105879,8 +105918,47 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node CREATED="1739580556302" ID="ID_1748409648" MODIFIED="1739580594120" TEXT="somit kein grunds&#xe4;tzliches Problem mit dem alten Tooling">
<arrowlink DESTINATION="ID_1805875630" ENDARROW="Default" ENDINCLINATION="331;15;" ID="Arrow_ID_275367387" STARTARROW="None" STARTINCLINATION="290;15;"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1739663114472" HGAP="61" ID="ID_154602686" MODIFIED="1739663139464" TEXT="aber Ticket!!" VSHIFT="21">
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1739663114472" HGAP="61" ID="ID_154602686" MODIFIED="1739901454483" TEXT="mu&#xdf; aber dringend modernisiert werden" VSHIFT="21">
<arrowlink COLOR="#fe091d" DESTINATION="ID_314645109" ENDARROW="Default" ENDINCLINATION="2059;133;" ID="Arrow_ID_1085573551" STARTARROW="None" STARTINCLINATION="827;-62;"/>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1739901126701" ID="ID_311690952" MODIFIED="1739901242578">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
da&#223; wir jetzt eine std::function erzeugen ist hier <b>ganz furchbar</b>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="smiley-angry"/>
<node COLOR="#c22556" CREATED="1739901371676" HGAP="30" ID="ID_247907486" MODIFIED="1739901425196" VSHIFT="-5">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
ein Schritt vor,
</p>
<p>
zwei Schritte zur&#252;ck...
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="9"/>
</node>
</node>
<node BACKGROUND_COLOR="#faded5" COLOR="#690f14" CREATED="1739901174559" ID="ID_681147882" MODIFIED="1739901230147">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
wenn mehr als ein Parameter <i>closed</i>&#160;wird &#10233; <b>Heap Storage</b>
</p>
</body>
</html></richcontent>
<icon BUILTIN="clanbomber"/>
</node>
</node>
</node>
</node>
@ -105898,8 +105976,11 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1739580770558" ID="ID_1162628481" MODIFIED="1739580788692" TEXT="das sich ergebende Konstrukt">
<node COLOR="#2c2a57" CREATED="1739580770558" ID="ID_1162628481" MODIFIED="1739891045340" TEXT="das sich ergebende Konstrukt">
<arrowlink COLOR="#c6fdd3" DESTINATION="ID_756152120" ENDARROW="Default" ENDINCLINATION="-378;-22;" ID="Arrow_ID_372372209" STARTARROW="None" STARTINCLINATION="10;176;"/>
<icon BUILTIN="forward"/>
<node CREATED="1739580792958" ID="ID_1753283976" MODIFIED="1739580812227" TEXT="packt die gebundenen Elemente in den processing-funktor"/>
<node CREATED="1739890988737" ID="ID_747291552" MODIFIED="1739891017411" TEXT="nimmt wieder ein (reduziertes) Tupel als Argument (m&#xf6;glicherweise generisch)"/>
<node CREATED="1739580816968" ID="ID_823161940" MODIFIED="1739580925274" TEXT="jedes Argument wird also 2-Mal kopiert">
<richcontent TYPE="NOTE"><html>
<head/>
@ -105936,7 +106017,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739582050928" ID="ID_1634640852" MODIFIED="1739582115569" TEXT="also mal im Test-Setup beispielhaft ausarbeiten">
<node COLOR="#435e98" CREATED="1739582050928" ID="ID_1634640852" MODIFIED="1739890634657" TEXT="also mal im Test-Setup beispielhaft ausarbeiten">
<linktarget COLOR="#4936b3" DESTINATION="ID_1634640852" ENDARROW="Default" ENDINCLINATION="82;-233;" ID="Arrow_ID_40372708" SOURCE="ID_1709833697" STARTARROW="None" STARTINCLINATION="-287;31;"/>
<icon BUILTIN="yes"/>
<node CREATED="1739644403194" ID="ID_1724825463" MODIFIED="1739644431815" TEXT="Beispiel-Funktion nimmt ein Array mit 5 Parametern"/>
@ -105958,7 +106039,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#dabe8f" COLOR="#bf1264" CREATED="1739644602379" ID="ID_1041155759" MODIFIED="1739834319487" TEXT="AUA. make_tuple kann kein Array bauen">
<node BACKGROUND_COLOR="#dabe8f" COLOR="#bf1264" CREATED="1739644602379" FOLDED="true" ID="ID_1041155759" MODIFIED="1739834319487" TEXT="AUA. make_tuple kann kein Array bauen">
<icon BUILTIN="broken-line"/>
<node CREATED="1739644626954" ID="ID_630391744" MODIFIED="1739644634662" TEXT="tja...">
<icon BUILTIN="ksmiletris"/>
@ -105975,7 +106056,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1739661467231" ID="ID_289562589" MODIFIED="1739661490167" TEXT="Parameter ist ein Value (ggfs Tupel)"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1739661519815" ID="ID_903309601" MODIFIED="1739834328519" TEXT="Anforderungen an einen Param-Transformer">
<node COLOR="#435e98" CREATED="1739661519815" FOLDED="true" ID="ID_903309601" MODIFIED="1739901501269" TEXT="Anforderungen an einen Param-Transformer">
<icon BUILTIN="yes"/>
<node CREATED="1739661533781" ID="ID_772896721" MODIFIED="1739661545552" TEXT="mu&#xdf; ausgabeseitig den exakt erwarteten Typ liefern">
<node COLOR="#5b280f" CREATED="1739661547624" ID="ID_719316826" MODIFIED="1739661611083" TEXT="nicht blo&#xdf; ein Tupel">
@ -106050,7 +106131,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1739664421315" ID="ID_1529597389" MODIFIED="1739664441690" TEXT="soll die drei partial-closure-Primitive als Funktions-Templates bieten"/>
</node>
<node CREATED="1739664449146" ID="ID_1274028526" MODIFIED="1739664470061" TEXT="bekommt daher lediglich das Parameter-Aggregat als Template-Argument"/>
<node COLOR="#338800" CREATED="1739664483904" ID="ID_756152120" MODIFIED="1739669641386" TEXT="Implementierungs-Skizze">
<node COLOR="#338800" CREATED="1739664483904" FOLDED="true" ID="ID_756152120" MODIFIED="1739903949173" TEXT="Implementierungs-Skizze">
<linktarget COLOR="#c6fdd3" DESTINATION="ID_756152120" ENDARROW="Default" ENDINCLINATION="-378;-22;" ID="Arrow_ID_372372209" SOURCE="ID_1162628481" STARTARROW="None" STARTINCLINATION="10;176;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1739669408564" ID="ID_118009551" MODIFIED="1739669423470" TEXT="verwende einen ClosureBuilder als lokales Template in NodeBuilder"/>
<node CREATED="1739669424670" ID="ID_1318292818" MODIFIED="1739669454271" TEXT="dieser bietet eine statische Funktion ClosureBuilder::closeFront"/>
@ -106060,10 +106142,11 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node BACKGROUND_COLOR="#bdf8db" COLOR="#338800" CREATED="1739669518141" ID="ID_260919432" MODIFIED="1739669639062" STYLE="fork" TEXT="funktionert">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1739669530247" ID="ID_1438322146" MODIFIED="1739669555839" TEXT="fehlt noch">
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739669562919" ID="ID_330946433" MODIFIED="1739831185269" TEXT="Ausschlu&#xdf; von Aufrufen ohne Parameter">
<node COLOR="#435e98" CREATED="1739669530247" ID="ID_1438322146" MODIFIED="1739890460900" TEXT="Erg&#xe4;nzungen">
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1739669562919" ID="ID_330946433" MODIFIED="1739901654728" TEXT="Ausschlu&#xdf; von Aufrufen ohne Parameter">
<linktarget COLOR="#5785ad" DESTINATION="ID_330946433" ENDARROW="Default" ENDINCLINATION="-490;0;" ID="Arrow_ID_1762553934" SOURCE="ID_509590719" STARTARROW="None" STARTINCLINATION="977;0;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#5b280f" CREATED="1739669585924" ID="ID_211735922" MODIFIED="1739831065154" TEXT="Spezialbehandlung wenn die Closure nur noch ein Argument nimmt">
<icon BUILTIN="button_cancel"/>
@ -106087,8 +106170,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
<node COLOR="#338800" CREATED="1739742027076" ID="ID_1345350905" MODIFIED="1739834260054" TEXT="schrittweise verallgemeinern">
<arrowlink COLOR="#29d01f" DESTINATION="ID_116229103" ENDARROW="Default" ENDINCLINATION="73;-65;" ID="Arrow_ID_1782513655" STARTARROW="None" STARTINCLINATION="-195;18;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1739742051151" ID="ID_240638029" MODIFIED="1739743700109" TEXT="Hindernis wegr&#xe4;umen: trailing NullType in Typsequenz der Funktions-Argumente">
<node COLOR="#338800" CREATED="1739742051151" FOLDED="true" ID="ID_240638029" MODIFIED="1739890549558" TEXT="Hindernis wegr&#xe4;umen: trailing NullType in Typsequenz der Funktions-Argumente">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e6e1bd" CREATED="1739742093416" ID="ID_74503597" LINK="#ID_490359788" MODIFIED="1739743326711" TEXT="zugleich ein wichtiger Schritt f&#xfc;r #987">
<icon BUILTIN="idea"/>
@ -106108,14 +106192,14 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#435e98" CREATED="1739743706096" ID="ID_1310970069" MODIFIED="1739743735573" TEXT="das ist eigentlich generisch &#x27f9; umziehen in lib::meta::TupleClosureBuilder">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#338800" CREATED="1739752776321" ID="ID_376565948" MODIFIED="1739833461512" TEXT="TupleClosure_test zur Dokumentation">
<linktarget COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-22;74;" ID="Arrow_ID_1770813109" SOURCE="ID_656057721" STARTARROW="None" STARTINCLINATION="-338;20;"/>
<linktarget COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-22;74;" ID="Arrow_ID_1966862235" SOURCE="ID_678284468" STARTARROW="None" STARTINCLINATION="-433;35;"/>
<node COLOR="#338800" CREATED="1739752776321" ID="ID_376565948" MODIFIED="1739890508739" TEXT="TupleClosure_test zur Dokumentation">
<linktarget COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-4;81;" ID="Arrow_ID_1770813109" SOURCE="ID_656057721" STARTARROW="None" STARTINCLINATION="-205;14;"/>
<linktarget COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-22;74;" ID="Arrow_ID_1966862235" SOURCE="ID_678284468" STARTARROW="None" STARTINCLINATION="-334;29;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1739822405519" ID="ID_1159986625" MODIFIED="1739822418374" TEXT="weitere partial-closure-F&#xe4;lle integrieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1739822430227" ID="ID_1498733913" MODIFIED="1739827102416">
<node COLOR="#435e98" CREATED="1739822430227" FOLDED="true" ID="ID_1498733913" MODIFIED="1739890484924">
<richcontent TYPE="NODE"><html>
<head/>
<body>
@ -106202,8 +106286,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="info"/>
</node>
</node>
<node COLOR="#338800" CREATED="1739830994738" ID="ID_656057721" MODIFIED="1739831050309" TEXT="Unit-Test f&#xfc;r Closure von Einzel-Argumenten">
<arrowlink COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-22;74;" ID="Arrow_ID_1770813109" STARTARROW="None" STARTINCLINATION="-338;20;"/>
<node COLOR="#338800" CREATED="1739830994738" ID="ID_656057721" MODIFIED="1739890503539" TEXT="Unit-Test f&#xfc;r Closure von Einzel-Argumenten">
<arrowlink COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-4;81;" ID="Arrow_ID_1770813109" STARTARROW="None" STARTINCLINATION="-205;14;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
@ -106212,7 +106296,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#338800" CREATED="1739756741667" ID="ID_20824263" MODIFIED="1739816589487" TEXT="Problem: spezielle Typsignatur">
<icon BUILTIN="button_ok"/>
<node CREATED="1739756760373" ID="ID_753184722" MODIFIED="1739756775186" TEXT="deshalb ist in jedem Fall eine partielle Spezialisierung notwendig"/>
<node BACKGROUND_COLOR="#edc89e" COLOR="#690f14" CREATED="1739756922215" ID="ID_1294911921" MODIFIED="1739816544790" TEXT="Problem: eine Builder-Funktion mit expliziter Argument-Anzahl">
<node BACKGROUND_COLOR="#edc89e" COLOR="#690f14" CREATED="1739756922215" FOLDED="true" ID="ID_1294911921" MODIFIED="1739816544790" TEXT="Problem: eine Builder-Funktion mit expliziter Argument-Anzahl">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1739756977184" ID="ID_1621203501" MODIFIED="1739757006679" TEXT="den Signatur-Typ k&#xf6;nnte man noch leicht synthetisieren">
<richcontent TYPE="NOTE"><html>
@ -106229,7 +106313,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node BACKGROUND_COLOR="#e3dfc5" COLOR="#435e98" CREATED="1739798967457" ID="ID_1274106457" MODIFIED="1739816566683" TEXT="anderer Ansatz: Tupel-Typsignatur emulieren">
<node BACKGROUND_COLOR="#e3dfc5" COLOR="#435e98" CREATED="1739798967457" FOLDED="true" ID="ID_1274106457" MODIFIED="1739816566683" TEXT="anderer Ansatz: Tupel-Typsignatur emulieren">
<icon BUILTIN="idea"/>
<node CREATED="1739798985823" ID="ID_9547449" MODIFIED="1739799013054" TEXT="...dann k&#xf6;nnte die Standard-Impl verwendet werden"/>
<node COLOR="#435e98" CREATED="1739799014639" ID="ID_205042889" MODIFIED="1739816580797" TEXT="brauche daf&#xfc;r einen automatisch konvertierbaren Adapter">
@ -106245,26 +106329,54 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1739830994738" ID="ID_678284468" MODIFIED="1739833461512" TEXT="Tuple-Protocol wird unterst&#xfc;tzt">
<arrowlink COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-22;74;" ID="Arrow_ID_1966862235" STARTARROW="None" STARTINCLINATION="-433;35;"/>
<arrowlink COLOR="#5fcdb6" DESTINATION="ID_376565948" ENDARROW="Default" ENDINCLINATION="-22;74;" ID="Arrow_ID_1966862235" STARTARROW="None" STARTINCLINATION="-334;29;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739834426148" ID="ID_116229103" MODIFIED="1739834437076" TEXT="kann nun alle Binding-F&#xe4;lle generisch handhaben">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#338800" CREATED="1739834426148" ID="ID_116229103" MODIFIED="1739905599371" TEXT="alle Binding-F&#xe4;lle generisch handhaben">
<linktarget COLOR="#29d01f" DESTINATION="ID_116229103" ENDARROW="Default" ENDINCLINATION="73;-65;" ID="Arrow_ID_1782513655" SOURCE="ID_1345350905" STARTARROW="None" STARTINCLINATION="-195;18;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1739834442174" ID="ID_1999526476" MODIFIED="1739834476493" TEXT="in WeavingBuilder per Typedef einbinden">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1739834455793" ID="ID_1242451785" MODIFIED="1739834478061" TEXT="kann direkt an die jeweilige Impl-Funktion dort delegieren">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739834479509" ID="ID_175725143" MODIFIED="1739834488796" TEXT="L&#xf6;sung ist kaskadierbar auf Ergebnis">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1739903823669" ID="ID_759891516" MODIFIED="1739905593495" TEXT="statische Fehlermeldungen bei sinnlosem Aufruf">
<icon BUILTIN="button_ok"/>
<node CREATED="1739903841847" ID="ID_1539868561" MODIFIED="1739903853800" TEXT="mu&#xdf; hier wohl im NodeBuilder direkt testen"/>
<node CREATED="1739903855148" ID="ID_1271168254" MODIFIED="1739903885175" TEXT="denn auch ein Parameter geht nicht &#x27f8; dann ist&apos;s kein Parameter-Tupel"/>
<node COLOR="#708736" CREATED="1739903892511" ID="ID_1834876388" LINK="#ID_330946433" MODIFIED="1739903995076" TEXT="bei leerem Tupel g&#xe4;be es schon eine static_assertion im TupleClosureBuilder">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...was uns aber nix hilft, denn wir kommen gar nicht dorthin
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#338800" CREATED="1739834479509" ID="ID_175725143" MODIFIED="1739905729945" TEXT="L&#xf6;sung ist kaskadierbar auf Ergebnis">
<arrowlink COLOR="#4ca333" DESTINATION="ID_1993199858" ENDARROW="Default" ENDINCLINATION="247;0;" ID="Arrow_ID_1792507084" STARTARROW="None" STARTINCLINATION="-200;14;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1739905629410" ID="ID_1481778914" MODIFIED="1739905759369" TEXT="Dokumentation">
<icon BUILTIN="list"/>
<node COLOR="#338800" CREATED="1739905638057" ID="ID_1129239563" MODIFIED="1739905713937" TEXT="TupleClosure_test">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1739905645042" ID="ID_1993199858" MODIFIED="1739905729945" TEXT="NodeBuilder_test::build_Node_closedParam()">
<linktarget COLOR="#4ca333" DESTINATION="ID_1993199858" ENDARROW="Default" ENDINCLINATION="247;0;" ID="Arrow_ID_1792507084" SOURCE="ID_175725143" STARTARROW="None" STARTINCLINATION="-200;14;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>