diff --git a/src/lib/iter-tree-explorer.hpp b/src/lib/iter-tree-explorer.hpp index be6f25da0..da1d676b5 100644 --- a/src/lib/iter-tree-explorer.hpp +++ b/src/lib/iter-tree-explorer.hpp @@ -911,34 +911,6 @@ namespace lib { } - /* === Remould the Filter condition underway === */ - - template - void - andFilter (COND conjunctiveClause) - { - using _ChainTraits = _BoundFunctor; - using Res = typename _ChainTraits::Res; - static_assert(std::is_constructible::value, "Chained Functor must be a predicate"); - - using ChainPredicate = typename _ChainTraits::Functor; - - FilterPredicate& firstClause = this->predicate_; - ChainPredicate chainClause{forward (conjunctiveClause)}; - - auto buildCombinedClause = [](auto first, auto second) - { - return [=](auto val) - { - return first(val) - and second(val); - }; - }; - - predicate_ = FilterPredicate{buildCombinedClause (firstClause, chainClause)}; - pullFilter(); - } - private: SRC& srcIter() const @@ -955,6 +927,44 @@ namespace lib { while (srcIter() and not predicate_(srcIter())) ++srcIter(); } + + + + public: /* === API to Remould the Filter condition underway === */ + + template + void + andFilter (COND&& conjunctiveClause) + { + remouldFilter (forward (conjunctiveClause) + ,[](auto first, auto chain) + { + return [=](auto val) + { + return first(val) + and chain(val); + }; + }); + } + + + private: + template + void + remouldFilter (COND&& additionalClause, COMB buildCombinedClause) + { + using _ChainTraits = _BoundFunctor; + using Res = typename _ChainTraits::Res; + static_assert(std::is_constructible::value, "Chained Functor must be a predicate"); + + using ChainPredicate = typename _ChainTraits::Functor; + + FilterPredicate& firstClause = this->predicate_; + ChainPredicate chainClause{forward (additionalClause)}; + + predicate_ = FilterPredicate{buildCombinedClause (firstClause, chainClause)}; + pullFilter(); + } }; diff --git a/tests/library/iter-tree-explorer-test.cpp b/tests/library/iter-tree-explorer-test.cpp index 5ef65bf60..6f25ed072 100644 --- a/tests/library/iter-tree-explorer-test.cpp +++ b/tests/library/iter-tree-explorer-test.cpp @@ -865,6 +865,8 @@ namespace test{ seq.andFilter (takeEve); CHECK (18 == *seq); + ++seq; + CHECK (16 == *seq); } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index d5494fb5d..13adccc8c 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -30974,7 +30974,9 @@ - + + + @@ -30988,12 +30990,12 @@ Name: mutableFilter()

- - +
- + + @@ -31002,6 +31004,48 @@ + + + + + + +

+ ...sieht gut aus. +

+

+ +

+

+ Folgendes habe ich gesehen +

+
    +
  • + zu Beginn zeigt das eingebettete Funktor-Objekt auf eine Position auf dem Stack +
  • +
  • + beim Aufrufen der andFilter()-Funktion werden diverse Funktoren kopiert,
    wobei nacheinander die (zu erwartenden) Argumente als Quelle auftauchen
    +
  • +
  • + danach hat sich der Funktor geändert: er zeigt nun auf eine Position auf dem Heap
    +
  • +
  • + der bisherige Funktor wurde mit der Closure des zusammengesetzten Funktors kollabiert (hat gleiche Addresse)
    +
  • +
  • + der Chain-Funktor hat eine Closure bekommen, die ebenfalls Heap-alloziert ist.
    das deutet darauf hin, daß das capturen per copy funktioniert hat
    +
  • +
  • + Beim Aufruf steppen wir nacheinander erst in den kombinierten Funktor,
    und von dort wie erwartet in die beiden Lambdas. +
  • +
  • +
    +
  • +
+ + +
+