TreeExplorer: Sketch how it might be possible to accept generic lambdas
...based on the research from yesterday
This commit is contained in:
parent
3614085ff7
commit
4098e2024d
1 changed files with 28 additions and 14 deletions
|
|
@ -93,7 +93,7 @@ namespace lib {
|
||||||
using std::forward;
|
using std::forward;
|
||||||
using std::function;
|
using std::function;
|
||||||
|
|
||||||
namespace iter_source {
|
namespace iter_explorer {
|
||||||
|
|
||||||
template<class CON>
|
template<class CON>
|
||||||
using iterator = typename meta::Strip<CON>::TypeReferred::iterator;
|
using iterator = typename meta::Strip<CON>::TypeReferred::iterator;
|
||||||
|
|
@ -229,6 +229,7 @@ namespace lib {
|
||||||
namespace { // TreeExplorer traits
|
namespace { // TreeExplorer traits
|
||||||
|
|
||||||
using meta::enable_if;
|
using meta::enable_if;
|
||||||
|
using meta::disable_if;
|
||||||
using meta::Yes_t;
|
using meta::Yes_t;
|
||||||
using meta::No_t;
|
using meta::No_t;
|
||||||
using meta::_Fun;
|
using meta::_Fun;
|
||||||
|
|
@ -268,7 +269,7 @@ namespace lib {
|
||||||
struct _TreeExplorerTraits<SRC, enable_if<is_StateCore<SRC>>>
|
struct _TreeExplorerTraits<SRC, enable_if<is_StateCore<SRC>>>
|
||||||
{
|
{
|
||||||
using SrcVal = typename std::remove_reference<decltype(yield (std::declval<SRC>()))>::type;
|
using SrcVal = typename std::remove_reference<decltype(yield (std::declval<SRC>()))>::type;
|
||||||
using SrcIter = iter_source::IterableDecorator<SrcVal, SRC>;
|
using SrcIter = iter_explorer::IterableDecorator<SrcVal, SRC>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class SRC>
|
template<class SRC>
|
||||||
|
|
@ -282,7 +283,7 @@ namespace lib {
|
||||||
{
|
{
|
||||||
static_assert (not std::is_rvalue_reference<SRC>::value,
|
static_assert (not std::is_rvalue_reference<SRC>::value,
|
||||||
"container needs to exist elsewhere during the lifetime of the iteration");
|
"container needs to exist elsewhere during the lifetime of the iteration");
|
||||||
using SrcIter = iter_source::StlRange<SRC>;
|
using SrcIter = iter_explorer::StlRange<SRC>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -317,29 +318,44 @@ namespace lib {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class SIG, typename VAL>
|
template<class FUN, typename IT>
|
||||||
struct _ExpansionTraits
|
struct _ExpansionTraits
|
||||||
{
|
{
|
||||||
using ExpandedChildren = typename _Fun<SIG>::Ret;
|
template<typename F, typename SEL =void>
|
||||||
|
struct FunDetector
|
||||||
|
{
|
||||||
|
using Sig = typename _Fun<F>::Sig;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename F>
|
||||||
|
struct FunDetector<F, disable_if<_Fun<F>> >
|
||||||
|
{
|
||||||
|
using Ret = decltype(std::declval<F>() (std::declval<IT>()));
|
||||||
|
using Sig = Ret(IT);
|
||||||
|
};
|
||||||
|
|
||||||
|
using Sig = typename FunDetector<FUN>::Sig;
|
||||||
|
|
||||||
|
using ExpandedChildren = typename _Fun<Sig>::Ret;
|
||||||
|
|
||||||
using Core = typename _TreeExplorerTraits<ExpandedChildren>::SrcIter;
|
using Core = typename _TreeExplorerTraits<ExpandedChildren>::SrcIter;
|
||||||
|
|
||||||
using Arg = typename _Fun<SIG>::Args::List::Head;
|
using Arg = typename _Fun<Sig>::Args::List::Head;
|
||||||
|
|
||||||
using Functor = ExpaFunc<SIG>;
|
using Functor = ExpaFunc<Sig>;
|
||||||
};
|
};
|
||||||
|
|
||||||
}//(End) TreeExplorer traits
|
}//(End) TreeExplorer traits
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace iter_source {
|
namespace iter_explorer {
|
||||||
|
|
||||||
template<class SRC, class SIG>
|
template<class SRC, class FUN>
|
||||||
class Expander
|
class Expander
|
||||||
: public SRC
|
: public SRC
|
||||||
{
|
{
|
||||||
using _Config = _ExpansionTraits<SIG, typename SRC::value_type>;
|
using _Config = _ExpansionTraits<FUN,SRC>;
|
||||||
using Core = typename _Config::Core;
|
using Core = typename _Config::Core;
|
||||||
using ExpandFunctor = typename _Config::Functor;
|
using ExpandFunctor = typename _Config::Functor;
|
||||||
|
|
||||||
|
|
@ -353,7 +369,6 @@ namespace lib {
|
||||||
Expander() =default;
|
Expander() =default;
|
||||||
// inherited default copy operations
|
// inherited default copy operations
|
||||||
|
|
||||||
template<typename FUN>
|
|
||||||
Expander (SRC&& parentExplorer, FUN&& expandFunctor)
|
Expander (SRC&& parentExplorer, FUN&& expandFunctor)
|
||||||
: SRC{move (parentExplorer)}
|
: SRC{move (parentExplorer)}
|
||||||
, expandChildren_{forward<FUN> (expandFunctor)}
|
, expandChildren_{forward<FUN> (expandFunctor)}
|
||||||
|
|
@ -461,12 +476,11 @@ namespace lib {
|
||||||
auto
|
auto
|
||||||
expand (FUN&& expandFunctor)
|
expand (FUN&& expandFunctor)
|
||||||
{
|
{
|
||||||
using FunSig = typename meta::_Fun<FUN>::Sig;
|
|
||||||
using This = typename meta::Strip<decltype(*this)>::TypeReferred;
|
using This = typename meta::Strip<decltype(*this)>::TypeReferred;
|
||||||
using Value = typename This::value_type;
|
using Value = typename This::value_type;
|
||||||
using Core = iter_source::Expander<This, FunSig>;
|
using Core = iter_explorer::Expander<This, FUN>;
|
||||||
|
|
||||||
using ExpandableExplorer = iter_source::IterableDecorator<Value, Core>;
|
using ExpandableExplorer = iter_explorer::IterableDecorator<Value, Core>;
|
||||||
|
|
||||||
return ExpandableExplorer{move(*this), forward<FUN>(expandFunctor)};
|
return ExpandableExplorer{move(*this), forward<FUN>(expandFunctor)};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue