TreeMutator binding: change handling of AFTER(Ref::ATTRIBS)
this is a subtle change in the semantics of the diff language, actually IMHO a change towards the better. It was prompted by the desire to integrate diff application onto GenNode-trees into the implementation framework based on TreeMutator, and do away with the dedicated implementation. Now it is a matter of the *selector* to decide if a given layer is responsible for "attributes". If so, then *all* elements within this layer count as "attribute" and an after(Ref::ATTRIBS) verb will fast forward behind *the end of this layer* Note that the meta token Ref::ATTRIBS is a named GenNode, and thus trivially responds to isNamed() == true
This commit is contained in:
parent
05768e4ac5
commit
a73e5ffffe
6 changed files with 134 additions and 40 deletions
|
|
@ -219,11 +219,8 @@ namespace diff{
|
|||
virtual bool
|
||||
accept_until (GenNode const& spec) override
|
||||
{
|
||||
if (Ref::END == spec)
|
||||
return PAR::accept_until(Ref::END);
|
||||
else
|
||||
if (Ref::ATTRIBS == spec)
|
||||
return true;
|
||||
if (Ref::END == spec or Ref::ATTRIBS == spec)
|
||||
return PAR::accept_until(spec);
|
||||
else
|
||||
{
|
||||
__ifApplicable_refuse_to ("navigate to a position behind", spec);
|
||||
|
|
|
|||
|
|
@ -296,15 +296,15 @@ namespace diff{
|
|||
virtual bool
|
||||
accept_until (GenNode const& spec)
|
||||
{
|
||||
if (spec.matches (Ref::END))
|
||||
if (spec.matches (Ref::END)
|
||||
or
|
||||
(spec.matches (Ref::ATTRIBS)
|
||||
and binding_.isApplicable (Ref::ATTRIBS)))
|
||||
{
|
||||
for ( ; pos_; ++pos_)
|
||||
binding_.inject (move(*pos_));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (spec.matches (Ref::ATTRIBS))
|
||||
return PAR::accept_until (spec);
|
||||
}
|
||||
else
|
||||
if (binding_.isApplicable(spec))
|
||||
{
|
||||
|
|
@ -471,9 +471,11 @@ namespace diff{
|
|||
}
|
||||
|
||||
static bool
|
||||
ignore_selector (GenNode const&)
|
||||
ignore_selector (GenNode const& spec)
|
||||
{
|
||||
return true; // by default apply diff unconditionally
|
||||
return spec != Ref::ATTRIBS;
|
||||
// by default apply diff unconditionally,
|
||||
// but don't respond to after(ATTRIBS)
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
|||
|
|
@ -261,10 +261,11 @@ namespace diff{
|
|||
|
||||
/** repeatedly accept, until after the designated location */
|
||||
virtual bool
|
||||
accept_until (GenNode const&)
|
||||
accept_until (GenNode const& spec)
|
||||
{
|
||||
// do nothing by default
|
||||
return false;
|
||||
return (Ref::END == spec or Ref::ATTRIBS == spec);
|
||||
// contents are exhausted by default,
|
||||
// yet we're unable to find something specific
|
||||
}
|
||||
|
||||
/** locate designated element and accept it at current position */
|
||||
|
|
@ -469,7 +470,9 @@ namespace diff{
|
|||
* - the optional _selector closure_ (CollectionBindingBuilder::isApplicableIf)
|
||||
* allows to limit applicability of this whole binding (layer) to only some
|
||||
* diff specs. E.g., we may set up a binding for elements with value semantics
|
||||
* and another binding layer on top to deal with object like children (sub scopes)
|
||||
* and another binding layer on top to deal with object like children (sub scopes).
|
||||
* Please note that this selector also gets to judge the Ref::ATTRIBS spec, which
|
||||
* means this layer's contents can be considered "attributes".
|
||||
* - the optional _setter closure_ (CollectionBindingBuilder::assignElement) accepts
|
||||
* a diff spec (GenNode) and should assign an equivalent value to the internal
|
||||
* data representation of the corresponding element (typically by constructing
|
||||
|
|
@ -481,6 +484,15 @@ namespace diff{
|
|||
* representation of the nested scope to enter. The code invoking this closure
|
||||
* typically pushes the buffer on some internal stack and switches then to use
|
||||
* this nested mutator until encountering the corresponding `EMU` bracket verb.
|
||||
* @note the `after(Ref::ATTRIBS)` verb can only processed if the selector responds
|
||||
* correct to a Ref::ATTRIBS spec. The implicit default selector does so, i.e.
|
||||
* it rejects `Ref::ATTRIBS`. Please be sure to accept this token _only_ if
|
||||
* your layer indeed holds something meant to implement "attributes", because
|
||||
* in that case, the verb `after(Ref::ATTRIBS)` will fast forward and accept
|
||||
* all the current contents of this layer
|
||||
* @warning please note the _nested DSL_. The builder functions used to define
|
||||
* the various closures are to be invoked on the _argument_ ("`collection(xyz)`"),
|
||||
* not on the top level builder...
|
||||
*/
|
||||
template<typename BIN>
|
||||
auto attach (BIN&& collectionBindingSetup);
|
||||
|
|
|
|||
|
|
@ -454,11 +454,12 @@ namespace test{
|
|||
CHECK (mutator2.matchSrc (ATTRIB1)); // current head element of src "matches" the given spec
|
||||
CHECK (isnil (target)); // the match didn't change anything
|
||||
|
||||
CHECK (not mutator2.accept_until(Ref::ATTRIBS));
|
||||
// NOTE: collection values can be anything; thus this
|
||||
CHECK (mutator2.accept_until(Ref::ATTRIBS));
|
||||
CHECK (mutator2.matchSrc (ATTRIB1)); // NOTE: collection values can be anything; thus this
|
||||
// collection binding layer can not have any notion of
|
||||
// "this is an attribute". It will just delegate to the
|
||||
// next lower layer and thus finally return false
|
||||
// "this is an attribute". It will not accept anything
|
||||
// and just delegate to the next lower layer, which here
|
||||
// is the empty binding and thus finally returns true
|
||||
|
||||
CHECK (mutator2.accept_until(ATTRIB3)); // ...but of course we can fast forward to dedicated values // accept_until
|
||||
CHECK (!isnil (target)); // the fast forward did indeed accept some entries
|
||||
|
|
@ -801,11 +802,7 @@ namespace test{
|
|||
// what /is/ allowed though, for reasons of logic,
|
||||
// is to "fast forward behind all attributes"
|
||||
// of course this is implemented as NOP
|
||||
CHECK (not mutator2.accept_until(Ref::END)); // accept_until END
|
||||
// likewise for Ref::END,
|
||||
// but in this case the call is actually forwarded down
|
||||
// and thus returns false in our setup here,
|
||||
// since there is no active layer below
|
||||
CHECK (mutator2.accept_until(Ref::END)); // likewise for Ref::END // accept_until END
|
||||
|
||||
mutator2.injectNew (ATTRIB2); // injectNew
|
||||
|
||||
|
|
@ -871,7 +868,7 @@ namespace test{
|
|||
CHECK (not mutator3.accept_until (ATTRIB2)); // unknown binding, no one is responsible
|
||||
CHECK (not mutator3.accept_until (ATTRIB1));
|
||||
CHECK (mutator3.accept_until (Ref::ATTRIBS)); // only the generic end-of-scope marks supported
|
||||
CHECK (not mutator3.accept_until (Ref::END)); // (and implemented either as NOP or passed down)
|
||||
CHECK (mutator3.accept_until (Ref::END)); // (and implemented as NOP plus forwarding down)
|
||||
|
||||
// explanation: due to the nature of a 'data field',
|
||||
// this binding has no notion of 'ordering' and thus no 'current position'.
|
||||
|
|
|
|||
|
|
@ -8228,7 +8228,7 @@ On receiving a stream of tokens of this "diff language", it is possibl
|
|||
i.e. a ''unified diff'' or the ''predicate notation'' used above to describe the list diffing algorithm, just by accumulating changes.
|
||||
</pre>
|
||||
</div>
|
||||
<div title="TreeMutator" creator="Ichthyostega" modifier="Ichthyostega" created="201503292115" modified="201606082305" tags="Model Concepts GuiPattern design draft" changecount="91">
|
||||
<div title="TreeMutator" creator="Ichthyostega" modifier="Ichthyostega" created="201503292115" modified="201609021520" tags="Model Concepts GuiPattern design draft" changecount="94">
|
||||
<pre>The TreeMutator is an intermediary to translate a generic structure pattern into heterogeneous local invocation sequences.
|
||||
within the [[diff framework|TreeDiffModel]], this is a crucial joint, since here the abstract, generic, ~DOM-like ExternalTreeDescription meeds opaque, local and undisclosed data structures.
|
||||
|
||||
|
|
@ -8302,6 +8302,7 @@ the building blocks, from which such a diff application can be combined, are emb
|
|||
;operation {{{accept_until}}}
|
||||
:repeatedly //accept// elements from the old state buffer, until hitting a condition. The condition is given within the //spec//
|
||||
:* when the spec is {{{Ref::END}}}, then accept all (remaining) elements, i.e. the remainder of the old sequence as-is.
|
||||
:* when the spec is {{{Ref::ATTRIBS}}}, and the implementation supports the notion of "an attribute", then accept and stop behind attributes
|
||||
:* otherwise, accept //until after// finding an element that matches the //spec//. That is, the matching element will be the last one accepted
|
||||
;operation {{{findSrc}}}
|
||||
:without changing the current position, delve further into the old state sequence, to find an element //matching the given spec.//
|
||||
|
|
@ -8364,12 +8365,16 @@ attached to a clip, or the mixture of clips, effects and labels found within a [
|
|||
:* ''mutateAttrib'': "key", mutator-builder lambda {{{void(TreeMutator::MutatorBuffer)}}}
|
||||
:** fabricate a recursive sub-TreeMutator to handle an //object valued// attribute
|
||||
:** implicit typing -- the fabricated sub-TreeMutator just needs to be able to deal with the bound attribute
|
||||
;GenNode binding
|
||||
:in the end, it turnes out that the //implementation// underlying our ExternalTreeDescription itself fits nicely into the above mentioned standard bindings --
|
||||
:all we have to do is to layer two collection bindings on top of each other, with a suitable //selector// to separate //attributes// from //children.//
|
||||
:obviously, this unified implementation comes at the price of one additional indirection (namely through the ~TreeMutator VTable), while the requirements on temporary storage size are almost identical (two iterators and two back references instead of one). Moreover, all the explicitly coded complexities regarding the attribute / children distinction is gone, relying on the logic of layered decorators solely. So the effort to shape the TreeMutator API payed off in the end, to improve and rectify the whole design...
|
||||
|
||||
|
||||
You should note that this entire design is recursive: only after understanding the part, where, for handling a sub-structure, a nested mutator is fabricated and placed into a given buffer, it becomes clear to what effect we're creating a customised mutator: we always need some (relative) parent scope, which happens to know more about the actual data to be treated with a TreeMutator. This scope assists with creating a suitable binding. Obviously, from within that binding, it is known what the sub-structures and children of that local data are all about and what semantics to give to the fundamental operations.
|
||||
</pre>
|
||||
</div>
|
||||
<div title="TreeMutatorEvolution" creator="Ichthyostega" modifier="Ichthyostega" created="201603160255" modified="201607282049" tags="Model Concepts design draft" changecount="24">
|
||||
<div title="TreeMutatorEvolution" creator="Ichthyostega" modifier="Ichthyostega" created="201603160255" modified="201609021605" tags="Model Concepts design draft" changecount="25">
|
||||
<pre>The TreeMutator is an intermediary to translate a generic structure pattern into heterogeneous local invocation sequences.
|
||||
|
||||
!Motivation
|
||||
|
|
@ -8512,6 +8517,10 @@ To create a ''binding'' for any object field, we need
|
|||
* either a ''setter'' (lambda) or a ''mutator builder'' (lambda)
|
||||
We have a distinct typing for each individual attribute, but this typing remains implicit: the lambda has to know what value to extract from the GenNode payload within the accepted diff message and how to apply this value. Especially for ''time entities'', which are modelled as immutable values, the lambda might want to build a [[time mutator|TimeMutation]]. And especially in the UI, timing specifications are expected to be translated into a //presentation grid.//
|
||||
|
||||
!!!types, attributes and layering
|
||||
During the analysis it turned out that support for a mixed set of //typed child elements// is an important goal. However, we may impose the restriction that these typed sub collections will be kept segregated and not be mixed up within the child scope. Effectively, this was already the fundamental trait for the //symbolic object representation// chosen here. Thus, "attributes" become just one further kind of typed children; even "metadata" might be treated along these lines in future (currently as of 2016 we have only a type field in {{{diff::Record}}}, which is treated explicitly).
|
||||
This observation leads directly to an implementation based on layered decorators. Each kind of target elements will be treated by another decorator exclusively, and control is passed through a chain of such decorators. This means, each decorator (or "onion-layer") gets into charge based on a //selector predicate,// which works on the given diff verb solely (no introspection and no "peeking" into the implementation data). We should note though, that this implies some fine points of the diff language semantics are subject to this architectural decision -- especially the precise behaviour of the {{{AFTER}}}-verb depends on the //concrete layer structure// used at the target of the diff. Yet this seems acceptable, since it is the very nature of diff application to be dependent on internals of the target location -- just by definition we assume this inner structure of the target to be semantically congruent with the diff's source structure.
|
||||
|
||||
|
||||
!Implementation
|
||||
__June 2016__: after defining and implementing several concrete bindings successfully, the TreeMutator interface can be considered a given now. It seems conceivable even to try re-implementing the (already existing, hard wired) binding for GenNode in terms of a TreeMutator with specially outfitted binding. Anyway, matters are investigated and clarified enough in order to build the actual diff application based on this new TreeMutator interface. Some tricky structural and technical problems remain to be solved for that
|
||||
|
|
|
|||
|
|
@ -563,6 +563,10 @@
|
|||
<node CREATED="1455899201435" ID="ID_1353317149" MODIFIED="1455899210798" TEXT="eine Abstraktion hat hier keinen Mehrwert"/>
|
||||
<node CREATED="1455899211338" ID="ID_1152596163" MODIFIED="1455899216645" TEXT="und ist überall sonst eine Bürde"/>
|
||||
</node>
|
||||
<node CREATED="1472829783619" HGAP="28" ID="ID_1015946734" MODIFIED="1472829805342" TEXT="am Ende ist das die schönere Implementierung geworden" VSHIFT="5">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1455669004941" ID="ID_853385575" MODIFIED="1472219338344">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
|
|
@ -683,7 +687,13 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1455669221255" ID="ID_1712552545" MODIFIED="1455669237745" TEXT="Repräsentation der "aktuellen Position""/>
|
||||
<node CREATED="1455669221255" ID="ID_1712552545" MODIFIED="1455669237745" TEXT="Repräsentation der "aktuellen Position"">
|
||||
<node CREATED="1472829837156" ID="ID_1214532087" MODIFIED="1472829843934" TEXT="implizit lassen"/>
|
||||
<node CREATED="1472829844387" ID="ID_1395134655" MODIFIED="1472829852134" TEXT="auf Implementierungs-Ebene verlagern"/>
|
||||
<node CREATED="1472829853242" ID="ID_562014580" MODIFIED="1472829913272" TEXT="in jedem Layer / für jeden Typ gesondert">
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_562014580" ENDARROW="Default" ENDINCLINATION="451;-8;" ID="Arrow_ID_543974195" SOURCE="ID_631826706" STARTARROW="None" STARTINCLINATION="322;-32;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1455669345167" ID="ID_310849010" MODIFIED="1455669353721" TEXT="generischen Rahmen für Mut-Operationen"/>
|
||||
<node CREATED="1455669238213" ID="ID_731780565" MODIFIED="1455669252935" TEXT="Einleiten der Rekursion">
|
||||
<node CREATED="1455842313629" ID="ID_179960248" MODIFIED="1455842321264" TEXT="ich hätte es gern echt-rekursiv"/>
|
||||
|
|
@ -838,7 +848,9 @@
|
|||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1455913847683" ID="ID_1829117976" MODIFIED="1455913860029" TEXT="es gibt effektiv mehrere Kinder-Sammlungen"/>
|
||||
<node CREATED="1455913860594" ID="ID_631826706" MODIFIED="1455913869013" TEXT="wir verwalten intern für jede eine Position"/>
|
||||
<node CREATED="1455913860594" ID="ID_631826706" MODIFIED="1472829913272" TEXT="wir verwalten intern für jede eine Position">
|
||||
<arrowlink DESTINATION="ID_562014580" ENDARROW="Default" ENDINCLINATION="451;-8;" ID="Arrow_ID_543974195" STARTARROW="None" STARTINCLINATION="322;-32;"/>
|
||||
</node>
|
||||
<node CREATED="1455913877183" ID="ID_1295733719" MODIFIED="1455913906711" TEXT="forwarding by type"/>
|
||||
</node>
|
||||
<node CREATED="1455913785555" ID="ID_1777441123" MODIFIED="1472219338382" TEXT="transparenter Filter">
|
||||
|
|
@ -1081,6 +1093,7 @@
|
|||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
<node CREATED="1455928383765" ID="ID_522592769" MODIFIED="1455928389737" TEXT="accept until condition is met"/>
|
||||
<node CREATED="1457231714541" ID="ID_1234563594" MODIFIED="1457231725704" TEXT="ID spec"/>
|
||||
<node CREATED="1472829929343" ID="ID_797835614" MODIFIED="1472829944881" TEXT="special handling for Ref::END / Ref::ATTRIBS"/>
|
||||
<node CREATED="1457231524839" ID="ID_1492447432" MODIFIED="1472219338456" TEXT="needs to establish responsible target beforehand">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
|
@ -1416,7 +1429,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d8bba4" CREATED="1456011994442" FOLDED="true" HGAP="68" ID="ID_343687995" MODIFIED="1461881405732" TEXT="zur Entscheidung..." VSHIFT="37">
|
||||
<node BACKGROUND_COLOR="#d8bba4" CREATED="1456011994442" FOLDED="true" HGAP="68" ID="ID_343687995" MODIFIED="1472830019560" TEXT="zur Entscheidung..." VSHIFT="37">
|
||||
<edge COLOR="#93766f"/>
|
||||
<arrowlink COLOR="#b10046" DESTINATION="ID_820279076" ENDARROW="Default" ENDINCLINATION="14;-46;" ID="Arrow_ID_103087571" STARTARROW="None" STARTINCLINATION="-137;-20;"/>
|
||||
<font NAME="SansSerif" SIZE="15"/>
|
||||
|
|
@ -1870,10 +1883,10 @@
|
|||
<node CREATED="1456430363599" ID="ID_1608232847" MODIFIED="1456505525321" TEXT="erlaube typ-gefilterte Kinder"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1456506101544" HGAP="4" ID="ID_133511037" MODIFIED="1465674319651" TEXT="Implementierung" VSHIFT="16">
|
||||
<node CREATED="1456506101544" HGAP="4" ID="ID_133511037" MODIFIED="1472829990104" TEXT="Implementierung" VSHIFT="16">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1456506128581" HGAP="-2" ID="ID_322289358" MODIFIED="1465428684559" TEXT="Abwägungen" VSHIFT="549">
|
||||
<node CREATED="1456506135028" FOLDED="true" HGAP="29" ID="ID_470489868" MODIFIED="1465674277614" TEXT="Indirektionen" VSHIFT="-5">
|
||||
<node CREATED="1456506135028" FOLDED="true" HGAP="29" ID="ID_470489868" MODIFIED="1472830010078" TEXT="Indirektionen" VSHIFT="-5">
|
||||
<node CREATED="1456506145826" ID="ID_759825167" MODIFIED="1461888854079" TEXT="kosten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
|
@ -2057,7 +2070,7 @@
|
|||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1456523437616" FOLDED="true" HGAP="34" ID="ID_410606899" MODIFIED="1472219570272" TEXT="Manipulations-Interface" VSHIFT="6">
|
||||
<node CREATED="1456523437616" FOLDED="true" HGAP="34" ID="ID_410606899" MODIFIED="1472830034436" TEXT="Manipulations-Interface" VSHIFT="6">
|
||||
<node COLOR="#338800" CREATED="1456523455997" ID="ID_1416114013" MODIFIED="1457741328003" TEXT="Design lösen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1456523507910" ID="ID_429333479" MODIFIED="1456523518005" TEXT="Henne oder Ei?"/>
|
||||
|
|
@ -2308,7 +2321,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1456528462585" FOLDED="true" HGAP="48" ID="ID_1770521063" MODIFIED="1472219573310" TEXT="Elemente" VSHIFT="21">
|
||||
<node CREATED="1456528462585" FOLDED="true" HGAP="48" ID="ID_1770521063" MODIFIED="1472830038962" TEXT="Elemente" VSHIFT="21">
|
||||
<node CREATED="1456528472016" ID="ID_315938795" MODIFIED="1456528476211" TEXT="bleiben abstrakt"/>
|
||||
<node CREATED="1456528477415" ID="ID_1931717091" MODIFIED="1456528481850" TEXT="abstrakte "Position"">
|
||||
<node CREATED="1456533135345" ID="ID_1775378899" MODIFIED="1465428629652" TEXT="Problem: wem gehört diese Position?">
|
||||
|
|
@ -4244,8 +4257,7 @@
|
|||
</node>
|
||||
<node CREATED="1457232746179" ID="ID_1793680066" MODIFIED="1464227326650" TEXT="Rec<GenNode>" VSHIFT="11">
|
||||
<icon BUILTIN="full-4"/>
|
||||
<node CREATED="1464305377785" ID="ID_396910166" MODIFIED="1464306126692" TEXT="Vorüberlegungen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1464305377785" ID="ID_396910166" MODIFIED="1472781547337" TEXT="Vorüberlegungen">
|
||||
<node CREATED="1464305417066" ID="ID_1059660516" MODIFIED="1472653389474" TEXT="wünschenswert">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1464305708891" ID="ID_1184917831" MODIFIED="1464305711647" TEXT="Vorteile">
|
||||
|
|
@ -4264,7 +4276,7 @@
|
|||
<node CREATED="1464305871806" ID="ID_1200803242" MODIFIED="1464305874249" TEXT="ein Stack"/>
|
||||
<node CREATED="1464306044598" ID="ID_780490719" MODIFIED="1464306049770" TEXT="pro Stackframe">
|
||||
<node CREATED="1464305896754" ID="ID_569905839" MODIFIED="1464305908965" TEXT="ref Rec::Mutator"/>
|
||||
<node CREATED="1464305910520" ID="ID_1883294095" MODIFIED="1464305921115" TEXT="ein RecordContentMutator">
|
||||
<node CREATED="1464305910520" ID="ID_1883294095" MODIFIED="1472781768389" TEXT="Puffer: RecordContentMutator">
|
||||
<node CREATED="1464305921943" ID="ID_1412580517" MODIFIED="1464305927370" TEXT="Vector Attribute"/>
|
||||
<node CREATED="1464305927910" ID="ID_1641635660" MODIFIED="1464305933817" TEXT="Vector Kinder"/>
|
||||
<node CREATED="1464305989422" ID="ID_614946430" MODIFIED="1464305994825" TEXT="ein vector::iterator"/>
|
||||
|
|
@ -4273,11 +4285,32 @@
|
|||
</node>
|
||||
<node CREATED="1464305854040" ID="ID_1876525606" MODIFIED="1464305858635" TEXT="per TreeMutator">
|
||||
<node CREATED="1464305876237" ID="ID_633615671" MODIFIED="1464305878376" TEXT="ein Stack"/>
|
||||
<node CREATED="1464306061588" ID="ID_735374750" MODIFIED="1464306065831" TEXT="pro Stackframe"/>
|
||||
<node CREATED="1464306061588" ID="ID_735374750" MODIFIED="1464306065831" TEXT="pro Stackframe">
|
||||
<node CREATED="1472781610135" ID="ID_150002810" MODIFIED="1472781623314">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<i>zwei </i>Bindings
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1472781728046" ID="ID_1910688935" MODIFIED="1472781744825" TEXT="ref Quell-Vector"/>
|
||||
<node CREATED="1472781629036" ID="ID_1614778599" MODIFIED="1472781751975" TEXT="Puffer: Vector GenNode"/>
|
||||
<node CREATED="1472781648571" ID="ID_1190592868" MODIFIED="1472781677753" TEXT="ein zugehöriger Iterator"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1472781868035" HGAP="40" ID="ID_195135751" MODIFIED="1472781878735" TEXT="Unterschied minimal" VSHIFT="-3">
|
||||
<node CREATED="1472781885352" ID="ID_327255109" MODIFIED="1472781888836" TEXT="zwei Iteratoren"/>
|
||||
<node CREATED="1472781889328" ID="ID_1298906038" MODIFIED="1472781899051" TEXT="zwei Quell-Referenzen"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1472653531806" HGAP="76" ID="ID_1466924103" MODIFIED="1472653539641" TEXT="Ansatz" VSHIFT="-10">
|
||||
<node CREATED="1472653541019" ID="ID_1910363821" MODIFIED="1472653569512">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
|
|
@ -4298,8 +4331,52 @@
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1464305382975" ID="ID_1038582300" MODIFIED="1464305386130" TEXT="Implementierung">
|
||||
<node CREATED="1457742036967" ID="ID_980619979" MODIFIED="1457742040187" TEXT="Attribute"/>
|
||||
<node CREATED="1457742036967" ID="ID_980619979" MODIFIED="1457742040187" TEXT="Attribute">
|
||||
<node CREATED="1472781560508" ID="ID_1534877939" MODIFIED="1472781584718" TEXT="Selector: isNamed"/>
|
||||
</node>
|
||||
<node CREATED="1457742040782" ID="ID_613087606" MODIFIED="1457742042442" TEXT="Kinder"/>
|
||||
<node CREATED="1472781922380" ID="ID_506316487" MODIFIED="1472781969409" TEXT="Problem: rekursiver Mutator">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1472781942185" ID="ID_882829469" MODIFIED="1472781946644" TEXT="rein code-technisches Problem"/>
|
||||
<node CREATED="1472781957063" ID="ID_1617563820" MODIFIED="1472781964177" TEXT="durch forward-decl aufzulösen"/>
|
||||
<node CREATED="1472781977156" ID="ID_1731364667" MODIFIED="1472782008196" TEXT="erfordert Umbau der Code-Struktur">
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1472782025318" ID="ID_387350632" MODIFIED="1472782043725" TEXT="Standard-Lambdas für GenNode">
|
||||
<node CREATED="1472782055217" ID="ID_1053081307" MODIFIED="1472782069243" TEXT="Selector -> ID-Vergleich"/>
|
||||
<node CREATED="1472782069784" ID="ID_893616200" MODIFIED="1472782075874" TEXT="Constructor -> copy"/>
|
||||
<node CREATED="1472782077062" ID="ID_1012433129" MODIFIED="1472782092512" TEXT="Setter -> assign DataCap"/>
|
||||
<node CREATED="1472782093956" ID="ID_1200489627" MODIFIED="1472782120696">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Mut -> <font color="#e43e2a">Rekursion</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1472830089042" ID="ID_1759032781" MODIFIED="1472830104684" TEXT="until after Ref::ATTRIBS">
|
||||
<node CREATED="1472830107591" ID="ID_1479915312" MODIFIED="1472830118609" TEXT="muß Semantik im TreeMutator API korrigieren"/>
|
||||
<node CREATED="1472830131284" ID="ID_1581714242" MODIFIED="1472830153132" TEXT="Problem: nur die Implementierung weiß, was ein "Attribut" ist"/>
|
||||
<node CREATED="1472830122757" ID="ID_937476321" MODIFIED="1472830129487" TEXT="brauche Unterstützung vom Selector"/>
|
||||
<node CREATED="1472830164119" ID="ID_1323583081" MODIFIED="1472830176489" TEXT="Lösungsansatz">
|
||||
<node CREATED="1472830177221" ID="ID_422155652" MODIFIED="1472830181729" TEXT="wie Ref::END"/>
|
||||
<node CREATED="1472830182101" ID="ID_275162903" MODIFIED="1472830195511" TEXT="aber nur einige Layer reagieren darauf"/>
|
||||
<node CREATED="1472830199203" ID="ID_35560751" MODIFIED="1472830209584" TEXT="default-return muß true sein">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1472830226455" ID="ID_1975724782" MODIFIED="1472830232658" TEXT="aber natürlich nur wenn leer..."/>
|
||||
<node CREATED="1472830286462" ID="ID_1170732286" MODIFIED="1472830298035" TEXT="Einsicht: END und ATTRIBS können nicht scheitern">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue