TreeExplorer: document wrapping into IterSource
This commit is contained in:
parent
c7e37c29e6
commit
e242053620
3 changed files with 167 additions and 110 deletions
|
|
@ -65,17 +65,37 @@
|
|||
** TreeExplorer itself is both a Lumiera Forward Iterator based on some wrapped data source, and at the same time
|
||||
** it is a builder to chain up processing steps to work on the data pulled from that source. These processing steps
|
||||
** are attached as _decorators_ wrapping the source, in the order the corresponding builder functions were invoked.
|
||||
** - the _expand operation_ installs a function to consume one element and replace it by the sequence of elements
|
||||
** - the *expand operation* installs a function to consume one element and replace it by the sequence of elements
|
||||
** (``children'') produced by that _»expansion functor«_. But this expansion does not happen automatically and
|
||||
** on each element, rather it is triggered by issuing a dedicated `expandChildren()` call on the processing
|
||||
** pipeline. Thus, binding the expansion functor has augmented the data source with the ability to explore
|
||||
** some part in more detail _when required.
|
||||
** - the _transform operation_ installs a function to be mapped onto each element retrieved from the underlying source
|
||||
** - in a similar vein, the _filter operation_ binds a predicate to decide about using or discarding data
|
||||
** some part in more detail _when required_.
|
||||
** - the *transform operation* installs a function to be mapped onto each element retrieved from the underlying source
|
||||
** - in a similar vein, the *filter operation* binds a predicate to decide about using or discarding data
|
||||
** - in concert, expand- and transform operation allow to build hierarchy evaluation algorithms without exposing
|
||||
** any knowledge regarding the concrete hierarchy used and explored as data source.
|
||||
**
|
||||
** @todo WIP-WIP-WIP initial draft as of 11/2017
|
||||
** In itself, the TreeExplorer is an iterator with implementation defined type (all operations being inlined).
|
||||
** But it is possible to package this structure behind a conventional iteration interface with virtual functions.
|
||||
** By invoking the terminal builder function TreeExplorer::asIterSource(), the iterator compound type, as created
|
||||
** thus far, will be moved into a heap allocation, returning a front-end based on IterSource. In addition, the
|
||||
** actually returned type, IterExplorerSource, exposes the `expandChildren()` operation as discussed above.
|
||||
**
|
||||
** ## some implementation details
|
||||
** The builder operations assemble a heavily nested type, each builder call thereby adding yet another layer of
|
||||
** subclassing. The templates involved into this build process are _specialised_, as driven by the actual functor
|
||||
** type bound into each builder step; this functor is investigated and possibly adapted, according to its input
|
||||
** type, while its output type determines the value type used in the pipeline "downstream". A functor with an
|
||||
** input (argument) type incompatible or unsuitable to the existing pipeline will produce that endless sway
|
||||
** of template error messages we all love so much. When this happens, please look at the static assertion
|
||||
** error message typically to be found below the first template-instantiation stack sequence of messages.
|
||||
**
|
||||
** @warning all builder operations work by _moving_ the existing pipeline built thus far into the parent
|
||||
** of the newly built subclass object. The previously existing pipeline is defunct after that
|
||||
** move; if you captured it into a variable, be sure to capture the _result_ of the new
|
||||
** builder operation as well and don't use the old variable anymore. Moreover, it should
|
||||
** be ensured that any "state core" used within TreeExplorer has an efficient move ctor;
|
||||
** including RVO, the compiler is typically able to optimise such move calls away altogether.
|
||||
**
|
||||
** @see IterTreeExplorer_test
|
||||
** @see iter-adapter.hpp
|
||||
|
|
@ -113,13 +133,18 @@ namespace lib {
|
|||
|
||||
namespace error = lumiera::error;
|
||||
|
||||
namespace iter_explorer {
|
||||
namespace iter_explorer { // basic iterator wrappers...
|
||||
|
||||
template<class CON>
|
||||
using iterator = typename meta::Strip<CON>::TypeReferred::iterator;
|
||||
template<class CON>
|
||||
using const_iterator = typename meta::Strip<CON>::TypeReferred::const_iterator;
|
||||
|
||||
/**
|
||||
* Adapt STL compliant container.
|
||||
* @note the container itself is _not_ included in the resulting iterator,
|
||||
* it is just assumed to stay alive during the entire iteration.
|
||||
*/
|
||||
template<class CON>
|
||||
struct StlRange
|
||||
: RangeIter<iterator<CON>>
|
||||
|
|
@ -186,11 +211,11 @@ namespace lib {
|
|||
IterableDecorator& operator= (IterableDecorator&&) =default;
|
||||
IterableDecorator& operator= (IterableDecorator const&) =default;
|
||||
|
||||
explicit operator bool() const { return isValid(); }
|
||||
|
||||
|
||||
/* === lumiera forward iterator concept === */
|
||||
|
||||
explicit operator bool() const { return isValid(); }
|
||||
|
||||
reference
|
||||
operator*() const
|
||||
{
|
||||
|
|
@ -247,7 +272,7 @@ namespace lib {
|
|||
}
|
||||
};
|
||||
|
||||
}//(End) namespace iter_explorer : predefined policies and configurations
|
||||
}//(End) namespace iter_explorer : basic iterator wrappers
|
||||
|
||||
|
||||
|
||||
|
|
@ -358,9 +383,9 @@ namespace lib {
|
|||
* - in case it is generic (generic lambda), we assume it actually accepts a reference to
|
||||
* the source iterator type `SRC`. Thus we instantiate a templated functor with this
|
||||
* argument type to find out about its result type (and this instantiation may fail)
|
||||
* - moreover, we try to determine, if an explicitly typed functor accepts a value of the
|
||||
* embedded source iterator (this is the "monadic" usage pattern), or if it rather accepts
|
||||
* the iterator or state core itself (the"opaque state manipulation" usage pattern).
|
||||
* - moreover, we try to determine, if an explicitly typed functor accepts a value as yielded
|
||||
* by the embedded source iterator (this is the "monadic" usage pattern), or if it rather
|
||||
* accepts the iterator or state core itself (the "opaque state manipulation" usage pattern).
|
||||
* - we generate a suitable argument accessor function and build the function composition
|
||||
* of this accessor and the provided _expansion functor_.
|
||||
* - the resulting, combined functor is stored into a std::function, but wired in a way to
|
||||
|
|
@ -738,6 +763,8 @@ namespace lib {
|
|||
|
||||
|
||||
/**
|
||||
* Interface to indicate the ability for _child expansion_.
|
||||
* This interface is used when packaging a TreeExplorer pipeline opaquely into IterSource.
|
||||
* @todo expandChildren() should not return the value pointer.
|
||||
* This is just a workaround to cope with the design mismatch in IterSource;
|
||||
* the fact that latter just passes around a pointer into the implementation is
|
||||
|
|
@ -754,7 +781,12 @@ namespace lib {
|
|||
};
|
||||
|
||||
/**
|
||||
* @todo WIP
|
||||
* @internal Decorator to package a whole TreeExplorer pipeline suitably to be handled through
|
||||
* an IterSource based front-end. Such packaging is performed by the TreeExplorer::asIterSource()
|
||||
* terminal builder function. In addition to [wrapping the iterator](\ref WrappedLumieraIter),
|
||||
* the `expandChildren()` operation is exposed as virtual function, to allow invocation through
|
||||
* the type-erased front-end, without any knowledge about the concrete implementation type
|
||||
* of the wrapped TreeIterator pipeline.
|
||||
*/
|
||||
template<class SRC>
|
||||
class PackagedTreeExplorerSource
|
||||
|
|
@ -783,7 +815,21 @@ namespace lib {
|
|||
|
||||
|
||||
/**
|
||||
* @todo WIP 12/2017
|
||||
* Iterator front-end to manage and operate a TreeExplorer pipeline opaquely.
|
||||
* In addition to the usual iterator functions, this front-end also exposes an
|
||||
* `expandChildren()`-function, to activate the _expansion functor_ installed
|
||||
* through TreeExplorer::expand().
|
||||
* @remarks A iterator pipeline is assembled through invocation of the builder functions
|
||||
* on TreeExplorer -- this way creating a complex implementation defined iterator type.
|
||||
* This front-end manages such a pipeline in heap allocated storage (by shared_ptr), while
|
||||
* exposing only a simple conventional interface (templated to the resulting value type `VAL`).
|
||||
* This allows to pass it over interfaces as "unspecified data source", without disclosing
|
||||
* the details of the implementation.
|
||||
* @warning this lightweight front-end handle in itself is copyable and default constructible,
|
||||
* but any copies will hold onto the same implementation back-end. The effect of competing
|
||||
* manipulations through such copies is _undefined_ (it depends on arbitrary intrinsics of
|
||||
* the implementation). Recommendation is, at any time, to use only one single instance
|
||||
* for iteration and discard it when done.
|
||||
*/
|
||||
template<typename VAL>
|
||||
struct IterExploreSource
|
||||
|
|
@ -822,6 +868,12 @@ namespace lib {
|
|||
{ }
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ======= TreeExplorer pipeline builder and iterator ======= */
|
||||
|
||||
/**
|
||||
* Adapter to build a demand-driven tree expanding and exploring computation
|
||||
* based on a custom opaque _state core_. TreeExploer adheres to the _Monad_
|
||||
|
|
@ -829,7 +881,15 @@ namespace lib {
|
|||
* tied into the basic template by means of a function provided at usage site.
|
||||
* This allows to separate the mechanics of evaluation and result combination
|
||||
* from the actual processing and thus to define tree structured computations
|
||||
* based on a not further disclosed, opaque source data structure.
|
||||
* based on an opaque source data structure not further disclosed.
|
||||
*
|
||||
* \param usage
|
||||
* - to build a TreeExplorer, use the treeExplore() free function,
|
||||
* which cares to pick up an possibly adapt the given iteration source
|
||||
* - to add processing layers, invoke the builder operations on TreeExplorer
|
||||
* in a chained fashion, thereby binding functors or lambdas. Capture the
|
||||
* final result with an auto variable.
|
||||
* - the result is iterable in accordance to »Lumiera Forward Iterator«
|
||||
*
|
||||
* @warning deliberately, the builder functions exposed on TreeExplorer will
|
||||
* _move_ the old object into the new, augmented iterator. This is
|
||||
|
|
@ -939,16 +999,17 @@ namespace lib {
|
|||
}
|
||||
|
||||
|
||||
/** @todo package as IterSource
|
||||
/** _terminal builder_ to package the processing pipeline as IterSource.
|
||||
* Invoking this function moves the whole iterator compound, as assembled by the preceding
|
||||
* builder calls, into heap allocated memory and returns a [iterator front-end](\ref IterExploreSource).
|
||||
* Any iteration and manipulation on that front-end is passed through virtual function calls into
|
||||
* the back-end, thereby concealing all details of the processing pipeline.
|
||||
*/
|
||||
IterExploreSource<value_type>
|
||||
asIterSource()
|
||||
{
|
||||
return IterExploreSource<value_type> {move(*this)};
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -967,7 +1028,7 @@ namespace lib {
|
|||
* @warning if you capture the result of this call by an auto variable,
|
||||
* be sure to understand that invoking any further builder operation on
|
||||
* TreeExplorer will invalidate that variable (by moving it into the
|
||||
* augmented iterator returned from that builder call).
|
||||
* augmented iterator returned from such builder call).
|
||||
*/
|
||||
template<class IT>
|
||||
inline auto
|
||||
|
|
|
|||
|
|
@ -722,8 +722,27 @@ namespace test{
|
|||
}
|
||||
|
||||
|
||||
|
||||
/** @test package the resulting Iterator as automatically managed,
|
||||
* polymorphic opaque entity implementing the IterSource interface.
|
||||
* The builder operations on TreeExplorer each generate a distinct, implementation
|
||||
* defined type, which is meant to be captured by `auto`. However, the terminal builder
|
||||
* function `asIterSource()` moves the whole compound iterator object, as generated by
|
||||
* preceding builder steps, into a heap allocation and exposes a simplified front-end,
|
||||
* which is only typed to the result value type. Obviously, the price to pay comes in
|
||||
* terms of virtual function calls for iteration, delegating to the pipeline backend.
|
||||
* - thus a variable typed to that front-end, `IterSource<VAL>` is polymorphic and
|
||||
* can be reassigned at runtime with an entirely different pipeline.
|
||||
* - but this structure also has the downside, that the implementation no longer
|
||||
* resides directly within the iterator: several front-end copies share the
|
||||
* same back-end. Note however that the behaviour of iterators copied this
|
||||
* way is _implementation defined_ anyway. There is never a guarantee that
|
||||
* a clone copy evolves with state independent from its ancestor; it just
|
||||
* happens to work this way in many simple cases. You should never use
|
||||
* more than one copy of a given iterator at any time, and you should
|
||||
* discard it, when done with iteration.
|
||||
* - actually, the returned front-end offers an extended API over plain vanilla
|
||||
* `IterSource<T>::iterator`, to expose the `expandChildren()` operation.
|
||||
*/
|
||||
void
|
||||
verify_asIterSource()
|
||||
|
|
|
|||
|
|
@ -4977,17 +4977,17 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510540282280" ID="ID_304955672" MODIFIED="1510940463183" TEXT="Baum-Explorer">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1510540409159" ID="ID_1790409069" MODIFIED="1510540416810" TEXT="wiederverwendbarer Baustein"/>
|
||||
<node CREATED="1510540682809" ID="ID_1860662906" MODIFIED="1510540688220" TEXT="konfiguriert mit">
|
||||
<node CREATED="1510540689329" ID="ID_678279547" MODIFIED="1510540693004" TEXT="expand-Funktion"/>
|
||||
<node CREATED="1510540693760" ID="ID_137650742" MODIFIED="1510540729583" TEXT="transform-Funktion"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510540282280" ID="ID_304955672" MODIFIED="1512797277432" STYLE="fork" TEXT="Baum-Explorer">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1510540409159" ID="ID_1790409069" MODIFIED="1512797263191" TEXT="wiederverwendbarer Baustein"/>
|
||||
<node CREATED="1510540682809" ID="ID_1860662906" MODIFIED="1512797263191" TEXT="konfiguriert mit">
|
||||
<node CREATED="1510540689329" ID="ID_678279547" MODIFIED="1512797263191" TEXT="expand-Funktion"/>
|
||||
<node CREATED="1510540693760" ID="ID_137650742" MODIFIED="1512797263191" TEXT="transform-Funktion"/>
|
||||
</node>
|
||||
<node CREATED="1510540500403" ID="ID_494812399" MODIFIED="1510540548093" TEXT="expandierbar">
|
||||
<node CREATED="1510540735386" ID="ID_94152805" MODIFIED="1510540740389" TEXT="zusätzliche API-Operation"/>
|
||||
<node CREATED="1510540740977" ID="ID_1864011655" MODIFIED="1510540760435" TEXT="ersetzt aktuellen Knoten durch seine Kinder"/>
|
||||
<node CREATED="1510939295181" ID="ID_454143909" MODIFIED="1510939320253">
|
||||
<node CREATED="1510540500403" ID="ID_494812399" MODIFIED="1512797263191" TEXT="expandierbar">
|
||||
<node CREATED="1510540735386" ID="ID_94152805" MODIFIED="1512797263191" TEXT="zusätzliche API-Operation"/>
|
||||
<node CREATED="1510540740977" ID="ID_1864011655" MODIFIED="1512797263191" TEXT="ersetzt aktuellen Knoten durch seine Kinder"/>
|
||||
<node CREATED="1510939295181" ID="ID_454143909" MODIFIED="1512797263191">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -5001,30 +5001,30 @@
|
|||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1510540417614" ID="ID_169601267" MODIFIED="1510540499335" TEXT="iterierbar">
|
||||
<node CREATED="1510541064485" ID="ID_15321736" MODIFIED="1510541090742" TEXT="jedes Element geht durch den Transformer"/>
|
||||
<node CREATED="1510541092114" ID="ID_1514360017" MODIFIED="1510541099717" TEXT="das ist die neue Einsicht">
|
||||
<node CREATED="1510540417614" ID="ID_169601267" MODIFIED="1512797263191" TEXT="iterierbar">
|
||||
<node CREATED="1510541064485" ID="ID_15321736" MODIFIED="1512797263192" TEXT="jedes Element geht durch den Transformer"/>
|
||||
<node CREATED="1510541092114" ID="ID_1514360017" MODIFIED="1512797263192" TEXT="das ist die neue Einsicht">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1510939495862" ID="ID_1918069733" MODIFIED="1510939511038" TEXT="Monade?">
|
||||
<node CREATED="1510939495862" ID="ID_1918069733" MODIFIED="1512797263192" TEXT="Monade?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1510939532689" ID="ID_608280633" MODIFIED="1510970210061" TEXT="konventionelle Lösung">
|
||||
<node CREATED="1510939532689" ID="ID_608280633" MODIFIED="1512797263192" TEXT="konventionelle Lösung">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1510939567867" ID="ID_1799788775" MODIFIED="1510939832540" TEXT="expand: S -> S"/>
|
||||
<node CREATED="1510939642250" ID="ID_456598029" MODIFIED="1510939827820" TEXT="S = opaque state"/>
|
||||
<node CREATED="1510939675821" ID="ID_71307720" MODIFIED="1510939825173" TEXT="eigentliche Erweiterung ist in S implementiert"/>
|
||||
<node CREATED="1510939688075" ID="ID_872154531" MODIFIED="1510939701342" TEXT="expand() reicht also nur einen Aufruf weiter"/>
|
||||
<node CREATED="1510939702170" ID="ID_699246805" MODIFIED="1510939818750" TEXT="Implementierung erfordert Seiteneffekt auf S"/>
|
||||
<node CREATED="1510939778231" ID="ID_763925317" MODIFIED="1510939816118" TEXT="S muß auf die Verwendung im Baum-Explorer vorbereitet sein"/>
|
||||
<node CREATED="1510940187687" ID="ID_349334428" MODIFIED="1510940196762" TEXT="triviale Implementierung kan sehr effizient sein"/>
|
||||
<node CREATED="1510939567867" ID="ID_1799788775" MODIFIED="1512797263192" TEXT="expand: S -> S"/>
|
||||
<node CREATED="1510939642250" ID="ID_456598029" MODIFIED="1512797263192" TEXT="S = opaque state"/>
|
||||
<node CREATED="1510939675821" ID="ID_71307720" MODIFIED="1512797263192" TEXT="eigentliche Erweiterung ist in S implementiert"/>
|
||||
<node CREATED="1510939688075" ID="ID_872154531" MODIFIED="1512797263192" TEXT="expand() reicht also nur einen Aufruf weiter"/>
|
||||
<node CREATED="1510939702170" ID="ID_699246805" MODIFIED="1512797263192" TEXT="Implementierung erfordert Seiteneffekt auf S"/>
|
||||
<node CREATED="1510939778231" ID="ID_763925317" MODIFIED="1512797263192" TEXT="S muß auf die Verwendung im Baum-Explorer vorbereitet sein"/>
|
||||
<node CREATED="1510940187687" ID="ID_349334428" MODIFIED="1512797263192" TEXT="triviale Implementierung kan sehr effizient sein"/>
|
||||
</node>
|
||||
<node CREATED="1510939552942" ID="ID_510344823" MODIFIED="1510970213063" TEXT="modadische Lösung">
|
||||
<node CREATED="1510939552942" ID="ID_510344823" MODIFIED="1512797263192" TEXT="modadische Lösung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1510939598175" ID="ID_1272498716" MODIFIED="1510939839411" TEXT="expand: S -> BaumExplorer<S>"/>
|
||||
<node CREATED="1510939845662" ID="ID_581825327" MODIFIED="1510939852465" TEXT="S = opaque State"/>
|
||||
<node CREATED="1510939856845" ID="ID_1492383135" MODIFIED="1510939877062" TEXT="Erweiterungs-Mechanismus im Baum-Explorer implementiert"/>
|
||||
<node CREATED="1510939940275" ID="ID_767766017" MODIFIED="1510940024138">
|
||||
<node CREATED="1510939598175" ID="ID_1272498716" MODIFIED="1512797263192" TEXT="expand: S -> BaumExplorer<S>"/>
|
||||
<node CREATED="1510939845662" ID="ID_581825327" MODIFIED="1512797263192" TEXT="S = opaque State"/>
|
||||
<node CREATED="1510939856845" ID="ID_1492383135" MODIFIED="1512797263192" TEXT="Erweiterungs-Mechanismus im Baum-Explorer implementiert"/>
|
||||
<node CREATED="1510939940275" ID="ID_767766017" MODIFIED="1512797263192">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -5039,9 +5039,9 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1510940053626" ID="ID_865181855" MODIFIED="1510940069076" TEXT="S kann Wertsemantik (aber auch Referenz-Semantik) haben"/>
|
||||
<node CREATED="1510940088149" ID="ID_791410014" MODIFIED="1510940110614" TEXT="S muß nicht speziell vorbereitet sein (nur konstruierbar)"/>
|
||||
<node CREATED="1510940199342" ID="ID_1423687617" MODIFIED="1511572072558" TEXT="man zahlt immer den Overhead für den Stack im Baum-Explorer">
|
||||
<node CREATED="1510940053626" ID="ID_865181855" MODIFIED="1512797263192" TEXT="S kann Wertsemantik (aber auch Referenz-Semantik) haben"/>
|
||||
<node CREATED="1510940088149" ID="ID_791410014" MODIFIED="1512797263192" TEXT="S muß nicht speziell vorbereitet sein (nur konstruierbar)"/>
|
||||
<node CREATED="1510940199342" ID="ID_1423687617" MODIFIED="1512797263192" TEXT="man zahlt immer den Overhead für den Stack im Baum-Explorer">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -5066,7 +5066,7 @@
|
|||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510939517499" ID="ID_1100296394" MODIFIED="1510940150893" TEXT="das ist eine Weichenstellung">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510939517499" ID="ID_1100296394" MODIFIED="1512797263192" TEXT="das ist eine Weichenstellung">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
|
|
@ -5103,7 +5103,8 @@
|
|||
<node CREATED="1512278456672" ID="ID_488770369" MODIFIED="1512278462388" TEXT="wird in jedem Schritt gestrippt"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510941463562" ID="ID_845080696" MODIFIED="1510941523082" TEXT="TreeExplorer">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510941463562" ID="ID_845080696" MODIFIED="1512797366789" TEXT="TreeExplorer">
|
||||
<linktarget COLOR="#585e9d" DESTINATION="ID_845080696" ENDARROW="Default" ENDINCLINATION="-101;761;" ID="Arrow_ID_402051988" SOURCE="ID_1359727169" STARTARROW="None" STARTINCLINATION="208;5;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1511571446467" FOLDED="true" ID="ID_1778455053" MODIFIED="1512358577968" TEXT="expand-Operation">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -5769,8 +5770,7 @@
|
|||
nicht mehr die expandChildren aufrufen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1512439636532" ID="ID_443920458" MODIFIED="1512439814700" TEXT="refresh()-Call im internen API">
|
||||
|
|
@ -5801,8 +5801,7 @@
|
|||
Das ist aber hier aus grundsätzlichen Überlegungen heraus keine Option
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1512439832865" ID="ID_1782781235" MODIFIED="1512440146656" TEXT="anderes Iterator-API">
|
||||
|
|
@ -5818,8 +5817,7 @@
|
|||
das IterStateWrapper-API ist <i>optimal</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -5859,8 +5857,7 @@
|
|||
sich im Iterator oder in der Implementierung irgendwo noch eine zusätzliche bool-Flag zu speichern.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1512440148015" ID="ID_1475512070" MODIFIED="1512440198570" TEXT="Einzige Lösung">
|
||||
|
|
@ -5876,8 +5873,7 @@
|
|||
implementieren ebenfalls <b>expandChildren</b>()
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -5897,8 +5893,7 @@
|
|||
ganz anders als bei IterAdapter, wo das Sinn macht...
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512440263551" ID="ID_1524108340" MODIFIED="1512440285896" TEXT="Dagegen könnte die "state core" sehr wohl genau dieses API exponieren."/>
|
||||
<node CREATED="1512440286772" ID="ID_535994508" MODIFIED="1512440435961" TEXT="wir brauchen deshalb nicht gleich ein Interface einführen">
|
||||
|
|
@ -5921,8 +5916,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512440341573" ID="ID_1804763032" MODIFIED="1512440348845" TEXT="wir können bis 2020 warten...">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
|
|
@ -5958,8 +5952,7 @@
|
|||
innen heraus
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1512516629180" ID="ID_1157813472" MODIFIED="1512516672998" TEXT="oh wie traurig">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -5971,8 +5964,7 @@
|
|||
will sagen, das ist ja auch eine durchgeknallte Idee....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
<node CREATED="1512516682701" ID="ID_1471867999" MODIFIED="1512516706422">
|
||||
|
|
@ -5985,8 +5977,7 @@
|
|||
wenn eine Funktion <i>in</i> einem Layer expanded
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512516708649" ID="ID_474656011" MODIFIED="1512516797884" TEXT="dann muß sie sich zwischen Vater oder 1.Kind entscheiden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -6004,8 +5995,7 @@
|
|||
und liefert das, was nach dem expand erscheind
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512516799653" ID="ID_589615050" MODIFIED="1512516811504" TEXT="nicht als Fehler bewertet">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
|
|
@ -6041,15 +6031,14 @@
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1511837384749" ID="ID_274979743" MODIFIED="1512621181803" TEXT="asIterSource">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1511837384749" FOLDED="true" ID="ID_274979743" MODIFIED="1512841003563" TEXT="asIterSource">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1512621242778" ID="ID_695969017" MODIFIED="1512621248235" TEXT="Eigenschaften">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1511837396075" ID="ID_1916743569" MODIFIED="1511837401078" TEXT="abschließender Dekorator"/>
|
||||
|
|
@ -6101,8 +6090,7 @@
|
|||
<i>jeder</i> Zugriff auf ein Sub-Objekt muß durch eine VTable
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512769199597" ID="ID_1928524017" MODIFIED="1512769227486">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
|
|
@ -6114,8 +6102,7 @@
|
|||
Stichwort: <b>virtual base offset</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#5229a2" CREATED="1512769231648" ID="ID_925551162" LINK="http://web.archive.org/web/20160413064252/http://www.phpcompiler.org/articles/virtualinheritance.html" MODIFIED="1512769289609" TEXT="Beschreibung der GCC-Implementierung">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
|
|
@ -6202,8 +6189,7 @@
|
|||
C++17 holt das nach
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512706162921" ID="ID_601609235" MODIFIED="1512706394332" TEXT="ab C++17 ist das anders">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -6224,8 +6210,7 @@
|
|||
die Signatur eines Copy-ctors überdeckt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1512706405155" ID="ID_1013782130" MODIFIED="1512706515474">
|
||||
|
|
@ -6238,8 +6223,7 @@
|
|||
Allerdings genügt es, dies an <i>einer</i> Stelle in der Kette zu ergänzen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -6255,8 +6239,7 @@
|
|||
Alle anderen Layer darüber reichen dann korrekt mit dem geerbten Ctor diese Initialisierung nach Unten.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1512706516628" ID="ID_1092840037" MODIFIED="1512706656273">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
|
|
@ -6268,8 +6251,7 @@
|
|||
übrigens ist es im IterSource<T>::iterator <i>nicht</i>  notwendig
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -6294,8 +6276,7 @@
|
|||
dann werden auch die Copy-Konstruktoren korrekt automatisch generiert.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -6349,8 +6330,7 @@
|
|||
Ticket machen: <font color="#b90736">#1125</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#7f5f85" DESTINATION="ID_1318870340" ENDARROW="Default" ENDINCLINATION="867;50;" ID="Arrow_ID_1918593298" SOURCE="ID_1066396845" STARTARROW="None" STARTINCLINATION="483;0;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
|
|
@ -6376,8 +6356,7 @@
|
|||
und dieser es dann auch managed
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<node CREATED="1512358864343" FOLDED="true" ID="ID_1251747225" MODIFIED="1512358957195">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
|
@ -6388,8 +6367,7 @@
|
|||
ist das <font color="#9e1124">#190</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1512358896258" ID="ID_62377324" MODIFIED="1512358945435" TEXT="nein das ist was anderes">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
|
|
@ -6417,8 +6395,7 @@
|
|||
und immer mit einem Heap-allozierten vector
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1512358632486" ID="ID_1795551304" MODIFIED="1512358640785" TEXT="aber keine konkrete Anwendung"/>
|
||||
|
|
@ -6663,8 +6640,8 @@
|
|||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1511836589393" ID="ID_54165230" MODIFIED="1512621159744" TEXT="verify_asIterSource();">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1511836589393" ID="ID_54165230" MODIFIED="1512841023182" TEXT="verify_asIterSource();">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1512620990860" ID="ID_167384287" MODIFIED="1512789972907" TEXT="einfach verpacken">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
|
|
@ -6684,11 +6661,10 @@
|
|||
können nun hinter dem gleichen Interface sitzen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1512621116947" ID="ID_1907769466" MODIFIED="1512789886391" TEXT="durchgeschleifte expandChildren()-Operation">
|
||||
<node COLOR="#338800" CREATED="1512621116947" FOLDED="true" ID="ID_1907769466" MODIFIED="1512841020337" TEXT="durchgeschleifte expandChildren()-Operation">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1512787465929" ID="ID_1053911863" MODIFIED="1512788738307" TEXT="Bug!">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -6729,8 +6705,7 @@
|
|||
<u>Frage</u>: ist das überhaupt eine gute Idee, vom Design her??
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1512711333823" ID="ID_1629518942" MODIFIED="1512711345303" TEXT="Idee: deepCopy bieten">
|
||||
|
|
@ -6754,7 +6729,9 @@
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1510941646050" ID="ID_596422747" MODIFIED="1510941710569" TEXT="expandable ChildIter">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1510941655360" ID="ID_1359727169" MODIFIED="1510941661027" TEXT="verwendet TreeExplorer"/>
|
||||
<node CREATED="1510941655360" ID="ID_1359727169" MODIFIED="1512797366789" TEXT="verwendet TreeExplorer">
|
||||
<arrowlink COLOR="#585e9d" DESTINATION="ID_845080696" ENDARROW="Default" ENDINCLINATION="-101;761;" ID="Arrow_ID_402051988" STARTARROW="None" STARTINCLINATION="208;5;"/>
|
||||
</node>
|
||||
<node CREATED="1510941661615" ID="ID_463290050" MODIFIED="1510941665179" TEXT="verpackt in IterSource"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue