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:
parent
e014d88b2c
commit
b7fc2df478
5 changed files with 210 additions and 47 deletions
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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<R1> b1, Extension<R1,R2> extension)
|
|||
<node CREATED="1739229119334" ID="ID_144074931" MODIFIED="1739229138054" TEXT="es gibt ein einfaches Frame-Grid zur Übersetzung in Frame-Nr"/>
|
||||
<node CREATED="1739229092233" ID="ID_687505824" MODIFIED="1739229232886" TEXT="der ProcessingKey wird testhalber in den Mix-Parameter (0...100) ü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ßen">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1739229265043" ID="ID_1535044883" MODIFIED="1739902107664" TEXT="neues Feature: ein Param-Tupel im Builder partiell schließ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>!‼ 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ß Du Dich „verspielst“ — und dann das: das sorgfälig schrittweise aufgebaute Design kann ein ganz und gar <b>grundlegendes und sehr geläufiges Problem nicht handhaben</b>!
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
<i><font size="2" color="#b0015f">Was mach ich jetzt bloß ... der NodeBuilder ist doch schon so komplex, daß ich ihn selber kaum noch stemmen kann..... Muß ich jetzt die grundelgende Systematik der Builder-DSL ü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ür eine Adaptierung des Processing-Functors">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
|
|
@ -105757,7 +105791,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> 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ß die verschiedenen Definitionsvarianten des Processing-Functors beachten">
|
||||
<node COLOR="#435e98" CREATED="1739242429615" FOLDED="true" ID="ID_1933481502" MODIFIED="1739467883768" TEXT="muß 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<R1> b1, Extension<R1,R2> 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ösung: gar nix bieten — User soll λ 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ösung: gar nix bieten — User soll λ bauen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -105835,8 +105871,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
<node CREATED="1739549074693" ID="ID_189358758" MODIFIED="1739549443676" TEXT="direkt definiertes Template-λ für bind-to-first in NodeBuilder einbauen">
|
||||
<node COLOR="#5b280f" CREATED="1739549074693" ID="ID_189358758" MODIFIED="1739890672708" TEXT="direkt definiertes Template-λ für bind-to-first in NodeBuilder einbauen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -105845,8 +105882,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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ückgreifen und einen Wrapper dafü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ückgreifen und einen Wrapper dafür anbieten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -105856,6 +105894,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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äre die Beschrä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<R1> b1, Extension<R1,R2> extension)
|
|||
<node CREATED="1739557252012" ID="ID_82088219" MODIFIED="1739557259143" TEXT="closeArg<i>"/>
|
||||
</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 »Funktion« ist std::make_tuple">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
|
|
@ -105879,8 +105918,47 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
</node>
|
||||
<node CREATED="1739580556302" ID="ID_1748409648" MODIFIED="1739580594120" TEXT="somit kein grundsä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ß 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ß 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ü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> wird ⟹ <b>Heap Storage</b>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -105898,8 +105976,11 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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ö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<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> 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ß ausgabeseitig den exakt erwarteten Typ liefern">
|
||||
<node COLOR="#5b280f" CREATED="1739661547624" ID="ID_719316826" MODIFIED="1739661611083" TEXT="nicht bloß ein Tupel">
|
||||
|
|
@ -106050,7 +106131,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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<R1> b1, Extension<R1,R2> 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ß von Aufrufen ohne Parameter">
|
||||
<node COLOR="#435e98" CREATED="1739669530247" ID="ID_1438322146" MODIFIED="1739890460900" TEXT="Ergänzungen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node COLOR="#338800" CREATED="1739669562919" ID="ID_330946433" MODIFIED="1739901654728" TEXT="Ausschluß 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<R1> b1, Extension<R1,R2> 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äumen: trailing NullType in Typsequenz der Funktions-Argumente">
|
||||
<node COLOR="#338800" CREATED="1739742051151" FOLDED="true" ID="ID_240638029" MODIFIED="1739890549558" TEXT="Hindernis wegrä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ür #987">
|
||||
<icon BUILTIN="idea"/>
|
||||
|
|
@ -106108,14 +106192,14 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
<node COLOR="#435e98" CREATED="1739743706096" ID="ID_1310970069" MODIFIED="1739743735573" TEXT="das ist eigentlich generisch ⟹ 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ä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<R1> b1, Extension<R1,R2> extension)
|
|||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1739830994738" ID="ID_656057721" MODIFIED="1739831050309" TEXT="Unit-Test fü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ü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<R1> b1, Extension<R1,R2> 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önnte man noch leicht synthetisieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -106229,7 +106313,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> 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önnte die Standard-Impl verwendet werden"/>
|
||||
<node COLOR="#435e98" CREATED="1739799014639" ID="ID_205042889" MODIFIED="1739816580797" TEXT="brauche dafür einen automatisch konvertierbaren Adapter">
|
||||
|
|
@ -106245,26 +106329,54 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1739830994738" ID="ID_678284468" MODIFIED="1739833461512" TEXT="Tuple-Protocol wird unterstü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älle generisch handhaben">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1739834426148" ID="ID_116229103" MODIFIED="1739905599371" TEXT="alle Binding-Fä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ö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ß hier wohl im NodeBuilder direkt testen"/>
|
||||
<node CREATED="1739903855148" ID="ID_1271168254" MODIFIED="1739903885175" TEXT="denn auch ein Parameter geht nicht ⟸ dann ist's kein Parameter-Tupel"/>
|
||||
<node COLOR="#708736" CREATED="1739903892511" ID="ID_1834876388" LINK="#ID_330946433" MODIFIED="1739903995076" TEXT="bei leerem Tupel gä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ö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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue