TreeExplorer: simple implementation based on eager pulling and an Invariant

lazy pulling would require us to store an additional bool
(the way the FilterIterator from itertools does)
This commit is contained in:
Fischlurch 2017-12-07 01:37:03 +01:00
parent 2eacde7f2c
commit e9e7004a2e
2 changed files with 30 additions and 14 deletions

View file

@ -663,7 +663,7 @@ namespace lib {
using FilterPredicate = typename _Traits::Functor;
FilterPredicate trafo_;
FilterPredicate predicate_;
public:
@ -672,15 +672,18 @@ namespace lib {
Filter (SRC&& dataSrc, FUN&& filterFun)
: SRC{move (dataSrc)}
, trafo_{forward<FUN> (filterFun)}
{ }
, predicate_{forward<FUN> (filterFun)}
{
pullFilter(); // initially pull to establish the invariant
}
/** refresh state when other layers manipulate the source sequence */
/** refresh state when other layers manipulate the source sequence.
* @note possibly pulls to re-establish the invariant */
void
expandChildren()
{
//////////////////////TODO trigger re-evaluation here...
pullFilter();
SRC::expandChildren();
}
@ -689,19 +692,20 @@ namespace lib {
bool
checkPoint() const
{
return false; //////////////TODO filter and pull here...
return bool(srcIter());
}
typename SRC::reference
yield() const
{
return *(*this);
return *srcIter();
}
void
iterNext()
{
++ srcIter();
pullFilter();
}
private:
@ -711,11 +715,14 @@ namespace lib {
return unConst(*this);
}
bool
/** @note establishes the invariant:
* whatever the source yields as current element,
* has already been approved by our predicate */
void
pullFilter ()
{
////////////////////////TODO while-not-filter iter
return false; //////////TODO return true if any result??
while (srcIter() and not predicate_(srcIter()))
++srcIter();
}
};
}

View file

@ -5706,12 +5706,21 @@
<node CREATED="1511837345226" ID="ID_991593174" MODIFIED="1511837351797" TEXT="bestehende Funktor-Argument-Traits"/>
</node>
<node CREATED="1512523892775" ID="ID_673112014" MODIFIED="1512523896362" TEXT="Knackpunkte">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1512523897422" ID="ID_1007287631" MODIFIED="1512523916092" TEXT="pullFilter">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1512523897422" ID="ID_1007287631" MODIFIED="1512606862773" TEXT="pullFilter">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1512523905005" ID="ID_1286045611" MODIFIED="1512523921543" TEXT="wie &quot;ausgewertet&quot; merken?">
<icon BUILTIN="help"/>
</node>
<node CREATED="1512606810364" ID="ID_1956085441" MODIFIED="1512606857354" STYLE="fork" TEXT="garnicht">
<icon BUILTIN="yes"/>
<node CREATED="1512606816571" ID="ID_1603234787" MODIFIED="1512606853200" TEXT="mit INVARIANTE arbeiten">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1512606823682" ID="ID_1935971404" MODIFIED="1512606853200" TEXT="erfordert vorauseilendes Pullen">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1512363846804" ID="ID_1346062807" MODIFIED="1512363878326" TEXT="auto-expand">
@ -6287,8 +6296,8 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1511836579562" ID="ID_1718741335" MODIFIED="1512523829719" TEXT="verify_FilterIterator();">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1512523719350" ID="ID_351021178" MODIFIED="1512523742972" TEXT="einfaches Pr&#xe4;dikat">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1512523719350" ID="ID_351021178" MODIFIED="1512606882124" TEXT="einfaches Pr&#xe4;dikat">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1512523726885" ID="ID_282579718" MODIFIED="1512523741403" TEXT="konsumieren bis leer">
<icon BUILTIN="flag-yellow"/>