Chain-Load: lazy init of functional configuration now complete
...so this was yet another digression, caused by the desire somehow to salvage this problematic component design. Using a DSL token fluently, while internally maintaining a complex and totally open function based configuration is a bit of a stretch.
This commit is contained in:
parent
659441fa88
commit
f1c156b4cd
4 changed files with 383 additions and 194 deletions
|
|
@ -45,7 +45,8 @@
|
|||
** before first use. Thus, a _»trojan functor«_ is placed into this work-function,
|
||||
** with the goal to activate a „trap“ on first use. This allows to invoke the actual
|
||||
** initialisation, which is also configured as a functor, and which is the only part
|
||||
** the client must provide actively, to activate the mechanism.
|
||||
** the client must provide actively, to activate the mechanism. Several initialisation
|
||||
** steps can be attached consecutively, and will later be triggered in sequence.
|
||||
**
|
||||
** There is one _gory detail_ however: the initialisation hook needs the actual instance
|
||||
** pointer valid *at the time of actual initialisation*. And since initialisation shall
|
||||
|
|
@ -54,7 +55,10 @@
|
|||
** that the »trojan functor« itself is stored somehow embedded into the target object
|
||||
** to be initialised. If there is a fixed distance relation in memory, then the target
|
||||
** can be derived from the self-position of the functor; if this assumption is broken
|
||||
** however, memory corruption and SEGFAULT may be caused.
|
||||
** however, memory corruption and SEGFAULT might ensue. These assumptions are covered
|
||||
** by an assertion and unit tests; as long as the function and the LazyInit instance
|
||||
** are arranged in a fixed memory layout, this scheme should work. Do not place one
|
||||
** or the other into a virtual base class though.
|
||||
**
|
||||
** @todo 11/2023 at the moment I am just desperately trying to get a bye-product of my
|
||||
** main effort into usable shape and salvage an design idea that sounded clever
|
||||
|
|
@ -384,12 +388,13 @@ namespace lib {
|
|||
TargetFun* target = relocate<TargetFun> (location, -FUNCTOR_PAYLOAD_OFFSET);
|
||||
LazyInit* self = relocate<LazyInit> (target, -targetOffset);
|
||||
REQUIRE (self);
|
||||
// tie storage to this (possibly recursive) call
|
||||
auto storageHandle = move(self->pendingInit_);
|
||||
// setup target as it would be with eager init
|
||||
(*target) = maybeInvoke<SIG> (previousInit, location);
|
||||
// invoke init, possibly downcast to derived *self
|
||||
performInit (static_cast<ExpectedArg> (self));
|
||||
self->pendingInit_.reset(); // release storage
|
||||
return *target; // invoked by the »Trojan« to yield first result
|
||||
return *target; // back to the »Trojan« to yield first result
|
||||
}};
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -439,7 +439,7 @@ out-lit: 42
|
|||
END
|
||||
|
||||
|
||||
PLANNED "Lazy init of a functor" LazyInit_test <<END
|
||||
TEST "Lazy init of a functor" LazyInit_test <<END
|
||||
END
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -27,11 +27,9 @@
|
|||
|
||||
|
||||
#include "lib/test/run.hpp"
|
||||
#include "lib/test/test-helper.hpp"
|
||||
#include "lib/lazy-init.hpp"
|
||||
//#include "lib/format-string.hpp"
|
||||
//#include "lib/test/test-helper.hpp"
|
||||
//#include "lib/test/testdummy.hpp"
|
||||
#include "lib/test/diagnostic-output.hpp" /////////////////////TODO TODOH
|
||||
#include "lib/meta/util.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
#include <memory>
|
||||
|
|
@ -41,28 +39,23 @@
|
|||
namespace lib {
|
||||
namespace test{
|
||||
|
||||
// using util::_Fmt;
|
||||
using std::make_unique;
|
||||
using util::isSameObject;
|
||||
using lib::meta::isFunMember;
|
||||
using lib::meta::disable_if;
|
||||
using err::LUMIERA_ERROR_LIFECYCLE;
|
||||
|
||||
using std::is_same;
|
||||
using std::remove_reference_t;
|
||||
using std::make_unique;
|
||||
|
||||
|
||||
namespace { // policy and configuration for test...
|
||||
|
||||
//
|
||||
}//(End) Test config
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************//**
|
||||
* @test Verify a mix-in to allow for lazy initialisation of complex infrastructure
|
||||
* tied to a std::function; the intention is to have a »trap« hidden in the
|
||||
* function itself to trigger on first use and perform the one-time
|
||||
* initialisation, then finally lock the object in place.
|
||||
* initialisation, then finally lock the object at a fixed place.
|
||||
* @see lazy-init.hpp
|
||||
* @see lib::RandomDraw
|
||||
*/
|
||||
|
|
@ -344,14 +337,14 @@ namespace test{
|
|||
CHECK (self);
|
||||
if (self->fun)
|
||||
// chain-up behind existing function
|
||||
self->fun = [self, prevFun = move(self->fun), nextFun = move(theFun)]
|
||||
self->fun = [self, prevFun=self->fun, nextFun=theFun]
|
||||
(int i)
|
||||
{
|
||||
return nextFun (prevFun (i));
|
||||
};
|
||||
else
|
||||
// build new function chain, inject seed from object
|
||||
self->fun = [self, newFun = move(theFun)]
|
||||
self->fun = [self, newFun=theFun]
|
||||
(int i)
|
||||
{
|
||||
return newFun (i + self->seed); // Note: binding to actual instance location
|
||||
|
|
@ -366,8 +359,8 @@ namespace test{
|
|||
{
|
||||
installInitialiser(fun, buildInit([](int){ return 0; }));
|
||||
}
|
||||
|
||||
template<typename FUN>
|
||||
// prevent this ctor from shadowing the copy ctors //////TICKET #963
|
||||
template<typename FUN, typename =disable_if<is_same<remove_reference_t<FUN>, LazyDemo>>>
|
||||
LazyDemo (FUN&& someFun)
|
||||
: LazyInit{MarkDisabled()}
|
||||
, fun{}
|
||||
|
|
@ -393,51 +386,102 @@ namespace test{
|
|||
* copied; they may even be assigned to existing instances, overwriting their state.
|
||||
* - a second given function will be chained behind the first one; this happens immediately
|
||||
* if the first function was already invoked (and this initialised)
|
||||
* - but when however both functions are attached immediately, prior to invocation,
|
||||
* then an elaborate chain of initialisers is setup behind the scenes and played back
|
||||
* in definition order once lazy initialisation is triggered
|
||||
* - all the intermediary state is safe to copy and move and fork
|
||||
* @remark 11/2023 memory allocations were verified using lib::test::Tracker and the EventLog
|
||||
*/
|
||||
void
|
||||
verify_complexUsageWithCopy()
|
||||
{
|
||||
LazyDemo d1;
|
||||
CHECK (not d1.isInit()); // not initialised, since function was not invoked yet
|
||||
CHECK (d1.fun); // the functor is not empty anymore, since the »trap« was installed
|
||||
LazyDemo dd;
|
||||
CHECK (not dd.isInit()); // not initialised, since function was not invoked yet
|
||||
CHECK (dd.fun); // the functor is not empty anymore, since the »trap« was installed
|
||||
|
||||
d1.seed = 2;
|
||||
CHECK (0 == d1.fun(22)); // d1 was default initialised and thus got the "return 0" function
|
||||
CHECK (d1.isInit()); // first invocation also triggered the init-routine
|
||||
dd.seed = 2;
|
||||
CHECK (0 == dd.fun(22)); // d1 was default initialised and thus got the "return 0" function
|
||||
CHECK (dd.isInit()); // first invocation also triggered the init-routine
|
||||
|
||||
// is »engaged« after init and rejects move / copy
|
||||
VERIFY_ERROR (LIFECYCLE, LazyDemo dx{move(d1)} );
|
||||
VERIFY_ERROR (LIFECYCLE, LazyDemo dx{move(dd)} );
|
||||
|
||||
|
||||
d1 = LazyDemo{[](int i) // assign a fresh copy (discarding any state in d1)
|
||||
dd = LazyDemo{[](int i) // assign a fresh copy (discarding any state in d1)
|
||||
{
|
||||
return i + 1; // using a "return i+1" function
|
||||
}};
|
||||
CHECK (not d1.isInit());
|
||||
CHECK (d1.seed == 0); // assignment indeed erased any existing settings (seed≔2)
|
||||
CHECK (d1.fun);
|
||||
CHECK (not dd.isInit());
|
||||
CHECK (dd.seed == 0); // assignment indeed erased any existing settings (seed≔2)
|
||||
CHECK (dd.fun);
|
||||
|
||||
CHECK (23 == d1.fun(22)); // new function was tied in (while also referring to self->seed)
|
||||
CHECK (d1.isInit());
|
||||
d1.seed = 3; // set the seed
|
||||
CHECK (26 == d1.fun(22)); // seed value is picked up dynamically
|
||||
CHECK (23 == dd.fun(22)); // new function was tied in (while also referring to self->seed)
|
||||
CHECK (dd.isInit());
|
||||
dd.seed = 3; // set the seed
|
||||
CHECK (26 == dd.fun(22)); // seed value is picked up dynamically
|
||||
|
||||
VERIFY_ERROR (LIFECYCLE, LazyDemo dx{move(d1)} );
|
||||
VERIFY_ERROR (LIFECYCLE, LazyDemo dx{move(dd)} );
|
||||
|
||||
// attach a further function, to be chained-up
|
||||
d1.attach([](int i)
|
||||
dd.attach([](int i)
|
||||
{
|
||||
return i / 2;
|
||||
});
|
||||
CHECK (d1.isInit());
|
||||
CHECK (d1.seed == 3);
|
||||
CHECK (12 == d1.fun(21)); // 21+3+1=25 / 2
|
||||
CHECK (13 == d1.fun(22));
|
||||
CHECK (13 == d1.fun(23));
|
||||
d1.seed++;
|
||||
CHECK (14 == d1.fun(23)); // 23+4+1=28 / 2
|
||||
CHECK (14 == d1.fun(24));
|
||||
CHECK (15 == d1.fun(25));
|
||||
CHECK (dd.isInit());
|
||||
CHECK (dd.seed == 3);
|
||||
CHECK (12 == dd.fun(21)); // 21+3+1=25 / 2
|
||||
CHECK (13 == dd.fun(22));
|
||||
CHECK (13 == dd.fun(23));
|
||||
dd.seed++;
|
||||
CHECK (14 == dd.fun(23)); // 23+4+1=28 / 2
|
||||
CHECK (14 == dd.fun(24));
|
||||
CHECK (15 == dd.fun(25));
|
||||
|
||||
// ...use exactly the same configuration,
|
||||
// but applied in one shot -> chained lazy-Init
|
||||
dd = LazyDemo{[](int i){return i+1; }}
|
||||
.attach([](int i){return i/2; });
|
||||
dd.seed = 3;
|
||||
CHECK (not dd.isInit());
|
||||
CHECK (dd.seed == 3);
|
||||
CHECK (dd.fun);
|
||||
|
||||
CHECK (12 == dd.fun(21));
|
||||
CHECK (13 == dd.fun(22));
|
||||
CHECK (13 == dd.fun(23));
|
||||
dd.seed++;
|
||||
CHECK (14 == dd.fun(23));
|
||||
CHECK (14 == dd.fun(24));
|
||||
CHECK (15 == dd.fun(25));
|
||||
|
||||
// create a nested graph of chained pending init
|
||||
dd = LazyDemo{[](int i){return i+1; }};
|
||||
LazyDemo d1{dd};
|
||||
LazyDemo d2{move(dd)};
|
||||
d2.seed = 3;
|
||||
d2.attach ([](int i){return i/2; });
|
||||
LazyDemo d3{d2};
|
||||
d2.attach ([](int i){return i-1; });
|
||||
|
||||
// dd was left in defunct state by the move, and thus is locked
|
||||
CHECK (not dd.fun);
|
||||
CHECK (dd.isInit());
|
||||
VERIFY_ERROR (LIFECYCLE, LazyDemo dx{move(dd)} );
|
||||
// this can be amended by assigning another instance not yet engaged
|
||||
dd = d2;
|
||||
d2.seed = 5;
|
||||
std::swap (d2,d3);
|
||||
std::swap (d3,d1);
|
||||
// confused?? ;-)
|
||||
CHECK (not dd.isInit() and dd.seed == 3); // Seed≡3 {i+1} ⟶ {i/2} ⟶ {i-1}
|
||||
CHECK (not d1.isInit() and d1.seed == 5); // Seed≡5 {i+1} ⟶ {i/2} ⟶ {i-1}
|
||||
CHECK (not d2.isInit() and d2.seed == 3); // Seed≡3 {i+1} ⟶ {i/2}
|
||||
CHECK (not d3.isInit() and d3.seed == 0); // Seed≡0 {i+1}
|
||||
|
||||
CHECK (12 == dd.fun(23)); // 23+3 +1 = 27/2 = 13 -1 = 12
|
||||
CHECK (13 == d1.fun(23)); // 23+5 +1 = 29/2 = 14 -1 = 13
|
||||
CHECK (13 == d2.fun(23)); // 23+3 +1 = 27/2 = 13 = 13
|
||||
CHECK (24 == d3.fun(23)); // 23+0 +1 = 24
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -96742,7 +96742,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700490465981" ID="ID_95937370" MODIFIED="1700490485279" TEXT="der Nutzer bekommt eine builder-DSL auf dem resultierenden, spezialisierten Typ"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#11660e" CREATED="1700491763307" FOLDED="true" ID="ID_1225692248" MODIFIED="1700714041514">
|
||||
<node COLOR="#11660e" CREATED="1700491763307" FOLDED="true" ID="ID_1225692248" MODIFIED="1700957411968">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -96751,9 +96751,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-466;214;" ID="Arrow_ID_834549033" SOURCE="ID_557518427" STARTARROW="None" STARTINCLINATION="242;0;"/>
|
||||
<linktarget COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="1568;-1210;" ID="Arrow_ID_298662468" SOURCE="ID_1582937575" STARTARROW="None" STARTINCLINATION="2265;134;"/>
|
||||
<linktarget COLOR="#639b93" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-812;-40;" ID="Arrow_ID_879341368" SOURCE="ID_36351098" STARTARROW="None" STARTINCLINATION="655;81;"/>
|
||||
<linktarget COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-466;214;" ID="Arrow_ID_834549033" SOURCE="ID_557518427" STARTARROW="None" STARTINCLINATION="242;0;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700491815546" ID="ID_1942150407" MODIFIED="1700713887314" TEXT="bestehenden Prototyp konsolidieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -97099,35 +97099,30 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="closed"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700771397323" ID="ID_1508566872" MODIFIED="1700771408743" TEXT="brauche re-Konfigurierung">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1700771397323" ID="ID_1508566872" MODIFIED="1700957145439" TEXT="brauche re-Konfigurierung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700771446815" ID="ID_488462675" MODIFIED="1700771465246" TEXT="im DSL-Gebrauch ist es ein value-Objekt"/>
|
||||
<node CREATED="1700771518723" ID="ID_1481914135" MODIFIED="1700771536304">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
zur Anwendung müssen Funktoren <i>gebunden </i>sein
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700772446358" ID="ID_1414778740" MODIFIED="1700772523740" TEXT="man könnte die Roh-Funktion irgendwo aufbewahren"/>
|
||||
<node CREATED="1700772494639" ID="ID_1137027795" MODIFIED="1700772550820" TEXT="besser: on-demand / lazy initialisieren">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700772585219" ID="ID_1288514282" MODIFIED="1700772589140" TEXT="Implementierung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1700772585219" FOLDED="true" ID="ID_1288514282" MODIFIED="1700957181486" TEXT="Implementierung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700772595434" ID="ID_167076178" MODIFIED="1700772600402" TEXT="Idee">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1700772622548" ID="ID_1267008084" MODIFIED="1700772805353" TEXT="Funk-Trojaner">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
In die eigentliche Auswertungsfunktion kann man eine »trojanische Funktion« installieren, die etwas völlig anderes macht, nämlich die Initialisierung. Danach überschreibt sie sich selbst mit der fertig gebundenen Funktion
|
||||
|
|
@ -97142,30 +97137,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1700773163605" ID="ID_1780777902" MODIFIED="1700773325986" TEXT="grundsätztlich ist std::function bereits ein Container">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...mit einem gewissen Grad an Type Erasure; sie haben eine bekannte, feste Größe, egal was man reinpackt, ggfs. aber verwalten sie Heap-Storage transparent
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700773082172" ID="ID_482286185" MODIFIED="1700773092962" TEXT="man könnte sie in einen OpaqueHolder packen"/>
|
||||
<node CREATED="1700773093950" ID="ID_1695195928" MODIFIED="1700773136964" TEXT="oder einen InPlaceAnyHolder">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
das ist praktisch das Gleiche, beide haben eine VTable, aber der OpaqueHolder baut darauf auf und unterstützt auch Zugriff über das Basis-Interface
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700773328463" ID="ID_1872463297" MODIFIED="1700773338841" TEXT="oder einfach Heap-Storage verwenden">
|
||||
<node CREATED="1700773344429" ID="ID_297664297" MODIFIED="1700773351404" TEXT="es lebe der shared_ptr">
|
||||
|
|
@ -97188,22 +97177,19 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700773817813" ID="ID_1896161271" MODIFIED="1700778636520" TEXT="muß später mit der konkreten Instanz aufgerufen werden"/>
|
||||
<node CREATED="1700773845235" ID="ID_1862822629" MODIFIED="1700773872409">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
init(this) ⟹ this wird <i>fertig gemacht</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700773954759" ID="ID_288410352" MODIFIED="1700773972621" TEXT="installiert die Trap-Door in den Funktor"/>
|
||||
</node>
|
||||
<node CREATED="1700773986279" ID="ID_445146544" MODIFIED="1700773993234" TEXT="trap ⟶ init">
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1700774014699" ID="ID_877534987" MODIFIED="1700774027691" TEXT="Kernproblem: *this erlangen">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700774014699" FOLDED="true" ID="ID_877534987" MODIFIED="1700954254084" TEXT="Kernproblem: *this erlangen">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node COLOR="#5b280f" CREATED="1700774132659" ID="ID_1314038863" MODIFIED="1700774158621" TEXT="nicht möglich ohne »Trick«">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
|
|
@ -97217,16 +97203,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700778224858" ID="ID_984729061" MODIFIED="1700778243311" TEXT="die Grenze variiert aber stark; libstdc++ ist ehr restriktiv"/>
|
||||
<node CREATED="1700778290585" ID="ID_665841886" MODIFIED="1700778307814">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<u>Erfahrungswert</u>: ein »Slot« geht immer
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -97245,6 +97228,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700778564373" ID="ID_1532831328" MODIFIED="1700778598692" TEXT="selber einkapseln; und per Assertion + Test absichern">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1700954234395" ID="ID_1474474663" MODIFIED="1700954251337" TEXT="(funktioniert bisher völlig astrein)">
|
||||
<font NAME="SansSerif" SIZE="11"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700778699563" ID="ID_1530959927" MODIFIED="1700778715437" TEXT="den Initialiser aufrufen"/>
|
||||
|
|
@ -97256,9 +97242,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1700778980340" ID="ID_1513073706" MODIFIED="1700779203466" TEXT="weil die Zuweisung sehr wahrscheinlich dem laufenden Code die Daten de-alloziert">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
die Trap-Door muß irgendwo auf den Initialiser zugreifen, und dieser muß wiederum die vorläufige Funktion speichern. Alle diese Allokationen müssen direkt am Trap selber »aufgehängt« werden; wenn wir also den Trap verwerfen (durch Neuzuweisung), sägen wir den Ast ab, auf dem wir sitzen. Kann man machen, wenn man Flügel hat, oder sowieso schon auf dem Sprung ist
|
||||
|
|
@ -97275,11 +97259,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#435e98" CREATED="1700779211570" ID="ID_181212829" MODIFIED="1700870784728" TEXT="sauber als Hilfskomponente aufsetzen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1700779233186" ID="ID_155856101" MODIFIED="1700779259708" TEXT="Begründung: wird schon wieder Komplex und hat ein paar vergrabene Hunde..."/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700779263072" ID="ID_1457586572" MODIFIED="1700792011790" TEXT="lib/lazy-init.hpp">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1700779263072" ID="ID_1457586572" MODIFIED="1700957081594" TEXT="lib/lazy-init.hpp">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700779275391" ID="ID_1990626821" MODIFIED="1700792011791" TEXT="LazyInit_test.cpp">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1700779275391" ID="ID_1990626821" MODIFIED="1700957083399" TEXT="LazyInit_test.cpp">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700875396864" ID="ID_1861612135" MODIFIED="1700875416597" TEXT="verify_trojanLambda">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
|
|
@ -97307,29 +97291,27 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700875598444" ID="ID_373137353" MODIFIED="1700875604078" TEXT="erbt direkt von einer function"/>
|
||||
<node CREATED="1700875605831" ID="ID_422784862" MODIFIED="1700875617830" TEXT="prüfe, daß der Initialiser nur einmal läuft"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700875396866" ID="ID_1176534247" MODIFIED="1700875620954" TEXT="verify_complexUsageWithCopy">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1700875396866" FOLDED="true" ID="ID_1176534247" MODIFIED="1700957085796" TEXT="verify_complexUsageWithCopy">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700875626785" ID="ID_1403498874" MODIFIED="1700875642770" TEXT="baue bewußt ein möglichst verschlungenes (realisitisches) Beispiel"/>
|
||||
<node CREATED="1700875643550" ID="ID_1209015029" MODIFIED="1700875657152" TEXT="macht eine nicht-triviale Verknpüfung, d.h. adaptiert die gegebene Funktion noch"/>
|
||||
<node CREATED="1700875658155" ID="ID_278966157" MODIFIED="1700875690711">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
die Funktion ist dieses Mal <b>ein Feld</b> <i>im </i>abgeleiteten Objekt (yess!)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700875716980" ID="ID_649768460" MODIFIED="1700875737214" TEXT="default-ctor installiert fallback-Funkction"/>
|
||||
<node CREATED="1700875738346" ID="ID_1264877418" MODIFIED="1700875746853" TEXT="ein ctor mit explizit gegebener Function"/>
|
||||
<node CREATED="1700875748355" ID="ID_103299394" MODIFIED="1700875753491" TEXT="Testfälle">
|
||||
<node COLOR="#338800" CREATED="1700875754418" ID="ID_660767780" MODIFIED="1700878189835" TEXT="default-Objekt">
|
||||
<node COLOR="#338800" CREATED="1700875748355" ID="ID_103299394" MODIFIED="1700954036849" TEXT="Testfälle">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700875764710" ID="ID_695451647" MODIFIED="1700878192178" TEXT="Zustand nach Konstruktion">
|
||||
<node COLOR="#338800" CREATED="1700875754418" FOLDED="true" ID="ID_660767780" MODIFIED="1700954033543" TEXT="default-Objekt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700875764710" FOLDED="true" ID="ID_695451647" MODIFIED="1700954031912" TEXT="Zustand nach Konstruktion">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1700875806915" ID="ID_1651702944" MODIFIED="1700878163584" TEXT="Function-Feld ist nicht initialisiert">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
|
|
@ -97365,13 +97347,15 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1700878177787" ID="ID_707719092" MODIFIED="1700878185308" TEXT="engaged / reject copy">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700930546516" ID="ID_1564171170" MODIFIED="1700930756771" TEXT="chained / repeated init">
|
||||
<linktarget COLOR="#d33070" DESTINATION="ID_1564171170" ENDARROW="Default" ENDINCLINATION="-852;94;" ID="Arrow_ID_474620988" SOURCE="ID_582127020" STARTARROW="None" STARTINCLINATION="353;26;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1700930691509" ID="ID_1932503456" MODIFIED="1700930701095" TEXT="nach Erweiterung auf chained-Init"/>
|
||||
<node COLOR="#338800" CREATED="1700930772985" ID="ID_437187802" MODIFIED="1700936377561" TEXT="Fall-1 schrittweise ⟹ 2.Funktion wird direkt angewendet">
|
||||
<node COLOR="#338800" CREATED="1700930546516" FOLDED="true" ID="ID_1564171170" MODIFIED="1700954019711" TEXT="chained / repeated init">
|
||||
<linktarget COLOR="#3fb0c8" DESTINATION="ID_1564171170" ENDARROW="Default" ENDINCLINATION="-852;94;" ID="Arrow_ID_474620988" SOURCE="ID_582127020" STARTARROW="None" STARTINCLINATION="353;26;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1700930810316" ID="ID_1951631206" MODIFIED="1700934641597" TEXT="SEGFAULT">
|
||||
<node COLOR="#435e98" CREATED="1700930691509" ID="ID_1932503456" MODIFIED="1700954017994" TEXT="nach Erweiterung auf chained-Init">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700930772985" FOLDED="true" ID="ID_437187802" MODIFIED="1700953905576" TEXT="Fall-1 schrittweise ⟹ 2.Funktion wird direkt angewendet">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1700930810316" FOLDED="true" ID="ID_1951631206" MODIFIED="1700953901716" TEXT="SEGFAULT">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1700930968706" ID="ID_112881994" MODIFIED="1700936360706" TEXT="vorheriger Testfall: verify_lazyInitialisation">
|
||||
<icon BUILTIN="forward"/>
|
||||
|
|
@ -97381,9 +97365,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700932393247" ID="ID_1817539105" MODIFIED="1700932400889" TEXT="mit dem Debugger nicht reproduzierbar"/>
|
||||
<node CREATED="1700932402518" ID="ID_895380648" MODIFIED="1700932452565" TEXT="wenn man die letzten beiden Zeilen auskommentiert ⟶ Fehler verschwindet">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
//          CHECK (1 == invoked);
|
||||
|
|
@ -97392,23 +97374,19 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
//          CHECK (init);
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700932454870" ID="ID_1214658102" MODIFIED="1700932500906" TEXT="nur die letzte Zeile auskommetiert ⟶ bad_function_call expcption (manchmal SEGFAULT)"/>
|
||||
</node>
|
||||
<node CREATED="1700932559871" ID="ID_291091970" MODIFIED="1700932592585">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
die neue <b><font color="#b80202">maybeInvoke</font></b>()
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node COLOR="#82294c" CREATED="1700932694758" ID="ID_1897631554" MODIFIED="1700932717669" TEXT="return (*pendingDelegate) (location); // invoke to create new TargetFun">
|
||||
<font NAME="Monospaced" SIZE="12"/>
|
||||
|
|
@ -97419,9 +97397,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700933322337" ID="ID_1721922743" MODIFIED="1700933339191" TEXT="capture previousInit">
|
||||
<node CREATED="1700933340351" ID="ID_455359128" MODIFIED="1700933402320" TEXT="ist korrupt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
previousInit
|
||||
|
|
@ -97430,23 +97406,35 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Details:<error reading variable: Cannot access memory at address 0x3000000030>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700933404336" ID="ID_606348307" MODIFIED="1700933415215" TEXT="get() zeigt auf eine Stack-Addresse (sollte Heap sein)"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700932731640" ID="ID_360832756" MODIFIED="1700932762749" TEXT="⟹ Problem steckt im erweiterten Memory-Management für chained-initialiser"/>
|
||||
<node BACKGROUND_COLOR="#d5bb9b" COLOR="#fa002a" CREATED="1700932787977" ID="ID_1177559316" MODIFIED="1700934162408" TEXT="gedankenloser Schmuh : move (pendingInit_) .....">
|
||||
<node BACKGROUND_COLOR="#d5bb9b" COLOR="#fa002a" CREATED="1700932787977" ID="ID_1177559316" MODIFIED="1700953280256">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
gedankenloser Schmuh :
|
||||
</p>
|
||||
<p>
|
||||
 move (pendingInit_) .....
|
||||
</p>
|
||||
<p>
|
||||
 und nachher pendingInit_.reset()
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#f23836" DESTINATION="ID_1177559316" ENDARROW="Default" ENDINCLINATION="-444;622;" ID="Arrow_ID_291683444" SOURCE="ID_173554336" STARTARROW="Default" STARTINCLINATION="852;0;"/>
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
<node CREATED="1700933651909" ID="ID_1160983607" MODIFIED="1700933990550" TEXT="was passiert bei move(shared_ptr)??">
|
||||
<arrowlink COLOR="#f01130" DESTINATION="ID_1523180887" ENDARROW="Default" ENDINCLINATION="-71;-11;" ID="Arrow_ID_1745949442" STARTARROW="None" STARTINCLINATION="155;12;"/>
|
||||
<node CREATED="1700934828648" ID="ID_831687284" MODIFIED="1700934902699" TEXT="nebenbei: im Code angeschaut">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
      __shared_ptr(__shared_ptr&& __r) noexcept
|
||||
|
|
@ -97467,8 +97455,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
      }
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<node CREATED="1700934837739" ID="ID_777504264" MODIFIED="1700934845312" TEXT="ganz sauber: konstruiert ein neues Objekt"/>
|
||||
<node CREATED="1700934846062" ID="ID_1249336482" MODIFIED="1700934855657" TEXT="mit einem leeren Refcount-Subobjekt"/>
|
||||
<node CREATED="1700934856341" ID="ID_1904206411" MODIFIED="1700934867263" TEXT="und macht dann ein Swap mit dem Original-Refcount"/>
|
||||
|
|
@ -97486,24 +97473,53 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1700933934838" ID="ID_1439685001" MODIFIED="1700934189582" TEXT="Party!"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700953800190" ID="ID_1286591280" LINK="#ID_1264532109" MODIFIED="1700953891597" TEXT="später zeict sich: das ist hier tatsächlich Schmuh �� ein 2. Bug"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700934610437" ID="ID_859515833" MODIFIED="1700934638430" TEXT="ein ganz banaler Programmierfehler">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
... kein Problem mit der Logik
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700941824310" ID="ID_594264747" MODIFIED="1700941827869" TEXT="gefixt... tut">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700941831718" ID="ID_1778726043" MODIFIED="1700944413355" TEXT="Fall-2 auf einmal ⟹ kaskadierte Aurfure im Lazy-Init">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700944444321" FOLDED="true" ID="ID_1888635944" MODIFIED="1700954021865" TEXT="copy/move during init">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700950281812" ID="ID_182597722" MODIFIED="1700954004491" TEXT="insgesamt vier Instanzen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700950291738" ID="ID_1014782121" MODIFIED="1700954003493" TEXT="wirr kopiert, verschoben und vertauscht">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700950302192" ID="ID_1141440341" MODIFIED="1700954002443" TEXT="dabei mit bis zu 3 Funktionen verkettet">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700950311851" ID="ID_843032083" MODIFIED="1700954001203" TEXT="alle Berechnungen sind plausibel">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700950347418" FOLDED="true" ID="ID_1458898624" LINK="#ID_700182781" MODIFIED="1700954006675" TEXT="Speicherverhlaten beobachtet">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700953910789" ID="ID_174734454" MODIFIED="1700953964360" TEXT="Irregularität beobachtet">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1700953922570" ID="ID_1253492564" LINK="#ID_523796059" MODIFIED="1700953967039" TEXT="dahinter verbarg sich ein Memory-corruption-Bug vom Feinsten"/>
|
||||
<node COLOR="#338800" CREATED="1700953972062" ID="ID_1218264036" MODIFIED="1700953997339" TEXT="damit nach kursorischer Überprüfung saubern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -97550,16 +97566,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#e9ecac" COLOR="#ad0163" CREATED="1700794701860" ID="ID_1782883387" MODIFIED="1700829809186">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<u>Ergebnis</u>: funktioniert <b>nicht</b> mit shared_ptr
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700794792578" ID="ID_1451884191" MODIFIED="1700829893535" TEXT="wenn Lambda einfachen ptr captured ⟼ Stack-Addresse">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -97602,22 +97615,19 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700846052905" ID="ID_540455340" MODIFIED="1700870846472" TEXT="Initialiser bauen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1700846052905" ID="ID_540455340" MODIFIED="1700954263631" TEXT="Initialiser bauen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700846059161" ID="ID_1706977768" MODIFIED="1700846067230" TEXT="puh... das wird komplex">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
<node CREATED="1700846071031" ID="ID_1148836740" MODIFIED="1700846284270" TEXT="und zwar weil LazyInit strenggenommen den genauen Functor-Typ nicht kennen sollte">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
In der Tat mache ich mir da grade selber das Leben schwer, aber die <i>billige Lösung</i> würde zu Verkopplung der Belange beim Client führen, insofern der Funktor-Typ Bestandteil der Signatur von LazyInit werden müßte. Das bedeutet, da es ein mix-In ist, müßte man diesen Typ vor Instatiierung bereits kennen oder spätestens im Zuge der Instantiierung irgendwie (per Metaprogramming) ermitteln. Obwohl dies komplett unnötig wäre — denn für die gewünsche Funktionalität genügt es völlig, wenn man den target-Functor (und damit die Signatur) erst in dem Moment erfährt, in dem tatsächlich ein Initialiser vorzubereiten ist.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700846290266" ID="ID_1685278359" MODIFIED="1700846318281" TEXT="Also bleibt nur: LazyInit packt den eigentlichen Initialiser in einen opaque container"/>
|
||||
</node>
|
||||
|
|
@ -97644,20 +97654,17 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700865668069" ID="ID_96300659" MODIFIED="1700865853252" TEXT="Speicherverwaltung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1700865668069" ID="ID_96300659" MODIFIED="1700954174939" TEXT="Speicherverwaltung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1700865679180" ID="ID_3672857" MODIFIED="1700869506867">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
InPlaceBuffer<i> mißbraucht</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1700865718074" ID="ID_46417679" MODIFIED="1700865732256" TEXT="er setzt eigentlich gemeinsame Basisklasse vorraus"/>
|
||||
<node CREATED="1700865733257" ID="ID_19147628" MODIFIED="1700865768147" TEXT="InPlaceAnyHolder würde den Fall unterstützen, ist aber zu schwergewichtig (VTable)"/>
|
||||
|
|
@ -97669,6 +97676,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1700930608396" ID="ID_1911462720" MODIFIED="1700930636539" TEXT="alten shared_ptr für Verkettung jeweils in das Delegate verschieben">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700954157294" ID="ID_1046438647" LINK="#ID_1097307622" MODIFIED="1700954173869" TEXT="Speicherverhalten mit EventLog beobachtet">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700865861639" ID="ID_409549839" MODIFIED="1700865919942" TEXT="gegebenes Init-λ adaptieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -97706,20 +97716,18 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1700871143583" ID="ID_1088454070" MODIFIED="1700934358632" TEXT="muß dann aber eine Setter-Funktion public machen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700934235151" ID="ID_988517206" MODIFIED="1700934456372" TEXT="Installieren des Initialisers nun stets über den Setter">
|
||||
<node COLOR="#338800" CREATED="1700934235151" ID="ID_988517206" MODIFIED="1700954145894" TEXT="Installieren des Initialisers nun stets über den Setter">
|
||||
<linktarget COLOR="#94385e" DESTINATION="ID_988517206" ENDARROW="Default" ENDINCLINATION="530;-26;" ID="Arrow_ID_622219569" SOURCE="ID_728350277" STARTARROW="None" STARTINCLINATION="-527;27;"/>
|
||||
<linktarget COLOR="#feccb9" DESTINATION="ID_988517206" ENDARROW="Default" ENDINCLINATION="-537;28;" ID="Arrow_ID_703877314" SOURCE="ID_1994110111" STARTARROW="None" STARTINCLINATION="-214;-11;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700934478543" ID="ID_1596192488" MODIFIED="1700934519682" TEXT="elaborierte Init-Logik direkt aus der ctor-initialiser-List ist sowiso keine gute Idee">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1700934521513" ID="ID_1817606797" MODIFIED="1700934538113" TEXT="und die default-Init eines shared_ptr ist extrem leichtgewichtig"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1700871279919" ID="ID_1126055663" MODIFIED="1700871683297">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700871279919" ID="ID_1126055663" MODIFIED="1700954112820">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
hier besteht ein latentes semantsiches Problem:
|
||||
|
|
@ -97728,8 +97736,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
lazyInit ⟹ Objekt ist erst mal <i>noch nicht ganz</i> initialisiert
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#a11470" DESTINATION="ID_615420321" ENDARROW="Default" ENDINCLINATION="-38;-156;" ID="Arrow_ID_1147775137" STARTARROW="None" STARTINCLINATION="-409;35;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1700883132460" ID="ID_1624384536" MODIFIED="1700883156773" TEXT="des Genaueren: der »Trojaner« sieht wir ein valider Funktor aus"/>
|
||||
|
|
@ -97737,11 +97744,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700883213489" ID="ID_1802613840" MODIFIED="1700883224039" TEXT="...besteht zumindest die Gefahr für Endlosschleifen">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node CREATED="1700883266746" ID="ID_541587975" MODIFIED="1700883289794" TEXT="dieses Problem könnte nur durch LazyInit selber addressiert werden">
|
||||
<node COLOR="#435e98" CREATED="1700883266746" FOLDED="true" ID="ID_541587975" MODIFIED="1700954140305" TEXT="dieses Problem könnte nur durch LazyInit selber addressiert werden">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1700883302425" ID="ID_601939875" MODIFIED="1700883331621" TEXT="isInit()"/>
|
||||
<node CREATED="1700883367516" ID="ID_358220582" MODIFIED="1700883381190" TEXT="hilft nicht bei kaskadierten Aufrufen"/>
|
||||
<node CREATED="1700883887222" ID="ID_1972271604" MODIFIED="1700883898233" TEXT="Nur der Installations-Mechanismus hätte eine Chance"/>
|
||||
<node CREATED="1700883887222" ID="ID_1972271604" LINK="#ID_1052362467" MODIFIED="1700954133743" TEXT="Nur der Installations-Mechanismus hätte eine Chance"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -97751,7 +97758,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="smily_bad"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1700871359629" ID="ID_615420321" MODIFIED="1700871683297" TEXT="kann nicht alle Usage-Pattern abdecken">
|
||||
<node COLOR="#435e98" CREATED="1700871359629" FOLDED="true" ID="ID_615420321" MODIFIED="1700957193306" TEXT="kann nicht alle Usage-Pattern abdecken">
|
||||
<linktarget COLOR="#a11470" DESTINATION="ID_615420321" ENDARROW="Default" ENDINCLINATION="-38;-156;" ID="Arrow_ID_1147775137" SOURCE="ID_1126055663" STARTARROW="None" STARTINCLINATION="-409;35;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1700871415082" ID="ID_1938566813" MODIFIED="1700871510648" TEXT="es geht allerdings um ein ehr fortgeschrittenes Szenario">
|
||||
|
|
@ -97778,21 +97785,18 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700871745466" ID="ID_143069674" MODIFIED="1700871754102" TEXT="die Lektion ist inwsichen sowas von klar"/>
|
||||
<node CREATED="1700871754718" ID="ID_845938579" MODIFIED="1700871770128">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
dieses Design ist <b>MIST</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700883451009" ID="ID_1957619208" MODIFIED="1700930513797" TEXT="Analyse: wiederholte / kaskadierte Initialisierungen">
|
||||
<node COLOR="#338800" CREATED="1700883451009" FOLDED="true" ID="ID_1957619208" MODIFIED="1700930513797" TEXT="Analyse: wiederholte / kaskadierte Initialisierungen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1700883475839" ID="ID_837624106" MODIFIED="1700930507747" TEXT="Ablauf">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -97888,22 +97892,17 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700885486066" ID="ID_1745928936" MODIFIED="1700885498658">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>darauf </i>kommt es jetzt auch nicht mehr an
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700885514470" ID="ID_1944104952" MODIFIED="1700885786804" TEXT="Hinweis/Warnung: die pending-Functors sind shared">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Funktor ist Funktor!
|
||||
|
|
@ -97912,32 +97911,25 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Deshalb sind sie ja stateless (und müssen auch so bleiben, also nicht mutable). Für jeweils <i>eine Instanz</i> wird ein Funktor einfach »verbrannt«, indem man ihn aufruft und danach das pendingInit leert. Und zwar auf <b>*self</b>  — der Funktor als Solcher bleibt stateless. Wenn ihn noch jemand anders referenziert, dann schön....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700885787889" ID="ID_532859014" MODIFIED="1700885850873">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Beim Umkonfigurieren wird der pendingInit <i>verschoben</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
und zwar aus dem LazyInit-Objekt in den Adapter hinein. Der use-count bleibt dadurch gleich.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700885870078" ID="ID_1085520028" MODIFIED="1700930525033" TEXT="wenn es einen pendingInit gibt (⟹Fall-3) dann verschieben">
|
||||
|
|
@ -97950,10 +97942,157 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700953516124" ID="ID_1258802311" MODIFIED="1700954099248" TEXT="Anpassung: Memory-Management an die jeweilige (rekursive) Initializer-Instanz binden">
|
||||
<arrowlink COLOR="#37b613" DESTINATION="ID_1264532109" ENDARROW="Default" ENDINCLINATION="-193;0;" ID="Arrow_ID_753230844" STARTARROW="None" STARTINCLINATION="172;156;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700930708239" ID="ID_582127020" MODIFIED="1700954096733" TEXT="Test: verify_complexUsageWithCopy">
|
||||
<arrowlink COLOR="#3fb0c8" DESTINATION="ID_1564171170" ENDARROW="Default" ENDINCLINATION="-852;94;" ID="Arrow_ID_474620988" STARTARROW="None" STARTINCLINATION="353;26;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700941790083" HGAP="25" ID="ID_1792069131" MODIFIED="1700941812331" TEXT="mal im einzelnen beobachtet" VSHIFT="18">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700941796973" FOLDED="true" ID="ID_1097307622" MODIFIED="1700954173868" TEXT="Allokationen verifiziert">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700950320909" ID="ID_700182781" MODIFIED="1700950401023" TEXT="Memory-Verhalten mit lib::test::Tracker + EventLog beobachtet">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
          using lib::test::Tracker;
|
||||
</p>
|
||||
<p>
|
||||
          auto& log = Tracker::log;
|
||||
</p>
|
||||
<p>
|
||||
          log.clear (this);
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
          auto f1 = [t=Tracker{11}](int i){return i+1; };
|
||||
</p>
|
||||
<p>
|
||||
          auto f2 = [t=Tracker{22}](int i){return i/2; };
|
||||
</p>
|
||||
<p>
|
||||
          auto f3 = [t=Tracker{33}](int i){return i-1; };
|
||||
</p>
|
||||
<p>
|
||||
...
|
||||
</p>
|
||||
<p>
|
||||
...
|
||||
</p>
|
||||
<p>
|
||||
          cout << "____Tracker-Log_______________\n"
|
||||
</p>
|
||||
<p>
|
||||
               << util::join(Tracker::log,      "\n")
|
||||
</p>
|
||||
<p>
|
||||
               << "\n───╼━━━━━━━━━━━╾──────────────"<<endl;
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1700950417857" ID="ID_1410694943" MODIFIED="1700950428315" TEXT="damit sehe ich zumindest, wo Lambdas kopiert werden"/>
|
||||
<node CREATED="1700950429279" ID="ID_1051322974" MODIFIED="1700950448107" TEXT="grob betrachtet erscheinen die Aufrufe plausibel"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700950449348" ID="ID_523796059" MODIFIED="1700953751733" TEXT="mir fällt auf, daß ein defunktes Objekt copy-konstruiert wird">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1700950494703" ID="ID_1272305442" MODIFIED="1700950512896" TEXT="und zwar beim Aufruf der 2.Funktion"/>
|
||||
<node CREATED="1700950513540" ID="ID_1095683406" MODIFIED="1700950531582" TEXT="ansonsten ist das Pattern komplett identisch zum 1.Funktionsaufruf"/>
|
||||
<node CREATED="1700951269423" ID="ID_551692794" MODIFIED="1700951279481" TEXT="der Initialiser wird shared verwendet">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1700951280726" ID="ID_685973813" MODIFIED="1700951313477" TEXT="⟹ der erste Aufruf moved das Objekt in die innere Closure"/>
|
||||
<node CREATED="1700951314364" ID="ID_1250605414" MODIFIED="1700951332687" TEXT="⟹ der nächste Aufruf findet in der äußeren Closure ein kaputtes Objekt"/>
|
||||
<node COLOR="#338800" CREATED="1700951339206" ID="ID_1908700484" MODIFIED="1700951348709" TEXT="hier das move(newFun) entfernt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700951350605" ID="ID_930693693" MODIFIED="1700953749341" TEXT="jetzt steht an der Stelle im Log ein DEAD-Objekt">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1700952106837" ID="ID_334037532" MODIFIED="1700952116015" TEXT="nein: es ist kein DEAD-Marker"/>
|
||||
<node CREATED="1700952116630" ID="ID_687777194" MODIFIED="1700952138171">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
sondern <b>irgend ein</b> Speicherinhalt
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_687777194" ENDARROW="Default" ENDINCLINATION="68;0;" ID="Arrow_ID_419694341" SOURCE="ID_1894077075" STARTARROW="None" STARTINCLINATION="68;0;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700951430090" ID="ID_1853549426" MODIFIED="1700951443628" TEXT="es passiert immer nur auf äußerstem Level der verschachtelten Funktionen"/>
|
||||
<node CREATED="1700951444996" ID="ID_1085072035" MODIFIED="1700951466881" TEXT="hiflt nix �� Debugger!">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1700952070245" ID="ID_1894077075" MODIFIED="1700952138172" TEXT="beim 2.Aufruf liegt in der Initializer-Closure in theFun ein defekter Wert">
|
||||
<arrowlink DESTINATION="ID_687777194" ENDARROW="Default" ENDINCLINATION="68;0;" ID="Arrow_ID_419694341" STARTARROW="None" STARTINCLINATION="68;0;"/>
|
||||
</node>
|
||||
<node CREATED="1700952311980" ID="ID_1810763546" MODIFIED="1700952324719" TEXT="wann wurde der zerstört?">
|
||||
<node CREATED="1700952384035" ID="ID_362847058" MODIFIED="1700952405119" TEXT="auffällig: nur der letzte im Chain hat dieses 2*move-Pattern"/>
|
||||
<node CREATED="1700953007575" ID="ID_1015631778" MODIFIED="1700953045102" TEXT="da er in der Closure sitzt ⟶ das Delegate-λ"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700952981057" ID="ID_212435146" MODIFIED="1700952986421" TEXT="nachdenken....">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1700953049634" ID="ID_1291679604" MODIFIED="1700953288212" TEXT="wann wird das Delegate-λ zerstört ....?"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700953069431" ID="ID_173554336" MODIFIED="1700953280256" TEXT="HA! die Zeile die mir schon vorhin beim 1.Bug als »Schmuh« auffiel">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und zwar deshalb, weil ich wußte, daß ich <i>über diese Zeile beim Umbau nicht nachgedacht habe...</i>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#f23836" DESTINATION="ID_1177559316" ENDARROW="Default" ENDINCLINATION="-444;622;" ID="Arrow_ID_291683444" STARTARROW="Default" STARTINCLINATION="852;0;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1700953289290" ID="ID_1496406816" MODIFIED="1700953315282" TEXT="die Idee war mal anfangs: „der letzte der rausghet macht das Licht aus“"/>
|
||||
<node CREATED="1700953316699" ID="ID_1789172210" MODIFIED="1700953343627" TEXT="und dann bin ich auf die glorreiche Idee gekommen, „das Licht“ rekursiv zu verwenden">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
<node CREATED="1700953352026" ID="ID_883746186" MODIFIED="1700953360205" TEXT="also der Reihe nach...">
|
||||
<node CREATED="1700953361008" ID="ID_13158316" MODIFIED="1700953427653" TEXT="es gibt nun mehrere Instanzen vom Initializer gleichzeitig im Speicher">
|
||||
<icon BUILTIN="full-1"/>
|
||||
</node>
|
||||
<node CREATED="1700953384030" ID="ID_1163845443" MODIFIED="1700953430020" TEXT="wir rufen die letzte instanz auf...">
|
||||
<icon BUILTIN="full-2"/>
|
||||
</node>
|
||||
<node CREATED="1700953398987" ID="ID_1111013847" MODIFIED="1700953432392" TEXT="und von dieser rekursiv bis in die erste Instanz">
|
||||
<icon BUILTIN="full-3"/>
|
||||
</node>
|
||||
<node CREATED="1700953408557" ID="ID_309903824" MODIFIED="1700953434812" TEXT="diese erste Instanz macht beim rausgehen das Licht aus">
|
||||
<icon BUILTIN="full-4"/>
|
||||
</node>
|
||||
<node CREATED="1700953418245" ID="ID_861253869" MODIFIED="1700953448882" TEXT="FINSTERNIS">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="full-0"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700953476481" ID="ID_116333256" MODIFIED="1700953544274" TEXT="Lösung / Bugfix: Lebensdauer an den Stack-Frame binden">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700953547615" ID="ID_183071421" MODIFIED="1700953558994" TEXT="statt self->pendingInit_.reset()"/>
|
||||
<node CREATED="1700953559891" ID="ID_1264532109" MODIFIED="1700954099248" TEXT="zu Beginn move(self->pendingInit) in den lokalen Stack-Frame">
|
||||
<linktarget COLOR="#37b613" DESTINATION="ID_1264532109" ENDARROW="Default" ENDINCLINATION="-193;0;" ID="Arrow_ID_753230844" SOURCE="ID_1258802311" STARTARROW="None" STARTINCLINATION="172;156;"/>
|
||||
</node>
|
||||
<node CREATED="1700953580407" ID="ID_1299146649" MODIFIED="1700953589318" TEXT="dann wird sie automatisch am Ende weggeräumt"/>
|
||||
<node CREATED="1700953589998" ID="ID_728234937" MODIFIED="1700953639278" TEXT="und zwar wirklich erst, wenn beim letzten der Refcount auf Null geht">
|
||||
<arrowlink DESTINATION="ID_1153703009" ENDARROW="Default" ENDINCLINATION="-12;116;" ID="Arrow_ID_1672051795" STARTARROW="None" STARTINCLINATION="-68;108;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1700953616134" ID="ID_1153703009" MODIFIED="1700953639278" TEXT="Damit sieht das Event-Log komplett sauber aus">
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1153703009" ENDARROW="Default" ENDINCLINATION="-12;116;" ID="Arrow_ID_1672051795" SOURCE="ID_728234937" STARTARROW="None" STARTINCLINATION="-68;108;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700930708239" ID="ID_582127020" MODIFIED="1700930761845" TEXT="Test: verify_complexUsageWithCopy">
|
||||
<arrowlink COLOR="#d33070" DESTINATION="ID_1564171170" ENDARROW="Default" ENDINCLINATION="-852;94;" ID="Arrow_ID_474620988" STARTARROW="None" STARTINCLINATION="353;26;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -98309,7 +98448,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#5b280f" CREATED="1700770943791" ID="ID_1199767820" MODIFIED="1700770980394" TEXT="sie müssen non-copyable sein wegen internem Function-binding">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700770992624" ID="ID_79615506" MODIFIED="1700771287660" TEXT="das verhindert aber genau den fluenden Umgang damit">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1700770992624" ID="ID_79615506" MODIFIED="1700957452873" TEXT="das verhindert aber genau den fluenden Umgang damit">
|
||||
<arrowlink COLOR="#ffcdd1" DESTINATION="ID_1702969215" ENDARROW="Default" ENDINCLINATION="-620;68;" ID="Arrow_ID_1851761641" STARTARROW="None" STARTINCLINATION="296;14;"/>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
|
|
@ -98322,8 +98461,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700771156458" ID="ID_1157037029" MODIFIED="1700771190968" TEXT="RandomDraw re-konfigurierbar machen">
|
||||
<node COLOR="#338800" CREATED="1700771156458" ID="ID_1157037029" LINK="#ID_1508566872" MODIFIED="1700957441004" TEXT="RandomDraw re-konfigurierbar machen">
|
||||
<icon BUILTIN="idea"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue