Invocation: adjustments to lib::Several to prepare for allocator use

* conduct analysis regarding allocator handling in the Builder
 * turns out we'll have to keep around two different allocators while building
 * ⟹ establish the goal to confine usage of the Node allocator to the lower Levels
 * consequently must open up the `lib::SeveralBuilder` to be usable
   as an intermediary data structure, while building up the target data
 * in the initial design, the `SeveralBuilder` was kept opaque, since
   contents can be expected to be re-located frequently and thus exposing
   elements and taking references could be dangerous — yet this is also
   true for `std::vector` however, so people are assumed to know
   when they want to shoot themselves into their own foot
This commit is contained in:
Fischlurch 2024-07-07 04:20:46 +02:00
parent 58a955a879
commit b01fc6e350
4 changed files with 167 additions and 31 deletions

View file

@ -147,6 +147,8 @@ namespace lib {
using std::is_const_v;
using std::is_same_v;
using lib::meta::is_Subclass;
using several::ArrayBucket;
/**
@ -507,6 +509,20 @@ namespace lib {
size_t capacity() const { return Coll::storageBuffSiz() / Coll::spread(); }
size_t capReserve() const { return capacity() - size(); }
/** allow to peek into data emplaced thus far...
* @warning contents may be re-allocated until the final \ref build()
*/
I&
operator[] (size_t idx)
{
if (idx >= Coll::size())
throw err::Invalid{_Fmt{"Access index %d >= size(%d)."}
% idx % Coll::size()
,LERR_(INDEX_BOUNDS)
};
return Coll::operator[] (idx);
}
private: /* ========= Implementation of element placement ================ */
template<class IT>

View file

@ -69,7 +69,7 @@
namespace lib {
namespace {// Storage header implementation details
namespace several {// Storage header implementation details
/** @internal mix-in for self-destruction capabilities
* @remark the destructor function is assumed to perform deallocation;
@ -166,7 +166,7 @@ namespace lib {
: util::MoveAssign
{
protected:
using Bucket = ArrayBucket<I>*;
using Bucket = several::ArrayBucket<I>*;
Bucket data_{nullptr};

View file

@ -55,6 +55,8 @@ using util::join;
namespace lib {
namespace test{
using LERR_(INDEX_BOUNDS);
namespace { // invocation tracking diagnostic subclass...
/**
@ -193,7 +195,9 @@ namespace test{
builder.emplace<Num<3>>()
.emplace<Num<2>>(1);
CHECK (2 == builder.size());
CHECK (2 == builder.size()); // use information functions...
CHECK (3 == builder[1].getVal()); // to peek into contents assembled thus far...
VERIFY_ERROR (INDEX_BOUNDS, builder[2] ); // runtime bounds check on the builder (but not on the product!)
builder.fillElm(2);
CHECK (4 == builder.size());
builder.fillElm(3, 5);

View file

@ -1248,9 +1248,7 @@
</node>
<node CREATED="1502402291209" ID="ID_1962599608" MODIFIED="1518487921051" TEXT="aber k&#xf6;nnte SWIG-kompatibel sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn eigentlich geht es nur um ein einfaches Producer-Interface,
@ -2032,9 +2030,7 @@
</node>
<node CREATED="1535636755202" ID="ID_507299995" MODIFIED="1535636897708" TEXT="kann grunds&#xe4;tzlich nicht alle F&#xe4;lle abdecken">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wenn n&#228;mlich das &quot;Expandieren&quot; in einen weiter reichenden Zusammenhang integriert ist,
@ -3328,9 +3324,7 @@
</node>
<node CREATED="1538356761143" ID="ID_1729059066" MODIFIED="1538356797681">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Konzept ist <i>nicht</i>, sie gleich in die description zu &#252;bernehmen
@ -4483,9 +4477,7 @@
<node CREATED="1481767665231" ID="ID_141423591" MODIFIED="1518487921056" TEXT="con">
<node CREATED="1481767681797" ID="ID_1133339398" MODIFIED="1576282358149" TEXT="fragiler Lebenszyklus">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
meint: zwei gekoppelte Statusvariable
@ -6883,9 +6875,7 @@
<node CREATED="1486063886407" ID="ID_1294385692" MODIFIED="1518487921061" TEXT="sollte aus den weitverbreiteten Header-Includes raus"/>
<node CREATED="1486063911188" ID="ID_1391435276" MODIFIED="1576282358134" TEXT="gegenw&#xe4;rtig Member im UiManager">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und der wird in der Tat an vielen Stellen includiert
@ -8795,9 +8785,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...da IterExplorer einen Template-Template-Parameter nimmt,
@ -10154,9 +10142,7 @@
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1512516629180" ID="ID_1157813472" MODIFIED="1512516672998" TEXT="oh wie traurig">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
will sagen, das ist ja auch eine durchgeknallte Idee....
@ -10167,9 +10153,7 @@
</node>
<node CREATED="1512516682701" ID="ID_1471867999" MODIFIED="1512516706422">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
wenn eine Funktion <i>in</i>&#160;einem Layer expanded
@ -10179,9 +10163,7 @@
</node>
<node CREATED="1512516708649" ID="ID_474656011" MODIFIED="1512516797884" TEXT="dann mu&#xdf; sie sich zwischen Vater oder 1.Kind entscheiden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...d.h, entweder man gibt aus dem Functor das zur&#252;ck,
@ -82083,6 +82065,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1720221008511" ID="ID_1789484362" MODIFIED="1720221026822" TEXT="soll eine fluent-style-Aufrufkette erm&#xf6;glichen"/>
</node>
</node>
<node CREATED="1720143945014" ID="ID_1417701802" MODIFIED="1720317417964" TEXT="withAllocator(allo)">
<linktarget COLOR="#817c91" DESTINATION="ID_1417701802" ENDARROW="Default" ENDINCLINATION="-112;1076;" ID="Arrow_ID_155810203" SOURCE="ID_1463946300" STARTARROW="None" STARTINCLINATION="-508;32;"/>
</node>
</node>
<node CREATED="1720179641909" ID="ID_931208358" MODIFIED="1720179644115" TEXT="Namen">
<node CREATED="1720179652998" ID="ID_748409736" MODIFIED="1720179657194" TEXT="NodeBuilder"/>
@ -82410,6 +82395,51 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1720058625192" ID="ID_1924296035" MODIFIED="1720058641546" TEXT="dagegen auf Level-2 gibt es nur auf Typ getemplatete Methoden"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720314562948" ID="ID_217083278" MODIFIED="1720314731490" TEXT="Daten f&#xfc;r Build-Vorgang m&#xfc;ssen von separatem Allocator verwaltet werden">
<linktarget COLOR="#774459" DESTINATION="ID_217083278" ENDARROW="Default" ENDINCLINATION="-1063;40;" ID="Arrow_ID_711707696" SOURCE="ID_1044694589" STARTARROW="None" STARTINCLINATION="804;73;"/>
<icon BUILTIN="yes"/>
<node CREATED="1720316082204" ID="ID_1659113006" MODIFIED="1720316089812" TEXT="syntaktische M&#xf6;glichkeiten">
<node CREATED="1720316091467" ID="ID_1890331920" MODIFIED="1720316098390" TEXT="direkt &#xfc;ber die Einstiegsfunktion"/>
<node CREATED="1720316099218" ID="ID_852632283" MODIFIED="1720316118532" TEXT="&#xfc;ber einen nachgeschalteten Qualifikator">
<node CREATED="1720316124312" ID="ID_962601831" MODIFIED="1720316133266" TEXT="das w&#xe4;re vorzuziehen, da lesbarer"/>
<node CREATED="1720316134343" ID="ID_1579996543" MODIFIED="1720316195167" TEXT="ist aber nicht ganz trivial zu implementieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...da der Typ des Builders vom Allocator abh&#228;ngt
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#525474" DESTINATION="ID_1147972165" ENDARROW="Default" ENDINCLINATION="5;-93;" ID="Arrow_ID_965912718" STARTARROW="None" STARTINCLINATION="-226;14;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720314814568" ID="ID_1147972165" MODIFIED="1720316332816" TEXT="cross-Builder-Ansatz">
<arrowlink COLOR="#721c55" DESTINATION="ID_1819027234" ENDARROW="Default" ENDINCLINATION="-426;-32;" ID="Arrow_ID_1938401610" STARTARROW="None" STARTINCLINATION="-70;384;"/>
<linktarget COLOR="#525474" DESTINATION="ID_1147972165" ENDARROW="Default" ENDINCLINATION="5;-93;" ID="Arrow_ID_965912718" SOURCE="ID_1579996543" STARTARROW="None" STARTINCLINATION="-226;14;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1720314831505" ID="ID_993955080" MODIFIED="1720314835363" TEXT="Level-3">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1720314955170" ID="ID_702805318" MODIFIED="1720314971125" TEXT="schwierig &#x2014; Einstieg noch nicht wirklich klar">
<icon BUILTIN="hourglass"/>
</node>
<node CREATED="1720314972101" ID="ID_906941544" MODIFIED="1720314994061" TEXT="brauche vermutlich dedizierten Einstiegs-Builder"/>
<node CREATED="1720314999624" ID="ID_1634794642" MODIFIED="1720315050913" TEXT="es ist aber auch noch nicht klar, wie der Level-3-build-walk genau gestartet wird">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node CREATED="1720314836072" ID="ID_1147923922" MODIFIED="1720314839441" TEXT="Level-2">
<node CREATED="1720317464400" ID="ID_823557133" MODIFIED="1720317484088" TEXT="versuche, hier auf Level-2 nur den Node-Allocator zu verwenden"/>
<node CREATED="1720315060096" ID="ID_948989119" MODIFIED="1720317491855" TEXT="Level-3 mu&#xdf; letztlich den Allocator durchgeben"/>
<node CREATED="1720315117369" ID="ID_1463946300" MODIFIED="1720317510552" TEXT="das mu&#xdf; passieren unmittelbar nach prepareNode()">
<arrowlink COLOR="#817c91" DESTINATION="ID_1417701802" ENDARROW="Default" ENDINCLINATION="-112;1076;" ID="Arrow_ID_155810203" STARTARROW="None" STARTINCLINATION="-508;32;"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
@ -86140,6 +86170,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720313949720" ID="ID_545937744" MODIFIED="1720314520064" TEXT="Memory-Management einrichten">
<linktarget COLOR="#e3426e" DESTINATION="ID_545937744" ENDARROW="Default" ENDINCLINATION="-403;31;" ID="Arrow_ID_1019256772" SOURCE="ID_1082077368" STARTARROW="None" STARTINCLINATION="467;53;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1720314305805" ID="ID_304028020" MODIFIED="1720314310083" TEXT="zwei Ebenen">
<node CREATED="1720314310978" ID="ID_1044694589" MODIFIED="1720315408053" TEXT="Allokator f&#xfc;r den Build-Vorgang">
<arrowlink COLOR="#774459" DESTINATION="ID_217083278" ENDARROW="Default" ENDINCLINATION="-1063;40;" ID="Arrow_ID_711707696" STARTARROW="None" STARTINCLINATION="804;73;"/>
<arrowlink COLOR="#774459" DESTINATION="ID_611643324" ENDARROW="Default" ENDINCLINATION="-1147;68;" ID="Arrow_ID_1972337488" STARTARROW="None" STARTINCLINATION="804;73;"/>
</node>
<node CREATED="1720314319630" ID="ID_1339736273" MODIFIED="1720314331059" TEXT="Allokator f&#xfc;r die Render-Nodes (pro Segment)"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1713823682795" ID="ID_868323088" MODIFIED="1713823821819" TEXT="Kl&#xe4;ren der Probleme mit den Prototypen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#dfb29e" COLOR="#a50125" CREATED="1718927789851" ID="ID_1793832055" MODIFIED="1718927827690" TEXT="Gefahr der kombinatorischen Explosion">
@ -87449,13 +87490,53 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1719970214048" ID="ID_912277542" MODIFIED="1719970290253" TEXT="Builder-API">
<arrowlink COLOR="#b82d72" DESTINATION="ID_1241897346" ENDARROW="Default" ENDINCLINATION="-200;386;" ID="Arrow_ID_1194515432" STARTARROW="None" STARTINCLINATION="-600;-89;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720285198414" ID="ID_1153319941" MODIFIED="1720285456652" TEXT="Grundlagen aufbauen">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1720285198414" ID="ID_1153319941" MODIFIED="1720312452926" TEXT="Grundlagen aufbauen">
<linktarget COLOR="#de3756" DESTINATION="ID_1153319941" ENDARROW="Default" ENDINCLINATION="-322;35;" ID="Arrow_ID_619451066" SOURCE="ID_1279225641" STARTARROW="None" STARTINCLINATION="833;-72;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="help"/>
<node CREATED="1720285508129" ID="ID_1303842344" MODIFIED="1720285515458" TEXT="Refactoring Connectivity"/>
<node CREATED="1720285518287" ID="ID_525600205" MODIFIED="1720285535616" TEXT="NodeBuilder"/>
<node CREATED="1720285544539" ID="ID_28916107" MODIFIED="1720285547718" TEXT="PortBuilder"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720314562948" ID="ID_611643324" MODIFIED="1720315408053" TEXT="separaten Allocator f&#xfc;r den Builder einf&#xfc;hren">
<linktarget COLOR="#774459" DESTINATION="ID_611643324" ENDARROW="Default" ENDINCLINATION="-1147;68;" ID="Arrow_ID_1972337488" SOURCE="ID_1044694589" STARTARROW="None" STARTINCLINATION="804;73;"/>
<icon BUILTIN="yes"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1720318492552" ID="ID_139926760" MODIFIED="1720318500106" TEXT="Probleme / Zweifel">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1720318501983" ID="ID_1668344828" MODIFIED="1720318529687" TEXT="zwei verschiedene Allocatoren in einem Builder sind verwirrend und gef&#xe4;hrlich"/>
<node CREATED="1720318530879" ID="ID_519349426" MODIFIED="1720318546580" TEXT="gut w&#xe4;re, wenn auf einem Level nur ein Allocator relevant ist"/>
<node CREATED="1720318547540" ID="ID_792899561" MODIFIED="1720318561458" TEXT="dann m&#xfc;&#xdf;te aber Level-2 komplett auf dem Ziel-Allocator laufen">
<node CREATED="1720318564566" ID="ID_506557297" MODIFIED="1720318595006" TEXT="er kann dann keine zus&#xe4;tzlichen Arbeitsdaten halten"/>
<node CREATED="1720318693773" ID="ID_1481571004" MODIFIED="1720318706074" TEXT="bedeutet: alle angelegten Daten wandern in die Render-Node"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720316245567" ID="ID_1819027234" MODIFIED="1720316332817" TEXT="cross-Builder-Trick f&#xfc;r Allokator einbauen">
<linktarget COLOR="#721c55" DESTINATION="ID_1819027234" ENDARROW="Default" ENDINCLINATION="-426;-32;" ID="Arrow_ID_1938401610" SOURCE="ID_1147972165" STARTARROW="None" STARTINCLINATION="-70;384;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1720316338810" ID="ID_1548536358" MODIFIED="1720316355932" TEXT="hatte das erstmals f&#xfc;r den SeveralBuilder so gemacht"/>
<node CREATED="1720316421216" ID="ID_18485878" MODIFIED="1720316434730" TEXT="Vorteil: man bekommt einen dedizierten Scope f&#xfc;r das Type-Rebinding"/>
<node CREATED="1720316436796" ID="ID_554170067" MODIFIED="1720316451392" TEXT="Nachteil: geht nur per move und bei noch leerem Builder"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720318733128" ID="ID_594929215" MODIFIED="1720318752670" TEXT="zus&#xe4;tzliche Schwierigkeit: Typ f&#xfc;r den Allocator">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1720318754853" ID="ID_1165422564" MODIFIED="1720318770806" TEXT="geht jeweils auch in den Zieldatentyp mit ein"/>
<node CREATED="1720318787977" ID="ID_145712004" MODIFIED="1720318800043" TEXT="macht Klassendefinition kniffelig">
<node CREATED="1720318802329" ID="ID_430923777" MODIFIED="1720318826079" TEXT="mu&#xdf; per decltype() abgreifen"/>
</node>
<node CREATED="1720318771515" ID="ID_1440673661" MODIFIED="1720318783185" TEXT="Ausnahme: lib::Several">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1720318828899" ID="ID_697070122" MODIFIED="1720360539626" TEXT="aber: erlaubt keinen Zugriff auf die abgelegten Daten">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1720318848113" ID="ID_1309186144" MODIFIED="1720318864488" TEXT="Begr&#xfc;ndung war: diese werden ggfs noch per re-alloc verschoben"/>
<node CREATED="1720318865502" ID="ID_1725813889" MODIFIED="1720318886874" TEXT="das ist richtig, gilt aber f&#xfc;r std::vector genauso"/>
<node COLOR="#435e98" CREATED="1720358717835" ID="ID_158212025" MODIFIED="1720360536672" TEXT="&#x27f9; diese Einschr&#xe4;nkung fallenlassen">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1719968038589" HGAP="38" ID="ID_177982013" MODIFIED="1719968051367" TEXT="Feststellungen" VSHIFT="30">
@ -88674,6 +88755,41 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1720313463006" ID="ID_174350782" MODIFIED="1720313473601" TEXT="Speicher f&#xfc;r den Build-Vorgang">
<node CREATED="1720313766515" ID="ID_1082077368" MODIFIED="1720314524742" TEXT="Prototyp / Entwicklung">
<arrowlink COLOR="#e3426e" DESTINATION="ID_545937744" ENDARROW="Default" ENDINCLINATION="-403;31;" ID="Arrow_ID_1019256772" STARTARROW="None" STARTINCLINATION="467;53;"/>
<icon BUILTIN="forward"/>
</node>
<node CREATED="1720313493545" ID="ID_992778398" MODIFIED="1720314530568" TEXT="Verwende separaten AllocationCluster f&#xfc;r alle Meta/Build-Entit&#xe4;ten"/>
<node CREATED="1720313512933" ID="ID_1508538563" MODIFIED="1720313529373" TEXT="dieser soll nach einem Build-Vorgang einfach weggeworfen werden">
<node CREATED="1720313532365" ID="ID_111352025" MODIFIED="1720313536117" TEXT="gef&#xe4;hrlich...">
<node CREATED="1720313537075" ID="ID_416643606" MODIFIED="1720313566688">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
alle Werte m&#252;ssen zuverl&#228;ssig in die Zieldatenstruktur <b>kopiert</b>&#160; werden
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1720313568317" ID="ID_106309971" MODIFIED="1720313594757" TEXT="das l&#xe4;&#xdf;t sich nicht per Typsystem enforcen">
<node CREATED="1720313596745" ID="ID_680303414" MODIFIED="1720313604212" TEXT="konsistentes Schema im Code verwenden"/>
<node CREATED="1720313604920" ID="ID_59742346" MODIFIED="1720313618954" TEXT="grunds&#xe4;tzlich alles an einen &#xbb;Allocator&#xab; ankoppeln"/>
</node>
<node CREATED="1720313621174" ID="ID_1172601220" MODIFIED="1720313636894" TEXT="idealerweise: m&#xf6;glichst viele POD-Daten verwenden"/>
</node>
<node CREATED="1720313675054" ID="ID_1333717893" MODIFIED="1720313710284" TEXT="Terminale build()-Operation braucht den Ziel-Allocator">
<node CREATED="1720313711537" ID="ID_1085269" MODIFIED="1720313726346" TEXT="d.h. dort sind dann ggfs. zwei Allocatoren gleichzeitig im Einsatz"/>
<node CREATED="1720313727222" ID="ID_499486223" MODIFIED="1720313739137" TEXT="auch daf&#xfc;r gibt es kein Sicherheitsnetz">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
<node CREATED="1715623570769" ID="ID_582193119" MODIFIED="1715623580607" TEXT="Allokations-Verwaltung per Segment"/>
</node>
</node>