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:
parent
b6ade2c0cf
commit
99c4663719
15 changed files with 154 additions and 119 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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_); }
|
||||
|
|
|
|||
|
|
@ -441,7 +441,7 @@ namespace gear {
|
|||
|
||||
|
||||
/** Adapted storage-Extent iterator, directly exposing Epoch& */
|
||||
using EpochIter = lib::IterableDecorator<Epoch, StorageAdaptor>;
|
||||
using EpochIter = lib::IterableDecorator<StorageAdaptor>;
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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_}}; }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)}
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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örigen Widgets"/>
|
||||
<node CREATED="1504459462330" ID="ID_791513915" MODIFIED="1557498707223">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Verwaltung <i>autmatisch</i> via ViewLocator -> PanelLocator
|
||||
|
|
@ -20759,9 +20755,7 @@
|
|||
</node>
|
||||
<node CREATED="1573744962237" ID="ID_1240251301" MODIFIED="1576282358094" TEXT="»Dreiecks-Anordnung« erscheint sinnvoll">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
da der ViewHook schon zwei Pointer zu zwei Entitäten halten muß, kann man Redundanzen vermeiden, indem man ihn <i>an einem dritten Ort</i> anbringt. Nä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äsentieren?
|
||||
|
|
@ -23826,9 +23816,7 @@
|
|||
</node>
|
||||
<node CREATED="1560698814327" ID="ID_44788176" MODIFIED="1576282358076" TEXT="wie wird es zugä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 »Oberdiogonalen«, d.h die Diagonale durch das obere Rechteck mit Höhe Φ-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ß 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> man eine <b>zufällig</b> 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ührt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...auch das basiert auf einer pragmatischen Überlegung; theoretisch könnten wir beliebig große Pixelanzahl unterstützen, dies würde aber auf allen Ebenen zu unerwartetem Verhalten führen, dessen Konsequenzen ich nicht überblicke ⟹ dann besser eine willkürliche und hinreichend große Grenze
|
||||
|
|
@ -41873,9 +41853,7 @@
|
|||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1670285974347" ID="ID_281565361" MODIFIED="1670517155305" TEXT="pixel/maxExtension > 1/ LIM_HAZARD">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
wenn der Zoom-Faktor einen größeen Nenner bekommt, wird er nach den inzwischen etablierten Richtlinien als »toxisch« betrachtet, und das heißt, die typischen Berechnungen im ZoomWindow kö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ü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ü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ögliche Gesamtsequenz">
|
||||
|
|
@ -53314,7 +53287,8 @@
|
|||
<node CREATED="1732499731453" ID="ID_524965988" MODIFIED="1732499744446" TEXT="sofern man sinnvoll auf einen kleinsten gemeinsamen Nenner zurückfällt"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1732499748626" ID="ID_73007932" MODIFIED="1732576975282" TEXT="nochmal untersuchen: können wir Value-Ergebnisse aus der Pipeline unterstützen?">
|
||||
<node COLOR="#435e98" CREATED="1732499748626" ID="ID_73007932" MODIFIED="1732658339211" TEXT="nochmal untersuchen: können wir Value-Ergebnisse aus der Pipeline unterstü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-> kann nicht unterstützt werden">
|
||||
<node CREATED="1732499786605" ID="ID_1510842318" MODIFIED="1732499805038" TEXT="diesen müß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 ⟶ 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 »State Core« zu tun hat"/>
|
||||
<node CREATED="1732584430730" ID="ID_1543136731" MODIFIED="1732584440733" TEXT="...wofü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ä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ä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önnte in der Tat">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
|
|
@ -53531,12 +53507,21 @@
|
|||
</node>
|
||||
<node CREATED="1732628547993" ID="ID_1897860408" MODIFIED="1732628563866" TEXT="deshalb muß der zweite (jetzt erste) Parameter bleiben, kann aber defaultet sein"/>
|
||||
<node CREATED="1732628564623" ID="ID_1023873369" MODIFIED="1732628576939" TEXT="und würde damit auch konsistent der tatsächliche Rückgabetyp sein"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1732628578845" ID="ID_734093259" MODIFIED="1732628604773" TEXT="disruptiv — aber substantielle Verbesserung">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1732628578845" ID="ID_734093259" MODIFIED="1732658950621" TEXT="disruptiv — 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 über die Parameter von IterStateWrapper nachdenken">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#435e98" CREATED="1732629696172" ID="ID_830334020" MODIFIED="1732658953629" TEXT="dann auch nochmal ü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ö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ührt ⟹ 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 überflüssig"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1732658651845" HGAP="-5" ID="ID_1835362800" MODIFIED="1732658895234" TEXT="spä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ß dafür nun i.d.R. etwas coden und die (stets vorhandenen) Value-Type-Bindings extrahieren, oder meta::Yield<IT> 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ösung mit std::common_type war noch zu starr"/>
|
||||
<node CREATED="1732658098532" ID="ID_1233018800" MODIFIED="1732658117286" TEXT="die umschließ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ß über weite Strecken der Ergebnistyp durchgereicht wird; einziger Knackpunkt wären Filter und Transformer, die ihre Argumente by-Ref nehmen; ich gehe aber davon aus, daß solche Funktoren ehr für den Einzelfall geschrieben sind — und in den allermeisten Fä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-> wird für values unterdrückt"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1732658479584" ID="ID_327208956" MODIFIED="1732658530579" TEXT="neues Traits-Template eingefü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">
|
||||
|
|
|
|||
Loading…
Reference in a new issue