Library: work out Skeleton for memory-handling strategy

- the basic decision is to implement ''realloc'' similar to `std::vector`
- however the situation is complicated by the desire to allow arbitrary element types
- ⟹ must build a strategy based on the properties of the target type
- the completely dynamic growth is only possibly for trivially-movable types
- can introduce a dedicated ''element type'' though, and store a trampolin handler
This commit is contained in:
Fischlurch 2024-06-04 23:24:11 +02:00
parent 2abbae77d7
commit 802fef9b7c
2 changed files with 281 additions and 39 deletions

View file

@ -47,6 +47,7 @@
#include "lib/iter-explorer.hpp"
#include "lib/util.hpp"
#include <type_traits>
#include <cstring>
#include <utility>
#include <vector>
@ -69,13 +70,59 @@ namespace lib {
UNIMPLEMENTED ("adjust memory allocation"); ///////////////////////////OOO Problem Objekte verschieben
}
};
using std::is_trivially_move_constructible_v;
using std::is_trivially_destructible_v;
using std::has_virtual_destructor_v;
using std::is_same_v;
using lib::meta::is_Subclass;
template<class I, class E>
struct MemStrategy
{
bool disposable :1 ;
bool wild_move :1 ;
template<typename TY>
bool
canDestroy()
{
return disposable
or (is_trivially_destructible_v<TY> and is_trivially_destructible_v<I>)
or (has_virtual_destructor_v<I> and is_Subclass<TY,I>())
or (is_same_v<TY,E> and is_Subclass<E,I>());
}
template<typename TY>
bool
canDynGrow()
{
return is_same_v<TY,E>
or (is_trivially_move_constructible_v<TY> and wild_move);
}
auto
getDeleter()
{
if constexpr (disposable or
(is_trivially_destructible_v<E> and is_trivially_destructible_v<I>))
return nullptr;
if constexpr (has_virtual_destructor_v<I>)
return nullptr;
else
return nullptr;
}
};
}
/**
* Wrap a vector holding objects of a subtype and
* provide array-like access using the interface type.
*/
template<class I, class POL =HeapOwn>
template<class I ///< Interface or base type visible on resulting Several<I>
,class E =I ///< a subclass element element type (relevant when not trivially movable and destructible)
,class POL =HeapOwn ///< Allocator policy
>
class SeveralBuilder
: Several<I>
, POL
@ -121,7 +168,7 @@ namespace lib {
adjustStorage (size_t cnt, size_t spread)
{
if (cnt*spread > storageSiz_)
{// need more storage..
{ // need more storage...
Col::data_ = static_cast<typename Col::Bucket> (POL::realloc (Col::data_, storageSiz_, cnt*spread));
storageSiz_ = cnt*spread;
}
@ -130,7 +177,7 @@ namespace lib {
adjustSpread (spread);
if (cnt*spread < storageSiz_)
{// attempt to shrink storage
{ // attempt to shrink storage
Col::data_ = static_cast<typename Col::Bucket> (POL::realloc (Col::data_, storageSiz_, cnt*spread));
storageSiz_ = cnt*spread;
}

View file

@ -81444,16 +81444,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1715620143727" ID="ID_828708828" MODIFIED="1715620159863" TEXT="Zugriff auf den Allocator per DI (statisch) oder Thread-local"/>
<node CREATED="1715620242056" ID="ID_427769562" MODIFIED="1716856637040" TEXT="Spezieller Allocator mit Block-de-Allocation">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...man verwendet <i>nur speziell im produktiven Einsatz im Node-Graph</i>&#160; einen besonderen Allocator, der zwar den Destruktor aufruft, aber den Speicher nicht freigibt; alloziert wird immer in einen kompakten Block hinein, der dann auf der Basis der Proze&#223;-Kenntnis als Ganzes verworfen und neu verwendet wird.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="forward"/>
</node>
</node>
@ -81680,16 +81677,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1716902524310" ID="ID_336186594" MODIFIED="1716902554166" TEXT="der Container selber ist runtime-polymorph">
<node CREATED="1716902559461" ID="ID_796780489" MODIFIED="1716902593125">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Konsequenz: man kann einen einzigen Typ <font face="Monospaced" color="#8c0808">Several&lt;X&gt;</font>&#160;anschreiben
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1716902606624" ID="ID_1870642120" MODIFIED="1716902710954" TEXT="alle Detail-Variationen sind als runtime state gegeben">
<linktarget COLOR="#4b357c" DESTINATION="ID_1870642120" ENDARROW="Default" ENDINCLINATION="106;163;" ID="Arrow_ID_1077333305" SOURCE="ID_324116912" STARTARROW="None" STARTINCLINATION="-291;19;"/>
@ -81750,42 +81744,33 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1716902202186" ID="ID_1015798898" MODIFIED="1716902275921" TEXT="Diskussion">
<node CREATED="1716902205235" ID="ID_1941027730" MODIFIED="1716902274648" TEXT="wir verschwenden Storage zur Performance-Optimierung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar vor allem durch den AllocationCluster mit einer festen Extent-Size. Vorhersehbar werden die Extents meist zu gro&#223; sein...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1716902277551" ID="ID_1279637635" MODIFIED="1716902337377" TEXT="Extents sind &#xfc;berdimensioniert &#x27f9; Platz ist &#x201e;eh da&#x201c;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und was noch besser ist: die Storage liegt kompakt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1716902347758" ID="ID_737951964" MODIFIED="1716902457937" TEXT="Zus&#xe4;tzliche Typ-Komplexit&#xe4;t dagegen w&#xe4;re problematisch">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...weil wir durch den Connectivity-Descriptor bereits eine gef&#228;hrlich komplexes St&#252;ck Metaprogramming haben, mit dem Risiko kombinatorischer Explosion
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1716902466150" ID="ID_1670357749" MODIFIED="1716902481998" TEXT="Entscheidung &#xd83e;&#xdc32; Ziel-B pr&#xe4;ferieren">
@ -81820,16 +81805,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1716905326312" ID="ID_1705639100" MODIFIED="1716905341332" TEXT="wegen ownership"/>
<node CREATED="1716905342344" ID="ID_36544498" MODIFIED="1716905416848" TEXT="f&#xfc;r unmanaged ArrayBuckets k&#xf6;nnte man eine cloneCopy-Funktion bereitstellen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
diese Funktion w&#252;rde eine Exception werfen, wen das ArrayBucket eben doch ownership-managed ist. Ansonsten erzeugt sie eine neue Instanz mit Verweis auf das gemeinsam nutzbare Bucket
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -81851,16 +81833,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1716912163674" ID="ID_581123494" MODIFIED="1716912528793" TEXT="mu&#xdf; hier einen offenen Zugriff hinter das Objektende machen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...weil ich den Zieltyp zum Cast nicht dynamisch konstruieren kann
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
@ -81885,8 +81864,224 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1716937138104" ID="ID_1463751078" MODIFIED="1716937157438" TEXT="aber: std::realloc gibt den alten Puffer sofort frei"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1716937163164" ID="ID_1513844512" MODIFIED="1716937171050" TEXT="wie geht std::vector damit um?">
<node COLOR="#435e98" CREATED="1716937163164" ID="ID_1513844512" MODIFIED="1717536682524" TEXT="wie geht std::vector damit um?">
<icon BUILTIN="help"/>
<node CREATED="1716990764896" ID="ID_1932292038" MODIFIED="1716990768697" TEXT="Code lesen...">
<node CREATED="1716990770901" ID="ID_765989351" MODIFIED="1716990794828" TEXT="resize() &#x27f6; _M_default_append(size_type n)">
<node CREATED="1716991624080" ID="ID_1771047546" MODIFIED="1716991629388" TEXT="wenn avail &gt; n">
<node CREATED="1716991641557" ID="ID_1450865359" MODIFIED="1716991679022" TEXT="std::__uninitialized_default_n_a(M_finish, n, _M_get_Tp_allocator());"/>
<node CREATED="1716992445613" ID="ID_1704671492" MODIFIED="1716992457319" TEXT="f&#xfc;llt den Raum mit default-konstruierten Objekten"/>
</node>
<node CREATED="1716991743675" ID="ID_493415039" MODIFIED="1716991747421" TEXT="sonst: wachsen">
<node CREATED="1716991748441" ID="ID_256826617" MODIFIED="1716992082953" TEXT="neue L&#xe4;nge len wird begrenzt durch max_size()"/>
<node CREATED="1716992284010" ID="ID_1754313988" MODIFIED="1716992301026" TEXT="komplett neue Allokation der L&#xe4;nge len"/>
<node CREATED="1716992476761" ID="ID_243565315" MODIFIED="1716999069060" TEXT="std::__uninitialized_move_if_noexcept_a(_M_start, _M_finish, __new_start, _M_get_Tp_allocator());">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_243565315" ENDARROW="Default" ENDINCLINATION="13;99;" ID="Arrow_ID_855653708" SOURCE="ID_945905429" STARTARROW="None" STARTINCLINATION="322;21;"/>
<node CREATED="1716994640256" ID="ID_90966765" MODIFIED="1716994650467" TEXT="macht move oder copy-Initialisierung"/>
<node CREATED="1716994659143" ID="ID_423406724" MODIFIED="1716994693125" TEXT="und zwar abh&#xe4;ngig vom Zieltyp"/>
<node CREATED="1716994713872" ID="ID_237185972" MODIFIED="1717536660362" TEXT="__make_move_if_noexcept_iterator(IT_i)">
<linktarget COLOR="#47a78d" DESTINATION="ID_237185972" ENDARROW="Default" ENDINCLINATION="-91;252;" ID="Arrow_ID_1124696583" SOURCE="ID_1567771113" STARTARROW="None" STARTINCLINATION="674;41;"/>
<node CREATED="1716996255516" ID="ID_764291516" MODIFIED="1716996262166" TEXT="ist eigentlich nur ein std::__uninitialized_copy_a">
<node CREATED="1716996369943" ID="ID_768726808" MODIFIED="1716996375716" TEXT="verwendet den Allocator"/>
<node CREATED="1716996376265" ID="ID_1255436974" MODIFIED="1716996387523" TEXT="...um am Ziel eine neue Instanz zu kopieren"/>
<node CREATED="1716996388079" ID="ID_1637885085" MODIFIED="1716996401929" TEXT="und &#xfc;bergibt ihr eiene Quell-Referenz"/>
</node>
<node CREATED="1716996264080" ID="ID_1192115542" MODIFIED="1716996280169" TEXT="aber packt den Pointer/Iterator um"/>
<node CREATED="1716995032097" ID="ID_1249947729" MODIFIED="1716996254025" TEXT="siehe auch: std::move_if_noexcept">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Same as std::move unless the type's move constructor could throw and the type is copyable, in which case an lvalue-reference is returned instead.
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node CREATED="1716994797739" ID="ID_274768762" MODIFIED="1716996262173" TEXT="__move_if_noexcept_cond&lt;value_type&gt;">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
<font color="#531e64" face="Monospaced">__and_</font><font face="Monospaced">&lt;</font><font color="#92250f" face="Monospaced">__not_</font><font face="Monospaced">&lt;<b>is_nothrow_move_constructible</b>&lt;_Tp&gt;&gt; </font>
</p>
<p>
<font face="Monospaced">&#160;&#160;&#160;&#160;&#160;&#160;, <b>is_copy_constructible</b>&lt;_Tp&gt;&gt;</font>
</p>
</body>
</html></richcontent>
<node CREATED="1716995184520" ID="ID_983904351" MODIFIED="1716995189899" TEXT="beachte die negative Formulierung"/>
<node CREATED="1716995193759" ID="ID_1454052596" MODIFIED="1716995200465" TEXT="der else-Fall ist das was wir eigentlich wollen"/>
</node>
<node CREATED="1716994739339" ID="ID_1646764235" MODIFIED="1716996213029" TEXT="std::move_iterator&lt;IT&gt;">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1716996108212" ID="ID_1222273534" MODIFIED="1716996113144" TEXT="verpackt einen STL iterator"/>
<node CREATED="1716996114228" ID="ID_1307025033" MODIFIED="1716996132093" TEXT="aber erzeugt eine RValue-Referenz bei Derefernzierung"/>
</node>
</node>
</node>
<node CREATED="1716999072506" ID="ID_563103052" MODIFIED="1716999079516" TEXT="und dann alte Elemente zerst&#xf6;ren"/>
<node CREATED="1716999080080" ID="ID_521884628" MODIFIED="1716999084108" TEXT="alten Block deallozieren"/>
</node>
</node>
<node CREATED="1716996537916" ID="ID_439873587" MODIFIED="1716996542495" TEXT="emplace_back(args...)">
<node CREATED="1716996778603" ID="ID_1854948949" MODIFIED="1716996788230" TEXT="if (_M_finish != _M_end_of_storage)">
<node CREATED="1716996854833" ID="ID_1856123255" MODIFIED="1716996855557" TEXT="_Alloc_traits::construct"/>
</node>
<node CREATED="1716996789019" ID="ID_1418564015" MODIFIED="1716996815527">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
sonst: _M_<b>realloc</b>_insert
</p>
</body>
</html></richcontent>
<node CREATED="1716997373227" ID="ID_626493899" MODIFIED="1716997385838" TEXT="auch hier: wachsen durch Umkopieren"/>
<node CREATED="1716997392113" ID="ID_59655719" MODIFIED="1716997406779" TEXT="neue L&#xe4;nge per Inkrement und begrenzt druch max_size()"/>
<node CREATED="1716999036887" ID="ID_1798375981" MODIFIED="1716999045585" TEXT="alloziert einen Block der neuen L&#xe4;nge"/>
<node CREATED="1716999046173" ID="ID_1721108534" MODIFIED="1716999053431" TEXT="platziert ganz ans Ende das neue Element"/>
<node CREATED="1716999054009" ID="ID_945905429" MODIFIED="1716999069060" TEXT="danach std::__uninitialized_move_if_noexcept_a">
<arrowlink DESTINATION="ID_243565315" ENDARROW="Default" ENDINCLINATION="13;99;" ID="Arrow_ID_855653708" STARTARROW="None" STARTINCLINATION="322;21;"/>
</node>
</node>
</node>
</node>
<node CREATED="1717536199658" ID="ID_1563046053" MODIFIED="1717536544630" TEXT="Fazit">
<icon BUILTIN="forward"/>
<node CREATED="1717536203729" ID="ID_105709507" MODIFIED="1717536524915" TEXT="verwendet kein realloc">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
die C-Funktion <font face="Monospaced">realloc()</font>&#160;kann zwar scheinbar &#8222;zaubern&#8220;, ist aber tats&#228;chlich auf Hilfe vom Allokator angewiesen, insofern dieser sich intern gewisse zus&#228;tzliche Reserven sichert. Und wenn seine Resevern nicht reichen, dann wird sofort woanders alloziert und alles per <font face="Monospaced">memmove()</font>&#160; umkopiert....
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1717536217204" ID="ID_248984018" MODIFIED="1717536532662" TEXT="...sondern erzeugt das gleiche Verhalten direkt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Tats&#228;chlich kann <font face="Monospaced">std::vector()</font>&#160;dasselbe besser machen, da er ggfs move-Konstruktoren aufrufen und au&#223;erdem als zus&#228;tzliche Heuristik die aktuelle Gr&#246;&#223;e des Vektors heranziehen kann, um eine angemessene Reserve bereitzustellen; au&#223;erdem ist die Gr&#246;&#223;e der Reserve direkt auf das API herausgef&#252;hrt.
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1717536629978" ID="ID_1567771113" MODIFIED="1717536675032" TEXT="Hilfsmittel: Typ-Weiche und std::move_iterator">
<arrowlink COLOR="#47a78d" DESTINATION="ID_237185972" ENDARROW="Default" ENDINCLINATION="-91;252;" ID="Arrow_ID_1124696583" STARTARROW="None" STARTINCLINATION="674;41;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717536689923" ID="ID_57717387" MODIFIED="1717536696459" TEXT="Also: das k&#xf6;nnen wir auch">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1717536711508" ID="ID_1202794334" MODIFIED="1717536719580" TEXT="und zwar zweischichtig">
<icon BUILTIN="yes"/>
<node CREATED="1717536720952" ID="ID_438837024" MODIFIED="1717536735768" TEXT="Reserve-oder-Verschieben"/>
<node CREATED="1717536736572" ID="ID_489657411" MODIFIED="1717536754798" TEXT="ggfs Zusammenspiel mit dem AllocationCluster"/>
<node CREATED="1717536777230" ID="ID_305862937" MODIFIED="1717536801703" TEXT="max-size: hier ggfs durch den Allocation-Cluster vorgegeben"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1717538242090" ID="ID_1593041374" MODIFIED="1717538261355" TEXT="Zielkonflikt &#x21af;">
<icon BUILTIN="broken-line"/>
<node CREATED="1717538269574" ID="ID_417300580" MODIFIED="1717538300972" TEXT="beliebige Sub-Typen variabler Gr&#xf6;&#xdf;e handhaben"/>
<node CREATED="1717538301896" ID="ID_1296824039" MODIFIED="1717538399557" TEXT="re-Alloc-Verschiebung sauber via move-Konstruktor machen"/>
<node COLOR="#5b280f" CREATED="1717538517882" ID="ID_452753064" MODIFIED="1717538534861" TEXT="wir kennen den konkreten Typ in der einzelnen Zelle nicht">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1717538661570" ID="ID_527938373" MODIFIED="1717541267684" TEXT="m&#xf6;gliche L&#xf6;sungen">
<icon BUILTIN="idea"/>
<node COLOR="#5b280f" CREATED="1717538745353" ID="ID_79141441" MODIFIED="1717541282563" TEXT="dynamisches realloc nur f&#xfc;r den Basis-Typ erlauben">
<icon BUILTIN="button_cancel"/>
<node CREATED="1717541285939" ID="ID_873094921" MODIFIED="1717541307763" TEXT="das w&#xe4;re einfach">
<icon BUILTIN="ksmiletris"/>
</node>
<node CREATED="1717541293868" ID="ID_95354963" MODIFIED="1717541301594" TEXT="aber auch &#xfc;berraschend restriktiv">
<icon BUILTIN="closed"/>
</node>
</node>
<node CREATED="1717539082925" ID="ID_1310049828" MODIFIED="1717541322799" TEXT="einen Element-Typ statisch f&#xfc;r den Builder definieren">
<icon BUILTIN="forward"/>
<node CREATED="1717541325558" HGAP="22" ID="ID_1092966052" MODIFIED="1717541339056" TEXT="das ist auf jeden Fall machbar!" VSHIFT="2">
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1717539256053" ID="ID_1258614171" MODIFIED="1717539267615" TEXT="Typhandler-Trampolin bauen">
<node CREATED="1717539290144" ID="ID_1487591003" MODIFIED="1717539297755" TEXT="stellt den Deleter bereit"/>
<node CREATED="1717539298319" ID="ID_1107472699" MODIFIED="1717539362752" TEXT="sowie einen Move-Handler"/>
<node CREATED="1717539382219" ID="ID_1846112682" MODIFIED="1717539408547" TEXT="kann (abh&#xe4;ngig vom Typ) auf memmove zur&#xfc;ckfallen"/>
</node>
<node CREATED="1717539527558" ID="ID_664027664" MODIFIED="1717539604663" TEXT="erweiterte Flexibilit&#xe4;t nur im Einzelfall">
<node CREATED="1717539630550" ID="ID_1134893118" MODIFIED="1717539634513" TEXT="Bedingungen">
<node CREATED="1717539636925" ID="ID_1442794254" MODIFIED="1717540858927" TEXT="Deleter">
<linktarget COLOR="#d90152" DESTINATION="ID_1442794254" ENDARROW="Default" ENDINCLINATION="2;12;" ID="Arrow_ID_92396700" SOURCE="ID_1347402773" STARTARROW="None" STARTINCLINATION="-2;-10;"/>
<node CREATED="1717539729616" ID="ID_1305258499" MODIFIED="1717539743649" TEXT="global disposable oder unmanaged &#x27f9; keiner"/>
<node CREATED="1717539852917" ID="ID_1428257938" MODIFIED="1717543030532" TEXT="&#x2228; Basistyp und konkreter Typ sind trivially destructible"/>
<node CREATED="1717539745205" ID="ID_222469132" MODIFIED="1717544076400" TEXT="&#x2228; Basistyp hat virtuellen Deleter und Typ ist Subklasse"/>
<node CREATED="1717540047343" ID="ID_1258092354" MODIFIED="1717544130652" TEXT="&#x2228; Typ &#x2261; Element-Typ und erbt von Basistyp"/>
</node>
<node CREATED="1717539954701" ID="ID_1347402773" MODIFIED="1717540865774" TEXT="Construct">
<arrowlink COLOR="#d90152" DESTINATION="ID_1442794254" ENDARROW="Default" ENDINCLINATION="2;12;" ID="Arrow_ID_92396700" STARTARROW="None" STARTINCLINATION="-2;-10;"/>
<node CREATED="1717540047343" ID="ID_305565585" MODIFIED="1717540069682" TEXT="Typ &#x2261; Element-Typ"/>
<node CREATED="1717540103214" ID="ID_472317796" MODIFIED="1717540293613" TEXT="&#x2228; Allokation mit ausreichendem Spread vorhanden"/>
<node CREATED="1717540387010" ID="ID_1163213959" MODIFIED="1717540975821" TEXT="&#x2228; Typ und Element-Typ trivial verschiebbar"/>
</node>
<node CREATED="1717540310958" ID="ID_791166795" MODIFIED="1717540323111" TEXT="DynGrow">
<node CREATED="1717540047343" ID="ID_794635351" MODIFIED="1717540069682" TEXT="Typ &#x2261; Element-Typ"/>
<node CREATED="1717540387010" ID="ID_1189081540" MODIFIED="1717540975821" TEXT="&#x2228; Typ und Element-Typ trivial verschiebbar"/>
</node>
<node CREATED="1717540316029" ID="ID_1546901658" MODIFIED="1717540318873" TEXT="Adjust">
<node CREATED="1717540387010" ID="ID_691327613" MODIFIED="1717545362426" TEXT="wild-move-Flag gesetzt"/>
</node>
<node CREATED="1717541455144" ID="ID_365666724" MODIFIED="1717541467717" TEXT="Shrink">
<node CREATED="1717541474460" HGAP="21" ID="ID_1811348621" MODIFIED="1717541492875" TEXT="rein an den Allokator delegiert" VSHIFT="4">
<font ITALIC="true" NAME="SansSerif" SIZE="11"/>
</node>
</node>
</node>
<node CREATED="1717541052496" ID="ID_1993251533" MODIFIED="1717541058707" TEXT="Pr&#xfc;freihenfolge">
<node CREATED="1717541059695" ID="ID_1168624181" MODIFIED="1717541072002" TEXT="zun&#xe4;chst mu&#xdf; der Deleter gekl&#xe4;rt sein"/>
<node CREATED="1717541083253" ID="ID_1635051454" MODIFIED="1717541091203" TEXT="der Deleter wird niemals ge&#xe4;ndert"/>
<node CREATED="1717541160635" ID="ID_255264045" MODIFIED="1717541168910" TEXT="bestehende Allokation ausreichend"/>
<node CREATED="1717541095619" ID="ID_1619642524" MODIFIED="1717545388181" TEXT="Element-Typ trivial verschiebbar &#x27f9; wild-move-Flag setzen"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717542409083" ID="ID_252983857" MODIFIED="1717542417791" TEXT="Strategy aufbauen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717542814132" ID="ID_1446789676" MODIFIED="1717542831827" TEXT="komplett vom Allokator trennen!">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1717542588800" ID="ID_1355622101" MODIFIED="1717542604293" TEXT="Pr&#xe4;dikate">
<node CREATED="1717542623647" ID="ID_749518164" MODIFIED="1717542633699" TEXT="canDestroy&lt;TY&gt;"/>
<node CREATED="1717542661348" ID="ID_1155347834" MODIFIED="1717545239426" TEXT="canDynGrow&lt;TY&gt;"/>
<node CREATED="1717542702415" ID="ID_1473880478" MODIFIED="1717545646724" TEXT="canAdjust &#x27f5; wild-move-Flag"/>
</node>
<node CREATED="1717543060128" ID="ID_1973537913" MODIFIED="1717543071098" TEXT="Handler">
<node CREATED="1717543072032" ID="ID_1791379026" MODIFIED="1717543076568" TEXT="getDeleter()">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1717546372010" ID="ID_231852526" MODIFIED="1717546386695" TEXT="kl&#xe4;ren: wie wird er konkret vernendet?">
<icon BUILTIN="help"/>
<node CREATED="1717546388726" ID="ID_1089262988" MODIFIED="1717546407495" TEXT="mu&#xdf; einen Pointer auf ein Trampolin speichern k&#xf6;nnen"/>
<node CREATED="1717546408121" ID="ID_1274735212" MODIFIED="1717546425197" TEXT="mu&#xdf; den Allokator mit einbinden">
<node CREATED="1717546597442" ID="ID_1158247490" MODIFIED="1717546607338" TEXT="&#x27f9; Trampolin mu&#xdf; von Allokator erben"/>
<node CREATED="1717546480353" ID="ID_1419974412" MODIFIED="1717546493220" TEXT="Problem : Trampolin f&#xfc;r Allokator-Instanz">
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1717546661817" ID="ID_999124001" MODIFIED="1717546671561" TEXT="wir haben NUR einen Pointer in der Storage vorgesehen">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1717546728089" ID="ID_549532304" MODIFIED="1717546740840" TEXT="wer verwaltet dann die Allokator-Instanz?">
<icon BUILTIN="help"/>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1717543083078" ID="ID_530261806" MODIFIED="1717543114805" TEXT="getMover()"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1716914864769" ID="ID_966642586" MODIFIED="1716914906125" TEXT="Builder-Operationen">