TreeExplorer: allow for a disabled filter
...considered as one of the building blocks to resolve Problems in the Design of ChainSearch
This commit is contained in:
parent
34b78fc47e
commit
e3ca8548a4
3 changed files with 556 additions and 288 deletions
|
|
@ -445,6 +445,8 @@ namespace lib {
|
|||
|
||||
namespace iter_explorer { // Implementation of Iterator decorating layers...
|
||||
|
||||
constexpr auto ACCEPT_ALL = [](auto){return true;};
|
||||
|
||||
/**
|
||||
* @internal technical details of binding a functor into the TreeExplorer.
|
||||
* Notably, this happens when adapting an _"expansion functor"_ to allow expanding a given element
|
||||
|
|
@ -927,12 +929,19 @@ namespace lib {
|
|||
return unConst(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
isDisabled() const
|
||||
{
|
||||
return not predicate_.boundFunction;
|
||||
}
|
||||
|
||||
/** @note establishes the invariant:
|
||||
* whatever the source yields as current element,
|
||||
* has already been approved by our predicate */
|
||||
void
|
||||
pullFilter ()
|
||||
{
|
||||
if (isDisabled()) return;
|
||||
while (srcIter() and not predicate_(srcIter()))
|
||||
++srcIter();
|
||||
}
|
||||
|
|
@ -1082,6 +1091,13 @@ namespace lib {
|
|||
});
|
||||
}
|
||||
|
||||
/** discard filter predicates and disable any filtering */
|
||||
void
|
||||
disableFilter()
|
||||
{
|
||||
_Base::predicate_.boundFunction = nullptr;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
/** @internal boilerplate to remould the filter predicate in-place
|
||||
|
|
@ -1113,6 +1129,9 @@ namespace lib {
|
|||
WrappedPredicate& firstClause = _Base::predicate_; // pick up the existing filter predicate
|
||||
ChainPredicate chainClause{forward<COND> (additionalClause)}; // wrap the extension predicate in a similar way
|
||||
|
||||
if (_Base::isDisabled())
|
||||
firstClause.boundFunction = ACCEPT_ALL;
|
||||
|
||||
_Base::predicate_ = WrappedPredicate{buildCombinedClause (firstClause, chainClause)};
|
||||
_Base::pullFilter(); // pull to re-establish the Invariant
|
||||
}
|
||||
|
|
@ -1457,7 +1476,7 @@ namespace lib {
|
|||
auto
|
||||
mutableFilter()
|
||||
{
|
||||
return mutableFilter ([](auto){ return true; });
|
||||
return mutableFilter (iter_explorer::ACCEPT_ALL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -853,7 +853,7 @@ namespace test{
|
|||
verify_FilterChanges()
|
||||
{
|
||||
auto seq = treeExplore(CountDown{20})
|
||||
.mutableFilter([](uint){ return true; });
|
||||
.mutableFilter();
|
||||
|
||||
auto takeEve = [](uint i){ return i%2 == 0; };
|
||||
auto takeTrd = [](uint i){ return i%3 == 0; };
|
||||
|
|
@ -908,6 +908,29 @@ namespace test{
|
|||
CHECK (0 == seq.p); // ...which he manipulated, so that core == 0
|
||||
CHECK (isnil (seq)); // .....and thus iteration end is detected
|
||||
VERIFY_ERROR (ITER_EXHAUST, *seq );
|
||||
|
||||
|
||||
// verify enabling and disabling...
|
||||
auto seq2 = treeExplore(CountDown{10})
|
||||
.mutableFilter(takeTrd);
|
||||
|
||||
CHECK (9 == *seq2);
|
||||
seq2.disableFilter();
|
||||
CHECK (9 == *seq2);
|
||||
++seq2;
|
||||
CHECK (8 == *seq2);
|
||||
seq2.andNotFilter (takeEve);
|
||||
CHECK (7 == *seq2);
|
||||
++seq2;
|
||||
CHECK (5 == *seq2);
|
||||
seq2.disableFilter();
|
||||
CHECK (5 == *seq2);
|
||||
++seq2;
|
||||
CHECK (4 == *seq2);
|
||||
++seq2;
|
||||
CHECK (3 == *seq2);
|
||||
seq2.flipFilter(); // everything rejected
|
||||
CHECK (isnil (seq2));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<map version="1.0.1">
|
||||
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
|
||||
<node BACKGROUND_COLOR="#6666ff" CREATED="1434127882200" ID="ID_1452170048" MODIFIED="1518487921106" STYLE="fork" TEXT="Lumi">
|
||||
<node BACKGROUND_COLOR="#6666ff" CREATED="1434127882200" ID="ID_1452170048" MODIFIED="1536409461357" STYLE="fork" TEXT="Lumi">
|
||||
<font NAME="SansSerif" SIZE="25"/>
|
||||
<node CREATED="1434128046296" ID="ID_1900827283" MODIFIED="1533388497006" POSITION="right" TEXT="GUI">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="14"/>
|
||||
|
|
@ -30746,6 +30746,8 @@
|
|||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1536410175049" ID="ID_1439541143" MODIFIED="1536410185984" TEXT="Ergänzungen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1535894221015" FOLDED="true" ID="ID_977007729" MODIFIED="1535898215661" TEXT="Bug im Filter-Layer">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535894239308" ID="ID_1809452702" MODIFIED="1535894251655" TEXT="Reihenfolge des Parent-Aufrufes in expandChildren()"/>
|
||||
|
|
@ -30783,6 +30785,400 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535893707036" ID="ID_650057716" MODIFIED="1536410348400" TEXT="Aufgabe: Filter erweiterbar machen">
|
||||
<linktarget COLOR="#62909b" DESTINATION="ID_650057716" ENDARROW="Default" ENDINCLINATION="100;100;" ID="Arrow_ID_1700598512" SOURCE="ID_257876647" STARTARROW="None" STARTINCLINATION="-412;-19;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535893718194" ID="ID_177803317" MODIFIED="1535893743691" TEXT="analog zum Filter in den Itertools"/>
|
||||
<node CREATED="1535893752174" ID="ID_27030007" MODIFIED="1535893777011" TEXT="ggfs diesen dort ablösen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
sofern längerfristig Itertools durch TreeExplorer abgelöst werden könnte
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535903530421" ID="ID_326687543" MODIFIED="1535932193036" TEXT="Aua">
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
<node CREATED="1535903536820" ID="ID_34512098" MODIFIED="1535903541919" TEXT="das wird komplex..."/>
|
||||
<node CREATED="1535903542556" ID="ID_945730027" MODIFIED="1535903551375" TEXT="der Filter-Layer ist hochgradig generisch"/>
|
||||
<node CREATED="1535904105560" ID="ID_1683260823" MODIFIED="1535904127224" TEXT="muß auch das Chain-Argument durch die Funktor-Traits schleusen"/>
|
||||
<node CREATED="1535904128524" ID="ID_1305515398" MODIFIED="1535904140074" TEXT="Code wird grausam">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
<node CREATED="1535904143098" ID="ID_62668261" MODIFIED="1535904152669" TEXT="funktioniert, aber gewaltig aufgebläht"/>
|
||||
<node CREATED="1535904153353" ID="ID_1229789568" MODIFIED="1535904403272" TEXT="ganz nah am Segfault vorbei">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und das hängt an einem hauchdünnen Faden,
|
||||
</p>
|
||||
<p>
|
||||
und ist subtil bis zum geht nicht mehr....
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Wenn man das Lambda einfach per [=] schreibt, und das Feld this->predicate_ verwendet,
|
||||
</p>
|
||||
<p>
|
||||
dann wird this gecaptured (und das ist effektiv per Referenz). Wenn ich dann den
|
||||
</p>
|
||||
<p>
|
||||
konstruierten Funktor an this->predicate_ zuweise, haben wir eine Endlos-Rekursion.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Lösung: man muß im lokalen Frame eine Referenz auf this->predicate definieren und binden.
|
||||
</p>
|
||||
<p>
|
||||
Diese wird dann per Value gecaptured, was die gewünschte Kopie bewirkt.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1535904168943" ID="ID_1486081044" MODIFIED="1535904249188" TEXT="eine unnötige Kopie">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...muß den Chain-Funktor aus dem Template-Argument erzeugen,
|
||||
</p>
|
||||
<p>
|
||||
und ihn dann in die per-Value-Closure des erzeugten neuen Lambda binden (=Kopie).
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Erst ab C++17 kann man Lambda-Captures pre move machen
|
||||
</p>
|
||||
<p>
|
||||
(und auch dafür ist die Syntax grausam)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535904461720" FOLDED="true" ID="ID_1122890797" MODIFIED="1535932207865" TEXT="will ich das wirklich.....?">
|
||||
<node CREATED="1535904470670" ID="ID_1319028134" MODIFIED="1535904516890" TEXT="natürlich nicht">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...es soll bloß einfach funktionieren!!!!!!!!!!!
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1535906366785" ID="ID_772195469" MODIFIED="1535906388442" TEXT="Komplexität entsteht aus der Flexibilität der Argumente">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1535904517824" ID="ID_495813123" MODIFIED="1535904857801" TEXT="stattdessen Itertools-Filter verwenden?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
keine gute Idee.
|
||||
</p>
|
||||
<p>
|
||||
Dann verwenden wir im einen Funktor-Framework eine Filter-Komponente
|
||||
</p>
|
||||
<p>
|
||||
aus dem anderen Framework, obwohl es direkt hier auch eine Filter-Komponente gäbe.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Außerdem habe ich immer noch die Hoffnung, irgendwann mal
|
||||
</p>
|
||||
<p>
|
||||
die Itertools komplett durch den TreeExplorer ablösen zu können
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535906261464" ID="ID_792586244" MODIFIED="1535909947735" TEXT="Auswege">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#338800" CREATED="1535906265911" FOLDED="true" ID="ID_949648101" MODIFIED="1535932222887" TEXT="speziellen Filter-Layer nur hierfür">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535906327782" ID="ID_1362040513" MODIFIED="1535906334769" TEXT="letztlich nur Code-Kosmetik"/>
|
||||
<node CREATED="1535909106704" ID="ID_1965298489" MODIFIED="1535909115714" TEXT="würde aber sehr speziellen Fall markieren"/>
|
||||
<node CREATED="1535909145091" ID="ID_1036104765" MODIFIED="1535909185418">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Name: <b>mutableFilter</b>()
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535906283948" FOLDED="true" ID="ID_1882070577" MODIFIED="1535932223855" TEXT="Chain-Filter-Bau in HIlfsfunktion">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535906394646" ID="ID_1941257576" MODIFIED="1535906399057" TEXT="wünschenswert"/>
|
||||
<node CREATED="1535906399621" ID="ID_1167561151" MODIFIED="1535906407632" TEXT="nicht klar, ob überhaupt möglich"/>
|
||||
<node CREATED="1535909021163" ID="ID_1877231025" MODIFIED="1535909030226" TEXT="geschachtelte generische Lambdas verwenden">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1535909041497" ID="ID_1207755293" MODIFIED="1535909052069" TEXT="AUA³">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
<node CREATED="1535909192572" ID="ID_1654371024" MODIFIED="1535909197055" TEXT="aber es geht...."/>
|
||||
<node COLOR="#338800" CREATED="1535909967725" ID="ID_163021784" MODIFIED="1535912743392" TEXT="im Debugger verifizieren!">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...sieht gut aus.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Folgendes habe ich gesehen
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
zu Beginn zeigt das eingebettete Funktor-Objekt auf eine Position auf dem Stack
|
||||
</li>
|
||||
<li>
|
||||
beim Aufrufen der andFilter()-Funktion werden diverse Funktoren kopiert,<br />wobei nacheinander die (zu erwartenden) Argumente als Quelle auftauchen<br />
|
||||
</li>
|
||||
<li>
|
||||
danach hat sich der Funktor geändert: er zeigt nun auf eine Position auf dem Heap<br />
|
||||
</li>
|
||||
<li>
|
||||
der bisherige Funktor wurde mit der Closure des zusammengesetzten Funktors kollabiert (hat gleiche Addresse)<br />
|
||||
</li>
|
||||
<li>
|
||||
der Chain-Funktor hat eine Closure bekommen, die ebenfalls Heap-alloziert ist.<br />das deutet darauf hin, daß das capturen per copy funktioniert hat<br />
|
||||
</li>
|
||||
<li>
|
||||
Beim Aufruf steppen wir nacheinander erst in den kombinierten Funktor,<br />und von dort wie erwartet in die beiden Lambdas.
|
||||
</li>
|
||||
<li>
|
||||
<br />
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535919506060" ID="ID_1859852045" MODIFIED="1536410320485" TEXT="heterogene Prädikat-Typen">
|
||||
<arrowlink COLOR="#616f95" DESTINATION="ID_1587572708" ENDARROW="Default" ENDINCLINATION="105;-232;" ID="Arrow_ID_346491515" STARTARROW="None" STARTINCLINATION="-143;0;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535919540560" ID="ID_1538734134" MODIFIED="1535932049581" TEXT="geht nicht?">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1535919549942" ID="ID_790617987" MODIFIED="1535919754360" TEXT="das zu Beginn verwendete Filter-Prädikat legt den Typ fest">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...für das dort hineingereichte Funktor-Objekt wird der Argument-Accessor ausgewählt (Metaprogrammierung).
|
||||
</p>
|
||||
<p>
|
||||
Er ist dann im Typ des Wrappers == _Traits::Functor codiert.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Wir können zwar den im Wrapper enthaltenen Funktor neu zuweisen (in gewissen Grenzen),
|
||||
</p>
|
||||
<p>
|
||||
aber er wird stets den zu Beginn gewählten Argument-Accessor nehmen.
|
||||
</p>
|
||||
<p>
|
||||
Typischerweise wird dieser ja sogar beim Aufruf des getemplateteten Funtions-Operators geInlined
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535919835337" ID="ID_1492056572" MODIFIED="1536409243145" TEXT="Ausweg: doppelt wrappen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536367874016" ID="ID_109911994" MODIFIED="1536410392505" TEXT="Filter deaktivierbar machen">
|
||||
<linktarget COLOR="#d683c5" DESTINATION="ID_109911994" ENDARROW="Default" ENDINCLINATION="1326;0;" ID="Arrow_ID_1556921295" SOURCE="ID_649387933" STARTARROW="None" STARTINCLINATION="142;0;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535899873112" ID="ID_81164806" MODIFIED="1535932139639" TEXT="Unit-Test (replizieren)">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1535913527837" ID="ID_756446305" MODIFIED="1535913542932" TEXT="anlegen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535913531701" ID="ID_1872325076" MODIFIED="1535932138102" TEXT="andere Fälle auch covern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536410408473" ID="ID_1812410133" MODIFIED="1536410416079" TEXT="Filter deaktivieren">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536367899301" ID="ID_1128977501" MODIFIED="1536367913469" TEXT="Neuzuweisung kompatibler Filter">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1536367916619" ID="ID_411753478" MODIFIED="1536367919774" TEXT="geht das?"/>
|
||||
<node CREATED="1536367921474" ID="ID_849620368" MODIFIED="1536367938773" TEXT="nur Signatur-Typ auf MutableFilter ">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1536368287265" ID="ID_29049674" MODIFIED="1536368351977">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Problem: std::function <b>in</b> FilterPredicate
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1536368354288" ID="ID_1161186805" MODIFIED="1536368384597" TEXT="muß die richtige "Kategorie" haben">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
entweder Val -> bool oder Iter -> bool
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1536409170928" ID="ID_1850744645" MODIFIED="1536409531056" TEXT="Design-Probleme">
|
||||
<icon BUILTIN="bell"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535919506060" ID="ID_1587572708" MODIFIED="1536410313468" TEXT="heterogene Prädikat-Typen">
|
||||
<linktarget COLOR="#616f95" DESTINATION="ID_1587572708" ENDARROW="Default" ENDINCLINATION="105;-232;" ID="Arrow_ID_346491515" SOURCE="ID_1859852045" STARTARROW="None" STARTINCLINATION="-143;0;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1535919549942" ID="ID_270773242" MODIFIED="1536409271272" TEXT="das zu Beginn verwendete Filter-Prädikat legt den Typ fest">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...für das dort hineingereichte Funktor-Objekt wird der Argument-Accessor ausgewählt (Metaprogrammierung).
|
||||
</p>
|
||||
<p>
|
||||
Er ist dann im Typ des Wrappers == _Traits::Functor codiert.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Wir können zwar den im Wrapper enthaltenen Funktor neu zuweisen (in gewissen Grenzen),
|
||||
</p>
|
||||
<p>
|
||||
aber er wird stets den zu Beginn gewählten Argument-Accessor nehmen.
|
||||
</p>
|
||||
<p>
|
||||
Typischerweise wird dieser ja sogar beim Aufruf des getemplateteten Funtions-Operators geInlined
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535919835337" ID="ID_619686338" MODIFIED="1536409289139" TEXT="1.Lösung: doppelt wrappen?">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535923167297" ID="ID_1635196754" MODIFIED="1535923219590" TEXT="Basis-Filter sieht unspezifische Form des Prädikates"/>
|
||||
<node CREATED="1535923237336" ID="ID_508718189" MODIFIED="1535923251434" TEXT="im Funktor steckt eingewickelt eine spezifische Form"/>
|
||||
<node CREATED="1535932069618" ID="ID_856161473" MODIFIED="1535932128786" TEXT="kein wirklicher overhead">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
der Aufruf vom äußeren in den inneren Wrapper ist 1:1 und sollte vom Compiler wegoptimiert werden
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924949587" ID="ID_835090820" MODIFIED="1535932018158" TEXT="Lösung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1535924955458" ID="ID_1924886650" MODIFIED="1535927205707" TEXT="Typ des gewrappten Funktors konstruieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924963017" ID="ID_1255665831" MODIFIED="1535927208519" TEXT="diesen schon in die Instanz der Basisklasse einfließen lassen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924983038" ID="ID_343931650" MODIFIED="1535927210570" TEXT="Konstruktor eigens definieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924991781" ID="ID_1047870457" MODIFIED="1535927212273" TEXT="inline wrappen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535925016969" ID="ID_797104795" MODIFIED="1535927239938" TEXT="der Rest müßte von selber funktionieren...">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536409302285" ID="ID_913930564" MODIFIED="1536409311669" TEXT="extrem komplexe Typen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1536409316172" ID="ID_1468538186" MODIFIED="1536409340127" TEXT="Call-Traces sind nahezu unlesbar">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...ich verbrenne Stunden beim Debuggen von neuem Code
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
<node CREATED="1536409470623" ID="ID_862991864" MODIFIED="1536409494631" TEXT="Ansatzpunkte">
|
||||
<node CREATED="1536409438003" ID="ID_254117479" MODIFIED="1536409449286" TEXT="erhebliche Redundanzen in den Typen"/>
|
||||
<node CREATED="1536409503106" ID="ID_377815860" MODIFIED="1536409513965" TEXT="konkrete Lambdas in der Typsignatur"/>
|
||||
</node>
|
||||
<node CREATED="1536409720285" ID="ID_610904065" MODIFIED="1536409725545" TEXT="Untersuchung">
|
||||
<node CREATED="1536409726421" ID="ID_1705785900" MODIFIED="1536409738318" TEXT="welche Typen werden wirklich benötigt">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1536409761248" ID="ID_753549743" MODIFIED="1536409843345" TEXT="Quelle == Basis-Typ"/>
|
||||
<node CREATED="1536409788637" ID="ID_87247261" MODIFIED="1536409835506" TEXT="bei Transofmation: neuer value_type"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535893137527" ID="ID_994961372" MODIFIED="1535893142488" TEXT="Verwendungen">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -30837,290 +31233,9 @@
|
|||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535893707036" FOLDED="true" ID="ID_257876647" MODIFIED="1535934249016" TEXT="Aufgabe: Filter erweiterbar machen">
|
||||
<node COLOR="#338800" CREATED="1535893707036" ID="ID_257876647" MODIFIED="1536410348399" TEXT="Aufgabe: Filter erweiterbar machen">
|
||||
<arrowlink COLOR="#62909b" DESTINATION="ID_650057716" ENDARROW="Default" ENDINCLINATION="100;100;" ID="Arrow_ID_1700598512" STARTARROW="None" STARTINCLINATION="-412;-19;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535893718194" ID="ID_872370459" MODIFIED="1535893743691" TEXT="analog zum Filter in den Itertools"/>
|
||||
<node CREATED="1535893752174" ID="ID_386073545" MODIFIED="1535893777011" TEXT="ggfs diesen dort ablösen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
sofern längerfristig Itertools durch TreeExplorer abgelöst werden könnte
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535903530421" ID="ID_384303362" MODIFIED="1535932193036" TEXT="Aua">
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
<node CREATED="1535903536820" ID="ID_1343418651" MODIFIED="1535903541919" TEXT="das wird komplex..."/>
|
||||
<node CREATED="1535903542556" ID="ID_1721469481" MODIFIED="1535903551375" TEXT="der Filter-Layer ist hochgradig generisch"/>
|
||||
<node CREATED="1535904105560" ID="ID_1560346116" MODIFIED="1535904127224" TEXT="muß auch das Chain-Argument durch die Funktor-Traits schleusen"/>
|
||||
<node CREATED="1535904128524" ID="ID_1238934363" MODIFIED="1535904140074" TEXT="Code wird grausam">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
<node CREATED="1535904143098" ID="ID_646600775" MODIFIED="1535904152669" TEXT="funktioniert, aber gewaltig aufgebläht"/>
|
||||
<node CREATED="1535904153353" ID="ID_616241221" MODIFIED="1535904403272" TEXT="ganz nah am Segfault vorbei">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und das hängt an einem hauchdünnen Faden,
|
||||
</p>
|
||||
<p>
|
||||
und ist subtil bis zum geht nicht mehr....
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Wenn man das Lambda einfach per [=] schreibt, und das Feld this->predicate_ verwendet,
|
||||
</p>
|
||||
<p>
|
||||
dann wird this gecaptured (und das ist effektiv per Referenz). Wenn ich dann den
|
||||
</p>
|
||||
<p>
|
||||
konstruierten Funktor an this->predicate_ zuweise, haben wir eine Endlos-Rekursion.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Lösung: man muß im lokalen Frame eine Referenz auf this->predicate definieren und binden.
|
||||
</p>
|
||||
<p>
|
||||
Diese wird dann per Value gecaptured, was die gewünschte Kopie bewirkt.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1535904168943" ID="ID_1936705749" MODIFIED="1535904249188" TEXT="eine unnötige Kopie">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...muß den Chain-Funktor aus dem Template-Argument erzeugen,
|
||||
</p>
|
||||
<p>
|
||||
und ihn dann in die per-Value-Closure des erzeugten neuen Lambda binden (=Kopie).
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Erst ab C++17 kann man Lambda-Captures pre move machen
|
||||
</p>
|
||||
<p>
|
||||
(und auch dafür ist die Syntax grausam)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535904461720" FOLDED="true" ID="ID_317840110" MODIFIED="1535932207865" TEXT="will ich das wirklich.....?">
|
||||
<node CREATED="1535904470670" ID="ID_160594644" MODIFIED="1535904516890" TEXT="natürlich nicht">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...es soll bloß einfach funktionieren!!!!!!!!!!!
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1535906366785" ID="ID_1488862884" MODIFIED="1535906388442" TEXT="Komplexität entsteht aus der Flexibilität der Argumente">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1535904517824" ID="ID_305725479" MODIFIED="1535904857801" TEXT="stattdessen Itertools-Filter verwenden?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
keine gute Idee.
|
||||
</p>
|
||||
<p>
|
||||
Dann verwenden wir im einen Funktor-Framework eine Filter-Komponente
|
||||
</p>
|
||||
<p>
|
||||
aus dem anderen Framework, obwohl es direkt hier auch eine Filter-Komponente gäbe.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Außerdem habe ich immer noch die Hoffnung, irgendwann mal
|
||||
</p>
|
||||
<p>
|
||||
die Itertools komplett durch den TreeExplorer ablösen zu können
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535906261464" ID="ID_1343076549" MODIFIED="1535909947735" TEXT="Auswege">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#338800" CREATED="1535906265911" FOLDED="true" ID="ID_442265155" MODIFIED="1535932222887" TEXT="speziellen Filter-Layer nur hierfür">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535906327782" ID="ID_1903350743" MODIFIED="1535906334769" TEXT="letztlich nur Code-Kosmetik"/>
|
||||
<node CREATED="1535909106704" ID="ID_1756811057" MODIFIED="1535909115714" TEXT="würde aber sehr speziellen Fall markieren"/>
|
||||
<node CREATED="1535909145091" ID="ID_23855152" MODIFIED="1535909185418">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Name: <b>mutableFilter</b>()
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535906283948" FOLDED="true" ID="ID_367978731" MODIFIED="1535932223855" TEXT="Chain-Filter-Bau in HIlfsfunktion">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535906394646" ID="ID_296637778" MODIFIED="1535906399057" TEXT="wünschenswert"/>
|
||||
<node CREATED="1535906399621" ID="ID_1487063274" MODIFIED="1535906407632" TEXT="nicht klar, ob überhaupt möglich"/>
|
||||
<node CREATED="1535909021163" ID="ID_1776922208" MODIFIED="1535909030226" TEXT="geschachtelte generische Lambdas verwenden">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1535909041497" ID="ID_911444458" MODIFIED="1535909052069" TEXT="AUA³">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
<node CREATED="1535909192572" ID="ID_1938820560" MODIFIED="1535909197055" TEXT="aber es geht...."/>
|
||||
<node COLOR="#338800" CREATED="1535909967725" ID="ID_745154448" MODIFIED="1535912743392" TEXT="im Debugger verifizieren!">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...sieht gut aus.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Folgendes habe ich gesehen
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
zu Beginn zeigt das eingebettete Funktor-Objekt auf eine Position auf dem Stack
|
||||
</li>
|
||||
<li>
|
||||
beim Aufrufen der andFilter()-Funktion werden diverse Funktoren kopiert,<br />wobei nacheinander die (zu erwartenden) Argumente als Quelle auftauchen<br />
|
||||
</li>
|
||||
<li>
|
||||
danach hat sich der Funktor geändert: er zeigt nun auf eine Position auf dem Heap<br />
|
||||
</li>
|
||||
<li>
|
||||
der bisherige Funktor wurde mit der Closure des zusammengesetzten Funktors kollabiert (hat gleiche Addresse)<br />
|
||||
</li>
|
||||
<li>
|
||||
der Chain-Funktor hat eine Closure bekommen, die ebenfalls Heap-alloziert ist.<br />das deutet darauf hin, daß das capturen per copy funktioniert hat<br />
|
||||
</li>
|
||||
<li>
|
||||
Beim Aufruf steppen wir nacheinander erst in den kombinierten Funktor,<br />und von dort wie erwartet in die beiden Lambdas.
|
||||
</li>
|
||||
<li>
|
||||
<br />
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535919506060" FOLDED="true" ID="ID_308901003" MODIFIED="1535932218407" TEXT="heterogene Prädikat-Typen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535919540560" ID="ID_544134703" MODIFIED="1535932049581" TEXT="geht nicht?">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1535919549942" ID="ID_809087906" MODIFIED="1535919754360" TEXT="das zu Beginn verwendete Filter-Prädikat legt den Typ fest">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...für das dort hineingereichte Funktor-Objekt wird der Argument-Accessor ausgewählt (Metaprogrammierung).
|
||||
</p>
|
||||
<p>
|
||||
Er ist dann im Typ des Wrappers == _Traits::Functor codiert.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Wir können zwar den im Wrapper enthaltenen Funktor neu zuweisen (in gewissen Grenzen),
|
||||
</p>
|
||||
<p>
|
||||
aber er wird stets den zu Beginn gewählten Argument-Accessor nehmen.
|
||||
</p>
|
||||
<p>
|
||||
Typischerweise wird dieser ja sogar beim Aufruf des getemplateteten Funtions-Operators geInlined
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535919835337" ID="ID_984434298" MODIFIED="1535932021329" TEXT="Ausweg: doppelt wrappen?">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535923167297" ID="ID_1611885187" MODIFIED="1535923219590" TEXT="Basis-Filter sieht unspezifische Form des Prädikates"/>
|
||||
<node CREATED="1535923237336" ID="ID_873685254" MODIFIED="1535923251434" TEXT="im Funktor steckt eingewickelt eine spezifische Form"/>
|
||||
<node CREATED="1535932069618" ID="ID_937611933" MODIFIED="1535932128786" TEXT="kein wirklicher overhead">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
der Aufruf vom äußeren in den inneren Wrapper ist 1:1 und sollte vom Compiler wegoptimiert werden
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924949587" ID="ID_283543674" MODIFIED="1535932018158" TEXT="Lösung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1535924955458" ID="ID_257130301" MODIFIED="1535927205707" TEXT="Typ des gewrappten Funktors konstruieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924963017" ID="ID_1923686219" MODIFIED="1535927208519" TEXT="diesen schon in die Instanz der Basisklasse einfließen lassen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924983038" ID="ID_966924861" MODIFIED="1535927210570" TEXT="Konstruktor eigens definieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535924991781" ID="ID_28842573" MODIFIED="1535927212273" TEXT="inline wrappen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535925016969" ID="ID_214947623" MODIFIED="1535927239938" TEXT="der Rest müßte von selber funktionieren...">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535899873112" ID="ID_1460874987" MODIFIED="1535932139639" TEXT="Unit-Test (replizieren)">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1535913527837" ID="ID_1506533000" MODIFIED="1535913542932" TEXT="anlegen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535913531701" ID="ID_1093929821" MODIFIED="1535932138102" TEXT="andere Fälle auch covern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535899922873" ID="ID_1971708144" MODIFIED="1535937992260" TEXT="bestehende Aufrufe in EventMatch konsolidieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -31162,6 +31277,31 @@
|
|||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1535939763441" ID="ID_132867774" MODIFIED="1535939780642" TEXT="muß "nur noch" Cursor gegen neue State-Core austauschen"/>
|
||||
<node CREATED="1535939781302" ID="ID_285459121" MODIFIED="1535939796824" TEXT="diese hält den Cursor plus einen Stack mit den Filtern"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536368106394" ID="ID_1324169393" MODIFIED="1536368114930" TEXT="in eigene Translation-Unit verschieben">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1536368121224" ID="ID_684768731" MODIFIED="1536368139195">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
die Search-Engine bläht die Debug-Infos <b>gewaltig</b> auf
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1536368144661" ID="ID_184622907" MODIFIED="1536368158636" TEXT="BusTerm_test = 12 MB">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
<node CREATED="1536368166242" ID="ID_280400966" MODIFIED="1536368177458" TEXT="EventLog_test = 6 MB">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1536368188063" ID="ID_1725693994" MODIFIED="1536368197862" TEXT="kein Wunder bei den Typen...">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535893799799" ID="ID_706866636" MODIFIED="1535938019075" TEXT="Auswertungs-Stack">
|
||||
|
|
@ -31525,7 +31665,8 @@
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018931433" ID="ID_1532889609" MODIFIED="1536326576841" TEXT="treeExplorer-Konfiguration">
|
||||
<arrowlink COLOR="#65a7b1" DESTINATION="ID_1044555993" ENDARROW="Default" ENDINCLINATION="70;92;" ID="Arrow_ID_575633930" STARTARROW="None" STARTINCLINATION="149;-3;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536353107155" HGAP="27" ID="ID_1163131751" MODIFIED="1536353202260" TEXT="Problem: Basis-Layer" VSHIFT="23">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536353107155" HGAP="33" ID="ID_1163131751" MODIFIED="1536361617044" TEXT="Problem: Basis-Layer" VSHIFT="37">
|
||||
<arrowlink COLOR="#4471b4" DESTINATION="ID_942897075" ENDARROW="Default" ENDINCLINATION="37;-79;" ID="Arrow_ID_537236489" STARTARROW="None" STARTINCLINATION="30;44;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1536353117930" ID="ID_625995057" MODIFIED="1536353132265" TEXT="hinzugefügt für "leeren" Zustand">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -31533,6 +31674,9 @@
|
|||
<node CREATED="1536353133264" ID="ID_597888311" MODIFIED="1536353144626" TEXT="Backtracking in leeren Zustand">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1536357642662" ID="ID_77507334" MODIFIED="1536357654371" TEXT="Basis-Layer wird eigentlich nie mehr besucht">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536353280436" ID="ID_967254721" MODIFIED="1536353333302" TEXT="Problem: clearFilter()">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -31545,7 +31689,7 @@
|
|||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536353335500" ID="ID_698525366" MODIFIED="1536353392694" TEXT="Problem ist partielle Expansion">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536353335500" ID="ID_698525366" MODIFIED="1536358327376" TEXT="muß Stack der partiellen Auswertungen verwerfen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -31560,6 +31704,7 @@
|
|||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink COLOR="#60a2d5" DESTINATION="ID_33678789" ENDARROW="Default" ENDINCLINATION="315;0;" ID="Arrow_ID_1930258825" STARTARROW="None" STARTINCLINATION="106;0;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -31577,6 +31722,87 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1536357666667" ID="ID_886527146" MODIFIED="1536357671758" TEXT="Design-Kritik">
|
||||
<node CREATED="1536357672802" ID="ID_2301559" MODIFIED="1536357696186" TEXT="aktuelles Design ist minimalistisch aber nicht elegant">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1536357853649" ID="ID_1868098250" MODIFIED="1536357864980" TEXT="API geradliniger als die interne Struktur">
|
||||
<node CREATED="1536357700806" ID="ID_484166025" MODIFIED="1536357804847" TEXT="der Basis-Layer ist aufgrund des API vorhanden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...denn
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
es ist praktisch, zunächst "leer" zu konstruieren
|
||||
</li>
|
||||
<li>
|
||||
es ist verständlicher, wenn alle Bedingungen symmetrisch angegeben werden
|
||||
</li>
|
||||
<li>
|
||||
es ist natürlich, daß ein "leerer" Filter alles durchläßt
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1536357809367" ID="ID_118025251" MODIFIED="1536357830652" TEXT="die clearFilter()-Funktion folgt derselben Logik">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Filter leer == alles durchlassen
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357878006" ID="ID_1225195123" MODIFIED="1536358257081" TEXT="Aufräumen und nachrüsten">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357891412" ID="ID_942897075" MODIFIED="1536358349759" TEXT="den Basis-Layer eliminieren">
|
||||
<linktarget COLOR="#4471b4" DESTINATION="ID_942897075" ENDARROW="Default" ENDINCLINATION="37;-79;" ID="Arrow_ID_537236489" SOURCE="ID_1163131751" STARTARROW="None" STARTINCLINATION="30;44;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357900635" ID="ID_646733499" MODIFIED="1536358247780" TEXT="brauche einen "leer"-Status im Filter">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1536367745114" ID="ID_945289619" MODIFIED="1536367753030" TEXT="explizit als bool-Flag">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536367754089" ID="ID_649387933" MODIFIED="1536410400971" TEXT="im Filter-Funktor verstecken">
|
||||
<arrowlink COLOR="#d683c5" DESTINATION="ID_109911994" ENDARROW="Default" ENDINCLINATION="1326;0;" ID="Arrow_ID_1556921295" STARTARROW="None" STARTINCLINATION="142;0;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357917385" ID="ID_1615410357" MODIFIED="1536358250507" TEXT="wenn leer, dann direkt den Basis-Layer konfigurieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357952068" ID="ID_876149668" MODIFIED="1536358251475" TEXT="nur an die Kette anfügen, wenn nicht leer">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357967826" ID="ID_634133289" MODIFIED="1536358245365" TEXT="clearFilter()">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1536357973769" ID="ID_33678789" MODIFIED="1536358316984" TEXT="brauche Unterstützung vom Expander">
|
||||
<linktarget COLOR="#60a2d5" DESTINATION="ID_33678789" ENDARROW="Default" ENDINCLINATION="315;0;" ID="Arrow_ID_1930258825" SOURCE="ID_698525366" STARTARROW="None" STARTINCLINATION="106;0;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536357986087" ID="ID_1097583555" MODIFIED="1536358230631" TEXT="rootCurrent()">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536358193211" ID="ID_601406114" MODIFIED="1536358229327" TEXT="hebt aktuelle Sequenz auf Root-Level">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536358204137" ID="ID_1724606451" MODIFIED="1536358228591" TEXT="verwirft den sonstigen Stack komplett">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018420398" ID="ID_41628967" MODIFIED="1536326452308" TEXT="Adaptieren der Quell-Datensequenz">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1536018880168" ID="ID_1619721301" MODIFIED="1536326442522" TEXT="macht normalerweise TreeExplorer">
|
||||
|
|
|
|||
Loading…
Reference in a new issue