Library: complete implementation of Map-databinding

...using a ''special protocol'' to represent iterative data sequences
 * use an Index-Key with a CSV list of element prefixes
 * synthesise key-prefixes for each data element
 * perform lookup with the decorated key first

This allows to somehow ''emulate'' nested associations within a single, flat Map.
Obviously this is more like a proof-of-concept; actually the Map-databinding
is meant to handle the simple cases, where just placeholders are to be substituted.

The logic structures are much more relevant when binding to structural data,
most notably to the Lumiera _External Tree Description_ format, which is
used for model data and inter-layer communication.
This commit is contained in:
Fischlurch 2024-03-25 03:03:18 +01:00
parent 58ffbac7f3
commit c09f44e20f
2 changed files with 134 additions and 80 deletions

View file

@ -122,6 +122,7 @@ namespace lib {
using StrView = std::string_view;
using util::_Fmt;
using util::isnil;
using util::unConst;
@ -140,7 +141,7 @@ namespace lib {
iterNestedKeys (string key, string const& iterDef)
{
return explore (util::RegexSearchIter{iterDef, ACCEPT_DATA_ELM})
.transform ([&](smatch mat){ return key+"."+string{mat[1]}; });
.transform ([&](smatch mat){ return key+"."+string{mat[1]}+"."; });
}
@ -521,37 +522,75 @@ namespace lib {
using MapS = std::map<string,string>;
/**
* Data-binding for a Map-of-strings.
* Simple keys are retrieved by direct lookup.
* For the representation of nested data sequences,
* the following conventions apply
* - the data sequence itself is represented by an index-key
* - the value associated to this index-key is a CSV sequence
* - each element in this sequence defines a key prefix
* - nested keys are then defined as `<index-key>.<elm-key>.<key>`
* - when key decoration is enabled for a nested data source, each
* lookup for a given key is first tried with the prefix, then as-is.
* Consequently, all data in the sequence must be present in the original
* map, stored under the decorated keys.
* @note multiply nested sequences are _not supported._
* While it _is_ possible to have nested loops, the resulting sets
* of keys must be disjoint and data must be present in the base map.
* @see TextTemplate_test::verify_Map_binding()
*/
template<>
struct TextTemplate::DataSource<MapS>
{
MapS const * data_;
using Iter = decltype(iterNestedKeys("",""));
string keyPrefix_{};
bool isNested() { return not isnil (keyPrefix_); }
bool
contains (string key)
{
return util::contains (*data_, key);
return (isNested() and util::contains (*data_, keyPrefix_+key))
or util::contains (*data_, key);
}
string const&
retrieveContent (string key)
{
auto elm = data_->find (key);
MapS::const_iterator elm;
if (isNested())
{
elm = data_->find (keyPrefix_+key);
if (elm == data_->end())
elm = data_->find (key);
}
else
elm = data_->find (key);
ENSURE (elm != data_->end());
return elm->second;
}
using Iter = decltype(iterNestedKeys("",""));
Iter
getSequence (string key)
{
UNIMPLEMENTED ("extract data sequence from definition key");
if (not contains(key))
return Iter{};
else
return iterNestedKeys (key, retrieveContent(key));
}
DataSource
openContext (Iter& iter)
{
REQUIRE (iter);
UNIMPLEMENTED ("open a nested sub-data-ctx based on the given iterator");
DataSource nested{*this};
nested.keyPrefix_ = *iter;
return nested;
}
};

View file

@ -112477,11 +112477,11 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710723556427" ID="ID_967894122" MODIFIED="1710723653752" TEXT="Baukastensystem &#x2014; kein Framework">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710723662213" ID="ID_454325758" MODIFIED="1710723719430" TEXT="Ersetzung per ${Name}">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#990000" CREATED="1710723662213" ID="ID_454325758" MODIFIED="1711336107467" TEXT="Ersetzung per ${Name}">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710792595619" ID="ID_1847669087" MODIFIED="1710792697841" TEXT="m&#xf6;gliche weitere Features">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#45406d" CREATED="1710792595619" ID="ID_1847669087" MODIFIED="1711336505291" TEXT="unterst&#xfc;tzt einfache Logik-Konstrukte">
<icon BUILTIN="button_ok"/>
<node CREATED="1710792606209" ID="ID_1610911585" MODIFIED="1710805681293" TEXT="${if ID} ... ${else [ID]} ... ${end if ID}"/>
<node CREATED="1710792634661" ID="ID_584250278" MODIFIED="1710805692772" TEXT="${for ID} ... ${else [ID]} ... ${end for ID}"/>
</node>
@ -112496,8 +112496,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710792755709" ID="ID_952834241" MODIFIED="1710792828516" TEXT="ein situativ-funktionales Daten-Binding">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1710792755709" ID="ID_952834241" MODIFIED="1711336122669" TEXT="ein situativ-funktionales Daten-Binding">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710792833458" ID="ID_275925925" MODIFIED="1710792878693" TEXT="ein generischer Standard-Adapter f&#xfc;r map-artigen Zugriff">
<icon BUILTIN="flag-yellow"/>
</node>
@ -112505,12 +112505,12 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793061549" ID="ID_896868325" MODIFIED="1710793066570" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793061549" ID="ID_896868325" MODIFIED="1711336391576" TEXT="Implementierung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1710793071787" ID="ID_697532669" MODIFIED="1710811850787" TEXT="Rahmen in lib/text-template.hpp">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710809059429" ID="ID_332847297" MODIFIED="1710809198212" TEXT="class TextTemplate">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1710809059429" ID="ID_332847297" MODIFIED="1711336132795" TEXT="class TextTemplate">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1710809189941" ID="ID_392724858" MODIFIED="1710811854998" TEXT="nested definitions">
<icon BUILTIN="button_ok"/>
@ -112518,12 +112518,13 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710809220249" ID="ID_1049694621" MODIFIED="1710809223876" TEXT="enum Code"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793119597" ID="ID_1328122626" MODIFIED="1710793127228" TEXT="Design">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#2a0fad" CREATED="1710793119597" ID="ID_1328122626" MODIFIED="1711336460037" TEXT="Design">
<font BOLD="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710793135490" ID="ID_1136896163" MODIFIED="1710811869814" TEXT="Binding">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793140948" ID="ID_1992696242" MODIFIED="1710793164256" TEXT="Schema f&#xfc;r Binding anlegen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793140948" ID="ID_1992696242" MODIFIED="1711336422206" TEXT="Schema f&#xfc;r Binding anlegen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1710793148025" ID="ID_1493105822" MODIFIED="1710811861955" TEXT="das Binding-callback-API definieren">
<icon BUILTIN="button_ok"/>
@ -112621,13 +112622,13 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793178661" ID="ID_1043138581" MODIFIED="1710793271816" TEXT="Parser">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793274688" ID="ID_1785713892" MODIFIED="1710793282863" TEXT="RegExp - Iteration">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793178661" ID="ID_1043138581" MODIFIED="1711336174610" TEXT="Parser">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1710793274688" ID="ID_1785713892" MODIFIED="1711336170787" TEXT="RegExp - Iteration">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793301196" ID="ID_42591067" MODIFIED="1710793305367" TEXT="Basis-Tokens">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793301196" ID="ID_42591067" MODIFIED="1711336172340" TEXT="Basis-Tokens">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1710800049563" ID="ID_1822369135" MODIFIED="1711311789300" TEXT="Arbeitsprinzip">
@ -112645,16 +112646,18 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710800342067" ID="ID_596660101" MODIFIED="1710800360272" TEXT="diese adressieren andere Instruktionen per direkter Index-ID"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793189554" ID="ID_1486654440" MODIFIED="1710793220336" TEXT="Template-Processor">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793221783" ID="ID_2381771" MODIFIED="1710793242797" TEXT="Template-Definition">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1710793189554" ID="ID_1486654440" MODIFIED="1711336407247" TEXT="Template-Processor">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="info"/>
<node COLOR="#435e98" CREATED="1710793221783" ID="ID_2381771" MODIFIED="1711336229806" TEXT="Template-Definition">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793245457" ID="ID_1022549828" MODIFIED="1710793256443" TEXT="per ctor mit Raw-String">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710793245457" ID="ID_1022549828" MODIFIED="1711336221755" TEXT="Spec als String wird unmittelbar geparst">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793257202" ID="ID_1216732700" MODIFIED="1710793267357" TEXT="alternativer ctor zum Laden aus Datei">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710793257202" ID="ID_1216732700" MODIFIED="1711336183863" TEXT="alternativer ctor zum Laden aus Datei">
<icon BUILTIN="hourglass"/>
<node CREATED="1711336184788" ID="ID_327310540" MODIFIED="1711336193079" TEXT="sp&#xe4;ter mal (bei Bedarf...)"/>
</node>
</node>
</node>
@ -112731,8 +112734,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710809364702" ID="ID_1039397469" MODIFIED="1710809374320" TEXT="struct Instance&lt;Binding&gt;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799996889" ID="ID_1910948400" MODIFIED="1710800002425" TEXT="Processing">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710799996889" ID="ID_1910948400" MODIFIED="1711336380860" TEXT="Processing">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1710799920412" ID="ID_1195498496" MODIFIED="1711323991738" TEXT="parsing">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1710804975672" ID="ID_1778438879" MODIFIED="1711311749543" TEXT="Reg-Exp-Iteration auf die Tag-Syntax">
@ -112854,10 +112857,10 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710799932570" ID="ID_1103663065" MODIFIED="1710799946174" TEXT="instance">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710800667346" ID="ID_299824445" MODIFIED="1710800700515" TEXT="handzuhabende Situationen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710799932570" ID="ID_1103663065" MODIFIED="1711336375053" TEXT="instance">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1710800667346" ID="ID_299824445" MODIFIED="1711336365428" TEXT="handzuhabende Situationen">
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1710800705306" ID="ID_906431564" MODIFIED="1711326090062" TEXT="literaler Textblock">
<node CREATED="1710800725888" ID="ID_1235186459" MODIFIED="1710800731914" TEXT="Text liegt im Speicher"/>
<node CREATED="1710800732695" ID="ID_777704048" MODIFIED="1710800741009" TEXT="wird in die Ausgabe &#xfc;bertragen"/>
@ -112908,8 +112911,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710807154373" ID="ID_1583286685" MODIFIED="1710807157096" TEXT="nichts zu tun"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710802324329" ID="ID_431802587" MODIFIED="1710802329041" TEXT="funktionale Elemente">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#338800" CREATED="1710802324329" ID="ID_431802587" MODIFIED="1711336368291" TEXT="funktionale Elemente">
<icon BUILTIN="button_ok"/>
<node CREATED="1710802404231" ID="ID_417674931" MODIFIED="1710802420784" TEXT="active DataSrc"/>
<node CREATED="1710802472877" ID="ID_1932723676" MODIFIED="1710802476682" TEXT="active Element">
<node CREATED="1710802550515" ID="ID_900437708" MODIFIED="1710802555782" TEXT="typischerweise ein Iterator"/>
@ -112925,18 +112928,18 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710856691780" ID="ID_763640380" MODIFIED="1710856698164" TEXT="Rahmen schaffen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710856691780" ID="ID_763640380" MODIFIED="1711336351889" TEXT="Rahmen schaffen">
<icon BUILTIN="button_ok"/>
<node CREATED="1710856716918" ID="ID_1752947576" MODIFIED="1710856723204" TEXT="r&#xfc;ckw&#xe4;rts vorgehen">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710856729291" ID="ID_1875406462" MODIFIED="1710859944223" TEXT="die Instantiierung erfolgt lazy &#x27f9; Iterator-Pipeline">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1710856729291" FOLDED="true" ID="ID_1875406462" MODIFIED="1711336349160" TEXT="die Instantiierung erfolgt lazy &#x27f9; Iterator-Pipeline">
<icon BUILTIN="button_ok"/>
<node CREATED="1710856916531" ID="ID_1047340326" MODIFIED="1710856926342" TEXT="die ActionSeq konsumieren"/>
<node CREATED="1710857877562" ID="ID_707601175" MODIFIED="1710857911451" TEXT="Instantiierungs-Prozessor : function-mapping"/>
<node CREATED="1710858136177" ID="ID_1016066994" MODIFIED="1710858673982" TEXT="logische Signatur des Einzelschrits: (Action, Binding, Ctx) &#x27fc; string"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710858917164" ID="ID_1301011429" MODIFIED="1710889523599" TEXT="praktischer Ansatz: IterableDecorator einer InscanceCore">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1710858917164" FOLDED="true" ID="ID_1301011429" MODIFIED="1711336332858" TEXT="praktischer Ansatz: IterableDecorator einer InscanceCore">
<icon BUILTIN="button_ok"/>
<node CREATED="1710889530609" ID="ID_1033056147" MODIFIED="1710889545299" TEXT="diese beinhaltet den Interpreter-State"/>
<node CREATED="1710889546263" ID="ID_1579638728" MODIFIED="1710889557098" TEXT="einschlie&#xdf;lich der M&#xf6;glichkeit verschachtelter States"/>
<node CREATED="1710889557878" ID="ID_1797783109" MODIFIED="1710889645948" TEXT="letzteres ist aber als seltene/optionale Erweiterung anzusetzen">
@ -112954,8 +112957,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710859083131" ID="ID_1103676674" MODIFIED="1710859102540" TEXT="const- referenziert die Daten"/>
<node CREATED="1710859106953" ID="ID_1570382274" MODIFIED="1710859128336" TEXT="implementiert das Binding-Concept"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1710859064221" ID="ID_190332829" MODIFIED="1710889769933" TEXT="stellt au&#xdf;erdem einen Stack f&#xfc;r Verschachtelung bereit">
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1710859064221" ID="ID_190332829" MODIFIED="1711336006569" TEXT="stellt au&#xdf;erdem einen Stack f&#xfc;r Verschachtelung bereit">
<icon BUILTIN="idea"/>
<node CREATED="1710889849728" ID="ID_399157295" MODIFIED="1710889858546" TEXT="falls leer &#x27f9; einfacher Standardfall"/>
<node CREATED="1710889859678" ID="ID_1032750724" MODIFIED="1710889877399" TEXT="sonst: mu&#xdf; sich jeweils die Vorg&#xe4;nger-DataSrc merken"/>
<node CREATED="1710889878990" ID="ID_936276949" MODIFIED="1710889900005" TEXT="...um diese vor dem pop() wiederherstellen zu k&#xf6;nnen"/>
@ -112966,18 +112969,18 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710901576799" ID="ID_309524144" MODIFIED="1710901587322" TEXT="&#xfc;berall bei&#xdf;t sich die Katze in den Schwanz"/>
<node CREATED="1710901588837" ID="ID_1966885383" MODIFIED="1710901606703" TEXT="ich will die Implementierungs-Logik m&#xf6;glichst weit nach unten schieben"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710898561618" ID="ID_961175411" MODIFIED="1710898581408" TEXT="Optimierung: string_view durch das ganze System durchf&#xe4;deln">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710898561618" FOLDED="true" ID="ID_961175411" MODIFIED="1711336328074" TEXT="Optimierung: string_view durch das ganze System durchf&#xe4;deln">
<icon BUILTIN="button_ok"/>
<node CREATED="1710898588958" ID="ID_329918455" MODIFIED="1710898606712" TEXT="es l&#xe4;uft stets auf einen koordinierten Datenzugriff hinaus"/>
<node CREATED="1710898607588" ID="ID_1515577566" MODIFIED="1710898620430" TEXT="und die Datenstruktur wird referenziert w&#xe4;hrend der Instantiierung"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710898624785" ID="ID_153699526" MODIFIED="1710898818451" TEXT="&#x27f9; theoretisch sollte es m&#xf6;glich sein durch den gesamten Proze&#xdf; hindurch zu referenzieren">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1710898624785" ID="ID_153699526" MODIFIED="1711336018243" TEXT="&#x27f9; theoretisch sollte es m&#xf6;glich sein durch den gesamten Proze&#xdf; hindurch zu referenzieren">
<node CREATED="1710898727250" ID="ID_1040294627" MODIFIED="1710898736225" TEXT="die Keys sind zwar kurz..."/>
<node CREATED="1710898736874" ID="ID_379388881" MODIFIED="1710898751668" TEXT="aber die konstanten Template-Bestandteile sind (sehr) lang"/>
<node CREATED="1710898758439" ID="ID_40861357" MODIFIED="1710898781000" TEXT="mit String-Values w&#xfc;rde zudem auf vielen Ebenen kopiert und Heap-Memory verwaltet"/>
<node CREATED="1710898782460" ID="ID_1183887615" MODIFIED="1710901418729" TEXT="und letztlich verlangt auch das Iterator-Konzept eine Referenz vom &#xbb;core-yield&#xab;">
<arrowlink COLOR="#756ac6" DESTINATION="ID_98335183" ENDARROW="Default" ENDINCLINATION="63;-36;" ID="Arrow_ID_506603112" STARTARROW="None" STARTINCLINATION="-260;10;"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1710898830750" ID="ID_629945091" MODIFIED="1710898839421" TEXT="ist das auch praktisch machbar?">
<node BACKGROUND_COLOR="#ecbc9f" COLOR="#990033" CREATED="1710898830750" ID="ID_629945091" MODIFIED="1711336320400" TEXT="ist das auch praktisch machbar?">
<icon BUILTIN="help"/>
<node CREATED="1710977238360" ID="ID_1614727391" MODIFIED="1710977265505" TEXT="sehr wohl &#x2014; genau daf&#xfc;r wurde std::string_view eingef&#xfc;hrt">
<icon BUILTIN="idea"/>
@ -113042,12 +113045,12 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1711330603683" ID="ID_296531042" MODIFIED="1711330671193" TEXT="brauche zumindest elementares MapS-Binding">
<arrowlink COLOR="#b54881" DESTINATION="ID_702455242" ENDARROW="Default" ENDINCLINATION="-279;-482;" ID="Arrow_ID_1670013683" STARTARROW="None" STARTINCLINATION="-121;7;"/>
<node BACKGROUND_COLOR="#dfe0aa" COLOR="#0f4569" CREATED="1711330603683" ID="ID_296531042" MODIFIED="1711335981711" TEXT="brauche zumindest elementares MapS-Binding">
<arrowlink COLOR="#b54881" DESTINATION="ID_702455242" ENDARROW="Default" ENDINCLINATION="-279;-482;" ID="Arrow_ID_1670013683" STARTARROW="None" STARTINCLINATION="-190;11;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#338800" CREATED="1710978786840" ID="ID_647695428" MODIFIED="1711046694334" TEXT="brauche einen &#xbb;Cursor&#xab; f&#xfc;r aktuelle Action">
<node COLOR="#338800" CREATED="1710978786840" FOLDED="true" ID="ID_647695428" MODIFIED="1711046694334" TEXT="brauche einen &#xbb;Cursor&#xab; f&#xfc;r aktuelle Action">
<linktarget COLOR="#7e4239" DESTINATION="ID_647695428" ENDARROW="Default" ENDINCLINATION="-527;-17;" ID="Arrow_ID_660745747" SOURCE="ID_1755236197" STARTARROW="None" STARTINCLINATION="211;249;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1710978847288" ID="ID_1081341248" MODIFIED="1711046705927" TEXT="hatte ich sowas nicht schon mal?">
@ -113383,32 +113386,39 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1710901479260" ID="ID_1390433932" MODIFIED="1710901499394" TEXT="Action::instantiate() auf Basis des Data-Bindings implementieren">
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710901502001" ID="ID_1137356719" MODIFIED="1710901531737" TEXT="hier wird der Kern der Template-Interpretation ausformuliert">
<node COLOR="#338800" CREATED="1710901479260" ID="ID_1390433932" MODIFIED="1711335865662" TEXT="Action::instantiate() auf Basis des Data-Bindings implementieren">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#0b0099" CREATED="1710901502001" ID="ID_1137356719" MODIFIED="1711335774377" TEXT="hier wird der Kern der Template-Interpretation ausformuliert">
<icon BUILTIN="yes"/>
<node CREATED="1711335881046" ID="ID_1520038773" MODIFIED="1711335901030" TEXT="delegiert jedoch an die InstanceCore"/>
<node CREATED="1711335902010" ID="ID_312181517" MODIFIED="1711335911773" TEXT="diese delegiert an Action::instantiate()"/>
<node CREATED="1711335915232" ID="ID_408565908" MODIFIED="1711335940297" TEXT="dieses wiederum st&#xfc;tzt sich auf das Data-Binding ab"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711048651321" ID="ID_1379071153" MODIFIED="1711048709052" TEXT="strebe an, die Handhabung von Binding und Context in der InstanzCore zu abstrahieren">
<node COLOR="#435e98" CREATED="1711048651321" ID="ID_1379071153" MODIFIED="1711335743498" TEXT="die Handhabung von Binding und Context sind in der InstanzCore zu abstrahiert">
<linktarget COLOR="#3c5ab7" DESTINATION="ID_1379071153" ENDARROW="Default" ENDINCLINATION="175;0;" ID="Arrow_ID_1882777047" SOURCE="ID_589689453" STARTARROW="None" STARTINCLINATION="18;-7;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1710971037326" ID="ID_775342057" MODIFIED="1711047828238" TEXT="einfachster Fall: ein konstantes Segment (code TEXT)">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1711047795099" ID="ID_1376260812" MODIFIED="1711047819540" TEXT="wichtigster Standardfall: einfacher Platzhalter (code KEY)">
<node CREATED="1711047837701" ID="ID_614470133" LINK="#ID_1077539392" MODIFIED="1711048073966" TEXT="Zugriff &#xfc;ber die Abstraktion der DataSrc"/>
<node CREATED="1711047969028" ID="ID_589689453" MODIFIED="1711048716087" TEXT="DataSrc.contains(key), DataSrc.retrieveContent(key), DataSrc.handleMiss(key)">
<node CREATED="1711047969028" ID="ID_589689453" MODIFIED="1711335846248" TEXT="DataSrc.contains(key), DataSrc.retrieveContent(key), ...">
<arrowlink COLOR="#3c5ab7" DESTINATION="ID_1379071153" ENDARROW="Default" ENDINCLINATION="175;0;" ID="Arrow_ID_1882777047" STARTARROW="None" STARTINCLINATION="18;-7;"/>
</node>
<node CREATED="1711048020006" ID="ID_749375229" MODIFIED="1711048057908" TEXT="Map-Binding grunds&#xe4;tzlich einrichten"/>
<node CREATED="1711048031035" ID="ID_1724296194" MODIFIED="1711048039782" TEXT="Hello-cruel-World-Test mu&#xdf; laufen"/>
<node COLOR="#338800" CREATED="1711048020006" ID="ID_749375229" MODIFIED="1711335801184" TEXT="Map-Binding grunds&#xe4;tzlich einrichten">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1711048031035" ID="ID_1724296194" MODIFIED="1711335798503" TEXT="Hello-cruel-World-Test mu&#xdf; laufen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793352301" ID="ID_1691061928" MODIFIED="1710793355254" TEXT="Bindings">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793356309" ID="ID_618241969" MODIFIED="1710793358557" TEXT="Map">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710793352301" ID="ID_1691061928" MODIFIED="1711335701805" TEXT="Bindings">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1710793356309" ID="ID_618241969" MODIFIED="1711335699916" TEXT="Map">
<icon BUILTIN="button_ok"/>
<node CREATED="1710804031539" ID="ID_1692068622" MODIFIED="1710879172991" TEXT="der Inhaltstyp wird via util::toString() zugegriffen"/>
<node CREATED="1710804062496" ID="ID_377899149" MODIFIED="1710804093937" TEXT="DataSrc ist ein generischer Wrapper um die Map"/>
<node CREATED="1710804167972" ID="ID_200600045" MODIFIED="1710804186992" TEXT="der Iterator ist eine String-View (ein String-Range)"/>
@ -113428,27 +113438,27 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1710804264759" ID="ID_1288259029" MODIFIED="1710804281745" TEXT="das bedeutet: die Daten m&#xfc;ssen eben dementsprechend strukturiert sein"/>
<node CREATED="1710804473275" ID="ID_1177047190" MODIFIED="1710804522912" TEXT="ein verschachtelter Kontext mu&#xdf; Keys referenzieren, die anderweitig in der Map vorhanden sind"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711330640991" ID="ID_702455242" MODIFIED="1711330676226" TEXT="Implementierung">
<linktarget COLOR="#b54881" DESTINATION="ID_702455242" ENDARROW="Default" ENDINCLINATION="-279;-482;" ID="Arrow_ID_1670013683" SOURCE="ID_296531042" STARTARROW="None" STARTINCLINATION="-121;7;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1711330640991" ID="ID_702455242" MODIFIED="1711335956808" TEXT="Implementierung">
<linktarget COLOR="#b54881" DESTINATION="ID_702455242" ENDARROW="Default" ENDINCLINATION="-279;-482;" ID="Arrow_ID_1670013683" SOURCE="ID_296531042" STARTARROW="None" STARTINCLINATION="-190;11;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711330691216" ID="ID_650431219" MODIFIED="1711331581249" TEXT="h&#xe4;lt einen Pointer auf die zugrundeliegende Map">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711331357462" ID="ID_1912581954" MODIFIED="1711331578929" TEXT="merkt sich ein Key-Pr&#xe4;fix zur Dekoration">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711331495228" ID="ID_745563840" MODIFIED="1711331561532" TEXT="es wird nur beim Zugriff immer das Pr&#xe4;fix vor den jeweils gegebenen Key geklebt">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1711331357462" ID="ID_1912581954" MODIFIED="1711335634739" TEXT="merkt sich ein Key-Pr&#xe4;fix zur Dekoration">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711331495228" ID="ID_745563840" MODIFIED="1711335637950" TEXT="es wird nur beim Zugriff immer das Pr&#xe4;fix vor den jeweils gegebenen Key geklebt">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1711331371556" ID="ID_909634689" MODIFIED="1711331568956" TEXT="hier wird nicht verschachtelt">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711331380819" ID="ID_853300536" MODIFIED="1711331563787" TEXT="es gibt dann nur einen Fallback auf die undekorierte Map">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1711331380819" ID="ID_853300536" MODIFIED="1711335639381" TEXT="es gibt dann nur einen Fallback auf die undekorierte Map">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711331407216" ID="ID_1304513851" MODIFIED="1711331577097" TEXT="die Iteration wertet eine Liste von Daten-Key-Elementen aus">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1711331407216" ID="ID_1304513851" MODIFIED="1711335641953" TEXT="die Iteration wertet eine Liste von Daten-Key-Elementen aus">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1711331431068" ID="ID_748427184" MODIFIED="1711333491631" TEXT="aus jedem wird ein Pr&#xe4;fix gebildet">
<icon BUILTIN="idea"/>
</node>
@ -113461,6 +113471,10 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1711331469327" ID="ID_1328551681" MODIFIED="1711331478314" TEXT="Ebene-2 : Keys zusammensetzen"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1711335652300" ID="ID_1349211278" MODIFIED="1711335681237" TEXT="Test">
<arrowlink COLOR="#d00f57" DESTINATION="ID_1713123157" ENDARROW="Default" ENDINCLINATION="104;-13;" ID="Arrow_ID_413173793" STARTARROW="None" STARTINCLINATION="-338;-54;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710804833930" ID="ID_1766619477" MODIFIED="1710804839987" TEXT="Test-Binding">
@ -113513,6 +113527,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793522467" ID="ID_1713123157" MODIFIED="1710793546412" TEXT="verify_Map_binding">
<linktarget COLOR="#d00f57" DESTINATION="ID_1713123157" ENDARROW="Default" ENDINCLINATION="104;-13;" ID="Arrow_ID_413173793" SOURCE="ID_1349211278" STARTARROW="None" STARTINCLINATION="-338;-54;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710793547451" ID="ID_778488140" MODIFIED="1710793552697" TEXT="verify_ETD_binding">