Library: investigate case with known element type

- the test-dummy objects need a `noexcept` move ctor
- **bug** here: need an explicit check to prevent other types
  than the known element type from ''sneaking in''
This commit is contained in:
Fischlurch 2024-06-12 03:23:20 +02:00
parent 006809712e
commit d9f86ad891
4 changed files with 85 additions and 7 deletions

View file

@ -242,8 +242,9 @@ namespace lib {
}
else
{
E& oldElm = reinterpret_cast<E&> (src->subscript (idx));
Fac::template createAt<E> (tar, idx
,std::move_if_noexcept (src->subscript(idx)));
,std::move_if_noexcept (oldElm));
}
tar->cnt = idx+1; // mark fill continuously for proper clean-up after exception
}
@ -327,7 +328,7 @@ namespace lib {
fillElm (size_t cntNew, ARGS&& ...args)
{
for ( ; 0<cntNew; --cntNew)
emplaceNewElm<I> (forward<ARGS> (args)...);
emplaceNewElm<E> (forward<ARGS> (args)...);
return move(*this);
}

View file

@ -70,7 +70,7 @@ namespace test{
: val_(v)
{ init(); }
Dummy (Dummy && oDummy)
Dummy (Dummy && oDummy) noexcept
: Dummy(0)
{
swap (*this, oDummy);

View file

@ -87,6 +87,28 @@ namespace test{
{
return i+ii + explore(ext_).resultSum();
}
/// allow for move construction
Num (Num && oNum) noexcept
: Num(0)
{
swap (*this, oNum);
}
Num&
operator= (Num && oNum)
{
if (&oNum != this)
swap (*this, oNum);
return *this;
}
friend void
swap (Num& num1, Num& num2) ///< checksum neutral
{
std::swap (static_cast<Dummy&> (num1)
,static_cast<Dummy&> (num2));
std::swap (num1.ext_, num2.ext_);
}
};
} // (END) test types
@ -248,6 +270,26 @@ namespace test{
, builder.fillElm (20) );
CHECK (10 == builder.size());
}
{ // Scenario-2 : Baseclass and elements of a single fixed subclass
SeveralBuilder<Dummy, Num<5>> builder;
Dummy dum;
SHOW_EXPR(dum.getVal())
Dummy nem{move(dum)};
SHOW_EXPR(dum.getVal())
SHOW_EXPR(nem.getVal())
Num<5> no5;
SHOW_EXPR(no5.getVal())
Num<5> ne5{move(no5)};
SHOW_EXPR(no5.getVal())
SHOW_EXPR(ne5.getVal())
builder.fillElm(5);
CHECK (5 == builder.size());
builder.emplace<Num<1>>(); ///////////////////////////////////OOO this should trigger an exception -> need to code an explicit check right at the start of emplaceNewElm()
}
}

View file

@ -82741,7 +82741,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1717980838451" ID="ID_123345043" MODIFIED="1717980849735" TEXT="hab es jetzt vorerst doch wieder dorthin geschoben"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717980850354" ID="ID_1951694568" MODIFIED="1717980857530" TEXT="TODO: bessere L&#xf6;sung finden">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717980850354" ID="ID_1951694568" MODIFIED="1718158733534" TEXT="TODO: bessere L&#xf6;sung finden">
<linktarget COLOR="#ea004d" DESTINATION="ID_1951694568" ENDARROW="Default" ENDINCLINATION="456;43;" ID="Arrow_ID_13456577" SOURCE="ID_1048202028" STARTARROW="None" STARTINCLINATION="325;-27;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -83375,9 +83376,43 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1718153109115" ID="ID_443086499" MODIFIED="1718153130346" STYLE="fork" TEXT="kein Typ mit anderem nicht-passenden Destruktor-Schema"/>
<node COLOR="#435e98" CREATED="1718122010547" ID="ID_1757791910" MODIFIED="1718153130345" STYLE="fork" TEXT="nicht gen&#xfc;gend Storage und kann nicht verschieben"/>
</node>
<node CREATED="1718122030712" ID="ID_1960968889" MODIFIED="1718122040234" TEXT="Base + bekanntes E">
<node CREATED="1718122066531" ID="ID_1633309056" MODIFIED="1718122076582" TEXT="kann wachsen (da move-ctor bekannt)"/>
<node CREATED="1718122077386" ID="ID_959961694" MODIFIED="1718122087388" TEXT="kann keinen anderen Typ platzieren (selbst wenn kleiner)"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1718122030712" ID="ID_1960968889" MODIFIED="1718158946391" TEXT="Base + bekanntes E">
<icon BUILTIN="pencil"/>
<node CREATED="1718122066531" ID="ID_1633309056" MODIFIED="1718122076582" TEXT="kann wachsen (da move-ctor bekannt)">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#761b6d" CREATED="1718158865620" ID="ID_1008642521" MODIFIED="1718158939698" TEXT="erst mal mu&#xdf; Num&lt;5&gt; auch einen move-ctor haben">
<icon BUILTIN="broken-line"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#761b6d" CREATED="1718158901756" ID="ID_1578123647" MODIFIED="1718158939699">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
und der von Dummy mu&#223; <b>noexcept</b>&#160;sein
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="broken-line"/>
</node>
</node>
<node CREATED="1718122077386" ID="ID_959961694" MODIFIED="1718122087388" TEXT="kann keinen anderen Typ platzieren (selbst wenn kleiner)">
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1718157829884" ID="ID_1228814618" MODIFIED="1718157836660" TEXT="spricht nicht an">
<icon BUILTIN="broken-line"/>
<node CREATED="1718157847914" ID="ID_1926254706" MODIFIED="1718157851469" TEXT="Beobachtungen">
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1718157852441" ID="ID_1384707564" MODIFIED="1718157871000" TEXT="probeMoveCapability&lt;TY&gt;() setzt gleich zu Beginn die move-Sperre">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1718158012556" ID="ID_240735780" MODIFIED="1718158019734" TEXT="das ist logisch falsch...."/>
<node CREATED="1718158020275" ID="ID_1916533180" MODIFIED="1718158029781" TEXT="wir d&#xfc;rften diesen Punkt gar nicht erreichen"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1718158031369" ID="ID_1048202028" MODIFIED="1718158733534" TEXT="Ja... hier fehlt ein expliziter Check">
<arrowlink COLOR="#ea004d" DESTINATION="ID_1951694568" ENDARROW="Default" ENDINCLINATION="456;43;" ID="Arrow_ID_13456577" STARTARROW="None" STARTINCLINATION="325;-27;"/>
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1718122252659" ID="ID_616405505" MODIFIED="1718122291873" TEXT="Triviale Typen">
<node CREATED="1718122293022" ID="ID_697520417" MODIFIED="1718122302248" TEXT="kann wachsen"/>