diff --git a/src/lib/iter-tree-explorer.hpp b/src/lib/iter-tree-explorer.hpp index dfdfac94a..7fa5a0f84 100644 --- a/src/lib/iter-tree-explorer.hpp +++ b/src/lib/iter-tree-explorer.hpp @@ -93,7 +93,7 @@ namespace lib { using std::forward; using std::function; - namespace iter_source { + namespace iter_explorer { template using iterator = typename meta::Strip::TypeReferred::iterator; @@ -229,6 +229,7 @@ namespace lib { namespace { // TreeExplorer traits using meta::enable_if; + using meta::disable_if; using meta::Yes_t; using meta::No_t; using meta::_Fun; @@ -268,7 +269,7 @@ namespace lib { struct _TreeExplorerTraits>> { using SrcVal = typename std::remove_reference()))>::type; - using SrcIter = iter_source::IterableDecorator; + using SrcIter = iter_explorer::IterableDecorator; }; template @@ -282,7 +283,7 @@ namespace lib { { static_assert (not std::is_rvalue_reference::value, "container needs to exist elsewhere during the lifetime of the iteration"); - using SrcIter = iter_source::StlRange; + using SrcIter = iter_explorer::StlRange; }; @@ -317,29 +318,44 @@ namespace lib { } }; - template + template struct _ExpansionTraits { - using ExpandedChildren = typename _Fun::Ret; + template + struct FunDetector + { + using Sig = typename _Fun::Sig; + }; + + template + struct FunDetector> > + { + using Ret = decltype(std::declval() (std::declval())); + using Sig = Ret(IT); + }; + + using Sig = typename FunDetector::Sig; + + using ExpandedChildren = typename _Fun::Ret; using Core = typename _TreeExplorerTraits::SrcIter; - using Arg = typename _Fun::Args::List::Head; + using Arg = typename _Fun::Args::List::Head; - using Functor = ExpaFunc; + using Functor = ExpaFunc; }; }//(End) TreeExplorer traits - namespace iter_source { + namespace iter_explorer { - template + template class Expander : public SRC { - using _Config = _ExpansionTraits; + using _Config = _ExpansionTraits; using Core = typename _Config::Core; using ExpandFunctor = typename _Config::Functor; @@ -353,7 +369,6 @@ namespace lib { Expander() =default; // inherited default copy operations - template Expander (SRC&& parentExplorer, FUN&& expandFunctor) : SRC{move (parentExplorer)} , expandChildren_{forward (expandFunctor)} @@ -461,12 +476,11 @@ namespace lib { auto expand (FUN&& expandFunctor) { - using FunSig = typename meta::_Fun::Sig; using This = typename meta::Strip::TypeReferred; using Value = typename This::value_type; - using Core = iter_source::Expander; + using Core = iter_explorer::Expander; - using ExpandableExplorer = iter_source::IterableDecorator; + using ExpandableExplorer = iter_explorer::IterableDecorator; return ExpandableExplorer{move(*this), forward(expandFunctor)}; }