clean-up: simplify function-closure -- eliminate the 'apply' case

This library header was developed at a time, where C++ had no built-in support
for so called "invokables"; `std::invoke` and `std::apply` were added much later;
So in that early version that was a significant technical hurdle to overcome.

seems like it might be possible to get rid of the TupleApplicator alltogether?
This commit is contained in:
Fischlurch 2025-06-05 01:18:59 +02:00
parent 1a2c2ededa
commit 400d0eb92e
4 changed files with 54 additions and 181 deletions

View file

@ -101,13 +101,6 @@ namespace func{
template<> //__________________________________ template<> //__________________________________
struct Apply<0> ///< Apply function without Arguments struct Apply<0> ///< Apply function without Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP&)
{
return f ();
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP&) bind (FUN& f, TUP&)
@ -120,13 +113,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<1> ///< Apply function with 1 Argument struct Apply<1> ///< Apply function with 1 Argument
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f (get<0>(arg));
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -139,15 +125,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<2> ///< Apply function with 2 Arguments struct Apply<2> ///< Apply function with 2 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -162,16 +139,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<3> ///< Apply function with 3 Arguments struct Apply<3> ///< Apply function with 3 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -187,17 +154,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<4> ///< Apply function with 4 Arguments struct Apply<4> ///< Apply function with 4 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
, get<3>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -214,18 +170,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<5> ///< Apply function with 5 Arguments struct Apply<5> ///< Apply function with 5 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
, get<3>(arg)
, get<4>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -243,19 +187,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<6> ///< Apply function with 6 Arguments struct Apply<6> ///< Apply function with 6 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
, get<3>(arg)
, get<4>(arg)
, get<5>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -274,20 +205,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<7> ///< Apply function with 7 Arguments struct Apply<7> ///< Apply function with 7 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
, get<3>(arg)
, get<4>(arg)
, get<5>(arg)
, get<6>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -307,21 +224,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<8> ///< Apply function with 8 Arguments struct Apply<8> ///< Apply function with 8 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
, get<3>(arg)
, get<4>(arg)
, get<5>(arg)
, get<6>(arg)
, get<7>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -342,22 +244,6 @@ namespace func{
template<> //_________________________________ template<> //_________________________________
struct Apply<9> ///< Apply function with 9 Arguments struct Apply<9> ///< Apply function with 9 Arguments
{ {
template<typename RET, class FUN, class TUP>
static RET
invoke (FUN& f, TUP & arg)
{
return f ( get<0>(arg)
, get<1>(arg)
, get<2>(arg)
, get<3>(arg)
, get<4>(arg)
, get<5>(arg)
, get<6>(arg)
, get<7>(arg)
, get<8>(arg)
);
}
template<typename RET, class FUN, class TUP> template<typename RET, class FUN, class TUP>
static RET static RET
bind (FUN& f, TUP & arg) bind (FUN& f, TUP & arg)
@ -516,8 +402,13 @@ namespace func{
BoundFunc bind (SIG& f) { return Apply<ARG_CNT>::template bind<BoundFunc> (f, params_); } BoundFunc bind (SIG& f) { return Apply<ARG_CNT>::template bind<BoundFunc> (f, params_); }
BoundFunc bind (function<SIG> const& f) { return Apply<ARG_CNT>::template bind<BoundFunc> (f, params_); } BoundFunc bind (function<SIG> const& f) { return Apply<ARG_CNT>::template bind<BoundFunc> (f, params_); }
Ret operator() (SIG& f) { return Apply<ARG_CNT>::template invoke<Ret> (f, params_); } template<class FUN>
Ret operator() (function<SIG>& f) { return Apply<ARG_CNT>::template invoke<Ret> (f, params_); } Ret
operator() (FUN&& f)
{
ASSERT_VALID_SIGNATURE (FUN,SIG);
return std::apply (forward<FUN> (f), params_);
}
}; };
@ -644,7 +535,7 @@ namespace func{
* @param arg value tuple, used to close function arguments starting from left * @param arg value tuple, used to close function arguments starting from left
* @return new function object, holding copies of the values and using them at the * @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. * closed arguments; on invocation, only the remaining arguments need to be supplied.
* @note BuildL, i.e. the TupleApplicator _must take its arguments by-value._ Any attempt * @note BuildL, and consequently TupleApplicator _must take the arguments by-value._ Any attempt
* towards »perfect-forwarding« would be potentially fragile and not worth the effort, * towards »perfect-forwarding« would be potentially fragile and not worth the effort,
* since the optimiser sees the operation as a whole. * since the optimiser sees the operation as a whole.
* @todo 2/2025 However, the LeftReplacedArgs _could_ then possibly moved into the bind function, * @todo 2/2025 However, the LeftReplacedArgs _could_ then possibly moved into the bind function,
@ -844,32 +735,6 @@ namespace func{
/* ========== function-style interface ============= */ /* ========== function-style interface ============= */
/** build a TupleApplicator, which embodies the given
* argument tuple and can be used to apply them
* to various functions repeatedly.
*/
template<typename...ARG>
inline
typename _Sig<void, TySeq<ARG...>>::Applicator
tupleApplicator (std::tuple<ARG...>& args)
{
using Signature = typename _Sig<void,TySeq<ARG...>>::Type;
return TupleApplicator<Signature>{args};
}
/** apply the given function to the argument tuple
* @deprecated 11/23 meanwhile provided by the standard lib! */
template<typename SIG, typename...ARG>
inline
typename _Fun<SIG>::Ret
apply (SIG& f, std::tuple<ARG...>& args)
{
using Ret = typename _Fun<SIG>::Ret; //
using Signature = typename _Sig<Ret,TySeq<ARG...>>::Type; // Note: deliberately re-building the Signature Type
return TupleApplicator<Signature>{args} (f); // in order to get better error messages here
}
/** close the given function over all arguments, /** close the given function over all arguments,
* using the values from the argument tuple. * using the values from the argument tuple.
* @return a closure object, which can be * @return a closure object, which can be

View file

@ -51,7 +51,6 @@ namespace control {
using lib::meta::_Fun; using lib::meta::_Fun;
using lib::meta::Tuple; using lib::meta::Tuple;
using lib::meta::BuildTupleAccessor; using lib::meta::BuildTupleAccessor;
using lib::meta::func::TupleApplicator;
using lib::meta::buildTuple; using lib::meta::buildTuple;
using lib::meta::Nil; using lib::meta::Nil;
@ -175,8 +174,8 @@ namespace control {
void void
invoke (CmdFunctor const& unboundFunctor) invoke (CmdFunctor const& unboundFunctor)
{ {
TupleApplicator<SIG> apply_this_arguments(params_); ArgTuple& paramTuple{params_};
apply_this_arguments (unboundFunctor.getFun<SIG>()); std::apply (unboundFunctor.getFun<SIG>(), paramTuple);
} }

View file

@ -86,7 +86,6 @@ namespace test {
using func::TupleApplicator; using func::TupleApplicator;
using func::FunctionClosure; using func::FunctionClosure;
using func::closure; using func::closure;
using func::apply;
/*********************************************************************//** /*********************************************************************//**
@ -164,21 +163,15 @@ namespace test {
DUMPVAL (tup2); DUMPVAL (tup2);
DUMPVAL (tup3); DUMPVAL (tup3);
CHECK (-1 == Apply<0>::invoke<int> (fun0, tup0) );
CHECK (11 == Apply<1>::invoke<int> (fun1, tup1) );
CHECK (11+12 == Apply<2>::invoke<int> (fun2, tup2) );
CHECK (11+12+13 == Apply<3>::invoke<int> (fun3, tup3) );
CHECK (-1 == TupleApplicator<int()> (tup0) (fun0) ); CHECK (-1 == TupleApplicator<int()> (tup0) (fun0) );
CHECK (11 == TupleApplicator<int(int)> (tup1) (fun1) ); CHECK (11 == TupleApplicator<int(int)> (tup1) (fun1) );
CHECK (11+12 == TupleApplicator<int(int,int)> (tup2) (fun2) ); CHECK (11+12 == TupleApplicator<int(int,int)> (tup2) (fun2) );
CHECK (11+12+13 == TupleApplicator<int(int,int,int)> (tup3) (fun3) ); CHECK (11+12+13 == TupleApplicator<int(int,int,int)> (tup3) (fun3) );
CHECK (-1 == apply(fun0, tup0) ); CHECK (-1 == std::apply(fun0, tup0) );
CHECK (11 == apply(fun1, tup1) ); CHECK (11 == std::apply(fun1, tup1) );
CHECK (11+12 == apply(fun2, tup2) ); CHECK (11+12 == std::apply(fun2, tup2) );
CHECK (11+12+13 == apply(fun3, tup3) ); CHECK (11+12+13 == std::apply(fun3, tup3) );
} }
@ -194,21 +187,15 @@ namespace test {
function<int(int,int)> functor2 (fun2); function<int(int,int)> functor2 (fun2);
function<int(int,int,int)> functor3 (fun3); function<int(int,int,int)> functor3 (fun3);
CHECK (-1 == Apply<0>::invoke<int> (functor0, tup0) );
CHECK (11 == Apply<1>::invoke<int> (functor1, tup1) );
CHECK (11+12 == Apply<2>::invoke<int> (functor2, tup2) );
CHECK (11+12+13 == Apply<3>::invoke<int> (functor3, tup3) );
CHECK (-1 == TupleApplicator<int()> (tup0) (functor0) ); CHECK (-1 == TupleApplicator<int()> (tup0) (functor0) );
CHECK (11 == TupleApplicator<int(int)> (tup1) (functor1) ); CHECK (11 == TupleApplicator<int(int)> (tup1) (functor1) );
CHECK (11+12 == TupleApplicator<int(int,int)> (tup2) (functor2) ); CHECK (11+12 == TupleApplicator<int(int,int)> (tup2) (functor2) );
CHECK (11+12+13 == TupleApplicator<int(int,int,int)> (tup3) (functor3) ); CHECK (11+12+13 == TupleApplicator<int(int,int,int)> (tup3) (functor3) );
CHECK (-1 == apply(functor0, tup0) ); CHECK (-1 == std::apply(functor0, tup0) );
CHECK (11 == apply(functor1, tup1) ); CHECK (11 == std::apply(functor1, tup1) );
CHECK (11+12 == apply(functor2, tup2) ); CHECK (11+12 == std::apply(functor2, tup2) );
CHECK (11+12+13 == apply(functor3, tup3) ); CHECK (11+12+13 == std::apply(functor3, tup3) );
} }

View file

@ -164238,7 +164238,7 @@ Since then others have made contributions, see the log for the history.</font></
</node> </node>
</node> </node>
<node COLOR="#435e98" CREATED="1748828247849" ID="ID_476644412" MODIFIED="1748869713383" TEXT="Verbindung mit Typelisten"> <node COLOR="#435e98" CREATED="1748828247849" ID="ID_476644412" MODIFIED="1748869713383" TEXT="Verbindung mit Typelisten">
<node COLOR="#338800" CREATED="1749001830758" ID="ID_91346918" MODIFIED="1749007560980" TEXT="eigenst&#xe4;ndige Konstruktion von Type-Listen hinzuf&#xfc;gen"> <node COLOR="#338800" CREATED="1749001830758" ID="ID_91346918" MODIFIED="1749078634991" TEXT="eigenst&#xe4;ndige Konstruktion von Type-Listen hinzuf&#xfc;gen">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
<body> <body>
@ -164246,8 +164246,7 @@ Since then others have made contributions, see the log for the history.</font></
bisher wurde das durch Delegieren an die alte Loki-Implementierung bewerkstelligt; das nun direkt auf der Basis von Variadics zu machen, w&#228;re der zentrale Schritt, der das neue &#214;kosystem der variadischen Typlisten autonom macht (so da&#223; man am Ende die alte nicht-variadische Definition entfernen kann) bisher wurde das durch Delegieren an die alte Loki-Implementierung bewerkstelligt; das nun direkt auf der Basis von Variadics zu machen, w&#228;re der zentrale Schritt, der das neue &#214;kosystem der variadischen Typlisten autonom macht (so da&#223; man am Ende die alte nicht-variadische Definition entfernen kann)
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<arrowlink COLOR="#8ec9a3" DESTINATION="ID_1097523075" ENDARROW="Default" ENDINCLINATION="1324;0;" ID="Arrow_ID_370033957" STARTARROW="None" STARTINCLINATION="481;24;"/> <arrowlink COLOR="#8ec9a3" DESTINATION="ID_1097523075" ENDARROW="Default" ENDINCLINATION="1324;0;" ID="Arrow_ID_370033957" STARTARROW="None" STARTINCLINATION="481;24;"/>
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
</node> </node>
@ -164261,8 +164260,7 @@ Since then others have made contributions, see the log for the history.</font></
in typeseq-util (etwas versteckt zwischen den Spezialisierungen von Prepend, was wiederum Vorraussetzung ist, so einen R&#252;ckweg konstruieren zu k&#246;nnen) in typeseq-util (etwas versteckt zwischen den Spezialisierungen von Prepend, was wiederum Vorraussetzung ist, so einen R&#252;ckweg konstruieren zu k&#246;nnen)
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node COLOR="#338800" CREATED="1748828427985" ID="ID_819357004" MODIFIED="1748869657923" TEXT="auch eine f&#xfc;r TySeq hinzuf&#xfc;gen"> <node COLOR="#338800" CREATED="1748828427985" ID="ID_819357004" MODIFIED="1748869657923" TEXT="auch eine f&#xfc;r TySeq hinzuf&#xfc;gen">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
@ -164276,8 +164274,7 @@ Since then others have made contributions, see the log for the history.</font></
d.h arbeitet ausschlie&#223;lich auf Typlisten und bezieht sich nirgends auf Typ-Sequenzen d.h arbeitet ausschlie&#223;lich auf Typlisten und bezieht sich nirgends auf Typ-Sequenzen
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1748900614743" ID="ID_516014802" MODIFIED="1748900632652" TEXT="durch Test belegt: funtioniert auch mit den neuen Type-Sequenzen"> <node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1748900614743" ID="ID_516014802" MODIFIED="1748900632652" TEXT="durch Test belegt: funtioniert auch mit den neuen Type-Sequenzen">
<font NAME="SansSerif" SIZE="10"/> <font NAME="SansSerif" SIZE="10"/>
@ -164297,8 +164294,7 @@ Since then others have made contributions, see the log for the history.</font></
es stellt n&#228;mllich nur auf einen nested&#160;&#160;X::List ab es stellt n&#228;mllich nur auf einen nested&#160;&#160;X::List ab
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node CREATED="1748828781783" ID="ID_691444823" MODIFIED="1748828794388" TEXT="sollte also f&#xfc;r alle Varianten gleicherma&#xdf;en greifen"/> <node CREATED="1748828781783" ID="ID_691444823" MODIFIED="1748828794388" TEXT="sollte also f&#xfc;r alle Varianten gleicherma&#xdf;en greifen"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748888164617" ID="ID_145174722" MODIFIED="1748980951490" TEXT="sollte Tests ustellen auf Inline-Checks (mit _expect)"> <node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1748888164617" ID="ID_145174722" MODIFIED="1748980951490" TEXT="sollte Tests ustellen auf Inline-Checks (mit _expect)">
@ -164345,7 +164341,7 @@ Since then others have made contributions, see the log for the history.</font></
</node> </node>
<node CREATED="1748829890844" ID="ID_1803577911" MODIFIED="1748829894782" TEXT="view-spec-dsl"/> <node CREATED="1748829890844" ID="ID_1803577911" MODIFIED="1748829894782" TEXT="view-spec-dsl"/>
</node> </node>
<node CREATED="1748992492455" ID="ID_240022720" MODIFIED="1748992513597" TEXT="mu&#xdf; auf einen Schlag geschwenkt werden (Komplexit&#xe4;t)"> <node CREATED="1748992492455" ID="ID_240022720" MODIFIED="1749078649878" TEXT="mu&#xdf; auf einen Schlag geschwenkt werden (Komplexit&#xe4;t)">
<arrowlink DESTINATION="ID_142039126" ENDARROW="Default" ENDINCLINATION="726;0;" ID="Arrow_ID_535671141" STARTARROW="None" STARTINCLINATION="726;0;"/> <arrowlink DESTINATION="ID_142039126" ENDARROW="Default" ENDINCLINATION="726;0;" ID="Arrow_ID_535671141" STARTARROW="None" STARTINCLINATION="726;0;"/>
<arrowlink DESTINATION="ID_1545630215" ENDARROW="Default" ENDINCLINATION="741;0;" ID="Arrow_ID_1949399206" STARTARROW="None" STARTINCLINATION="741;0;"/> <arrowlink DESTINATION="ID_1545630215" ENDARROW="Default" ENDINCLINATION="741;0;" ID="Arrow_ID_1949399206" STARTARROW="None" STARTINCLINATION="741;0;"/>
<icon BUILTIN="messagebox_warning"/> <icon BUILTIN="messagebox_warning"/>
@ -164372,9 +164368,35 @@ Since then others have made contributions, see the log for the history.</font></
...aber nur wenn's einfach geht; eigentlich ist das au&#223;erhalb vom Scope und k&#246;nnte auch sp&#228;ter mal gemacht werden (ist nur ein Implementierungsdetail), sofern die bestehende Impl mit den neuen Typlisten arbeitet ...aber nur wenn's einfach geht; eigentlich ist das au&#223;erhalb vom Scope und k&#246;nnte auch sp&#228;ter mal gemacht werden (ist nur ein Implementierungsdetail), sofern die bestehende Impl mit den neuen Typlisten arbeitet
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<icon BUILTIN="hourglass"/> <icon BUILTIN="hourglass"/>
<node CREATED="1749074120514" ID="ID_1124039482" MODIFIED="1749074155396" TEXT="Schritt 1: Apply::invoke durch std::apply ersetzen">
<node CREATED="1749074488848" ID="ID_483438140" MODIFIED="1749074510349" TEXT="std::apply nimmt Funktion und Argument-Tupel per perfect-forwarding"/>
<node CREATED="1749074518632" ID="ID_271102144" MODIFIED="1749074526683" TEXT="unsere Impl arbeitet bisher mit Referenzen"/>
<node CREATED="1749074644727" ID="ID_800672638" MODIFIED="1749074650748" TEXT="tats&#xe4;chlich...">
<node CREATED="1749074651689" ID="ID_1201506659" MODIFIED="1749074657673" TEXT="nur zwei Verwendungen"/>
<node CREATED="1749074658274" ID="ID_1612862461" MODIFIED="1749074814185" TEXT="theoretisch k&#xf6;nnte die Funktion per forwarding durchgereicht werden"/>
<node CREATED="1749074676501" ID="ID_1942815860" MODIFIED="1749074872305" TEXT="w&#xe4;hrend die Params im TupleApplicator gespeichert sind"/>
<node CREATED="1749074815269" ID="ID_1502758690" MODIFIED="1749074832547" TEXT="tats&#xe4;chlich aber ist die Funktion als SIG im TupleApplicator festgelegt"/>
<node CREATED="1749074914027" ID="ID_827747475" MODIFIED="1749074928981" TEXT="und es gibt zwei Overloads, die beider per Ref nehmen">
<node CREATED="1749074930358" ID="ID_60505718" MODIFIED="1749074938288" TEXT="einmal f&#xfc;r eine Funktions-Referenz"/>
<node CREATED="1749074938991" ID="ID_1933479118" MODIFIED="1749074945258" TEXT="einmal f&#xfc;r eine std::function"/>
</node>
<node COLOR="#338800" CREATED="1749074949182" ID="ID_922059503" MODIFIED="1749078724388" TEXT="man k&#xf6;nnte das durch einen einzigen, echten Forwarder ersetzen">
<arrowlink COLOR="#3195b1" DESTINATION="ID_1229605231" ENDARROW="Default" ENDINCLINATION="-11;-24;" ID="Arrow_ID_1270112967" STARTARROW="None" STARTINCLINATION="-46;2;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1749075523968" ID="ID_1229605231" MODIFIED="1749078724388" TEXT="mehr noch: komplett eliminieren">
<linktarget COLOR="#3195b1" DESTINATION="ID_1229605231" ENDARROW="Default" ENDINCLINATION="-11;-24;" ID="Arrow_ID_1270112967" SOURCE="ID_922059503" STARTARROW="None" STARTINCLINATION="-46;2;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1749075539726" ID="ID_1117642835" MODIFIED="1749075548070" TEXT="es gibt n&#xe4;mlich nur eine einzige Usage"/>
<node CREATED="1749075560359" ID="ID_1888947775" MODIFIED="1749075565388" TEXT="command-op-closure.hpp">
<node CREATED="1749075574514" ID="ID_576031540" MODIFIED="1749075590619" TEXT="OpClosure::invoke(CmdFunctor const&amp;)"/>
<node CREATED="1749075598293" ID="ID_1797552075" MODIFIED="1749075608850" TEXT="das l&#xe4;&#xdf;t sich offensichtlich direkt durch std::apply ersetzen"/>
</node>
</node>
</node>
</node> </node>
</node> </node>
</node> </node>
@ -164436,7 +164458,7 @@ Since then others have made contributions, see the log for the history.</font></
<node COLOR="#435e98" CREATED="1748829480048" ID="ID_142039126" MODIFIED="1749007517616" TEXT="FunctionClosure_test"> <node COLOR="#435e98" CREATED="1748829480048" ID="ID_142039126" MODIFIED="1749007517616" TEXT="FunctionClosure_test">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_142039126" ENDARROW="Default" ENDINCLINATION="726;0;" ID="Arrow_ID_535671141" SOURCE="ID_240022720" STARTARROW="None" STARTINCLINATION="726;0;"/> <linktarget COLOR="#a9b4c1" DESTINATION="ID_142039126" ENDARROW="Default" ENDINCLINATION="726;0;" ID="Arrow_ID_535671141" SOURCE="ID_240022720" STARTARROW="None" STARTINCLINATION="726;0;"/>
</node> </node>
<node COLOR="#435e98" CREATED="1748829502213" ID="ID_1545630215" MODIFIED="1749007517616" TEXT="FunctionComposition_test"> <node COLOR="#435e98" CREATED="1748829502213" ID="ID_1545630215" MODIFIED="1749078649878" TEXT="FunctionComposition_test">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1545630215" ENDARROW="Default" ENDINCLINATION="741;0;" ID="Arrow_ID_1949399206" SOURCE="ID_240022720" STARTARROW="None" STARTINCLINATION="741;0;"/> <linktarget COLOR="#a9b4c1" DESTINATION="ID_1545630215" ENDARROW="Default" ENDINCLINATION="741;0;" ID="Arrow_ID_1949399206" SOURCE="ID_240022720" STARTARROW="None" STARTINCLINATION="741;0;"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#cd016f" CREATED="1748993653112" ID="ID_1058696109" MODIFIED="1748993677622" TEXT="Stackoverflow in Eclipse"> <node BACKGROUND_COLOR="#e0ceaa" COLOR="#cd016f" CREATED="1748993653112" ID="ID_1058696109" MODIFIED="1748993677622" TEXT="Stackoverflow in Eclipse">
<font NAME="SansSerif" SIZE="10"/> <font NAME="SansSerif" SIZE="10"/>
@ -164464,7 +164486,7 @@ Since then others have made contributions, see the log for the history.</font></
<node COLOR="#435e98" CREATED="1748829576396" ID="ID_281104576" MODIFIED="1748883754992" TEXT="TypeListUtil_test"> <node COLOR="#435e98" CREATED="1748829576396" ID="ID_281104576" MODIFIED="1748883754992" TEXT="TypeListUtil_test">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_281104576" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_351374746" SOURCE="ID_1470463237" STARTARROW="None" STARTINCLINATION="458;41;"/> <linktarget COLOR="#a9b4c1" DESTINATION="ID_281104576" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_351374746" SOURCE="ID_1470463237" STARTARROW="None" STARTINCLINATION="458;41;"/>
</node> </node>
<node COLOR="#435e98" CREATED="1748829567920" ID="ID_1097523075" MODIFIED="1749007565198" TEXT="TypeList_test"> <node COLOR="#435e98" CREATED="1748829567920" ID="ID_1097523075" MODIFIED="1749078634991" TEXT="TypeList_test">
<linktarget COLOR="#8ec9a3" DESTINATION="ID_1097523075" ENDARROW="Default" ENDINCLINATION="1324;0;" ID="Arrow_ID_370033957" SOURCE="ID_91346918" STARTARROW="None" STARTINCLINATION="481;24;"/> <linktarget COLOR="#8ec9a3" DESTINATION="ID_1097523075" ENDARROW="Default" ENDINCLINATION="1324;0;" ID="Arrow_ID_370033957" SOURCE="ID_91346918" STARTARROW="None" STARTINCLINATION="481;24;"/>
</node> </node>
<node CREATED="1748829607017" MODIFIED="1748829607017" TEXT="Variant_test"/> <node CREATED="1748829607017" MODIFIED="1748829607017" TEXT="Variant_test"/>