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:
parent
1a2c2ededa
commit
400d0eb92e
4 changed files with 54 additions and 181 deletions
|
|
@ -101,13 +101,6 @@ namespace func{
|
|||
template<> //__________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP&)
|
||||
|
|
@ -120,13 +113,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -139,15 +125,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -162,16 +139,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -187,17 +154,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -214,18 +170,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -243,19 +187,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -274,20 +205,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -307,21 +224,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
bind (FUN& f, TUP & arg)
|
||||
|
|
@ -342,22 +244,6 @@ namespace func{
|
|||
template<> //_________________________________
|
||||
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>
|
||||
static RET
|
||||
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 (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_); }
|
||||
Ret operator() (function<SIG>& f) { return Apply<ARG_CNT>::template invoke<Ret> (f, params_); }
|
||||
template<class FUN>
|
||||
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
|
||||
* @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.
|
||||
* @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,
|
||||
* since the optimiser sees the operation as a whole.
|
||||
* @todo 2/2025 However, the LeftReplacedArgs _could_ then possibly moved into the bind function,
|
||||
|
|
@ -844,32 +735,6 @@ namespace func{
|
|||
|
||||
/* ========== 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,
|
||||
* using the values from the argument tuple.
|
||||
* @return a closure object, which can be
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ namespace control {
|
|||
using lib::meta::_Fun;
|
||||
using lib::meta::Tuple;
|
||||
using lib::meta::BuildTupleAccessor;
|
||||
using lib::meta::func::TupleApplicator;
|
||||
using lib::meta::buildTuple;
|
||||
using lib::meta::Nil;
|
||||
|
||||
|
|
@ -175,8 +174,8 @@ namespace control {
|
|||
void
|
||||
invoke (CmdFunctor const& unboundFunctor)
|
||||
{
|
||||
TupleApplicator<SIG> apply_this_arguments(params_);
|
||||
apply_this_arguments (unboundFunctor.getFun<SIG>());
|
||||
ArgTuple& paramTuple{params_};
|
||||
std::apply (unboundFunctor.getFun<SIG>(), paramTuple);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@ namespace test {
|
|||
using func::TupleApplicator;
|
||||
using func::FunctionClosure;
|
||||
using func::closure;
|
||||
using func::apply;
|
||||
|
||||
|
||||
/*********************************************************************//**
|
||||
|
|
@ -164,21 +163,15 @@ namespace test {
|
|||
DUMPVAL (tup2);
|
||||
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 (11 == TupleApplicator<int(int)> (tup1) (fun1) );
|
||||
CHECK (11+12 == TupleApplicator<int(int,int)> (tup2) (fun2) );
|
||||
CHECK (11+12+13 == TupleApplicator<int(int,int,int)> (tup3) (fun3) );
|
||||
|
||||
CHECK (-1 == apply(fun0, tup0) );
|
||||
CHECK (11 == apply(fun1, tup1) );
|
||||
CHECK (11+12 == apply(fun2, tup2) );
|
||||
CHECK (11+12+13 == apply(fun3, tup3) );
|
||||
|
||||
CHECK (-1 == std::apply(fun0, tup0) );
|
||||
CHECK (11 == std::apply(fun1, tup1) );
|
||||
CHECK (11+12 == std::apply(fun2, tup2) );
|
||||
CHECK (11+12+13 == std::apply(fun3, tup3) );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -194,21 +187,15 @@ namespace test {
|
|||
function<int(int,int)> functor2 (fun2);
|
||||
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 (11 == TupleApplicator<int(int)> (tup1) (functor1) );
|
||||
CHECK (11+12 == TupleApplicator<int(int,int)> (tup2) (functor2) );
|
||||
CHECK (11+12+13 == TupleApplicator<int(int,int,int)> (tup3) (functor3) );
|
||||
|
||||
CHECK (-1 == apply(functor0, tup0) );
|
||||
CHECK (11 == apply(functor1, tup1) );
|
||||
CHECK (11+12 == apply(functor2, tup2) );
|
||||
CHECK (11+12+13 == apply(functor3, tup3) );
|
||||
|
||||
CHECK (-1 == std::apply(functor0, tup0) );
|
||||
CHECK (11 == std::apply(functor1, tup1) );
|
||||
CHECK (11+12 == std::apply(functor2, tup2) );
|
||||
CHECK (11+12+13 == std::apply(functor3, tup3) );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -164238,7 +164238,7 @@ Since then others have made contributions, see the log for the history.</font></
|
|||
</node>
|
||||
</node>
|
||||
<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ändige Konstruktion von Type-Listen hinzufügen">
|
||||
<node COLOR="#338800" CREATED="1749001830758" ID="ID_91346918" MODIFIED="1749078634991" TEXT="eigenständige Konstruktion von Type-Listen hinzufügen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<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äre der zentrale Schritt, der das neue Ökosystem der variadischen Typlisten autonom macht (so daß man am Ende die alte nicht-variadische Definition entfernen kann)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#8ec9a3" DESTINATION="ID_1097523075" ENDARROW="Default" ENDINCLINATION="1324;0;" ID="Arrow_ID_370033957" STARTARROW="None" STARTINCLINATION="481;24;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</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ückweg konstruieren zu können)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1748828427985" ID="ID_819357004" MODIFIED="1748869657923" TEXT="auch eine für TySeq hinzufügen">
|
||||
<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ßlich auf Typlisten und bezieht sich nirgends auf Typ-Sequenzen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<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">
|
||||
<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ämllich nur auf einen nested  X::List ab
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1748828781783" ID="ID_691444823" MODIFIED="1748828794388" TEXT="sollte also für alle Varianten gleichermaßen greifen"/>
|
||||
<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 CREATED="1748829890844" ID="ID_1803577911" MODIFIED="1748829894782" TEXT="view-spec-dsl"/>
|
||||
</node>
|
||||
<node CREATED="1748992492455" ID="ID_240022720" MODIFIED="1748992513597" TEXT="muß auf einen Schlag geschwenkt werden (Komplexität)">
|
||||
<node CREATED="1748992492455" ID="ID_240022720" MODIFIED="1749078649878" TEXT="muß auf einen Schlag geschwenkt werden (Komplexität)">
|
||||
<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;"/>
|
||||
<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ßerhalb vom Scope und könnte auch später mal gemacht werden (ist nur ein Implementierungsdetail), sofern die bestehende Impl mit den neuen Typlisten arbeitet
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<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ächlich...">
|
||||
<node CREATED="1749074651689" ID="ID_1201506659" MODIFIED="1749074657673" TEXT="nur zwei Verwendungen"/>
|
||||
<node CREATED="1749074658274" ID="ID_1612862461" MODIFIED="1749074814185" TEXT="theoretisch könnte die Funktion per forwarding durchgereicht werden"/>
|
||||
<node CREATED="1749074676501" ID="ID_1942815860" MODIFIED="1749074872305" TEXT="während die Params im TupleApplicator gespeichert sind"/>
|
||||
<node CREATED="1749074815269" ID="ID_1502758690" MODIFIED="1749074832547" TEXT="tatsä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ür eine Funktions-Referenz"/>
|
||||
<node CREATED="1749074938991" ID="ID_1933479118" MODIFIED="1749074945258" TEXT="einmal für eine std::function"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1749074949182" ID="ID_922059503" MODIFIED="1749078724388" TEXT="man kö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ä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&)"/>
|
||||
<node CREATED="1749075598293" ID="ID_1797552075" MODIFIED="1749075608850" TEXT="das läßt sich offensichtlich direkt durch std::apply ersetzen"/>
|
||||
</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">
|
||||
<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 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;"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#cd016f" CREATED="1748993653112" ID="ID_1058696109" MODIFIED="1748993677622" TEXT="Stackoverflow in Eclipse">
|
||||
<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">
|
||||
<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 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;"/>
|
||||
</node>
|
||||
<node CREATED="1748829607017" MODIFIED="1748829607017" TEXT="Variant_test"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue