diff --git a/src/lib/iter-source.hpp b/src/lib/iter-source.hpp index 2444d8aa1..28429cd5d 100644 --- a/src/lib/iter-source.hpp +++ b/src/lib/iter-source.hpp @@ -261,6 +261,10 @@ namespace lib { WrappedLumieraIter (IT&& orig) : src_(forward(orig)) { } + + + protected: + IT& wrappedIter() { return src_; } }; diff --git a/src/lib/iter-tree-explorer.hpp b/src/lib/iter-tree-explorer.hpp index 81508c7ab..95bb7bdb9 100644 --- a/src/lib/iter-tree-explorer.hpp +++ b/src/lib/iter-tree-explorer.hpp @@ -111,6 +111,8 @@ namespace lib { using std::function; using util::isnil; + namespace error = lumiera::error; + namespace iter_explorer { template @@ -434,7 +436,7 @@ namespace lib { - namespace iter_explorer { + namespace iter_explorer { // Implementation of Iterator decorating layers... /** * @internal Base of pipe processing decorator chain. @@ -733,7 +735,38 @@ namespace lib { ++srcIter(); } }; - } + + + class ChildExpandableSource + { + protected: + ~ChildExpandableSource() { } ///< @note mix-in interface, not meant to handle objects + public: + virtual void expandChildren() =0; + }; + + /** + * @todo WIP + */ + template + class PackagedTreeExplorerSource + : public WrappedLumieraIter + , public ChildExpandableSource + { + using Parent = WrappedLumieraIter; + + public: + using Parent::Parent; + + virtual void + expandChildren() override + { + Parent::wrappedIter().expandChildren(); + } + }; + + }//(End)Iterator decorating layer implementation + @@ -746,15 +779,35 @@ namespace lib { : IterSource::iterator { - //////TODO clarify allowed ctors + IterExploreSource() =default; + // inherited default copy operations + void expandChildren() { - UNIMPLEMENTED ("how to phone home..."); + using Expandable = iter_explorer::ChildExpandableSource; + + if (not this->source()) + throw error::State ("operating on a disabled default constructed TreeExplorer" + ,error::LUMIERA_ERROR_BOTTOM_VALUE); + + auto source = this->source().get(); + dynamic_cast (source)->expandChildren(); } + private: + template + friend class TreeExplorer; + + template + IterExploreSource (IT&& opaqueSrcPipeline) + : IterSource::iterator { + IterSource::build ( + new iter_explorer::PackagedTreeExplorerSource { + move (opaqueSrcPipeline)})} + { } }; /** @@ -879,7 +932,7 @@ namespace lib { IterExploreSource asIterSource() { - UNIMPLEMENTED ("wrap into IterSource"); + return IterExploreSource {move(*this)}; } diff --git a/tests/library/iter-tree-explorer-test.cpp b/tests/library/iter-tree-explorer-test.cpp index f1d7a4362..a6c330d8d 100644 --- a/tests/library/iter-tree-explorer-test.cpp +++ b/tests/library/iter-tree-explorer-test.cpp @@ -759,6 +759,13 @@ namespace test{ cout << materialise(exploreIter) << endl; CHECK (isnil (sequence)); + CHECK (38 == *sequence); +// CHECK (38 == *exploreIter); + ++exploreIter; + exploreIter.expandChildren(); + cout << materialise(exploreIter) << endl; +#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #888 +#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #888 } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 2c95fb1f9..4cbf4d81f 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -6030,12 +6030,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ jeder Zugriff auf ein Sub-Objekt muß durch eine VTable +

+ + +
+
+ + + + + + +

+ Stichwort: virtual base offset +

+ + +
+
+ + +
- + + + + + + + + + + + + + + + + + + @@ -6544,6 +6618,9 @@ + + +