Library: simplify state-core wrapper parameters

As follow-up from the preceding refactorings,
it is now possible to drastically simplify several type signatures.
Generally speaking, iterator pipelines can now pass-through the result type,
and thus it is no longer necessary to handle this result type explicitly

In the case of `IterStateWrapper`, the result type parameter was retained,
but moved to the second position and defaulted; sometimes it can be relevant
to force a specific type; this is especially useful when defining an
`iterator` and a `const_iterator` based on the same »state-core«
This commit is contained in:
Fischlurch 2024-11-26 22:15:33 +01:00
parent b6ade2c0cf
commit 99c4663719
15 changed files with 154 additions and 119 deletions

View file

@ -594,7 +594,7 @@ namespace diff{
*/
class GenNode::ScopeExplorer
{
using ScopeIter = IterStateWrapper<const GenNode, DataCap::Locator>;
using ScopeIter = IterStateWrapper<DataCap::Locator>;
std::deque<ScopeIter> scopes_;
@ -660,7 +660,7 @@ namespace diff{
struct GenNode::ScopeExplorerIterator
: IterStateWrapper<const GenNode, ScopeExplorer>
: IterStateWrapper<ScopeExplorer>
{
using IterStateWrapper::IterStateWrapper;

View file

@ -118,7 +118,7 @@ namespace diff{
/** Diff is a iterator to yield a sequence of DiffStep elements */
using Diff = lib::IterStateWrapper<DiffStep, DiffFrame>;
using Diff = lib::IterStateWrapper<DiffFrame>;
/** Diff generation core operation.
* Take a snapshot of the \em current state of the underlying sequence

View file

@ -53,8 +53,6 @@ namespace lib {
using value_type = typename meta::RefTraits<ResVal>::Value;
using reference = typename meta::RefTraits<ResVal>::Reference;
using IterWrapper = lib::IterStateWrapper<value_type, IndexAccessCore>;
bool
checkPoint() const
{
@ -81,6 +79,8 @@ namespace lib {
and idx < data_->size();
}
using IterWrapper = lib::IterStateWrapper<IndexAccessCore>;
friend bool operator== (IndexAccessCore const& c1, IndexAccessCore const& c2)
{

View file

@ -360,25 +360,24 @@ namespace lib {
* -# \c checkPoint establishes if the given state element represents a valid active state
* -# \c iterNext evolves this state by one step (sideeffect)
* -# \c yield realises the given state, yielding an element of _result type_ \a T
* @tparam T nominal result type (maybe const, but without reference).
* The resulting iterator will yield a reference to this type T
* @tparam ST type of the »state core«, defaults to T.
* The resulting iterator will hold an instance of ST, which thus
* needs to be copyable and default constructible to the extent
* this is required for the iterator as such.
* @tparam T (optional) result type, usually deduced from ST::yield
* @see IterableDecorator for variation of the same concept
* @see iter-explorer-test.hpp
* @see iter-adaptor-test.cpp
*/
template<typename T, class ST>
template<class ST, typename T =iter::CoreYield<ST>>
class IterStateWrapper
{
ST core_;
public:
typedef T* pointer;
typedef T& reference;
typedef T value_type;
using value_type = typename meta::RefTraits<T>::Value;
using reference = typename meta::RefTraits<T>::Reference;
using pointer = typename meta::RefTraits<T>::Pointer;
IterStateWrapper (ST&& initialState)
: core_(std::forward<ST>(initialState))
@ -401,7 +400,7 @@ namespace lib {
/* === lumiera forward iterator concept === */
reference
T
operator*() const
{
__throw_if_empty();
@ -411,8 +410,15 @@ namespace lib {
pointer
operator->() const
{
__throw_if_empty();
return & core_.yield(); // core interface: yield
if constexpr (meta::isLRef_v<T>)
{
__throw_if_empty();
return & core_.yield(); // core interface: yield
}
else
static_assert (!sizeof(T),
"can not provide operator-> "
"since iterator pipeline generates a value");
}
IterStateWrapper&
@ -455,24 +461,24 @@ namespace lib {
ENABLE_USE_IN_STD_RANGE_FOR_LOOPS (IterStateWrapper);
/// comparison is allowed to access state implementation core
template<class T1, class T2, class STX>
friend bool operator== (IterStateWrapper<T1,STX> const&, IterStateWrapper<T2,STX> const&);
template<class STX, class T1, class T2>
friend bool operator== (IterStateWrapper<STX,T1> const&, IterStateWrapper<STX,T2> const&);
};
/// Supporting equality comparisons of equivalent iterators (same state type)...
template<class T1, class T2, class ST>
template<class ST, class T1, class T2>
inline bool
operator== (IterStateWrapper<T1,ST> const& il, IterStateWrapper<T2,ST> const& ir)
operator== (IterStateWrapper<ST,T1> const& il, IterStateWrapper<ST,T2> const& ir)
{
return (il.empty() and ir.empty())
or (il.isValid() and ir.isValid() and il.core_ == ir.core_);
}
template<class T1, class T2, class ST>
template<class ST, class T1, class T2>
inline bool
operator!= (IterStateWrapper<T1,ST> const& il, IterStateWrapper<T2,ST> const& ir)
operator!= (IterStateWrapper<ST,T1> const& il, IterStateWrapper<ST,T2> const& ir)
{
return not (il == ir);
}
@ -656,13 +662,12 @@ namespace lib {
* it is guaranteed to be valid (by contextual knowledge). It might be a good idea
* to build some safety checks into the Core API functions instead, maybe even just
* as assertions, or to wrap the Core into \ref CheckedCore for most usages.
* @tparam T nominal result type (maybe const, but without reference).
* @tparam COR type of the »state core«. The resulting iterator will _mix-in_ this type,
* and thus inherit properties like copy, move, compare, VTable, POD-ness.
* The COR must implement the following _iteration control API:_
* -# `checkPoint` establishes if the given state element represents a valid state
* -# ´iterNext` evolves this state by one step (sideeffect)
* -# `yield` realises the given state, exposing a result of type `T&`
* -# `yield` realises the given state, exposing a result reference or value
* Furthermore, COR must be default-constructible in _disabled_ state
* @note the resulting iterator will attempt to yield a reference to type \a T when possible;
* but when the wrapped `COR::yield()` produces a value, this is passed as such, moreover
@ -671,7 +676,7 @@ namespace lib {
* @see iter-explorer-test.hpp
* @see iter-adaptor-test.cpp
*/
template<typename T, class COR>
template<class COR>
class IterableDecorator
: public COR
{
@ -687,12 +692,10 @@ namespace lib {
}
public:
using CoreYield = iter::CoreYield<COR>;
using _CommonT = meta::CommonResultYield<T&, CoreYield>;
using YieldRes = typename _CommonT::ResType;
using value_type = typename _CommonT::value_type;
using reference = typename _CommonT::reference;
using pointer = typename _CommonT::pointer;
using YieldRes = iter::CoreYield<COR>;
using value_type = typename meta::RefTraits<YieldRes>::Value;
using reference = typename meta::RefTraits<YieldRes>::Reference;
using pointer = typename meta::RefTraits<YieldRes>::Pointer;
/** by default, pass anything down for initialisation of the core.
@ -725,10 +728,10 @@ namespace lib {
pointer
operator->() const
{
if constexpr (_CommonT::isRef)
if constexpr (meta::isLRef_v<YieldRes>)
return & _core().yield(); // core interface: yield
else
static_assert (_CommonT::isRef,
static_assert (!sizeof(COR),
"can not provide operator-> "
"since iterator pipeline generates a value");
}
@ -758,17 +761,14 @@ namespace lib {
/// Supporting equality comparisons of equivalent iterators (equivalent state core)...
template<class T1, class T2>
friend bool
operator== (IterableDecorator<T1,COR> const& il, IterableDecorator<T2,COR> const& ir)
operator== (IterableDecorator const& il, IterableDecorator const& ir)
{
return (il.empty() and ir.empty())
or (il.isValid() and ir.isValid() and il._core() == ir._core());
}
template<class T1, class T2>
friend bool
operator!= (IterableDecorator<T1,COR> const& il, IterableDecorator<T2,COR> const& ir)
operator!= (IterableDecorator const& il, IterableDecorator const& ir)
{
return not (il == ir);
}

View file

@ -155,10 +155,10 @@ namespace lib {
*/
template<class IT>
class IterCursor
: public IterStateWrapper<typename iter::CursorGear<IT>::value_type, iter::CursorGear<IT>>
: public IterStateWrapper<iter::CursorGear<IT>>
{
using _Core = iter::CursorGear<IT>;
using _Parent = IterStateWrapper<typename _Core::value_type, _Core>;
using _Parent = IterStateWrapper<_Core>;
public:
IterCursor() =default;

View file

@ -275,7 +275,7 @@ namespace lib {
{
using SrcRaw = typename lib::meta::Strip<SRC>::Type;
using SrcVal = typename meta::RefTraits<iter::CoreYield<SrcRaw>>::Value;
using SrcIter = lib::IterableDecorator<SrcVal, lib::CheckedCore<SrcRaw>>;
using SrcIter = lib::IterableDecorator<lib::CheckedCore<SrcRaw>>;
};
template<class SRC>

View file

@ -111,7 +111,7 @@ namespace lib {
*/
template<class TY>
struct IterStack
: IterStateWrapper<TY, iter::IterDequeStorage<TY>>
: IterStateWrapper<iter::IterDequeStorage<TY>>
{
// using default create and copy operations
@ -186,7 +186,7 @@ namespace lib {
*/
template<class TY>
struct IterQueue
: IterStateWrapper<TY, iter::IterDequeStorage<TY>>
: IterStateWrapper<iter::IterDequeStorage<TY>>
{
// using default create and copy operations

View file

@ -394,8 +394,8 @@ namespace lib {
};
public:
using iterator = IterStateWrapper< N, IterationState>;
using const_iterator = IterStateWrapper<const N, IterationState>;
using iterator = IterStateWrapper<IterationState, N&>;
using const_iterator = IterStateWrapper<IterationState, const N&>;
iterator begin() { return iterator (head_); }

View file

@ -441,7 +441,7 @@ namespace gear {
/** Adapted storage-Extent iterator, directly exposing Epoch& */
using EpochIter = lib::IterableDecorator<Epoch, StorageAdaptor>;
using EpochIter = lib::IterableDecorator<StorageAdaptor>;
/**

View file

@ -257,7 +257,7 @@ namespace mem {
/** allow transparent iteration of Extents,
* with the ability to expand storage */
using iterator = lib::IterableDecorator<Extent, IdxLink>;
using iterator = lib::IterableDecorator<IdxLink>;
/** iterate over all the currently active Extents */
iterator begin() { return iterator{IdxLink{this, start_}}; }

View file

@ -112,7 +112,7 @@ namespace test{
void
simpleUsage()
{
auto it = IterableDecorator<int, StepDown>{3};
auto it = IterableDecorator<StepDown>{3};
CHECK (it);
CHECK (*it == 3);
++it;
@ -130,7 +130,7 @@ namespace test{
void
stateManipulation()
{
auto it = IterableDecorator<int, StepDown>{};
auto it = IterableDecorator<StepDown>{};
CHECK (not it);
CHECK (*it == 0);
++it;
@ -166,7 +166,7 @@ namespace test{
VERIFY_ERROR (ITER_EXHAUST, cc.yield() );
VERIFY_ERROR (ITER_EXHAUST, cc.iterNext() );
auto it = IterStateWrapper<uint,StepDown>{StepDown{2}};
auto it = IterStateWrapper{StepDown{2}};
CHECK (it);
CHECK (*it == 2u);
++it;
@ -206,7 +206,7 @@ namespace test{
int yield() const { return StepDown::yield(); }
};
auto it = IterableDecorator<int, CheckedCore<ValueStep>>{2};
auto it = IterableDecorator<CheckedCore<ValueStep>>{2};
CHECK (it);
CHECK (*it == 2);
CHECK (it.n == 2);

View file

@ -124,16 +124,16 @@ namespace test{
* @note the "state core" is not accessible from the outside
*/
class NumberSequence
: public IterStateWrapper<uint, CountDown>
: public IterStateWrapper<CountDown>
{
public:
explicit
NumberSequence(uint start = 0)
: IterStateWrapper<uint,CountDown> (CountDown{start})
: IterStateWrapper{CountDown{start}}
{ }
NumberSequence(uint start, uint end)
: IterStateWrapper<uint,CountDown> (CountDown(start,end))
: IterStateWrapper{CountDown(start,end)}
{ }
};

View file

@ -246,23 +246,13 @@ namespace test{
.transform ([&](ITup& iTup){ return mapEach (iTup, access_val); })
;
// hold onto your hat!!!
// demonstrate the composed pipeline type...
CHECK (TYPE(ii) == "IterExplorer<"
"IterableDecorator<"
"tuple<int, uint>, " // ◁──────────────────────────────── this is the overall result type
"CheckedCore<"
"iter_explorer::Transformer<" // ◁──────────────────────────────── the top-layer is a Transformer (to access the value from each src-iter)
"iter_explorer::BaseAdapter<"
"IterableDecorator<" // ◁──────────────────────────── the product-iterator we constructed
"tuple<" // ◁──────────────────────────── ....exposing the iterator-tuple as „result“
"IterExplorer<" // ◁───────────────────────────────── the first source iterator (directly wrapping NumIter)
"iter_explorer::BaseAdapter<NumIter<int> > >, "
"IterExplorer<" // ◁───────────────────────────────── the second source iterator (based on a STL collection)
"iter_explorer::BaseAdapter<"
"iter_explorer::StlRange<array<uint, 3ul>&> "
"> "
"> "
">, "
"CheckedCore<" // ◁──────────────────────────── ....and using the given ProductCore as »state core«
"IterZip_test::demo_construction()::ProductCore> > >, "
"tuple<int, uint> " // ◁──────────────────────────────── back to top-layer: result-type of the Transformer

View file

@ -461,7 +461,7 @@ for} tail...
auto it = binding.getSequence("i");
CHECK (it);
CHECK (*it == "i.p."_expect );
CHECK (meta::typeStr(it) == "IterExplorer<IterableDecorator<string, CheckedCore<iter_explorer::Transformer<iter_explorer::BaseAdapter<RegexSearchIter>, string> > > >"_expect );
CHECK (meta::typeStr(it) == "IterExplorer<IterableDecorator<CheckedCore<iter_explorer::Transformer<iter_explorer::BaseAdapter<RegexSearchIter>, string> > > >"_expect );
auto subBind = binding.openContext(it);
CHECK (subBind.isSubScope());

View file

@ -19922,9 +19922,7 @@
</node>
<node CREATED="1665969462522" ID="ID_1851529218" MODIFIED="1665969529899">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
den <i>Medien-Typ</i>
@ -20306,9 +20304,7 @@
<node CREATED="1504459419584" ID="ID_1339072222" MODIFIED="1557498707223" TEXT="in der TimelinePane leben die zugeh&#xf6;rigen Widgets"/>
<node CREATED="1504459462330" ID="ID_791513915" MODIFIED="1557498707223">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Verwaltung <i>autmatisch</i>&#160;via ViewLocator -&gt; PanelLocator
@ -20759,9 +20755,7 @@
</node>
<node CREATED="1573744962237" ID="ID_1240251301" MODIFIED="1576282358094" TEXT="&#xbb;Dreiecks-Anordnung&#xab; erscheint sinnvoll">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
da der ViewHook schon zwei Pointer zu zwei Entit&#228;ten halten mu&#223;, kann man Redundanzen vermeiden, indem man ihn <i>an einem dritten Ort</i>&#160;anbringt. N&#228;mlich an einem Ort, an dem ohnehin schon eine Dreiecksbeziehung mit diesen beiden Elementen besteht
@ -21182,9 +21176,7 @@
</node>
<node CREATED="1575220123929" ID="ID_830381506" MODIFIED="1575220138837">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
alle anderen Daten in TrackBody sind <b>nicht redundant</b>
@ -22350,9 +22342,7 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1539388923323" ID="ID_430199880" MODIFIED="1557498707224">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<font color="#e71c1c">Problem</font>: alle Timelines der Session repr&#228;sentieren?
@ -23826,9 +23816,7 @@
</node>
<node CREATED="1560698814327" ID="ID_44788176" MODIFIED="1576282358076" TEXT="wie wird es zug&#xe4;nglich?">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -27543,9 +27531,7 @@
</node>
<node CREATED="1677366530209" ID="ID_1369679680" MODIFIED="1677861872506" TEXT="Auge">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Mitte der &#187;Oberdiogonalen&#171;, d.h die Diagonale durch das obere Rechteck mit H&#246;he &#934;-major und voller Breite
@ -36550,9 +36536,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
also kein Initialisieren des Toolkit,
@ -39610,9 +39594,7 @@
<node CREATED="1624113257517" ID="ID_70759730" MODIFIED="1624113272119" TEXT="diese mu&#xdf; man mit move_to explizit setzen"/>
<node CREATED="1624113272939" ID="ID_318150010" MODIFIED="1624113302609">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
sonst <b>verschleppt</b>&#160;man eine <b>zuf&#228;llig</b>&#160;vorher gegebene Position
@ -40906,9 +40888,7 @@
<icon BUILTIN="button_ok"/>
<node CREATED="1667667900172" ID="ID_638983817" MODIFIED="1667667999509" TEXT="hier nun doch eine Maximal-Pixelzahl eingef&#xfc;hrt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...auch das basiert auf einer pragmatischen &#220;berlegung; theoretisch k&#246;nnten wir beliebig gro&#223;e Pixelanzahl unterst&#252;tzen, dies w&#252;rde aber auf allen Ebenen zu unerwartetem Verhalten f&#252;hren, dessen Konsequenzen ich nicht &#252;berblicke &#10233; dann besser eine willk&#252;rliche und hinreichend gro&#223;e Grenze
@ -41873,9 +41853,7 @@
<icon BUILTIN="info"/>
<node CREATED="1670285974347" ID="ID_281565361" MODIFIED="1670517155305" TEXT="pixel/maxExtension &gt; 1/ LIM_HAZARD">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wenn der Zoom-Faktor einen gr&#246;&#223;een Nenner bekommt, wird er nach den inzwischen etablierten Richtlinien als &#187;toxisch&#171; betrachtet, und das hei&#223;t, die typischen Berechnungen im ZoomWindow k&#246;nnten entgleisen
@ -42299,9 +42277,7 @@
<node CREATED="1670533665256" ID="ID_1624584888" MODIFIED="1670533684900" TEXT="letztlich nur Bruchrechnen"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1670533759294" ID="ID_1337555507" MODIFIED="1670533795730">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<u>latente Gefahr</u>: Rest bei <i>giftiger Duration</i>
@ -42621,9 +42597,7 @@
<icon BUILTIN="broken-line"/>
<node CREATED="1670629999164" ID="ID_1312554244" MODIFIED="1670630059800" TEXT="und zwar mit interessanten (realistischen) Werten">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
ZoomWindow: established size or metric misses expectation by more than 1px. 3px != 0.279620 expected pixel.
@ -43018,9 +42992,7 @@
</node>
<node CREATED="1670719062943" ID="ID_1581529912" MODIFIED="1670719167745" TEXT="die Frage ob 0.1px-Band oder 1px-Band ist demgegen&#xfc;ber zweitrangig (nur Faktor 2)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
will sagen, wenn man das 0.1px-Band zum Absturz bringen kann, dann klappt das mit der doppelten Zeit auch beim 1px-Band
@ -52573,7 +52545,8 @@
</node>
</node>
</node>
<node CREATED="1732154493179" ID="ID_1329557703" MODIFIED="1732154500718" TEXT="iter-zip">
<node COLOR="#338800" CREATED="1732154493179" ID="ID_1329557703" MODIFIED="1732659010836" TEXT="iter-zip">
<icon BUILTIN="button_ok"/>
<node CREATED="1732154503106" ID="ID_852276140" MODIFIED="1732154521492" TEXT="N Iteratoren in Tupel zusammenf&#xfc;hren">
<node CREATED="1732154525721" ID="ID_161696884" MODIFIED="1732154540166" TEXT="zum Verbinden mehrerer Datenquellen"/>
<node CREATED="1732154540893" ID="ID_1426555488" MODIFIED="1732154577823" TEXT="es gilt die kleinst-m&#xf6;gliche Gesamtsequenz">
@ -53314,7 +53287,8 @@
<node CREATED="1732499731453" ID="ID_524965988" MODIFIED="1732499744446" TEXT="sofern man sinnvoll auf einen kleinsten gemeinsamen Nenner zur&#xfc;ckf&#xe4;llt"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1732499748626" ID="ID_73007932" MODIFIED="1732576975282" TEXT="nochmal untersuchen: k&#xf6;nnen wir Value-Ergebnisse aus der Pipeline unterst&#xfc;tzen?">
<node COLOR="#435e98" CREATED="1732499748626" ID="ID_73007932" MODIFIED="1732658339211" TEXT="nochmal untersuchen: k&#xf6;nnen wir Value-Ergebnisse aus der Pipeline unterst&#xfc;tzen?">
<linktarget COLOR="#4e6fd7" DESTINATION="ID_73007932" ENDARROW="Default" ENDINCLINATION="-1571;53;" ID="Arrow_ID_1348614829" SOURCE="ID_1087558825" STARTARROW="None" STARTINCLINATION="-292;13;"/>
<icon BUILTIN="help"/>
<node COLOR="#435e98" CREATED="1732499767002" FOLDED="true" ID="ID_1245640841" MODIFIED="1732636236208" TEXT="Problem-1 : operator-&gt; kann nicht unterst&#xfc;tzt werden">
<node CREATED="1732499786605" ID="ID_1510842318" MODIFIED="1732499805038" TEXT="diesen m&#xfc;&#xdf;te man dann per conditional-Definiton entfernen"/>
@ -53478,7 +53452,8 @@
<node COLOR="#338800" CREATED="1732584380577" ID="ID_907702003" MODIFIED="1732637858939" TEXT="nebenbei: IterableDecorator ist nun flexibler &#x27f6; Test">
<icon BUILTIN="yes"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1732584408909" ID="ID_1774747868" MODIFIED="1732584416008" TEXT="iter-core-adapter-test.cpp">
<node COLOR="#435e98" CREATED="1732584408909" ID="ID_1774747868" MODIFIED="1732658996535" TEXT="iter-core-adapter-test.cpp">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1732584417772" ID="ID_710320129" MODIFIED="1732584430262" TEXT="weil das eigentlich mit dem Thema &#xbb;State Core&#xab; zu tun hat"/>
<node CREATED="1732584430730" ID="ID_1543136731" MODIFIED="1732584440733" TEXT="...wof&#xfc;r es bisher gar keine Tests gab">
<icon BUILTIN="smiley-neutral"/>
@ -53489,12 +53464,13 @@
</node>
<node COLOR="#338800" CREATED="1732584463118" ID="ID_1750877358" MODIFIED="1732636191954" TEXT="Testfall mit den Typkonvertierungen extrahieren">
<linktarget COLOR="#1c61d4" DESTINATION="ID_1750877358" ENDARROW="Default" ENDINCLINATION="1071;0;" ID="Arrow_ID_626641268" SOURCE="ID_910412701" STARTARROW="None" STARTINCLINATION="385;33;"/>
<linktarget COLOR="#69c89b" DESTINATION="ID_1750877358" ENDARROW="Default" ENDINCLINATION="69;1076;" ID="Arrow_ID_813654437" SOURCE="ID_1771231866" STARTARROW="None" STARTINCLINATION="260;-379;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1732584616649" ID="ID_1631761913" MODIFIED="1732584728444" TEXT="aufr&#xe4;umen...">
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1732584624472" ID="ID_447849996" MODIFIED="1732584637215" TEXT="Typ-Parameter von IterStateWrapper">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1732584616649" ID="ID_1631761913" MODIFIED="1732658977729" TEXT="aufr&#xe4;umen...">
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1732584624472" FOLDED="true" ID="ID_447849996" MODIFIED="1732658984799" TEXT="Typ-Parameter von IterStateWrapper">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1732584638326" ID="ID_200640906" MODIFIED="1732628617817" TEXT="der default auf dem 2.Parameter kann weg">
<icon BUILTIN="button_ok"/>
<node CREATED="1732628224293" ID="ID_766835440" MODIFIED="1732628228755" TEXT="er wird nie verwendet"/>
@ -53509,7 +53485,7 @@
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1732584652068" ID="ID_1279596515" MODIFIED="1732628609814" TEXT="kann man den Typ-Parameter deduzierbar machen?">
<node COLOR="#435e98" CREATED="1732584652068" ID="ID_1279596515" MODIFIED="1732658915633" TEXT="kann man den Typ-Parameter deduzierbar machen?">
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1732628298530" ID="ID_831486797" MODIFIED="1732628304606" TEXT="man k&#xf6;nnte in der Tat">
<icon BUILTIN="hourglass"/>
@ -53531,12 +53507,21 @@
</node>
<node CREATED="1732628547993" ID="ID_1897860408" MODIFIED="1732628563866" TEXT="deshalb mu&#xdf; der zweite (jetzt erste) Parameter bleiben, kann aber defaultet sein"/>
<node CREATED="1732628564623" ID="ID_1023873369" MODIFIED="1732628576939" TEXT="und w&#xfc;rde damit auch konsistent der tats&#xe4;chliche R&#xfc;ckgabetyp sein"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1732628578845" ID="ID_734093259" MODIFIED="1732628604773" TEXT="disruptiv &#x2014; aber substantielle Verbesserung">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1732628578845" ID="ID_734093259" MODIFIED="1732658950621" TEXT="disruptiv &#x2014; aber substantielle Verbesserung">
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1732629696172" ID="ID_830334020" MODIFIED="1732629711807" TEXT="dann auch nochmal &#xfc;ber die Parameter von IterStateWrapper nachdenken">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1732629696172" ID="ID_830334020" MODIFIED="1732658953629" TEXT="dann auch nochmal &#xfc;ber die Parameter von IterStateWrapper nachdenken">
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1732658923278" ID="ID_1898212478" MODIFIED="1732658944678" TEXT="in der Tat: hier ist die gleiche Vereinfachung m&#xf6;glich">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1732658934303" ID="ID_1974065226" MODIFIED="1732658944678" TEXT="der explizite Typ-Parameter kann sogar ganz weg">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1732658954909" ID="ID_1267513558" MODIFIED="1732658969610" TEXT="Anpassungen ausgef&#xfc;hrt &#x27f9; funktioniert auf Anhieb">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1732584709076" ID="ID_1502894530" MODIFIED="1732630636890" TEXT="Kommentare in iter-adapter">
@ -53549,7 +53534,7 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1535891065189" FOLDED="true" ID="ID_1233342893" MODIFIED="1695502596556" TEXT="Iterator-Monade">
<node COLOR="#338800" CREATED="1535891065189" FOLDED="true" ID="ID_1233342893" MODIFIED="1732655076691" TEXT="Iterator-Monade">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -54353,7 +54338,7 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1536409302285" FOLDED="true" ID="ID_913930564" MODIFIED="1573229616333" TEXT="extrem komplexe Typen">
<node COLOR="#338800" CREATED="1536409302285" FOLDED="true" ID="ID_913930564" MODIFIED="1732658898172" TEXT="extrem komplexe Typen">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_913930564" ENDARROW="Default" ENDINCLINATION="-286;-25;" ID="Arrow_ID_1572610374" SOURCE="ID_1397772054" STARTARROW="None" STARTINCLINATION="-132;45;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1536409316172" ID="ID_1468538186" MODIFIED="1536409340127" TEXT="Call-Traces sind nahezu unlesbar">
@ -54633,6 +54618,24 @@
<node CREATED="1536515869405" ID="ID_1548641638" MODIFIED="1536515881255" TEXT="alle darauf aufbauenden Typen sind &#xfc;berfl&#xfc;ssig"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1732658651845" HGAP="-5" ID="ID_1835362800" MODIFIED="1732658895234" TEXT="sp&#xe4;ter: weitere Vereinfachung: IterableDecorator hat nur noch einen Parameter" VSHIFT="6">
<arrowlink COLOR="#7797c5" DESTINATION="ID_690902537" ENDARROW="Default" ENDINCLINATION="-8;-29;" ID="Arrow_ID_254363283" STARTARROW="None" STARTINCLINATION="8;54;"/>
<icon BUILTIN="info"/>
<node CREATED="1732658707732" ID="ID_1010776687" MODIFIED="1732658782566" TEXT="Vorteil: Typen werden nochmal drastisch einfacher">
<icon BUILTIN="ksmiletris"/>
</node>
<node CREATED="1732658717837" ID="ID_152258919" MODIFIED="1732658779997" TEXT="Nachteil: man sieht nicht mehr sofort den Ergebnis-Typ">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
man mu&#223; daf&#252;r nun i.d.R. etwas coden und die (stets vorhandenen) Value-Type-Bindings extrahieren, oder meta::Yield&lt;IT&gt; verwenden
</p>
</body>
</html></richcontent>
<icon BUILTIN="smily_bad"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1686757225113" FOLDED="true" ID="ID_1735448615" MODIFIED="1686757642923" TEXT="Koordination Quell-Pipeline bei Expansion">
<icon BUILTIN="button_ok"/>
@ -54815,6 +54818,48 @@
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1732658057281" FOLDED="true" ID="ID_964659074" MODIFIED="1732658903770" TEXT="Heterogene Ergebnis-Typen bei Expansion">
<icon BUILTIN="button_ok"/>
<node CREATED="1732658082632" ID="ID_1786139033" MODIFIED="1732658091769" TEXT="Probleme">
<node CREATED="1732658069216" ID="ID_214018331" MODIFIED="1732658097768" TEXT="direkt gecodete L&#xf6;sung mit std::common_type war noch zu starr"/>
<node CREATED="1732658098532" ID="ID_1233018800" MODIFIED="1732658117286" TEXT="die umschlie&#xdf;enden Wrapper gehen von einem Referenz-Typ aus"/>
</node>
<node CREATED="1732658119033" ID="ID_1087558825" MODIFIED="1732658472204" TEXT="inzwischen habe ich das Iteratoren-Framework flexibler gemacht">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Nebenbei bei der der Entwicklung eines tuple-zipping-Iterators; da ist mir aufgefallen, da&#223; &#252;ber weite Strecken der Ergebnistyp durchgereicht wird; einziger Knackpunkt w&#228;ren Filter und Transformer, die ihre Argumente by-Ref nehmen; ich gehe aber davon aus, da&#223; solche Funktoren ehr f&#252;r den Einzelfall geschrieben sind &#8212; und in den allermeisten F&#228;llen liefern wir ja weiterhin by-ref
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#4e6fd7" DESTINATION="ID_73007932" ENDARROW="Default" ENDINCLINATION="-1571;53;" ID="Arrow_ID_1348614829" STARTARROW="None" STARTINCLINATION="-292;13;"/>
<node CREATED="1732658142230" ID="ID_1253668803" MODIFIED="1732658157017" TEXT="CoreYield-Typ wird direkt abgegriffen"/>
<node CREATED="1732658157701" ID="ID_589675170" MODIFIED="1732658175854" TEXT="operator-&gt; wird f&#xfc;r values unterdr&#xfc;ckt"/>
</node>
<node COLOR="#435e98" CREATED="1732658479584" ID="ID_327208956" MODIFIED="1732658530579" TEXT="neues Traits-Template eingef&#xfc;hrt: lib::meta::CommonResultYield">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
in value-type-binding.hpp
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="idea"/>
<node CREATED="1732658531445" ID="ID_89938606" MODIFIED="1732658541039" TEXT="baut auf std::common_type auf"/>
<node CREATED="1732658543427" ID="ID_720852404" MODIFIED="1732658555157" TEXT="handhabt aber Referenz und Const-Eigenschaft explizit"/>
<node COLOR="#338800" CREATED="1732658555834" ID="ID_1771231866" MODIFIED="1732658625190" TEXT="mit Testabdeckung in IterCoreAdapber_test">
<arrowlink COLOR="#69c89b" DESTINATION="ID_1750877358" ENDARROW="Default" ENDINCLINATION="69;1076;" ID="Arrow_ID_813654437" STARTARROW="None" STARTINCLINATION="260;-379;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1732658799417" ID="ID_690902537" MODIFIED="1732658887267" TEXT="bei IterStateWrapper / IterableDecorator: einfachere und deduzierbare Typ-Parameter">
<linktarget COLOR="#7797c5" DESTINATION="ID_690902537" ENDARROW="Default" ENDINCLINATION="-8;-29;" ID="Arrow_ID_254363283" SOURCE="ID_1835362800" STARTARROW="None" STARTINCLINATION="8;54;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1732379711542" ID="ID_1700111124" MODIFIED="1732379714311" TEXT="Erfahrungen">