Block-Flow: completed implementation of low-level cyclic extent storage
..verified boundary cases for expansion while retaining addresses of currently active extents...
This commit is contained in:
parent
824a626c2e
commit
18904e5b58
5 changed files with 160 additions and 68 deletions
|
|
@ -34,9 +34,6 @@
|
|||
**
|
||||
** @see ExtentFamily_test
|
||||
** @see gear::BlockFlow usage example
|
||||
**
|
||||
** @todo WIP-WIP-WIP 7/2023 »Playback Vertical Slice«
|
||||
**
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -49,7 +46,6 @@
|
|||
#include "lib/nocopy.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
//#include <string>
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
|
@ -59,13 +55,12 @@
|
|||
namespace vault{
|
||||
namespace mem {
|
||||
|
||||
// using util::isnil;
|
||||
// using std::string;
|
||||
using util::unConst;
|
||||
|
||||
template<typename T, size_t siz>
|
||||
class ExtentDiagnostic;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Memory manager to provide a sequence of Extents for cyclic usage.
|
||||
|
|
@ -73,7 +68,6 @@ namespace mem {
|
|||
* ctors or dtors on the objects nominally located in »slots« within the Extent.
|
||||
* @tparam T payload type living in the Extent's »slots«
|
||||
* @tparam siz number of »slots« per Extent
|
||||
* @todo WIP-WIP 7/2023
|
||||
* @see ExtentFamily_test
|
||||
*/
|
||||
template<typename T, size_t siz>
|
||||
|
|
@ -237,6 +231,7 @@ namespace mem {
|
|||
friend iterator end (ExtentFamily& exFam) { return exFam.end(); }
|
||||
|
||||
|
||||
|
||||
private: /* ====== storage management implementation ====== */
|
||||
bool
|
||||
isWrapped() const
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@ TESTING "Low-level Test Suite: Memory Management" ./test-suite --group=memory
|
|||
|
||||
|
||||
|
||||
PLANNED "Cyclic Extent Sequence" ExtentFamily_test <<END
|
||||
TEST "Cyclic Extent Sequence" ExtentFamily_test <<END
|
||||
return: 0
|
||||
END
|
||||
|
|
|
|||
|
|
@ -27,16 +27,12 @@
|
|||
|
||||
#include "lib/test/run.hpp"
|
||||
#include "vault/mem/extent-family.hpp"
|
||||
//#include "lib/time/timevalue.hpp"
|
||||
//#include "lib/format-cout.hpp"////////////////////TODO
|
||||
#include "lib/test/diagnostic-output.hpp"////////////////////TODO
|
||||
#include "lib/iter-explorer.hpp"
|
||||
//#include "lib/util.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
#include <utility>
|
||||
|
||||
using test::Test;
|
||||
//using std::move;
|
||||
using util::isnil;
|
||||
using util::isSameObject;
|
||||
using lib::explore;
|
||||
|
|
@ -46,10 +42,6 @@ namespace vault{
|
|||
namespace mem {
|
||||
namespace test {
|
||||
|
||||
// using lib::time::FrameRate;
|
||||
// using lib::time::Offset;
|
||||
// using lib::time::Time;
|
||||
|
||||
using Extents = ExtentFamily<int, 10>;
|
||||
using Extent = Extents::Extent;
|
||||
using Iter = Extents::iterator;
|
||||
|
|
@ -57,7 +49,6 @@ namespace test {
|
|||
|
||||
|
||||
|
||||
|
||||
/***************************************************************//**
|
||||
* @test document and verify a memory management scheme to maintain
|
||||
* a flexible set of _»memory extents«_ for cyclic usage.
|
||||
|
|
@ -243,10 +234,32 @@ namespace test {
|
|||
/** @test verify in detail how iteration wraps around to also reuse
|
||||
* previously dropped extents, possibly rearranging the internal
|
||||
* management-vector to allow growing new extents at the end.
|
||||
* - existing allocations are re-used cyclically
|
||||
* - this may lead to a »wrapped« internal state
|
||||
* - necessitating to expand allocations in the middle
|
||||
* - yet all existing Extent addresses remain stable
|
||||
*/
|
||||
void
|
||||
wrapAround()
|
||||
{
|
||||
// Helper to capture the storage addresses of all currently active Extents
|
||||
auto snapshotAdr = [](Extents& extents)
|
||||
{
|
||||
auto takeAdr = [](auto& x){ return &*x; };
|
||||
return explore(extents).transform(takeAdr).effuse();
|
||||
};
|
||||
auto verifyAdr = [](auto snapshot, auto it)
|
||||
{
|
||||
for (auto oldAddr : snapshot)
|
||||
{
|
||||
if (not isSameObject(*oldAddr, *it))
|
||||
return false;
|
||||
++it;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
Extents extents{5};
|
||||
CHECK ( 0 == watch(extents).first());
|
||||
CHECK ( 0 == watch(extents).last());
|
||||
|
|
@ -259,27 +272,69 @@ namespace test {
|
|||
CHECK ( 4 == watch(extents).active());
|
||||
CHECK ( 5 == watch(extents).size());
|
||||
|
||||
auto takeAdr = [](auto& x){ return &*x; };
|
||||
auto snapshot = explore(extents).transform(takeAdr).effuse();
|
||||
SHOW_EXPR(snapshot.size())
|
||||
SHOW_EXPR(snapshot[0])
|
||||
SHOW_EXPR(snapshot[3])
|
||||
auto snapshot = snapshotAdr(extents); // capture *addresses* of currently active Extents
|
||||
CHECK (4 == snapshot.size());
|
||||
|
||||
extents.openNew();
|
||||
SHOW_EXPR(watch(extents).first())
|
||||
SHOW_EXPR(watch(extents).last())
|
||||
SHOW_EXPR(watch(extents).active())
|
||||
SHOW_EXPR(watch(extents).size())
|
||||
CHECK ( 0 == watch(extents).first());
|
||||
CHECK ( 5 == watch(extents).last());
|
||||
CHECK ( 5 == watch(extents).active());
|
||||
CHECK (10 == watch(extents).size()); // Note: heuristics to over-allocate to some degree
|
||||
auto it = extents.begin();
|
||||
for (auto oldAddr : snapshot)
|
||||
{
|
||||
CHECK (isSameObject(*oldAddr, *it));
|
||||
++it;
|
||||
}
|
||||
CHECK (verifyAdr (snapshot, extents.begin()));
|
||||
|
||||
extents.dropOld(3); // place the active window such as to start on last snapshotted Extent
|
||||
CHECK ( 3 == watch(extents).first());
|
||||
CHECK ( 5 == watch(extents).last());
|
||||
CHECK ( 2 == watch(extents).active());
|
||||
CHECK (10 == watch(extents).size());
|
||||
CHECK (isSameObject (*extents.begin(), *snapshot.back()));
|
||||
|
||||
extents.openNew(6); // now provoke a »wrapped« state of internal management of active Extents
|
||||
CHECK ( 3 == watch(extents).first()); // ...Note: the position of the *first* active Extent...
|
||||
CHECK ( 1 == watch(extents).last()); // ... is *behind* the position of the last active Extent
|
||||
CHECK ( 8 == watch(extents).active()); // ... implying that the active strike wraps at allocation end
|
||||
CHECK (10 == watch(extents).size());
|
||||
snapshot = snapshotAdr (extents); // take a new snapshot; this also verifies proper iteration
|
||||
CHECK (8 == snapshot.size());
|
||||
|
||||
extents.openNew(2); // ask for more than can be accommodated without ambiguity
|
||||
CHECK ( 8 == watch(extents).first()); // ...Note: new allocation was inserted, existing tail shifted
|
||||
CHECK ( 3 == watch(extents).last()); // ... allowing for the requested two »slots« to be accommodated
|
||||
CHECK (10 == watch(extents).active());
|
||||
CHECK (15 == watch(extents).size());
|
||||
CHECK (verifyAdr (snapshot, extents.begin())); // ... yet all existing Extent addresses have been rotated transparently
|
||||
|
||||
extents.dropOld(10); // close out all active slots, wrapping the first-pos to approach last
|
||||
CHECK ( 3 == watch(extents).first());
|
||||
CHECK ( 3 == watch(extents).last());
|
||||
CHECK ( 0 == watch(extents).active());
|
||||
CHECK (15 == watch(extents).size());
|
||||
|
||||
extents.openNew(12); // provoke a special boundary situation, where the end is *just wrapped*
|
||||
CHECK ( 3 == watch(extents).first());
|
||||
CHECK ( 0 == watch(extents).last());
|
||||
CHECK (12 == watch(extents).active());
|
||||
CHECK (15 == watch(extents).size());
|
||||
|
||||
extents.dropOld(11); // and make this boundary situation even more nasty, just sitting on the rim
|
||||
CHECK (14 == watch(extents).first());
|
||||
CHECK ( 0 == watch(extents).last());
|
||||
CHECK ( 1 == watch(extents).active());
|
||||
CHECK (15 == watch(extents).size());
|
||||
|
||||
CHECK (14 == extents.begin().getIndex());
|
||||
snapshot = snapshotAdr (extents); // verify iteration end just after wrapping properly detected
|
||||
CHECK (1 == snapshot.size());
|
||||
CHECK (isSameObject (*extents.begin(), *snapshot.front()));
|
||||
|
||||
extents.openNew(14); // and now provoke further expansion, adding new allocation right at start
|
||||
CHECK (19 == watch(extents).first()); // ...Note: first must be relocated to sit again at the very rim
|
||||
CHECK (14 == watch(extents).last()); // ... to allow last to sit at the index previously used by first
|
||||
CHECK (15 == watch(extents).active());
|
||||
CHECK (20 == watch(extents).size());
|
||||
|
||||
CHECK (19 == extents.begin().getIndex()); // ... yet address of the first Extent remains the same, just held in another slot
|
||||
CHECK (isSameObject (*extents.begin(), *snapshot.front()));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -7095,7 +7095,7 @@ The Scheduler is now considered an implementation-level facility with an interfa
|
|||
&rarr; [[Workers|SchedulerWorker]]
|
||||
</pre>
|
||||
</div>
|
||||
<div title="SchedulerMemory" creator="Ichthyostega" modifier="Ichthyostega" created="202307031622" modified="202307032243" tags="Rendering operational draft" changecount="11">
|
||||
<div title="SchedulerMemory" creator="Ichthyostega" modifier="Ichthyostega" created="202307031622" modified="202307121942" tags="Rendering operational draft" changecount="20">
|
||||
<pre>//The Scheduler uses an »Extent« based memory management scheme known as {{{BlockFlow}}}.//
|
||||
The organisation of rendering happens in terms of [[Activities|RenderActivity]], which may bound by //dependencies// and limited by //deadlines.// For the operational point of view this implies that a sequence of allocations must be able to „flow through the Scheduler“ -- in fact, only references to these {{{Activity}}}-records are passed, while the actual descriptors reside at fixed memory locations. This is essential to model the dependencies and conditional execution structures efficiently. At some point however, any {{{Activity}}}-record will either be //performed// or //obsoleted// -- and this leads to the idea of managing the allocations in //extents// of memory here termed as »Epochs«
|
||||
* a new Activity is planted into a suitable //Epoch,// based on its deadline
|
||||
|
|
@ -7109,8 +7109,15 @@ This is a rather fragile composition and chosen here for performance reasons; wh
|
|||
Unfortunately this tricky arrangement also implies that many safety barriers of the C++ language are circumvented. A strict processing regime must be established, with clear rules as to when activities may, or may no longer be accessed.
|
||||
* each »Epoch« gets an associated //deadline//
|
||||
* when the next [[job|RenderJob]] processed by a worker starts //after this Epoch's deadline//, the worker //has left the Epoch.//
|
||||
* when all workers have left an Epoch, only ''pending async IO tasks'' need to be considered, since such IO task can always be delayed for an extended period of time. For an IO task, buffers need to be kept available, and those buffers are indirectly tied to the job depending on them.
|
||||
* when all workers have left an Epoch, only ''pending async IO tasks'' need to be considered, since IO can possibly be delayed for an extended period of time.<br/>For an IO task, buffers //need to be kept available,// and those buffers are indirectly tied to the job depending on them.
|
||||
* ⟹ thus a count of pending IO activities must be maintained //for each Epoch// -- implemented by the same mechanism also employed for dependencies between render jobs, which is a notification message causing a local counter to be decremented.
|
||||
|
||||
!operational capabilities
|
||||
The memory management for the scheduler is arranged into three layers...
|
||||
* raw memory is allocated in large blocks of {{{Extent}}} size -- {{red{currently as of 7/23}}} claimed from regular heap storage
|
||||
* a low-level allocation scheme, the {{{ExtentFamily}}} uses a //pool of extents cyclically,// with the ability to claim more extents on-demand
|
||||
* the high-level {{{BlockFlow}}} allocation manager is aware of scheduler semantics and dresses up those extents as {{{Epoch}}}
|
||||
For each new RenderActivity, the API usage with the help of the {{{ActivityLang}}} is required to designate a ''deadline'' -- which can be used to associate the corresponding {{{Activity}}}-records with a suitable {{{Epoch}}}. The //temporal spacing// of epochs, as well as the number of active epochs (=extents) must be managed dynamically. {{red{As of 7/23, a scheme to avoid control oscillations}}} need to be devised, see [[#1316|https://issues.lumiera.org/ticket/1316]]. When the reserved allocation for an epoch turns out as insufficient (i.e. the underlying extent has been filled up prior to maturity), further {{{Activity}}} records will be //„borrowed“// from the next epoch, while reducing the epoch spacing for compensation. Each {{{Epoch}}} automatically maintains a specifically rigged »''~EpochGuard''«-{{{Activity}}}, always located in the first »slot« of the epoch storage. This guard models the deadline and additionally allows to block deallocation with a count-down latch, which can be tied to pending IO operations.
|
||||
</pre>
|
||||
</div>
|
||||
<div title="SchedulerRequirements" modifier="Ichthyostega" created="201107080145" modified="201112171835" tags="Rendering spec draft discuss">
|
||||
|
|
|
|||
|
|
@ -78789,9 +78789,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1688515126831" ID="ID_1528998679" MODIFIED="1688515184828" TEXT="Epoche aktiv oder obsolet"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1688394889309" ID="ID_1132827905" MODIFIED="1688868065166" TEXT="ExtentFamily_test">
|
||||
<linktarget COLOR="#eb4070" DESTINATION="ID_1132827905" ENDARROW="Default" ENDINCLINATION="-593;73;" ID="Arrow_ID_709934622" SOURCE="ID_504623704" STARTARROW="None" STARTINCLINATION="-214;-18;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1688394889309" ID="ID_1132827905" MODIFIED="1689188274739" TEXT="ExtentFamily_test">
|
||||
<linktarget COLOR="#40c5eb" DESTINATION="ID_1132827905" ENDARROW="Default" ENDINCLINATION="-593;73;" ID="Arrow_ID_709934622" SOURCE="ID_504623704" STARTARROW="None" STARTINCLINATION="-214;-18;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1688394900403" ID="ID_1380392473" MODIFIED="1688394919878" TEXT="underlying sequence-of-extents">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
|
|
@ -78854,19 +78854,34 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1688863046274" ID="ID_121256425" MODIFIED="1689182097866" TEXT="iteration mit wrap-around">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1688863046274" ID="ID_121256425" MODIFIED="1689188255487" TEXT="iteration mit wrap-around">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1689182063013" ID="ID_750255233" MODIFIED="1689182092157" TEXT="Diagnose: Iterator-Stellung und allozierte Addressen prüfen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688863075348" ID="ID_619946525" MODIFIED="1688863105883" TEXT="Iteration in Normal-Stellung alloziert am Ende">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689184284607" ID="ID_231887241" MODIFIED="1689184306124" TEXT="im Debugger auf Plausibilität geprüft">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1689184307170" ID="ID_1796856440" MODIFIED="1689184322898" TEXT="Speicherblöcke enthalten tatsächlich »Müll«">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688863063471" ID="ID_1548989724" MODIFIED="1688863074305" TEXT="Iteration belegt freigegebene Extents erneut">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689184324601" ID="ID_1203335340" MODIFIED="1689184356437" TEXT="Speicher-Adressen in <raw> und als Extent& sind identisch">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688863109043" ID="ID_1214274693" MODIFIED="1688863138245" TEXT="stößt die Iteration nach wrap-around an Grenzen, so wird re-Normalisiert">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689184357957" ID="ID_1395108098" MODIFIED="1689184375062" TEXT="im Snapshot-Vektor stehen tatsächlich die Extent* (Adressen)">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1688863075348" ID="ID_619946525" MODIFIED="1689188166869" TEXT="Iteration in Normal-Stellung alloziert am Ende">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1688863063471" ID="ID_1548989724" MODIFIED="1689188170837" TEXT="Iteration belegt freigegebene Extents erneut">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1688863109043" ID="ID_1214274693" MODIFIED="1689188242156" TEXT="nach wrap-around werden zusätzliche Extents in der Mitte eingefügt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1689188257046" ID="ID_1274659581" MODIFIED="1689188271832" TEXT="Grenzsituation wenn das Ende grade ge-wrappt ist">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -79107,12 +79122,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688337270626" ID="ID_1810148055" MODIFIED="1688337284937" TEXT="»BlockFlow« : Implementation">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1688398675985" ID="ID_291772625" MODIFIED="1688960090391" TEXT="Basis: ExtentFamily">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688398685028" ID="ID_1348599303" MODIFIED="1688398807927" TEXT="Anforderungen">
|
||||
<node COLOR="#338800" CREATED="1688398675985" ID="ID_291772625" MODIFIED="1689188506325" TEXT="Basis: ExtentFamily">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1688398685028" ID="ID_1348599303" MODIFIED="1689188393371" TEXT="Anforderungen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1688398688699" ID="ID_1432998672" MODIFIED="1688398701914" TEXT="stellt eine Sequenz von »Extents« bereit"/>
|
||||
<node CREATED="1688432466445" ID="ID_1473749393" MODIFIED="1688432494176">
|
||||
<node CREATED="1688432466445" ID="ID_1473749393" LINK="#ID_615463720" MODIFIED="1689188719424">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -79132,9 +79147,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1688398813243" ID="ID_504623704" MODIFIED="1688960080656" TEXT="Aufbau testgetrieben...">
|
||||
<arrowlink COLOR="#eb4070" DESTINATION="ID_1132827905" ENDARROW="Default" ENDINCLINATION="-593;73;" ID="Arrow_ID_709934622" STARTARROW="None" STARTINCLINATION="-214;-18;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1688398813243" ID="ID_504623704" MODIFIED="1689188396059" TEXT="Aufbau testgetrieben...">
|
||||
<arrowlink COLOR="#40c5eb" DESTINATION="ID_1132827905" ENDARROW="Default" ENDINCLINATION="-593;73;" ID="Arrow_ID_709934622" STARTARROW="None" STARTINCLINATION="-214;-18;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1688398884005" ID="ID_1188543253" MODIFIED="1688867997850" TEXT="Basis-Struktur">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1688432746255" ID="ID_880122043" MODIFIED="1688432851088" TEXT="Entscheidung: die Größe ist eine compile-time-Konstante">
|
||||
|
|
@ -79203,7 +79218,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#b85283" DESTINATION="ID_518652809" ENDARROW="Default" ENDINCLINATION="594;42;" ID="Arrow_ID_463215029" SOURCE="ID_1531653683" STARTARROW="None" STARTINCLINATION="897;-29;"/>
|
||||
<linktarget COLOR="#535ad3" DESTINATION="ID_518652809" ENDARROW="Default" ENDINCLINATION="594;42;" ID="Arrow_ID_463215029" SOURCE="ID_1531653683" STARTARROW="None" STARTINCLINATION="897;-29;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -79221,14 +79236,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688398888563" ID="ID_1767596073" MODIFIED="1688398901315" TEXT="Iteration">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#435e98" CREATED="1688437541022" ID="ID_1493417420" MODIFIED="1689039356340" TEXT="kann man überhaupt iterieren ohne einen TransformIterator zu verwenden?">
|
||||
<node COLOR="#338800" CREATED="1688398888563" ID="ID_1767596073" MODIFIED="1689188349830" TEXT="Iteration">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1688437541022" FOLDED="true" ID="ID_1493417420" MODIFIED="1689188442612" TEXT="kann man überhaupt iterieren ohne einen TransformIterator zu verwenden?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1688509701330" ID="ID_1512622255" MODIFIED="1688509710564" TEXT="ja: ganz banal">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1688509711550" ID="ID_868274901" MODIFIED="1688509754176" TEXT="mit einem IterAdapter">
|
||||
<node CREATED="1688509711550" FOLDED="true" ID="ID_868274901" MODIFIED="1688509754176" TEXT="mit einem IterAdapter">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -79371,8 +79386,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1688509796132" ID="ID_361634809" MODIFIED="1688853056871" TEXT="fragt sich bloß: wird überhaupt ein Iterator gebraucht?">
|
||||
<arrowlink COLOR="#7e3acf" DESTINATION="ID_836380061" ENDARROW="Default" ENDINCLINATION="47;-174;" ID="Arrow_ID_166794449" STARTARROW="None" STARTINCLINATION="-280;14;"/>
|
||||
<node COLOR="#435e98" CREATED="1688509796132" FOLDED="true" ID="ID_361634809" MODIFIED="1688853056871" TEXT="fragt sich bloß: wird überhaupt ein Iterator gebraucht?">
|
||||
<arrowlink COLOR="#473acf" DESTINATION="ID_836380061" ENDARROW="Default" ENDINCLINATION="47;-174;" ID="Arrow_ID_166794449" STARTARROW="None" STARTINCLINATION="-289;16;"/>
|
||||
<node CREATED="1688852868967" ID="ID_1480472415" MODIFIED="1689036951117" TEXT="Antwort: ja — und zwar um Wachstum nahtlos zu ermöglichen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
|
@ -79389,8 +79404,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#435e98" CREATED="1688853104969" ID="ID_1620391720" MODIFIED="1689039292684" TEXT="nach Iterations-Ende muß nahtlos eine Allokations-Erweiterung folgen können">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1689037074376" ID="ID_732439061" MODIFIED="1689037112236" TEXT="automatisch die Allokation expandieren?">
|
||||
<node COLOR="#435e98" CREATED="1689037074376" ID="ID_732439061" MODIFIED="1689188488227" TEXT="automatisch die Allokation expandieren?">
|
||||
<icon BUILTIN="help"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1689037090654" ID="ID_316316225" MODIFIED="1689037110364" TEXT="Antwort: möglich aber keine gute Idee">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
|
|
@ -79423,6 +79439,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1689188453899" HGAP="29" ID="ID_210565250" MODIFIED="1689188475198" TEXT="folgt sauber dem zyklischen Nutzungsmuster" VSHIFT="1">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1688398893220" ID="ID_675575195" MODIFIED="1688960070966" TEXT="belegen / freigeben">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -79436,12 +79455,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1688437770295" ID="ID_867206595" MODIFIED="1688960066248" TEXT="falls am Ende">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1688957825760" ID="ID_376842621" MODIFIED="1688957834883" TEXT="vector::resize() genügt"/>
|
||||
<node COLOR="#435e98" CREATED="1688957825760" ID="ID_376842621" MODIFIED="1689188373498" TEXT="vector::resize() genügt"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1688437784470" ID="ID_797852741" MODIFIED="1688960065205" TEXT="falls wrap-around">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1688957839759" ID="ID_671792490" MODIFIED="1688957862703" TEXT="zusätzlich die neuen Elemente in die Pufferzone in der Mitte rotieren"/>
|
||||
<node CREATED="1688957863500" ID="ID_592181743" MODIFIED="1688958053349" TEXT="std::rotate() verwenden">
|
||||
<node COLOR="#435e98" CREATED="1688957839759" ID="ID_671792490" MODIFIED="1689188381525" TEXT="zusätzlich die neuen Elemente in die Pufferzone in der Mitte rotieren">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1688957863500" ID="ID_592181743" MODIFIED="1689188364215" TEXT="std::rotate() verwenden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -79474,7 +79495,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688509829145" HGAP="36" ID="ID_836380061" MODIFIED="1688514802412" TEXT="benötigte high-Level-Operationen identifizieren">
|
||||
<arrowlink COLOR="#eb4070" DESTINATION="ID_1454374119" ENDARROW="Default" ENDINCLINATION="-596;80;" ID="Arrow_ID_208594716" STARTARROW="None" STARTINCLINATION="-331;-16;"/>
|
||||
<linktarget COLOR="#7e3acf" DESTINATION="ID_836380061" ENDARROW="Default" ENDINCLINATION="47;-174;" ID="Arrow_ID_166794449" SOURCE="ID_361634809" STARTARROW="None" STARTINCLINATION="-280;14;"/>
|
||||
<linktarget COLOR="#473acf" DESTINATION="ID_836380061" ENDARROW="Default" ENDINCLINATION="47;-174;" ID="Arrow_ID_166794449" SOURCE="ID_361634809" STARTARROW="None" STARTINCLINATION="-289;16;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688510160724" ID="ID_915708936" MODIFIED="1688772898446" TEXT="Activity allozieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -80530,9 +80551,23 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1688438177472" ID="ID_854658770" MODIFIED="1688438183516" TEXT="Weiterentwicklung">
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1688438184671" ID="ID_1971690047" MODIFIED="1688438194457" TEXT="Prüfen / messen">
|
||||
<icon BUILTIN="bell"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1688438197846" ID="ID_1531653683" MODIFIED="1688438261107" TEXT="findet für POD tatsächlich keine value-Initialisierung der Storage statt?">
|
||||
<arrowlink COLOR="#b85283" DESTINATION="ID_518652809" ENDARROW="Default" ENDINCLINATION="594;42;" ID="Arrow_ID_463215029" STARTARROW="None" STARTINCLINATION="897;-29;"/>
|
||||
<node COLOR="#435e98" CREATED="1688438197846" ID="ID_1531653683" MODIFIED="1689188696667" TEXT="findet für POD tatsächlich keine value-Initialisierung der Storage statt?">
|
||||
<arrowlink COLOR="#535ad3" DESTINATION="ID_518652809" ENDARROW="Default" ENDINCLINATION="594;42;" ID="Arrow_ID_463215029" STARTARROW="None" STARTINCLINATION="897;-29;"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node COLOR="#338800" CREATED="1689188627004" HGAP="35" ID="ID_1696284581" MODIFIED="1689188685265" VSHIFT="8">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head></head>
|
||||
<body>
|
||||
<p>
|
||||
tatsächlich ... wenn die Datenfelder <i>base values </i>sind
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1689188529497" ID="ID_595569173" LINK="#ID_1796856440" MODIFIED="1689188565632" TEXT="verifiziert im Rahmen von ExtentFamily_test">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue