TreeExplorer: rename and refactor for readability
...while this implementation works now, it is still very complex and intricate. I am still doubtful this is a good approach, but well, we need to try that route....
This commit is contained in:
parent
bb948bff34
commit
76a11b3730
2 changed files with 54 additions and 47 deletions
|
|
@ -92,6 +92,7 @@ namespace lib {
|
||||||
using std::move;
|
using std::move;
|
||||||
using std::forward;
|
using std::forward;
|
||||||
using std::function;
|
using std::function;
|
||||||
|
using util::isnil;
|
||||||
|
|
||||||
namespace iter_explorer {
|
namespace iter_explorer {
|
||||||
|
|
||||||
|
|
@ -235,7 +236,6 @@ namespace lib {
|
||||||
using meta::_Fun;
|
using meta::_Fun;
|
||||||
using std::__and_;
|
using std::__and_;
|
||||||
using std::__not_;
|
using std::__not_;
|
||||||
using std::is_constructible;
|
|
||||||
using meta::can_IterForEach;
|
using meta::can_IterForEach;
|
||||||
using meta::can_STL_ForEach;
|
using meta::can_STL_ForEach;
|
||||||
|
|
||||||
|
|
@ -287,37 +287,7 @@ namespace lib {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template<class SIG, class ARG, class SEL =void>
|
|
||||||
struct ArgAccessor
|
|
||||||
{
|
|
||||||
using FunArg = typename std::remove_reference<
|
|
||||||
typename _Fun<SIG>::Args::List::Head>::type;
|
|
||||||
static_assert (std::is_convertible<ARG, FunArg>::value,
|
|
||||||
"the expansion functor must accept the source iterator or state core as parameter");
|
|
||||||
|
|
||||||
static auto accessor() { return [](ARG& arg) -> ARG& { return arg; }; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class SIG, class IT>
|
|
||||||
struct ArgAccessor<SIG, IT, enable_if<std::is_convertible<typename IT::value_type, typename _Fun<SIG>::Args::List::Head>>>
|
|
||||||
{
|
|
||||||
static auto accessor() { return [](auto iter) { return *iter; }; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class SIG>
|
|
||||||
struct ExpaFunc
|
|
||||||
{
|
|
||||||
function<SIG> expandFun;
|
|
||||||
|
|
||||||
template<typename ARG>
|
|
||||||
auto
|
|
||||||
operator() (ARG& arg)
|
|
||||||
{
|
|
||||||
auto accessArg = ArgAccessor<SIG,ARG>::accessor();
|
|
||||||
|
|
||||||
return expandFun (accessArg (arg));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class FUN, typename SRC>
|
template<class FUN, typename SRC>
|
||||||
struct _ExpansionTraits
|
struct _ExpansionTraits
|
||||||
|
|
@ -337,17 +307,43 @@ namespace lib {
|
||||||
};
|
};
|
||||||
|
|
||||||
using Sig = typename FunDetector<FUN>::Sig;
|
using Sig = typename FunDetector<FUN>::Sig;
|
||||||
|
using Arg = typename _Fun<Sig>::Args::List::Head;
|
||||||
|
using Res = typename _Fun<Sig>::Ret;
|
||||||
|
|
||||||
using ExpandedChildren = typename _Fun<Sig>::Ret;
|
using ResultIter = typename _TreeExplorerTraits<Res>::SrcIter;
|
||||||
|
|
||||||
using Core = typename _TreeExplorerTraits<ExpandedChildren>::SrcIter;
|
static_assert (std::is_convertible<typename ResultIter::value_type, typename SRC::value_type>::value,
|
||||||
|
|
||||||
static_assert (std::is_convertible<typename Core::value_type, typename SRC::value_type>::value,
|
|
||||||
"the iterator from the expansion must yield compatible values");
|
"the iterator from the expansion must yield compatible values");
|
||||||
|
|
||||||
// using Arg = typename _Fun<Sig>::Args::List::Head;
|
template<class ARG, class SEL =void>
|
||||||
|
struct ArgAccessor
|
||||||
|
{
|
||||||
|
using FunArgType = typename std::remove_reference<Arg>::type;
|
||||||
|
static_assert (std::is_convertible<ARG, FunArgType>::value,
|
||||||
|
"the expansion functor must accept the source iterator or state core as parameter");
|
||||||
|
|
||||||
|
static auto build() { return [](ARG& arg) -> ARG& { return arg; }; }
|
||||||
|
};
|
||||||
|
|
||||||
using Functor = ExpaFunc<Sig>;
|
template<class IT>
|
||||||
|
struct ArgAccessor<IT, enable_if<std::is_convertible<typename IT::value_type, Arg>>>
|
||||||
|
{
|
||||||
|
static auto build() { return [](auto iter) { return *iter; }; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Functor
|
||||||
|
{
|
||||||
|
function<Sig> expandFun;
|
||||||
|
|
||||||
|
template<typename ARG>
|
||||||
|
auto
|
||||||
|
operator() (ARG& arg)
|
||||||
|
{
|
||||||
|
auto accessArg = ArgAccessor<ARG>::build();
|
||||||
|
|
||||||
|
return expandFun (accessArg (arg));
|
||||||
|
}
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
}//(End) TreeExplorer traits
|
}//(End) TreeExplorer traits
|
||||||
|
|
@ -361,12 +357,12 @@ namespace lib {
|
||||||
: public SRC
|
: public SRC
|
||||||
{
|
{
|
||||||
using SrcIter = typename SRC::SrcIter;
|
using SrcIter = typename SRC::SrcIter;
|
||||||
using _Config = _ExpansionTraits<FUN,SrcIter>;
|
using _Traits = _ExpansionTraits<FUN,SrcIter>;
|
||||||
using Core = typename _Config::Core;
|
using ResIter = typename _Traits::ResultIter;
|
||||||
using ExpandFunctor = typename _Config::Functor;
|
using ExpandFunctor = typename _Traits::Functor;
|
||||||
|
|
||||||
ExpandFunctor expandChildren_;
|
ExpandFunctor expandChildren_;
|
||||||
IterStack<Core> expansions_;
|
IterStack<ResIter> expansions_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Expander() =default;
|
Expander() =default;
|
||||||
|
|
@ -385,10 +381,10 @@ namespace lib {
|
||||||
{
|
{
|
||||||
REQUIRE (checkPoint(*this), "attempt to expand an empty explorer");
|
REQUIRE (checkPoint(*this), "attempt to expand an empty explorer");
|
||||||
|
|
||||||
Core expanded = 0 < depth()? expandChildren_(*expansions_)
|
ResIter expanded = 0 < depth()? expandChildren_(*expansions_)
|
||||||
: expandChildren_(*this);
|
: expandChildren_(*this);
|
||||||
iterNext (*this); // consume current head element
|
iterNext (*this); // consume current head element
|
||||||
if (expanded.isValid())
|
if (not isnil(expanded))
|
||||||
expansions_.push (move(expanded));
|
expansions_.push (move(expanded));
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
|
|
@ -443,8 +439,7 @@ namespace lib {
|
||||||
*
|
*
|
||||||
* @todo WIP -- preliminary draft as of 11/2017
|
* @todo WIP -- preliminary draft as of 11/2017
|
||||||
*/
|
*/
|
||||||
template<class SRC
|
template<class SRC>
|
||||||
>
|
|
||||||
class TreeExplorer
|
class TreeExplorer
|
||||||
: public SRC
|
: public SRC
|
||||||
{
|
{
|
||||||
|
|
@ -488,6 +483,7 @@ namespace lib {
|
||||||
|
|
||||||
return ExpandableExplorer{move(*this), forward<FUN>(expandFunctor)};
|
return ExpandableExplorer{move(*this), forward<FUN>(expandFunctor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5348,6 +5348,16 @@
|
||||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||||
<icon BUILTIN="clanbomber"/>
|
<icon BUILTIN="clanbomber"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1511578305427" ID="ID_1738957205" MODIFIED="1511578318339" TEXT="alle technischen Details in die Traits">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1511578319810" ID="ID_1918720180" MODIFIED="1511578346703" TEXT="unterstützte Varianten dokumentieren">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1511578330448" ID="ID_1808038526" MODIFIED="1511578396263" TEXT="alle unterstützten Varianten im Test abdecken">
|
||||||
|
<arrowlink COLOR="#b65d79" DESTINATION="ID_1298407683" ENDARROW="Default" ENDINCLINATION="-33;-51;" ID="Arrow_ID_1214344498" STARTARROW="None" STARTINCLINATION="-292;0;"/>
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -5374,7 +5384,8 @@
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510969031379" ID="ID_1298407683" MODIFIED="1510969041717" TEXT="verify_expandOperation();">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510969031379" ID="ID_1298407683" MODIFIED="1511578384759" TEXT="verify_expandOperation();">
|
||||||
|
<linktarget COLOR="#b65d79" DESTINATION="ID_1298407683" ENDARROW="Default" ENDINCLINATION="-33;-51;" ID="Arrow_ID_1214344498" SOURCE="ID_1808038526" STARTARROW="None" STARTINCLINATION="-292;0;"/>
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
<node COLOR="#338800" CREATED="1511227813712" ID="ID_942570698" MODIFIED="1511228177906" TEXT="Fall-1">
|
<node COLOR="#338800" CREATED="1511227813712" ID="ID_942570698" MODIFIED="1511228177906" TEXT="Fall-1">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue