diff --git a/src/lib/several-builder.hpp b/src/lib/several-builder.hpp index 979f5d75f..31e2b19cd 100644 --- a/src/lib/several-builder.hpp +++ b/src/lib/several-builder.hpp @@ -242,8 +242,9 @@ namespace lib { } else { + E& oldElm = reinterpret_cast (src->subscript (idx)); Fac::template createAt (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 (forward (args)...); + emplaceNewElm (forward (args)...); return move(*this); } diff --git a/src/lib/test/testdummy.hpp b/src/lib/test/testdummy.hpp index 17ee98004..b55466e33 100644 --- a/src/lib/test/testdummy.hpp +++ b/src/lib/test/testdummy.hpp @@ -70,7 +70,7 @@ namespace test{ : val_(v) { init(); } - Dummy (Dummy && oDummy) + Dummy (Dummy && oDummy) noexcept : Dummy(0) { swap (*this, oDummy); diff --git a/tests/library/several-builder-test.cpp b/tests/library/several-builder-test.cpp index 14bfc45a5..55247aae3 100644 --- a/tests/library/several-builder-test.cpp +++ b/tests/library/several-builder-test.cpp @@ -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 (num1) + ,static_cast (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> 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>(); ///////////////////////////////////OOO this should trigger an exception -> need to code an explicit check right at the start of emplaceNewElm() + } } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index e2e603522..d3ec96505 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -82741,7 +82741,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + @@ -83375,9 +83376,43 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - + + + + + + + + + + + + +

+ und der von Dummy muß noexcept sein +

+ + +
+ +
+
+ + + + + + + + + + + + + + + +