From 1e657acbffae269cd22ac2f3a9fe45fb824639bb Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sun, 9 Sep 2018 03:23:17 +0200 Subject: [PATCH] TreeExplorer: refactor Transformer to employ the improved wrapping style ...step by step switch over to the new usage pattern. Transformer should be the blueprint for all other functor usages. The reworked solutions behaves as expected; we see two functor invocations; the outer functor, which does the argument adaptation, is allocated in heap memory --- src/lib/iter-tree-explorer.hpp | 21 ++++++++------- src/lib/wrapper.hpp | 2 ++ tests/library/iter-tree-explorer-test.cpp | 1 + wiki/thinkPad.ichthyo.mm | 33 ++++++++++++++++++++--- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/lib/iter-tree-explorer.hpp b/src/lib/iter-tree-explorer.hpp index 2bf94e392..b3a18bbe0 100644 --- a/src/lib/iter-tree-explorer.hpp +++ b/src/lib/iter-tree-explorer.hpp @@ -793,32 +793,31 @@ namespace lib { * is adapted in a similar way as the "expand functor", so to detect and convert the * expected input on invocation. */ - template + template class Transformer : public SRC { static_assert(can_IterForEach::value, "Lumiera Iterator required as source"); - using _Traits = _FunTraits; - using Res = typename _Traits::Res; - using TransformFunctor = typename _Traits::Functor; - using TransformedItem = wrapper::ItemWrapper; + using TransformFunctor = function; + using TransformedItem = wrapper::ItemWrapper; TransformFunctor trafo_; TransformedItem treated_; public: - using value_type = typename meta::TypeBinding::value_type; - using reference = typename meta::TypeBinding::reference; - using pointer = typename meta::TypeBinding::pointer; + using value_type = typename meta::TypeBinding::value_type; + using reference = typename meta::TypeBinding::reference; + using pointer = typename meta::TypeBinding::pointer; Transformer() =default; // inherited default copy operations + template Transformer (SRC&& dataSrc, FUN&& transformFunctor) : SRC{move (dataSrc)} - , trafo_{forward (transformFunctor)} + , trafo_{_FunTraits::template adaptFunctor (forward (transformFunctor))} { } @@ -1437,7 +1436,9 @@ namespace lib { auto transform (FUN&& transformFunctor) { - using ResCore = iter_explorer::Transformer; + using Product = typename iter_explorer::_FunTraits::Res; + + using ResCore = iter_explorer::Transformer; using ResIter = typename _DecoratorTraits::SrcIter; return TreeExplorer (ResCore {move(*this), forward(transformFunctor)}); diff --git a/src/lib/wrapper.hpp b/src/lib/wrapper.hpp index aa66db2fe..363274fb6 100644 --- a/src/lib/wrapper.hpp +++ b/src/lib/wrapper.hpp @@ -185,11 +185,13 @@ namespace wrapper { explicit ItemWrapper(TY const& o) + : created_(false) { build (o); } explicit ItemWrapper(TY && ro) + : created_(false) { build (std::move(ro)); } diff --git a/tests/library/iter-tree-explorer-test.cpp b/tests/library/iter-tree-explorer-test.cpp index 588be76c4..914349475 100644 --- a/tests/library/iter-tree-explorer-test.cpp +++ b/tests/library/iter-tree-explorer-test.cpp @@ -517,6 +517,7 @@ namespace test{ .transform(multiply) ; + CHECK (14 == *ii); CHECK (14 == *ii); ++ii; CHECK (12 == *ii); diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index a892bba72..bab370530 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -31200,8 +31200,8 @@ - - + + @@ -31318,8 +31318,8 @@ - - + + @@ -31358,6 +31358,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + +