ChainSearch: draft a solution how to construct the Expand functor type
...now matters start to get really nasty, since we have to pick up an infered type from a partially built pipeline and use it to construct the signature for a functor to bind into the more elaborate complete pipeline
This commit is contained in:
parent
6834c26470
commit
a52ed91de0
3 changed files with 230 additions and 32 deletions
|
|
@ -61,11 +61,20 @@ namespace lib {
|
|||
|
||||
template<class SRC>
|
||||
auto
|
||||
buildSearchFilter(SRC&& dataSource)
|
||||
buildSearchFilter (SRC&& dataSource)
|
||||
{
|
||||
return treeExplore (forward<SRC> (dataSource))
|
||||
.mutableFilter();
|
||||
}
|
||||
|
||||
template<class SRC, class FUN>
|
||||
auto
|
||||
buildExplorer (SRC&& dataSource, FUN&& expandFunctor)
|
||||
{
|
||||
return buildSearchFilter (forward<SRC> (dataSource))
|
||||
.expand (forward<FUN> (expandFunctor))
|
||||
.expandAll();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -74,10 +83,12 @@ namespace lib {
|
|||
template<class SRC>
|
||||
class _IterChainSetup
|
||||
{
|
||||
using Filter = decltype( buildSearchFilter (std::declval<SRC>()) );
|
||||
|
||||
using StepFunctor = typename iter_explorer::_BoundFunctor<Filter(Filter const&), Filter>::Functor;
|
||||
|
||||
public:
|
||||
using Pipeline = decltype( buildSearchFilter (std::declval<SRC>()) );
|
||||
using Pipeline = decltype( buildExplorer (std::declval<SRC>(), std::declval<StepFunctor>()) );
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -102,6 +113,7 @@ namespace lib {
|
|||
// using _Parent = IterStateWrapper<typename _Core::value_type, _Core>;
|
||||
|
||||
public:
|
||||
using DebugPipeline = _Base;
|
||||
// IterChainSearch() =default;
|
||||
// IterChainSearch (IterChainSearch&&) =default;
|
||||
// IterChainSearch (IterChainSearch const&) =default;
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ namespace test{
|
|||
///////////////////////////////////////////////////TODO WIP
|
||||
using Searcher = decltype(search);
|
||||
SHOW_TYPE (Searcher);
|
||||
SHOW_TYPE (Searcher::DebugPipeline);
|
||||
SHOW_TYPE (Searcher::value_type);
|
||||
SHOW_TYPE (Searcher::pointer);
|
||||
|
||||
|
|
|
|||
|
|
@ -25107,8 +25107,7 @@
|
|||
match("a").after("b") scheitert, weil sich die Suche am ersten "a" festbeißt.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1535835709996" ID="ID_239175550" MODIFIED="1535835723893" TEXT="wir brauchen zwingend eine Art Stack">
|
||||
|
|
@ -30761,8 +30760,7 @@
|
|||
...von der entsprechenden Methode im Transformer
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
<node CREATED="1535894292222" ID="ID_1328694952" MODIFIED="1535894370745" TEXT="vermutlich im Test übersehen">
|
||||
|
|
@ -30778,8 +30776,7 @@
|
|||
und im Unit-Test nur für die Kombination Transformer + Explorer abgedeckt....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535894385009" ID="ID_1130325761" MODIFIED="1535898198283" TEXT="Testfall schreiben">
|
||||
|
|
@ -30804,8 +30801,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1535893231835" ID="ID_637460742" MODIFIED="1535893326431" TEXT="Such-Prädikate auf EventLog">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -30829,8 +30825,7 @@
|
|||
hinter der sich eine verkettete Suche mit Backtracking verbirgt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535893353955" ID="ID_1665477644" MODIFIED="1535893590393" TEXT="bestehende Lösung umstellen">
|
||||
<linktarget COLOR="#cc3e57" DESTINATION="ID_1665477644" ENDARROW="Default" ENDINCLINATION="-4110;-2852;" ID="Arrow_ID_1163013232" SOURCE="ID_1626597975" STARTARROW="None" STARTINCLINATION="1631;0;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
|
|
@ -30855,8 +30850,7 @@
|
|||
sofern längerfristig Itertools durch TreeExplorer abgelöst werden könnte
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535903530421" ID="ID_384303362" MODIFIED="1535932193036" TEXT="Aua">
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
|
|
@ -30900,8 +30894,7 @@
|
|||
Diese wird dann per Value gecaptured, was die gewünschte Kopie bewirkt.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1535904168943" ID="ID_1936705749" MODIFIED="1535904249188" TEXT="eine unnötige Kopie">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -30925,8 +30918,7 @@
|
|||
(und auch dafür ist die Syntax grausam)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535904461720" FOLDED="true" ID="ID_317840110" MODIFIED="1535932207865" TEXT="will ich das wirklich.....?">
|
||||
|
|
@ -30940,8 +30932,7 @@
|
|||
...es soll bloß einfach funktionieren!!!!!!!!!!!
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1535906366785" ID="ID_1488862884" MODIFIED="1535906388442" TEXT="Komplexität entsteht aus der Flexibilität der Argumente">
|
||||
|
|
@ -30972,8 +30963,7 @@
|
|||
die Itertools komplett durch den TreeExplorer ablösen zu können
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -31046,8 +31036,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -31145,8 +31134,7 @@
|
|||
...so daß es nur noch wenige Zugangs-Punkte zum unterliegenden Iterator gibt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535934121614" ID="ID_757923717" MODIFIED="1535937964888" TEXT="umstellen von IterTools -> TreeExplorer">
|
||||
|
|
@ -31165,8 +31153,7 @@
|
|||
und außerdem haben wir nun ein direktes API für die Laufrichtung
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -31193,8 +31180,7 @@
|
|||
<u>Invariante</u>: <b>pullMatch</b>()
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1535894029921" ID="ID_152779506" MODIFIED="1535894037411" TEXT="den Stack schrittweise hochsteigen"/>
|
||||
</node>
|
||||
|
|
@ -31235,8 +31221,207 @@
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018406232" ID="ID_1330264339" MODIFIED="1536018459425" TEXT="Schritte als Funktoren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018684754" ID="ID_1076606298" MODIFIED="1536018696034" TEXT="geeignete Signatur für die Schritt-Funktoren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018684754" ID="ID_1076606298" MODIFIED="1536273597914" TEXT="geeignete Signatur für die Schritt-Funktoren">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1536184281271" ID="ID_1736323474" MODIFIED="1536184299802" TEXT="Problem: Funktor-Signatur zu Beginn nicht bekannt">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1536184313018" ID="ID_306473960" MODIFIED="1536184367056" TEXT="es würde genügen, wenn der Werttyp kompatibel ist">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1536184383689" ID="ID_1457889497" MODIFIED="1536184509943">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
wir <i>müssen </i>hier eine Festlegung treffen
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...weil die Ergebnisse der einzelnen Schritt-Funktoren,
|
||||
</p>
|
||||
<p>
|
||||
jeweils in den Auswertungs-Stack gepackt werden sollen.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Daher müssen sie untereinander kompatibel sein.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1536184509936" ID="ID_936035440" MODIFIED="1536184832177" TEXT="pragmatische Wahl: Kopie des Basis-Filters">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
im typischen Fall kopiert man den Basis-Iterator,
|
||||
</p>
|
||||
<p>
|
||||
und manipuliert dann einige Einstellungen auf diesem.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Wir könnten diese Kopie-Semantik sogar <i>erzwingen,</i>
|
||||
</p>
|
||||
<p>
|
||||
indem wir als Argument-Typ des Schritt-Funktors eine const& vorgeben
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1536185340920" ID="ID_1706168706" MODIFIED="1536185362297" TEXT="also: konstruiere Pipeline mit Filter"/>
|
||||
<node CREATED="1536185364045" ID="ID_301562283" MODIFIED="1536185381295" TEXT="dann: Filter -> Filter als Funktor vorgeben"/>
|
||||
<node COLOR="#338800" CREATED="1536194368432" ID="ID_665607293" MODIFIED="1536273432151" TEXT="kniffelig in der Praxis">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
<node CREATED="1536194407802" ID="ID_752443094" MODIFIED="1536194421332" TEXT="der "Filter"-Typ ist in einen TreeExplorer gewrappt"/>
|
||||
<node CREATED="1536194422544" ID="ID_1594827200" MODIFIED="1536194440618" TEXT="konkret ist der Quell-Typ aber nur ein IterableDecorator"/>
|
||||
<node CREATED="1536194493975" ID="ID_1706559693" MODIFIED="1536194563398" TEXT="und der doppelt gewrappter Funktor....">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...den ich mache, um den Adapter in jedem Einzelfall zu bekommen
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1536194565261" ID="ID_892309176" MODIFIED="1536194581751" TEXT="...führt dazu, daß der innere Funktor ein Template ist"/>
|
||||
<node CREATED="1536194582411" ID="ID_427362932" MODIFIED="1536194600916" TEXT="und deshalb mit IterableDecorator& ge-probed wird"/>
|
||||
<node CREATED="1536195443615" ID="ID_1532213156" MODIFIED="1536195450119" TEXT="Problem">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1536195452006" ID="ID_1758963929" MODIFIED="1536195513457" TEXT="IterableDecorator hat einen Wildcard-Konstruktor"/>
|
||||
<node CREATED="1536195515142" ID="ID_207755200" MODIFIED="1536271102169" TEXT="deshalb scheint die Konvertierung string -> IterableDecorator möglich">
|
||||
<linktarget COLOR="#d83e76" DESTINATION="ID_207755200" ENDARROW="Default" ENDINCLINATION="262;10;" ID="Arrow_ID_1979852913" SOURCE="ID_360255766" STARTARROW="None" STARTINCLINATION="262;5;"/>
|
||||
</node>
|
||||
<node CREATED="1536195621631" ID="ID_1458745075" MODIFIED="1536195633265" TEXT="...was dann aber im eingewickelten MutableFunctor scheitert"/>
|
||||
<node CREATED="1536195633854" ID="ID_1469022446" MODIFIED="1536195641136" TEXT="(und ohnehin ein Schmarrrn wäre)"/>
|
||||
</node>
|
||||
<node CREATED="1536195694269" ID="ID_260759561" MODIFIED="1536273228593" TEXT="Lösung?">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1536195707299" ID="ID_1061111376" MODIFIED="1536273251780" TEXT="der innere Funktor ist generisch">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1536195819221" ID="ID_730902625" MODIFIED="1536270305176" TEXT="auf den flexiblen Adapter verzichten">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1536270307241" ID="ID_1232849452" MODIFIED="1536270310156" TEXT="bringt nix"/>
|
||||
<node CREATED="1536270310936" ID="ID_1638227415" MODIFIED="1536270381734" TEXT="string -> IterableDecorator greift trotzdem">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
....und fällt dann beim Instantiieren des Template auf die Schnautze
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1536271061916" ID="ID_360255766" MODIFIED="1536271107605" TEXT="ist ein grundsätzliches Problem">
|
||||
<arrowlink COLOR="#d83e76" DESTINATION="ID_207755200" ENDARROW="Default" ENDINCLINATION="262;10;" ID="Arrow_ID_1979852913" STARTARROW="None" STARTINCLINATION="262;5;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1536271137786" ID="ID_618430280" MODIFIED="1536273236978" TEXT="Fehl-Konvertierung gezielt unterbinden">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1536271169845" ID="ID_481868916" MODIFIED="1536271374301">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
sofern eine Initialisierung ausidem Source-Iterator <i>möglich ist</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1536271209768" ID="ID_1767817102" MODIFIED="1536271396476" TEXT="...weil es dann grundsätzch nicht notwendig ist, eigens etwas zu tun"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1536273280517" ID="ID_422856174" MODIFIED="1536273415840">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
und sonst ist das <i>nicht wirklich</i> "kniffelig"
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...bloß sind die zig-fach geschachtelten Template-Typen,
|
||||
</p>
|
||||
<p>
|
||||
die dann die Intantiierungs-Call-Hierarchie bevölkern,
|
||||
</p>
|
||||
<p>
|
||||
nahezu unlesbar....
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
AAber ... wenn es erst mal duch den Compiler ist,
|
||||
</p>
|
||||
<p>
|
||||
dann <i>sollte </i>der Optimizer diese gesamten x-fachen Wrapper nahezu restlos entfernen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="smiley-neutral"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1536273453876" ID="ID_1094128800" MODIFIED="1536273496418" TEXT="verwende nun BoundFunctor<Filter(Filter const&)> als Signatur">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1536273527418" ID="ID_180233427" MODIFIED="1536273554776">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Konsequenz: jede Argument-Funktion wird <i>nochmal</i> gewrappt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1536273556422" ID="ID_368248341" MODIFIED="1536273569201" TEXT="...und kann damit auch ein generisches Lambda sein">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536018696977" ID="ID_1710558292" MODIFIED="1536018702049" TEXT="Sequenz solcher Funktoren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue