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:
Fischlurch 2023-11-25 23:47:20 +01:00
parent 659441fa88
commit f1c156b4cd
4 changed files with 383 additions and 194 deletions

View file

@ -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
}};
}
};

View file

@ -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

View file

@ -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
}
};

View file

@ -96742,7 +96742,7 @@ Date:&#160;&#160;&#160;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:&#160;&#160;&#160;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:&#160;&#160;&#160;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&#252;ssen Funktoren <i>gebunden </i>sein
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1700772446358" ID="ID_1414778740" MODIFIED="1700772523740" TEXT="man k&#xf6;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 &#187;trojanische Funktion&#171; installieren, die etwas v&#246;llig anderes macht, n&#228;mlich die Initialisierung. Danach &#252;berschreibt sie sich selbst mit der fertig gebundenen Funktion
@ -97142,30 +97137,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="info"/>
<node CREATED="1700773163605" ID="ID_1780777902" MODIFIED="1700773325986" TEXT="grunds&#xe4;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&#246;&#223;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&#xf6;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&#252;tzt auch Zugriff &#252;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1700773817813" ID="ID_1896161271" MODIFIED="1700778636520" TEXT="mu&#xdf; sp&#xe4;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) &#10233; 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 &#x27f6; 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&#xf6;glich ohne &#xbb;Trick&#xab;">
<icon BUILTIN="broken-line"/>
@ -97217,16 +97203,13 @@ Date:&#160;&#160;&#160;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 &#187;Slot&#171; geht immer
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -97245,6 +97228,9 @@ Date:&#160;&#160;&#160;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&#xf6;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:&#160;&#160;&#160;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&#223; irgendwo auf den Initialiser zugreifen, und dieser mu&#223; wiederum die vorl&#228;ufige Funktion speichern. Alle diese Allokationen m&#252;ssen direkt am Trap selber &#187;aufgeh&#228;ngt&#171; werden; wenn wir also den Trap verwerfen (durch Neuzuweisung), s&#228;gen wir den Ast ab, auf dem wir sitzen. Kann man machen, wenn man Fl&#252;gel hat, oder sowieso schon auf dem Sprung ist
@ -97275,11 +97259,11 @@ Date:&#160;&#160;&#160;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&#xfc;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:&#160;&#160;&#160;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&#xfc;fe, da&#xdf; der Initialiser nur einmal l&#xe4;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&#xdf;t ein m&#xf6;glichst verschlungenes (realisitisches) Beispiel"/>
<node CREATED="1700875643550" ID="ID_1209015029" MODIFIED="1700875657152" TEXT="macht eine nicht-triviale Verknp&#xfc;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>&#160;<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&#xe4;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&#xe4;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:&#160;&#160;&#160;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 &#x27f9; 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 &#x27f9; 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:&#160;&#160;&#160;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 &#x27f6; Fehler verschwindet">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CHECK (1 == invoked);
@ -97392,23 +97374,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CHECK (init);
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1700932454870" ID="ID_1214658102" MODIFIED="1700932500906" TEXT="nur die letzte Zeile auskommetiert &#x27f6; 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:&#160;&#160;&#160;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Details:&lt;error reading variable: Cannot access memory at address 0x3000000030&gt;
</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="&#x27f9; Problem steckt im erweiterten Memory-Management f&#xfc;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>
&#160;move (pendingInit_) .....
</p>
<p>
&#160;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>
&#160;&#160;&#160;&#160;&#160;&#160;__shared_ptr(__shared_ptr&amp;&amp; __r) noexcept
@ -97467,8 +97455,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
&#160;&#160;&#160;&#160;&#160;&#160;}
</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:&#160;&#160;&#160;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&#xe4;ter zeict sich: das ist hier tats&#xe4;chlich Schmuh &#xd83e;&#xdc46; 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 &#x27f9; 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&#xe4;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 &#xdc;berpr&#xfc;fung saubern">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
@ -97550,16 +97566,13 @@ Date:&#160;&#160;&#160;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>&#160;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 &#x27fc; Stack-Addresse">
<icon BUILTIN="info"/>
@ -97602,22 +97615,19 @@ Date:&#160;&#160;&#160;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&#246;sung</i>&#160;w&#252;rde zu Verkopplung der Belange beim Client f&#252;hren, insofern der Funktor-Typ Bestandteil der Signatur von LazyInit werden m&#252;&#223;te. Das bedeutet, da es ein mix-In ist, m&#252;&#223;te man diesen Typ vor Instatiierung bereits kennen oder sp&#228;testens im Zuge der Instantiierung irgendwie (per Metaprogramming) ermitteln. Obwohl dies komplett unn&#246;tig w&#228;re &#8212; denn f&#252;r die gew&#252;nsche Funktionalit&#228;t gen&#252;gt es v&#246;llig, wenn man den target-Functor (und damit die Signatur) erst in dem Moment erf&#228;hrt, in dem tats&#228;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:&#160;&#160;&#160;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>&#160;mi&#223;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&#xfc;rde den Fall unterst&#xfc;tzen, ist aber zu schwergewichtig (VTable)"/>
@ -97669,6 +97676,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1700930608396" ID="ID_1911462720" MODIFIED="1700930636539" TEXT="alten shared_ptr f&#xfc;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-&#x3bb; adaptieren">
<icon BUILTIN="button_ok"/>
@ -97706,20 +97716,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1700871143583" ID="ID_1088454070" MODIFIED="1700934358632" TEXT="mu&#xdf; 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 &#xfc;ber den Setter">
<node COLOR="#338800" CREATED="1700934235151" ID="ID_988517206" MODIFIED="1700954145894" TEXT="Installieren des Initialisers nun stets &#xfc;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
lazyInit &#10233; Objekt ist erst mal <i>noch nicht ganz</i>&#160;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 &#xbb;Trojaner&#xab; sieht wir ein valider Funktor aus"/>
@ -97737,11 +97744,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1700883213489" ID="ID_1802613840" MODIFIED="1700883224039" TEXT="...besteht zumindest die Gefahr f&#xfc;r Endlosschleifen">
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1700883266746" ID="ID_541587975" MODIFIED="1700883289794" TEXT="dieses Problem k&#xf6;nnte nur durch LazyInit selber addressiert werden">
<node COLOR="#435e98" CREATED="1700883266746" FOLDED="true" ID="ID_541587975" MODIFIED="1700954140305" TEXT="dieses Problem k&#xf6;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&#xe4;tte eine Chance"/>
<node CREATED="1700883887222" ID="ID_1972271604" LINK="#ID_1052362467" MODIFIED="1700954133743" TEXT="Nur der Installations-Mechanismus h&#xe4;tte eine Chance"/>
</node>
</node>
</node>
@ -97751,7 +97758,7 @@ Date:&#160;&#160;&#160;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:&#160;&#160;&#160;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:&#160;&#160;&#160;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Deshalb sind sie ja stateless (und m&#252;ssen auch so bleiben, also nicht mutable). F&#252;r jeweils <i>eine Instanz</i>&#160;wird ein Funktor einfach &#187;verbrannt&#171;, indem man ihn aufruft und danach das pendingInit leert. Und zwar auf <b>*self</b>&#160;&#160;&#8212; der Funktor als Solcher bleibt stateless. Wenn ihn noch jemand anders referenziert, dann sch&#246;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 (&#x27f9;Fall-3) dann verschieben">
@ -97950,10 +97942,157 @@ Date:&#160;&#160;&#160;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>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;using lib::test::Tracker;
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;auto&amp; log = Tracker::log;
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;log.clear (this);
</p>
<p>
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;auto f1 = [t=Tracker{11}](int i){return i+1; };
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;auto f2 = [t=Tracker{22}](int i){return i/2; };
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;auto f3 = [t=Tracker{33}](int i){return i-1; };
</p>
<p>
...
</p>
<p>
...
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cout &lt;&lt; &quot;____Tracker-Log_______________\n&quot;
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;&lt; util::join(Tracker::log,&#160;&#160;&#160;&#160;&#160;&#160;&quot;\n&quot;)
</p>
<p>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;&lt; &quot;\n&#9472;&#9472;&#9472;&#9596;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9473;&#9598;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&quot;&lt;&lt;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&#xe4;llt auf, da&#xdf; 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="&#x27f9; der erste Aufruf moved das Objekt in die innere Closure"/>
<node CREATED="1700951314364" ID="ID_1250605414" MODIFIED="1700951332687" TEXT="&#x27f9; der n&#xe4;chste Aufruf findet in der &#xe4;u&#xdf;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>&#160;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 &#xe4;u&#xdf;erstem Level der verschachtelten Funktionen"/>
<node CREATED="1700951444996" ID="ID_1085072035" MODIFIED="1700951466881" TEXT="hiflt nix &#xd83e;&#xdc46; 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&#xf6;rt?">
<node CREATED="1700952384035" ID="ID_362847058" MODIFIED="1700952405119" TEXT="auff&#xe4;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 &#x27f6; das Delegate-&#x3bb;"/>
</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-&#x3bb; zerst&#xf6;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 &#xbb;Schmuh&#xab; auffiel">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...und zwar deshalb, weil ich wu&#223;te, da&#223; ich <i>&#252;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: &#x201e;der letzte der rausghet macht das Licht aus&#x201c;"/>
<node CREATED="1700953316699" ID="ID_1789172210" MODIFIED="1700953343627" TEXT="und dann bin ich auf die glorreiche Idee gekommen, &#x201e;das Licht&#x201c; 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&#xf6;sung / Bugfix: Lebensdauer an den Stack-Frame binden">
<icon BUILTIN="button_ok"/>
<node CREATED="1700953547615" ID="ID_183071421" MODIFIED="1700953558994" TEXT="statt self-&gt;pendingInit_.reset()"/>
<node CREATED="1700953559891" ID="ID_1264532109" MODIFIED="1700954099248" TEXT="zu Beginn move(self-&gt;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&#xe4;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#5b280f" CREATED="1700770943791" ID="ID_1199767820" MODIFIED="1700770980394" TEXT="sie m&#xfc;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:&#160;&#160;&#160;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>