diff --git a/src/lib/meta/trait.hpp b/src/lib/meta/trait.hpp index e15d8a2ae..a5f6d1df7 100644 --- a/src/lib/meta/trait.hpp +++ b/src/lib/meta/trait.hpp @@ -95,12 +95,13 @@ namespace mobject{ namespace lib { namespace meta { - using std::remove_cv; using std::remove_cv_t; - using std::remove_pointer; using std::remove_pointer_t; - using std::remove_reference; using std::remove_reference_t; + using std::conditional_t; + using std::is_reference_v; + using std::is_lvalue_reference_v; + using std::is_rvalue_reference_v; using std::is_pointer; using std::is_base_of; using std::is_convertible; @@ -248,7 +249,11 @@ namespace meta { template struct Strip { - using TypeUnconst = remove_cv_t; + using TypeUnconst = conditional_t + , conditional_t + , remove_cv_t> && + , remove_cv_t> & > + , remove_cv_t>; using TypeReferred = remove_reference_t; using TypePointee = remove_pointer_t; using TypePlain = remove_cv_t; diff --git a/src/lib/several-builder.hpp b/src/lib/several-builder.hpp index 28e032476..9180996c7 100644 --- a/src/lib/several-builder.hpp +++ b/src/lib/several-builder.hpp @@ -93,6 +93,9 @@ namespace lib { using std::is_trivially_destructible_v; using std::has_virtual_destructor_v; using std::is_trivially_copyable_v; + using std::is_object_v; + using std::is_volatile_v; + using std::is_const_v; using std::is_same_v; using lib::meta::is_Subclass; @@ -290,6 +293,17 @@ namespace lib { return move(*this); } + template + SeveralBuilder&& + append (VAL&& val, VALS&& ...vals) + { + emplace (forward (val)); + if constexpr (0 < sizeof...(VALS)) + return append (forward (vals)...); + else + return move(*this); + } + template SeveralBuilder&& appendAll (IT&& data) @@ -321,7 +335,7 @@ namespace lib { SeveralBuilder&& emplace (ARGS&& ...args) { - using Val = typename meta::RefTraits::Value; + using Val = typename meta::Strip::TypeReferred; emplaceNewElm (forward (args)...); return move(*this); } @@ -355,6 +369,8 @@ namespace lib { void emplaceNewElm (ARGS&& ...args) { + static_assert (is_object_v and not (is_const_v or is_volatile_v)); + // mark when target type is not trivially movable probeMoveCapability(); diff --git a/tests/library/several-builder-test.cpp b/tests/library/several-builder-test.cpp index 8805a347b..dacd31f6a 100644 --- a/tests/library/several-builder-test.cpp +++ b/tests/library/several-builder-test.cpp @@ -154,26 +154,15 @@ namespace test{ CHECK ( isnil(builder)); CHECK (not isnil(elms)); CHECK (7 == elms.size()); -SHOW_EXPR(elms[0]) -SHOW_EXPR(elms[0].getVal()) CHECK (elms[0].getVal() == (3+1)*3); // indeed a Num<3> with default-seed ≡ 3 -SHOW_EXPR(elms[0].calc(1)) CHECK (elms[0].calc(1) == 3 + 1 + (3+3+3)); // indeed called the overridden calc() operation -SHOW_EXPR(elms[1].getVal()) CHECK (elms[1].getVal() == (2+1)*1); // indeed a Num<2> with seed ≡ 1 -SHOW_EXPR(elms[1].calc(1)) CHECK (elms[1].calc(1) == 2 + 1 + (1+1)); // indeed the overridden calc() picking from the Array(1,1) -SHOW_EXPR(elms[2].getVal()) CHECK (isLimited (1, elms[2].getVal(), 100'000'000)); // indeed a Dummy with default random seed -SHOW_EXPR(elms[3].getVal()) CHECK (isLimited (1, elms[3].getVal(), 100'000'000)); // and this one too, since we filled in two instances -SHOW_EXPR(elms[4].getVal()) CHECK (elms[4].getVal() == 5); // followed by tree instances Dummy(5) -SHOW_EXPR(elms[5].getVal()) CHECK (elms[5].getVal() == 5); -SHOW_EXPR(elms[6].getVal()) CHECK (elms[6].getVal() == 5); -SHOW_EXPR(elms[6].calc(1)) CHECK (elms[6].calc(1) == 5+1); // indeed invoking the base implementation of calc() } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index c57f8016c..a9be8133f 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -83063,8 +83063,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + @@ -83080,12 +83080,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - - - + + + @@ -83096,6 +83094,18 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + +
@@ -83308,11 +83318,36 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - - - + + + + + + + + + + + + + + + + +

+ ...und zwar, weil man ein (language)-Array mit operator new[] allozieren muß +

+

+ ...✔ OK — selber schuld +

+ + +
+
+
+ + +