ChainSearch: configure the core of the chained search mechanism
...based on a monadic tree expansion: we define a single step, which takes the current filter configuration and builds the next filter configuration, based on a stored chain of configuration functions The actual exhausting depth-first results just by the greedy application pattern, and uses the stack embedded in the "Explorer" layer of TreeExplorer
This commit is contained in:
parent
2b72175e04
commit
d923138d1c
3 changed files with 68 additions and 29 deletions
|
|
@ -42,6 +42,7 @@
|
||||||
|
|
||||||
#include "lib/error.hpp"
|
#include "lib/error.hpp"
|
||||||
#include "lib/iter-tree-explorer.hpp"
|
#include "lib/iter-tree-explorer.hpp"
|
||||||
|
#include "lib/meta/util.hpp"
|
||||||
|
|
||||||
//#include <type_traits>
|
//#include <type_traits>
|
||||||
//#include <utility>
|
//#include <utility>
|
||||||
|
|
@ -57,6 +58,8 @@ namespace iter {
|
||||||
using std::forward;
|
using std::forward;
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
using lib::meta::disable_if;
|
||||||
|
|
||||||
|
|
||||||
namespace { // type construction helpers...
|
namespace { // type construction helpers...
|
||||||
|
|
||||||
|
|
@ -91,7 +94,7 @@ namespace iter {
|
||||||
{
|
{
|
||||||
using Filter = decltype( buildSearchFilter (std::declval<SRC>()) );
|
using Filter = decltype( buildSearchFilter (std::declval<SRC>()) );
|
||||||
|
|
||||||
using StepFunctor = typename iter_explorer::_BoundFunctor<Filter(Filter const&), Filter>::Functor;
|
using StepFunctor = typename iter_explorer::_BoundFunctor<Filter(Filter const&), Filter const&>::Functor;
|
||||||
|
|
||||||
using Pipeline = decltype( buildExplorer (std::declval<SRC>(), std::declval<StepFunctor>()) );
|
using Pipeline = decltype( buildExplorer (std::declval<SRC>(), std::declval<StepFunctor>()) );
|
||||||
};
|
};
|
||||||
|
|
@ -117,6 +120,7 @@ namespace iter {
|
||||||
using _Trait = _IterChainSetup<SRC>;
|
using _Trait = _IterChainSetup<SRC>;
|
||||||
using _Base = typename _Trait::Pipeline;
|
using _Base = typename _Trait::Pipeline;
|
||||||
|
|
||||||
|
using Value = typename _Base::value_type;
|
||||||
using Filter = typename _Trait::Filter;
|
using Filter = typename _Trait::Filter;
|
||||||
using Step = typename _Trait::StepFunctor;
|
using Step = typename _Trait::StepFunctor;
|
||||||
|
|
||||||
|
|
@ -141,18 +145,53 @@ namespace iter {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** */
|
/** configure additional chained search condition.
|
||||||
IterChainSearch&&
|
* @param a functor `Filter const& -> filter`, which takes a current filter configuration,
|
||||||
search (string target)
|
* returning a copy from this configuration, possibly configured differently.
|
||||||
|
* @note the given functor, lambda or function reference will be wrapped and adapted
|
||||||
|
* to conform to the required function signature. When using a generic lambda,
|
||||||
|
* the argument type `Filter const&` is assumed
|
||||||
|
* @remarks the additional chained search condition given here will be applied _after_
|
||||||
|
* matching all other conditions already in the filter chain. Each such condition
|
||||||
|
* is used to _filter_ the underlying source iterator, i.e. pull it until finding
|
||||||
|
* and element to match the condition. Basically these conditions are _not_ used in
|
||||||
|
* conjunction, but rather one after another. But since each such step in the chain
|
||||||
|
* is defined by a functor, which gets the previous filter configuration as argument,
|
||||||
|
* it is _possible_ to build a step which _extends_ or sharpens the preceding condition.
|
||||||
|
*/
|
||||||
|
template<typename FUN>
|
||||||
|
disable_if<is_convertible<FUN, Value>,
|
||||||
|
IterChainSearch&& >
|
||||||
|
search (FUN&& configureSearchStep)
|
||||||
{
|
{
|
||||||
TODO ("configure additional chained search condition");
|
stepChain_.emplace_back (Step{forward<FUN> (configureSearchStep)});
|
||||||
return move(*this);
|
return move(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** attach additional direct search for a given value.
|
||||||
|
* After successfully searching for all the conditions currently in the filter chain,
|
||||||
|
* the underlying iterator will finally be pulled until matching the given target value.
|
||||||
|
*/
|
||||||
|
IterChainSearch&&
|
||||||
|
search (Value target)
|
||||||
|
{
|
||||||
|
search ([=](Filter filter) // note: filter taken by value
|
||||||
|
{
|
||||||
|
filter.setNewFilter ([target](Value const& currVal) { return currVal == target; });
|
||||||
|
return filter; // return copy of the original state with changed filter
|
||||||
|
});
|
||||||
|
return move(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** drop all search condition frames.
|
||||||
|
* @remark the filter chain becomes empty,
|
||||||
|
* passing through the unaltered
|
||||||
|
* source sequence
|
||||||
|
*/
|
||||||
IterChainSearch&&
|
IterChainSearch&&
|
||||||
clearFilter()
|
clearFilter()
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED ("drop all search condition frames");
|
stepChain_.clear();
|
||||||
return move(*this);
|
return move(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -160,8 +199,11 @@ namespace iter {
|
||||||
Filter
|
Filter
|
||||||
configureFilterChain (Filter const& currentFilterState)
|
configureFilterChain (Filter const& currentFilterState)
|
||||||
{
|
{
|
||||||
uint depth = this->depth();
|
uint depth = currentFilterState.depth();
|
||||||
return Filter{}; /////TODO empty filter means recursion end
|
if (depth < stepChain_.size())
|
||||||
|
return stepChain_[depth](currentFilterState); // augmented copy
|
||||||
|
else
|
||||||
|
return Filter{}; // empty filter indicates recursion end
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,14 +111,11 @@ namespace test{
|
||||||
///////////////////////////////////////////////////TODO WIP
|
///////////////////////////////////////////////////TODO WIP
|
||||||
using Searcher = decltype(search);
|
using Searcher = decltype(search);
|
||||||
SHOW_TYPE (Searcher);
|
SHOW_TYPE (Searcher);
|
||||||
SHOW_TYPE (Searcher::DebugPipeline);
|
|
||||||
SHOW_TYPE (Searcher::value_type);
|
SHOW_TYPE (Searcher::value_type);
|
||||||
SHOW_TYPE (Searcher::pointer);
|
SHOW_TYPE (Searcher::pointer);
|
||||||
|
|
||||||
// TypeDebugger<Searcher::reference> guggi; // --> std::__cxx11::basic_string<char> const&
|
// TypeDebugger<Searcher::reference> guggi; // --> std::__cxx11::basic_string<char> const&
|
||||||
cout << "search[0]=" <<*search<<endl;
|
cout << "search[0]=" <<*search<<endl;
|
||||||
++search;
|
|
||||||
cout << "search[1]=" <<*search<<endl;
|
|
||||||
///////////////////////////////////////////////////TODO WIP
|
///////////////////////////////////////////////////TODO WIP
|
||||||
CHECK (search);
|
CHECK (search);
|
||||||
CHECK (not isnil(search));
|
CHECK (not isnil(search));
|
||||||
|
|
|
||||||
|
|
@ -31196,15 +31196,15 @@
|
||||||
<node CREATED="1536018293535" ID="ID_361886715" MODIFIED="1536018315757" TEXT="Abkürzung für direkten Wert-equality-Match"/>
|
<node CREATED="1536018293535" ID="ID_361886715" MODIFIED="1536018315757" TEXT="Abkürzung für direkten Wert-equality-Match"/>
|
||||||
<node CREATED="1536018276593" ID="ID_1222260775" MODIFIED="1536018287299" TEXT="prekonfigurierte Builder-Funktionen für Standardfälle"/>
|
<node CREATED="1536018276593" ID="ID_1222260775" MODIFIED="1536018287299" TEXT="prekonfigurierte Builder-Funktionen für Standardfälle"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018364845" ID="ID_1351452920" MODIFIED="1536018457506" TEXT="Implementierung">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018364845" ID="ID_1351452920" MODIFIED="1536329770737" TEXT="Implementierung">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="pencil"/>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018375244" ID="ID_1906913554" MODIFIED="1536018458786" TEXT="Kern: Explore-Mechanismus">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018375244" ID="ID_1906913554" MODIFIED="1536329750864" TEXT="Kern: Explore-Mechanismus">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="pencil"/>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018644456" ID="ID_477475522" MODIFIED="1536018654007" TEXT="Signatur der Explore-Funktion festlegen">
|
<node COLOR="#338800" CREATED="1536018644456" ID="ID_477475522" MODIFIED="1536329729458" TEXT="Signatur der Explore-Funktion festlegen">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018705511" ID="ID_1131109871" MODIFIED="1536018800891" TEXT="greedy Tiefensuche">
|
<node COLOR="#338800" CREATED="1536018705511" ID="ID_1131109871" MODIFIED="1536329731179" TEXT="greedy Tiefensuche">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018802738" ID="ID_1560348563" MODIFIED="1536018807506" TEXT="Abbruchbedingung">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018802738" ID="ID_1560348563" MODIFIED="1536018807506" TEXT="Abbruchbedingung">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
|
@ -31215,9 +31215,9 @@
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018862802" ID="ID_1044555993" MODIFIED="1536326576841" TEXT="abgeleiteten Frame konstruieren">
|
<node COLOR="#338800" CREATED="1536018862802" ID="ID_1044555993" MODIFIED="1536329736419" TEXT="abgeleiteten Frame konstruieren">
|
||||||
<linktarget COLOR="#65a7b1" DESTINATION="ID_1044555993" ENDARROW="Default" ENDINCLINATION="70;92;" ID="Arrow_ID_575633930" SOURCE="ID_1532889609" STARTARROW="None" STARTINCLINATION="149;-3;"/>
|
<linktarget COLOR="#65a7b1" DESTINATION="ID_1044555993" ENDARROW="Default" ENDINCLINATION="70;92;" ID="Arrow_ID_575633930" SOURCE="ID_1532889609" STARTARROW="None" STARTINCLINATION="149;-3;"/>
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1536018406232" ID="ID_1330264339" MODIFIED="1536326484790" TEXT="Schritte als Funktoren">
|
<node COLOR="#338800" CREATED="1536018406232" ID="ID_1330264339" MODIFIED="1536326484790" TEXT="Schritte als Funktoren">
|
||||||
|
|
@ -31456,14 +31456,14 @@
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018442123" ID="ID_829730232" MODIFIED="1536018463121" TEXT="Abkürzung für direkten Match">
|
<node COLOR="#338800" CREATED="1536018442123" ID="ID_829730232" MODIFIED="1536329759111" TEXT="Abkürzung für direkten Match">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018985450" ID="ID_1700266521" MODIFIED="1536019004173" TEXT="Wert-Typ deduzieren">
|
<node COLOR="#338800" CREATED="1536018985450" ID="ID_1700266521" MODIFIED="1536329755895" TEXT="Wert-Typ deduzieren">
|
||||||
<arrowlink DESTINATION="ID_1619721301" ENDARROW="Default" ENDINCLINATION="129;0;" ID="Arrow_ID_1721152439" STARTARROW="None" STARTINCLINATION="76;-5;"/>
|
<arrowlink DESTINATION="ID_1619721301" ENDARROW="Default" ENDINCLINATION="129;0;" ID="Arrow_ID_1721152439" STARTARROW="None" STARTINCLINATION="76;-5;"/>
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536019008151" ID="ID_29813547" MODIFIED="1536019026064" TEXT="equality comparision in Lambda">
|
<node COLOR="#338800" CREATED="1536019008151" ID="ID_29813547" MODIFIED="1536329757422" TEXT="equality comparision in Lambda">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018471975" ID="ID_1115030606" MODIFIED="1536018481902" TEXT="Variante für bidirektionale Suche">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018471975" ID="ID_1115030606" MODIFIED="1536018481902" TEXT="Variante für bidirektionale Suche">
|
||||||
|
|
@ -31484,8 +31484,8 @@
|
||||||
<icon BUILTIN="idea"/>
|
<icon BUILTIN="idea"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018539621" ID="ID_1857591081" MODIFIED="1536018556917" TEXT="simpleSearch()">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018539621" ID="ID_1857591081" MODIFIED="1536329779734" TEXT="simpleSearch()">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="pencil"/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018544936" ID="ID_1750921303" MODIFIED="1536018557580" TEXT="chainedIteration()">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018544936" ID="ID_1750921303" MODIFIED="1536018557580" TEXT="chainedIteration()">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue