Invocation: Argument-spec evaluation sufficiently complete for now

Some additional tests to challenge the parser, which seems to work well.
Without extended analysis into the usage of those node specifications,
it is pointless to expand further on its capabilities. For now, it is
sufficient to have a foundation for hash-computation in place.

__Note__: found a nifty way to give lib::Several an easy toString rendering,
without cranking up the header inclusion load.
This commit is contained in:
Fischlurch 2025-02-02 17:22:16 +01:00
parent f6a2a641df
commit ead494e465
7 changed files with 118 additions and 51 deletions

View file

@ -188,12 +188,12 @@ namespace util {
* absolutely generic (In fact that was the reason why I
* gave up and just rolled our own `join` utility)
*/
template<class CON>
template<class COLL>
inline string
join (CON&& coll, string const& delim =", ")
join (COLL&& coll, string const& delim =", ")
{
using Coll = typename lib::meta::Strip<CON>::TypePlain;
_RangeIter<Coll> range(std::forward<CON>(coll)); // copies when CON is reference
using Coll = typename lib::meta::Strip<COLL>::TypePlain;
_RangeIter<Coll> range(std::forward<COLL>(coll)); // copies when CON is reference
auto strings = stringify (std::move (range.iter));
if (!strings) return "";
@ -242,5 +242,22 @@ namespace util {
}
/** one-argument variant that can be forward declared... */
template<class COLL>
inline string
toStringParen (COLL&& coll)
{
return "("+join (forward<COLL> (coll))+")";
}
template<class COLL>
inline string
toStringBracket (COLL&& coll)
{
return "["+join (forward<COLL> (coll))+"]";
}
} // namespace util
#endif /*LIB_FORMAT_UTIL_H*/

View file

@ -57,6 +57,10 @@
#include <cstddef>
#include <functional>
namespace util {
template<class COLL>
std::string toStringBracket (COLL&& coll);
}
namespace lib {
@ -179,6 +183,9 @@ namespace lib {
return *this;
}
explicit
operator std::string() const;
size_t
size() const
{
@ -248,5 +255,13 @@ namespace lib {
};
/** generic string rendering delegated to `util::toString(elm)` */
template<class I>
inline
Several<I>::operator std::string() const
{
return util::toStringBracket (*this);
}
} // namespace lib
#endif

View file

@ -322,7 +322,7 @@ namespace engine {
ProcID::ArgModel
ProcID::genArgModel()
{
auto argListSyntax = accept_bracket(accept_repeated(COMMA, specTermSyntax));
auto argListSyntax = accept_bracket(accept_repeated(0,MAX_NODE_ARG, COMMA, specTermSyntax));
auto argSpecSyntax = accept(argListSyntax)
.opt(argListSyntax)
.bind([](auto model) -> ProcID::ArgModel

View file

@ -129,6 +129,12 @@ namespace engine {
using OptionalBuff = std::optional<BuffHandle>;
/** arbitrary safety limit on fain-in / fan-out
* @note expect lower limits in practice caused by AllocationCluster */
const size_t MAX_NODE_ARG = LUMIERA_MAX_ORDINAL_NUMBER / 2;
class Port
: util::NonCopyable
{

View file

@ -34,7 +34,7 @@ namespace engine{
namespace test {
using std::abs;
using util::join;
// using util::join;
@ -51,8 +51,8 @@ namespace test {
}
/** @test TODO evaluation of processing-spec for a ProcID
* @todo WIP 1/25 🔁 define 🔁 implement
/** @test evaluation of processing-spec for a ProcID
* @todo 1/25 define implement
*/
void
verify_ID_specification()
@ -82,24 +82,34 @@ namespace test {
ProcID::ArgModel arg1 = p1.genArgModel();
ProcID::ArgModel arg2 = p2.genArgModel();
ProcID::ArgModel arg3 = p3.genArgModel();
SHOW_EXPR(join (arg1.iArg))
SHOW_EXPR(join (arg1.oArg))
SHOW_EXPR(join (arg2.iArg))
SHOW_EXPR(join (arg2.oArg))
SHOW_EXPR(join (arg3.iArg))
SHOW_EXPR(join (arg3.oArg))
CHECK (join (arg1.iArg) == ""_expect );
CHECK (join (arg1.oArg) == "arg"_expect ); // only one argument list -> used for output
CHECK (join (arg2.iArg) == ""_expect );
CHECK (join (arg2.oArg) == "a1, a2"_expect );
CHECK (join (arg3.iArg) == "in, in, in"_expect ); // repetition-abbreviation of arguments unfolded
CHECK (join (arg3.oArg) == "o1, o2, o2"_expect );
UNIMPLEMENTED ("parse and evaluate");
CHECK (not arg1.hasInArgs());
CHECK (not arg2.hasInArgs());
CHECK (arg1.outArity() == 1);
CHECK (arg2.outArity() == 2);
CHECK (arg3.outArity() == 3);
CHECK (arg3.inArity() == 3);
CHECK (arg1.iArg == "[]"_expect );
CHECK (arg1.oArg == "[arg]"_expect ); // only one argument list -> used for output
CHECK (arg2.iArg == "[]"_expect );
CHECK (arg2.oArg == "[a1, a2]"_expect );
CHECK (arg3.iArg == "[in, in, in]"_expect ); // repetition-abbreviation of arguments unfolded
CHECK (arg3.oArg == "[o1, o2, o2]"_expect );
// give the spec-parser a rough time....
string nastySpec = "(\":-)\"/2,std::tuple<short,long>/3,{oh,RLY?}/2,\\\")";
auto hairyModel = ProcID::describe("", nastySpec).genArgModel();
CHECK (hairyModel.outArity() == 8);
CHECK (hairyModel.inArity() == 0);
CHECK (hairyModel.oArg == "[\":-)\", \":-)\", "
"std::tuple<short,long>, "
"std::tuple<short,long>, "
"std::tuple<short,long>, "
"{oh,RLY?}, {oh,RLY?}, \\\"]"_expect);
}
/** @test TODO aspects of node definition relevant for the ProcID
* @todo WIP 1/25 🔁 define implement
* @todo WIP 2/25 🔁 define implement
*/
void
verify_ID_properties()

View file

@ -36,6 +36,7 @@ using std::array;
using lib::explore;
using util::isLimited;
using util::toString;
using util::isnil;
using util::join;
@ -161,6 +162,7 @@ namespace test{
CHECK (elms.back() == 13);
CHECK (elms[3] == 3);
CHECK (join (elms,"-") == "1-1-2-3-5-8-13"_expect);
CHECK (toString(elms) == "[1, 1, 2, 3, 5, 8, 13]"_expect);
}

View file

@ -105306,8 +105306,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736632825326" ID="ID_445490716" MODIFIED="1736632833373" TEXT="Argumentlisten aufschl&#xfc;sseln">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1736632825326" ID="ID_445490716" MODIFIED="1738516465242" TEXT="Argumentlisten aufschl&#xfc;sseln">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1738288578828" ID="ID_1600745522" MODIFIED="1738288973161" TEXT="Wozu?">
<linktarget COLOR="#4416dc" DESTINATION="ID_1600745522" ENDARROW="Default" ENDINCLINATION="-224;60;" ID="Arrow_ID_1199285145" SOURCE="ID_786613770" STARTARROW="None" STARTINCLINATION="183;0;"/>
<icon BUILTIN="info"/>
@ -105341,9 +105341,13 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</body>
</html></richcontent>
</node>
<node CREATED="1738510255777" ID="ID_669885653" MODIFIED="1738510336552" TEXT="nur wenige Zugriffe hierauf direkt aus dem Render-Vorgang">
<arrowlink COLOR="#496cc8" DESTINATION="ID_981290324" ENDARROW="Default" ENDINCLINATION="-1004;-71;" ID="Arrow_ID_356560538" STARTARROW="None" STARTINCLINATION="410;19;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1736632885429" ID="ID_1285666886" MODIFIED="1736633401873" TEXT="in Input / Output-Teil zerlegen">
<icon BUILTIN="flag-pink"/>
</node>
<node COLOR="#338800" CREATED="1736632885429" ID="ID_1285666886" MODIFIED="1738516458294" TEXT="in Input / Output-Teil zerlegen">
<icon BUILTIN="button_ok"/>
<node CREATED="1736637886757" ID="ID_1642918073" MODIFIED="1736637912343" TEXT="Mist! mu&#xdf; Klammerung parsen"/>
<node CREATED="1736638440539" ID="ID_764410464" MODIFIED="1736638458389" TEXT="ja dann &#x2014; werden wir gliech parsen!">
<node COLOR="#5b280f" CREATED="1736645265951" ID="ID_1649012023" MODIFIED="1736715480639" TEXT="NICHT eine Library verwenden">
@ -105386,6 +105390,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1738092795598" ID="ID_461276578" MODIFIED="1738285081902" TEXT="uuuuund ... kaum wart&apos; ma zwei Wochen, schon k&#xf6;nnen &#x201e;wir&#x201c; das">
<arrowlink COLOR="#996494" DESTINATION="ID_1363201028" ENDARROW="Default" ENDINCLINATION="-20;-32;" ID="Arrow_ID_621419348" STARTARROW="None" STARTINCLINATION="132;6;"/>
<linktarget COLOR="#2469a2" DESTINATION="ID_461276578" ENDARROW="Default" ENDINCLINATION="1338;-36;" ID="Arrow_ID_1078242662" SOURCE="ID_195611513" STARTARROW="Default" STARTINCLINATION="1743;85;"/>
<linktarget COLOR="#4690c4" DESTINATION="ID_461276578" ENDARROW="Default" ENDINCLINATION="-782;31;" ID="Arrow_ID_774773700" SOURCE="ID_537165384" STARTARROW="None" STARTINCLINATION="-239;-11;"/>
<icon BUILTIN="smily_bad"/>
</node>
</node>
@ -105427,9 +105432,10 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1738332756317" ID="ID_908054156" MODIFIED="1738365016846" TEXT="Argument-Auswertung implementieren">
<icon BUILTIN="pencil"/>
<node CREATED="1738332766392" ID="ID_1638579640" MODIFIED="1738332770822" TEXT="Code-Anordnung">
<node COLOR="#338800" CREATED="1738332756317" ID="ID_908054156" MODIFIED="1738516455105" TEXT="Argument-Auswertung implementieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1738332766392" ID="ID_1638579640" MODIFIED="1738516477005" TEXT="Code-Anordnung">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1738332780351" ID="ID_1622923755" MODIFIED="1738335786356" TEXT="aus ProcNode.hpp heraushalten">
<icon BUILTIN="messagebox_warning"/>
</node>
@ -105496,7 +105502,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#338800" CREATED="1738347757673" ID="ID_343200211" MODIFIED="1738347794623" TEXT="es gibt noch kein fill-by-move &#x27f9; nachr&#xfc;sten">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1738347797563" ID="ID_128830147" MODIFIED="1738364972902" TEXT="const Element-Typ macht Probleme">
<node COLOR="#338800" CREATED="1738347797563" FOLDED="true" ID="ID_128830147" MODIFIED="1738364972902" TEXT="const Element-Typ macht Probleme">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1738347812806" ID="ID_248989693" MODIFIED="1738364970007" TEXT="reinterpret-cast macht keinen const-cast">
<node CREATED="1738347833854" ID="ID_1340813798" MODIFIED="1738347845378" TEXT="hey... was soll das??">
@ -105511,8 +105517,10 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
<node COLOR="#435e98" CREATED="1738348359719" ID="ID_968746797" MODIFIED="1738364967687" TEXT="seltsame Probleme mit dem Allokator">
<node CREATED="1738348393499" ID="ID_536251182" MODIFIED="1738361405248" TEXT="Spezialisierung ist wohl nur f&#xfc;r non-CV definiert"/>
<node CREATED="1738348411361" ID="ID_404478938" MODIFIED="1738348444571" TEXT="also CV automatisch vom Typ entfernen">
<node CREATED="1738348393499" ID="ID_536251182" MODIFIED="1738510032644" TEXT="Spezialisierung ist wohl nur f&#xfc;r non-CV definiert">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1738348411361" FOLDED="true" ID="ID_404478938" MODIFIED="1738348444571" TEXT="also CV automatisch vom Typ entfernen">
<node COLOR="#435e98" CREATED="1738348446044" ID="ID_1406523831" MODIFIED="1738361998554" TEXT="will nicht funktionieren">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1738348458226" ID="ID_59165298" MODIFIED="1738361926851" TEXT="mismatch mit new_allocator, der einen Basis-Allocator per Pointer nimmt">
@ -105539,7 +105547,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node CREATED="1738362009001" ID="ID_1270461864" MODIFIED="1738362022913" TEXT="damit geht&apos;s kann einen const-String von non-const-String initialisieren"/>
<node COLOR="#338800" CREATED="1738362009001" ID="ID_1270461864" MODIFIED="1738510045093" TEXT="damit geht&apos;s: kann einen const-String von non-const-String initialisieren">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1738364889035" ID="ID_1815714742" MODIFIED="1738364963180" TEXT="Destruktor kann nicht festgestellt werden">
<node CREATED="1738364904359" ID="ID_1913087416" MODIFIED="1738364944225" TEXT="liegt ebenfalls an CV">
@ -105563,9 +105573,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#338800" CREATED="1738380589746" ID="ID_180463287" MODIFIED="1738383244594" TEXT="aber alle RegExps statisch compilieren">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1738380602321" ID="ID_103601413" MODIFIED="1738383242621" TEXT="au&#xdf;erdem: Builder-Funktion f&#xfc;r &lt;geklammerte sub-Spec&gt;">
<node COLOR="#338800" CREATED="1738380602321" FOLDED="true" ID="ID_103601413" MODIFIED="1738383242621" TEXT="au&#xdf;erdem: Builder-Funktion f&#xfc;r &lt;geklammerte sub-Spec&gt;">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1738380625397" ID="ID_1784590181" MODIFIED="1738380638067" TEXT="Vorsicht: rekursive Klausel braucht dauerhafte Storage">
<node BACKGROUND_COLOR="#dec27a" COLOR="#a50125" CREATED="1738380625397" ID="ID_1784590181" MODIFIED="1738510079827" TEXT="Vorsicht: rekursive Klausel braucht dauerhafte Storage">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1738380639585" ID="ID_600115874" MODIFIED="1738380655248" TEXT="verwende getemplatete Funktion und darin eine statische Variable">
@ -105606,7 +105616,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1736633780461" ID="ID_182647940" MODIFIED="1738463484410" TEXT="Repetitions-Spec /# ausfalten">
<node COLOR="#338800" CREATED="1736633780461" FOLDED="true" ID="ID_182647940" MODIFIED="1738510105016" TEXT="Repetitions-Spec /# ausfalten">
<icon BUILTIN="button_ok"/>
<node CREATED="1738462844433" ID="ID_1445421658" MODIFIED="1738462904758" TEXT="nur sinnvoll mit &#xbb;schleppendem State&#xab; &#x27f9; Pipeline">
<linktarget COLOR="#fbfac5" DESTINATION="ID_1445421658" ENDARROW="Default" ENDINCLINATION="-169;10;" ID="Arrow_ID_1592587071" SOURCE="ID_364619333" STARTARROW="None" STARTINCLINATION="135;14;"/>
@ -105630,8 +105640,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
...wenn man's genau bedenkt: w&#228;re praktisch &#228;quivalent
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1738463780753" ID="ID_202887229" MODIFIED="1738463807594" TEXT="w&#xe4;re nur sinnvoll wenn auch die String-Daten selber im Several liegen"/>
<node COLOR="#5b280f" CREATED="1738463809678" ID="ID_1945186564" MODIFIED="1738463827762" TEXT="hier aber Several nur wegen dem API verwendet">
@ -105653,15 +105662,14 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
in einer LL-Syntax kann man nicht mit einer optionalen Struktur beginnen, die sich erst im R&#252;ckblick auf die ganze Zeile aufkl&#228;rt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1736632908578" ID="ID_1359149203" MODIFIED="1736633401873" TEXT="Token-Sequenz generieren">
<icon BUILTIN="flag-pink"/>
<node COLOR="#5b280f" CREATED="1736633418536" ID="ID_1128683976" MODIFIED="1738280806304" TEXT="Regular-Expressions (nach Schema-F)">
<node COLOR="#338800" CREATED="1736632908578" ID="ID_1359149203" MODIFIED="1738510154732" TEXT="Argument-Token-Sequenz bereitstellen">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1736633418536" FOLDED="true" ID="ID_1128683976" MODIFIED="1738280806304" TEXT="Regular-Expressions (nach Schema-F)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -105705,8 +105713,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1736633797874" ID="ID_266262938" MODIFIED="1738449408813" TEXT="Token-Pipeline aufbauen">
<node COLOR="#435e98" CREATED="1736633797874" FOLDED="true" ID="ID_266262938" MODIFIED="1738510368439" TEXT="Token-Pipeline aufbauen">
<icon BUILTIN="help"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1736633850189" ID="ID_187292513" MODIFIED="1736633861182" TEXT="k&#xf6;nnte ein Expander sein">
<icon BUILTIN="stop-sign"/>
<node COLOR="#5b280f" CREATED="1736633863015" ID="ID_1166752601" MODIFIED="1736633908235" TEXT="unn&#xf6;tig komplex">
@ -105754,8 +105763,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
Pipeline zum Aufbereiten der Argumente an
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -105769,13 +105777,13 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
Aber trotzdem immer noch nicht der leiseste Hauch von Erinnerung, was ich damals gemeint habe....
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<arrowlink COLOR="#fbfac5" DESTINATION="ID_1445421658" ENDARROW="Default" ENDINCLINATION="-169;10;" ID="Arrow_ID_1592587071" STARTARROW="None" STARTINCLINATION="135;14;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1738280786811" ID="ID_1355841919" MODIFIED="1738280796189" TEXT="also dann doch richtig parsen">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1738280786811" ID="ID_1355841919" MODIFIED="1738510129372" TEXT="also dann doch richtig parsen">
<icon BUILTIN="yes"/>
<node CREATED="1738281073002" ID="ID_537165384" MODIFIED="1738281158036" TEXT="schon beim Zerlegen in Input/Output bin ich auf diese Probleme gesto&#xdf;en &#x2014;">
<richcontent TYPE="NOTE"><html>
<head/>
@ -105785,11 +105793,14 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#4690c4" DESTINATION="ID_461276578" ENDARROW="Default" ENDINCLINATION="-782;31;" ID="Arrow_ID_774773700" STARTARROW="None" STARTINCLINATION="-239;-11;"/>
</node>
<node CREATED="1738281326205" ID="ID_1746479195" MODIFIED="1738281816880" TEXT="per Parse kann man aber auch gleich ein Modell erzeugen">
<node COLOR="#435e98" CREATED="1738281326205" FOLDED="true" ID="ID_1746479195" MODIFIED="1738510360943" TEXT="per Parse kann man aber auch gleich ein Modell erzeugen">
<icon BUILTIN="idea"/>
<node CREATED="1738281820274" ID="ID_1616091691" MODIFIED="1738281831902" TEXT="ist die Frage ob das hier sinnvoll ist"/>
<node CREATED="1738281832897" ID="ID_1679825734" MODIFIED="1738281848598" TEXT="alternativ k&#xf6;nnte man auch x-mal immer wieder parsen"/>
<node COLOR="#435e98" CREATED="1738282103267" ID="ID_981290324" MODIFIED="1738288404860" TEXT="was f&#xfc;r Zugriffe w&#xe4;ren denn regelm&#xe4;&#xdf;ig zu erwarten">
<node COLOR="#435e98" CREATED="1738282103267" ID="ID_981290324" MODIFIED="1738510336553" TEXT="was f&#xfc;r Zugriffe w&#xe4;ren denn regelm&#xe4;&#xdf;ig zu erwarten">
<linktarget COLOR="#496cc8" DESTINATION="ID_981290324" ENDARROW="Default" ENDINCLINATION="-1004;-71;" ID="Arrow_ID_356560538" SOURCE="ID_669885653" STARTARROW="None" STARTINCLINATION="410;19;"/>
<icon BUILTIN="help"/>
<node CREATED="1738282122522" ID="ID_1638205904" MODIFIED="1738282141735" TEXT="(also nicht im Test, sondern beim Rendern)">
<font NAME="SansSerif" SIZE="10"/>
@ -105821,6 +105832,12 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<arrowlink COLOR="#578494" DESTINATION="ID_891035798" ENDARROW="Default" ENDINCLINATION="46;331;" ID="Arrow_ID_982442559" STARTARROW="None" STARTINCLINATION="13;-499;"/>
</node>
</node>
<node COLOR="#338800" CREATED="1738510158791" ID="ID_669059834" MODIFIED="1738510216078" TEXT="vorerst gen&#xfc;gt dieses Modell">
<icon BUILTIN="yes"/>
<node CREATED="1738510170918" ID="ID_682975289" MODIFIED="1738510182534" TEXT="einzelne Argumente als const string"/>
<node CREATED="1738510183559" ID="ID_1893767765" MODIFIED="1738510193944" TEXT="liegen in zwei lib::Several&lt;const string&gt; bereit"/>
<node CREATED="1738510196195" ID="ID_87820153" MODIFIED="1738510203364" TEXT="ein paar Auswertungsfunktionen dazu"/>
</node>
</node>
</node>
<node COLOR="#5b280f" CREATED="1736632937502" ID="ID_461312539" MODIFIED="1736632988969" TEXT="Reduktion machen wir nicht">