From cbb35d716125e716ff891446cf5dffdd0f35ff7d Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sun, 19 Nov 2017 17:35:00 +0100 Subject: [PATCH] TreeExplorer: add shortcut to adapt STL container automatically ...selecting the iterator or const iterator as apropriate --- src/lib/iter-tree-explorer.hpp | 42 +++++++++++++++++++---- tests/library/iter-tree-explorer-test.cpp | 6 ++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/lib/iter-tree-explorer.hpp b/src/lib/iter-tree-explorer.hpp index 7afb82231..31e95f695 100644 --- a/src/lib/iter-tree-explorer.hpp +++ b/src/lib/iter-tree-explorer.hpp @@ -147,16 +147,42 @@ namespace lib { /////TODO RLY? - using util::unConst; - using lib::meta::enable_if; - using lib::meta::disable_if; - using std::function; - using meta::_Fun; +// using util::unConst; +// using lib::meta::enable_if; +// using lib::meta::disable_if; +// using std::function; +// using meta::_Fun; + template + using iterator = typename meta::Strip::TypeReferred::iterator; + template + using const_iterator = typename meta::Strip::TypeReferred::const_iterator; + template + struct StlRange + : RangeIter> + { + StlRange() =default; + StlRange (CON& container) + : RangeIter> {begin(container), end(container)} + { } + // standard copy operations acceptable + }; + + template + struct StlRange + : RangeIter> + { + StlRange() =default; + StlRange (CON const& container) + : RangeIter> {begin(container), end(container)} + { } + // standard copy operations acceptable + }; }//(End) namespace iter_explorer : predefined policies and configurations - namespace { + + namespace { // TreeExplorer traits using meta::enable_if; using meta::Yes_t; @@ -209,7 +235,9 @@ namespace lib { template struct _TreeExplorerTraits>> { - static_assert (!sizeof(SRC), "PLING: STL Iter"); + static_assert (not std::is_rvalue_reference::value, + "container needs to exist elsewhere during the lifetime of the iteration"); + using SrcIter = iter_explorer::StlRange; }; }//(End) TreeExplorer traits diff --git a/tests/library/iter-tree-explorer-test.cpp b/tests/library/iter-tree-explorer-test.cpp index 0ebd38b36..dde2e6fd3 100644 --- a/tests/library/iter-tree-explorer-test.cpp +++ b/tests/library/iter-tree-explorer-test.cpp @@ -292,6 +292,12 @@ namespace test{ CHECK (materialise(ii) == "-2-3--5-8--13"); CHECK (materialise(jj) == "3--5-8--13"); + + // can adapt STL container automatically + auto kk = treeExplore(numz); + CHECK (!isnil (kk)); + CHECK (1 == *kk); + CHECK (materialise(kk) == "1--2-3--5-8--13"); }