TreeExplorer: clean-up after refactoring

So we have now a reworked version of the internals of TreeExplorer in place.
It should be easier to debug template instantation traces now, since most
of the redundancy on the type parameters could be remove. Moreover, existing
pipelines can now be re-assigned with similarily built pipelines in many cases,
since the concrete type of the functor is now erased.

The price tag for this refactoring is that we have now to perform a call
through a function pointer on each functor invocation (due to the type erasure).
And seemingly the bloat in the debugging information has been increased slightly
(this overhead is removed by stripping the binary)
This commit is contained in:
Fischlurch 2018-09-09 20:44:32 +02:00
parent 9067740456
commit 7cdd680e78
4 changed files with 62 additions and 63 deletions

View file

@ -93,10 +93,8 @@ namespace iter {
struct _IterChainSetup
{
using Filter = decltype( buildSearchFilter(std::declval<SRC>()).asIterator() );
using StepFunctor = std::function<Filter(Filter const&)>;
using StepWrapper = typename iter_explorer::_FunTraits<Filter(Filter const&), Filter const&>::Functor;
// ^^^^^^^^^^^^^ used as argument on generic lambda
using Pipeline = decltype( buildExplorer (std::declval<SRC>(), std::declval<StepFunctor>()) );
static Pipeline
@ -130,7 +128,7 @@ namespace iter {
using Value = typename _Base::value_type;
using Filter = typename _Trait::Filter;
using Step = typename _Trait::StepWrapper;
using Step = typename _Trait::StepFunctor;
std::vector<Step> stepChain_;

View file

@ -465,10 +465,10 @@ namespace lib {
* accepts the iterator or state core itself (the "opaque state manipulation" usage pattern).
* - we generate a suitable argument accessor function and build the function composition
* of this accessor and the provided _expansion functor_.
* - the resulting, combined functor is stored into a std::function, but wired in a way to
* keep the argument-accepting front-end still generic (templated `operator()`). This
* special adapter supports the case when the _expansion functor_ yields a child sequence
* type different but compatible to the original source sequence embedded in TreeExplorer.
* - the resulting, combined functor is stored into a std::function, thereby abstracting
* from the actual adapting mechanism. This allows to combine different kinds of functors
* within the same processing step; and in addition, it allows the processing step to
* remain agnostic with respect to the adaptation and concrete type of the functor/lambda.
* @tparam FUN either the signature, or something _"function-like"_ passed as functor to be bound
* @tparam SRC (optional) but need to specify the source iterator type to apply when passing
* a generic lambda or template as FUN. Such a generic functor will be _instantiated_
@ -509,9 +509,11 @@ namespace lib {
static_assert (std::is_convertible<ARG, FunArgType>::value,
"the bound functor must accept the source iterator or state core as parameter");
static auto build() { return [](ARG& arg) -> ARG& { return arg; }; }
static decltype(auto) wrap (FUN&& rawFunctor) { return forward<FUN> (rawFunctor); }
static decltype(auto)
wrap (FUN&& rawFunctor) ///< actually pass-through the raw functor unaltered
{
return forward<FUN> (rawFunctor);
}
};
/** adapt to a functor, which accepts the value type of the source sequence ("monadic" usage pattern) */
@ -519,9 +521,11 @@ namespace lib {
struct ArgAdapter<IT, enable_if<__and_<is_convertible<typename IT::value_type, Arg>
,__not_<is_convertible<IT, Arg>>>>> // need to exclude the latter, since IterableDecorator
{ // often seems to accept IT::value_type (while in fact it doesn't)
static auto build() { return [](auto& iter) { return *iter; }; }
static auto wrap (function<Sig> rawFun) { return [rawFun](IT& srcIter) -> Res { return rawFun(*srcIter); }; }
static auto
wrap (function<Sig> rawFun) ///< adapt by dereferencing the source iterator
{
return [rawFun](IT& srcIter) -> Res { return rawFun(*srcIter); };
}
};
/** adapt to a functor collaborating with an IterSource based iterator pipeline */
@ -532,27 +536,16 @@ namespace lib {
{
using Source = typename IT::Source;
static auto build() { return [](auto& iter) -> Source& { return iter.source(); }; }
static auto wrap (function<Sig> rawFun) { return [rawFun](IT& iter) -> Res { return rawFun(iter.source()); }; }
};
/** holder for the suitably adapted _expansion functor_ */
struct Functor
{
function<Sig> boundFunction;
template<typename ARG>
Res
operator() (ARG& arg) const
static auto
wrap (function<Sig> rawFun) ///< extract the (abstracted) IterSource
{
auto accessArg = ArgAdapter<ARG>::build();
return boundFunction (accessArg (arg));
return [rawFun](IT& iter) -> Res { return rawFun(iter.source()); };
}
};
/** builder to create a nested/wrapping functor, suitably adapting the arguments */
template<typename IT>
static auto
adaptFunctor (FUN&& rawFunctor)
@ -618,7 +611,10 @@ namespace lib {
* the source iterator wrapped by this decorator.
* @remark since we allow a lot of leeway regarding the actual form and definition of the
* _expansion functor_, there is a lot of minute technical details, mostly confined
* within the _FunTraits traits.
* within the _FunTraits traits. For the same reason, we need to prepare two different
* bindings of the passed raw functor, one to work on the source sequence, and the other
* one to work on the result sequence of a recursive child expansions; these two sequences
* need not be implemented in the same way, which simplifies the definition of algorithms.
* @tparam SRC the wrapped source iterator, typically a TreeExplorer or nested decorator.
* @tparam FUN the concrete type of the functor passed. Will be dissected to find the signature
*/
@ -653,6 +649,7 @@ namespace lib {
{ }
/** core operation: expand current head element */
void
expandChildren()
@ -1189,6 +1186,7 @@ namespace lib {
using Parent = WrappedLumieraIter<SRC>;
using Val = typename SRC::value_type; ///////////////////////////////////TICKET #1125 : get rid of Val
~PackagedTreeExplorerSource() { }
public:
using Parent::Parent;

View file

@ -428,8 +428,6 @@ namespace test{
.expand([](CountDown core){ return NumberSequence{ core.yield() - 1}; }) // expand-functor: StateCore -> Iter
);
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1118 : GDB Segfault on loading the inferior
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1118 : Generated code works just fine and passes Test though
verify_treeExpandingIterator(
treeExplore(CountDown{5})
.expand([](auto & it){ return CountDown{ *it - 1}; }) // generic Lambda: Iter& -> StateCore
@ -439,7 +437,6 @@ namespace test{
treeExplore(CountDown{5})
.expand([](auto it){ return decltype(it){ *it - 1}; }) // generic Lambda: Iter -> Iter
);
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1118 : GDB Segfault on loading the inferior
}

View file

@ -30795,8 +30795,8 @@
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node CREATED="1536410175049" ID="ID_1439541143" MODIFIED="1536410185984" TEXT="Erg&#xe4;nzungen">
<icon BUILTIN="pencil"/>
<node CREATED="1536410175049" ID="ID_1439541143" MODIFIED="1536516072058" TEXT="Erg&#xe4;nzungen">
<icon BUILTIN="button_ok"/>
<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()"/>
@ -30834,8 +30834,8 @@
<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;"/>
<node COLOR="#338800" CREATED="1535893707036" ID="ID_650057716" MODIFIED="1536516299632" TEXT="Aufgabe: Filter erweiterbar machen">
<linktarget COLOR="#62909b" DESTINATION="ID_650057716" ENDARROW="Default" ENDINCLINATION="135;198;" 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&#xf6;sen">
@ -31040,8 +31040,8 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1535919506060" ID="ID_1859852045" MODIFIED="1536410320485" TEXT="heterogene Pr&#xe4;dikat-Typen">
<arrowlink COLOR="#616f95" DESTINATION="ID_1587572708" ENDARROW="Default" ENDINCLINATION="105;-232;" ID="Arrow_ID_346491515" STARTARROW="None" STARTINCLINATION="-143;0;"/>
<node COLOR="#338800" CREATED="1535919506060" FOLDED="true" ID="ID_1859852045" MODIFIED="1536516302967" TEXT="heterogene Pr&#xe4;dikat-Typen">
<arrowlink COLOR="#616f95" DESTINATION="ID_1587572708" ENDARROW="Default" ENDINCLINATION="49;-142;" 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"/>
@ -31079,9 +31079,9 @@
</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 COLOR="#338800" CREATED="1536367874016" ID="ID_109911994" MODIFIED="1536516037376" TEXT="Filter deaktivierbar machen">
<linktarget COLOR="#67ac9b" DESTINATION="ID_109911994" ENDARROW="Default" ENDINCLINATION="1326;0;" ID="Arrow_ID_1556921295" SOURCE="ID_649387933" STARTARROW="None" STARTINCLINATION="142;0;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1535899873112" ID="ID_81164806" MODIFIED="1535932139639" TEXT="Unit-Test (replizieren)">
<icon BUILTIN="button_ok"/>
@ -31091,10 +31091,10 @@
<node COLOR="#338800" CREATED="1535913531701" ID="ID_1872325076" MODIFIED="1535932138102" TEXT="andere F&#xe4;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 COLOR="#338800" CREATED="1536410408473" ID="ID_1812410133" MODIFIED="1536515975946" TEXT="Filter deaktivieren">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1536367899301" ID="ID_1128977501" MODIFIED="1536514380198" TEXT="Neuzuweisung kompatibler Filter">
<node COLOR="#338800" CREATED="1536367899301" FOLDED="true" ID="ID_1128977501" MODIFIED="1536516280898" TEXT="Neuzuweisung kompatibler Filter">
<icon BUILTIN="button_ok"/>
<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 ">
@ -31133,10 +31133,10 @@
</node>
</node>
</node>
<node CREATED="1536409170928" ID="ID_1850744645" MODIFIED="1536409531056" TEXT="Design-Probleme">
<icon BUILTIN="bell"/>
<node COLOR="#338800" CREATED="1535919506060" ID="ID_1587572708" MODIFIED="1536514384786" TEXT="heterogene Pr&#xe4;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;"/>
<node COLOR="#435e98" CREATED="1536409170928" ID="ID_1850744645" MODIFIED="1536515953937" TEXT="Design-Probleme">
<icon BUILTIN="go"/>
<node COLOR="#338800" CREATED="1535919506060" ID="ID_1587572708" MODIFIED="1536516302968" TEXT="heterogene Pr&#xe4;dikat-Typen">
<linktarget COLOR="#616f95" DESTINATION="ID_1587572708" ENDARROW="Default" ENDINCLINATION="49;-142;" ID="Arrow_ID_346491515" SOURCE="ID_1859852045" STARTARROW="None" STARTINCLINATION="-143;0;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1535919549942" ID="ID_270773242" MODIFIED="1536409271272" TEXT="das zu Beginn verwendete Filter-Pr&#xe4;dikat legt den Typ fest">
<richcontent TYPE="NOTE"><html>
@ -31211,8 +31211,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536409302285" ID="ID_913930564" MODIFIED="1536455982782" TEXT="extrem komplexe Typen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1536409302285" ID="ID_913930564" MODIFIED="1536515894710" TEXT="extrem komplexe Typen">
<icon BUILTIN="button_ok"/>
<node CREATED="1536409316172" ID="ID_1468538186" MODIFIED="1536409340127" TEXT="Call-Traces sind nahezu unlesbar">
<richcontent TYPE="NOTE"><html>
<head>
@ -31230,7 +31230,8 @@
<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="1536409720285" FOLDED="true" ID="ID_610904065" MODIFIED="1536516268555" TEXT="Untersuchung">
<icon BUILTIN="info"/>
<node CREATED="1536409726421" ID="ID_1705785900" MODIFIED="1536409738318" TEXT="welche Typen werden wirklich ben&#xf6;tigt">
<icon BUILTIN="help"/>
<node CREATED="1536409761248" ID="ID_753549743" MODIFIED="1536409843345" TEXT="Quelle == Basis-Typ"/>
@ -31282,7 +31283,8 @@
</node>
</node>
</node>
<node CREATED="1536441211468" HGAP="84" ID="ID_435661366" MODIFIED="1536451220949" TEXT="L&#xf6;sungs-Idee" VSHIFT="15">
<node COLOR="#435e98" CREATED="1536441211468" HGAP="84" ID="ID_435661366" MODIFIED="1536515901080" TEXT="L&#xf6;sungs-Idee" VSHIFT="15">
<icon BUILTIN="idea"/>
<node CREATED="1536441217427" ID="ID_1508660342" MODIFIED="1536441270931" TEXT="die Signatur im Builder konstruieren. Traits nur noch auf Signatur abst&#xfc;tzen">
<icon BUILTIN="full-1"/>
</node>
@ -31319,8 +31321,9 @@
<node CREATED="1536441367354" ID="ID_1778093460" MODIFIED="1536441424596" TEXT="welcher eine gegebene Funktion in eine vorgegebene function&lt;SIG&gt; einpasst"/>
</node>
</node>
<node CREATED="1536451222025" HGAP="9" ID="ID_389572303" MODIFIED="1536514344935" TEXT="Umbau" VSHIFT="5">
<node COLOR="#338800" CREATED="1536451222025" HGAP="9" ID="ID_389572303" MODIFIED="1536515885403" TEXT="Umbau" VSHIFT="5">
<linktarget COLOR="#3163b8" DESTINATION="ID_389572303" ENDARROW="Default" ENDINCLINATION="1208;0;" ID="Arrow_ID_1470957358" SOURCE="ID_821501153" STARTARROW="None" STARTINCLINATION="627;32;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1536451240308" ID="ID_241157222" MODIFIED="1536451273762" TEXT="den SRC-Parameter optional machen">
<icon BUILTIN="button_ok"/>
</node>
@ -31386,7 +31389,7 @@
<node COLOR="#338800" CREATED="1536453373605" ID="ID_1544724438" MODIFIED="1536499295024" TEXT="MutableFilter">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1536453408359" ID="ID_63715215" MODIFIED="1536514221593" TEXT="Anpassen an Expander">
<node COLOR="#338800" CREATED="1536453408359" FOLDED="true" ID="ID_63715215" MODIFIED="1536515929401" TEXT="Anpassen an Expander">
<icon BUILTIN="button_ok"/>
<node CREATED="1536507478977" ID="ID_1869401041" MODIFIED="1536508603516" TEXT="zwei Alternativen">
<icon BUILTIN="info"/>
@ -31504,8 +31507,11 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536453419141" ID="ID_564310637" MODIFIED="1536453427198" TEXT="vereinfachen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1536453419141" ID="ID_564310637" MODIFIED="1536515837769" TEXT="vereinfachen">
<icon BUILTIN="button_ok"/>
<node CREATED="1536515844176" ID="ID_1550470066" MODIFIED="1536515856523" TEXT="nested Functor f&#xe4;llt weg"/>
<node CREATED="1536515857230" ID="ID_1234982362" MODIFIED="1536515868816" TEXT="zugeh&#xf6;rige Builder fallen weg"/>
<node CREATED="1536515869405" ID="ID_1548641638" MODIFIED="1536515881255" TEXT="alle darauf aufbauenden Typen sind &#xfc;berfl&#xfc;ssig"/>
</node>
</node>
</node>
@ -31564,8 +31570,8 @@
<icon BUILTIN="help"/>
</node>
</node>
<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;"/>
<node COLOR="#338800" CREATED="1535893707036" ID="ID_257876647" MODIFIED="1536516299632" TEXT="Aufgabe: Filter erweiterbar machen">
<arrowlink COLOR="#62909b" DESTINATION="ID_650057716" ENDARROW="Default" ENDINCLINATION="135;198;" ID="Arrow_ID_1700598512" STARTARROW="None" STARTINCLINATION="-412;-19;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1535899922873" ID="ID_1971708144" MODIFIED="1535937992260" TEXT="bestehende Aufrufe in EventMatch konsolidieren">
@ -32095,8 +32101,8 @@
<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;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1536367754089" ID="ID_649387933" MODIFIED="1536516051923" TEXT="im Filter-Funktor verstecken">
<arrowlink COLOR="#67ac9b" DESTINATION="ID_109911994" ENDARROW="Default" ENDINCLINATION="1326;0;" ID="Arrow_ID_1556921295" STARTARROW="None" STARTINCLINATION="142;0;"/>
<icon BUILTIN="pencil"/>
</node>
</node>