diff --git a/src/lib/hetero-data.hpp b/src/lib/hetero-data.hpp index c70cc2f29..f92748cd4 100644 --- a/src/lib/hetero-data.hpp +++ b/src/lib/hetero-data.hpp @@ -73,11 +73,8 @@ namespace lib { /** */ - template - class HeteroData - { - /////////////////////////OOO do we need this as marker for an unspecified front-end? - }; + template + class HeteroData; template class HeteroData,TAIL>> @@ -99,6 +96,9 @@ namespace lib { return * reinterpret_cast<_Tail*> (Frame::next); } + template + friend class HeteroData; ///< allow chained types to use recursive type definitions + public: static constexpr size_t size() @@ -142,8 +142,8 @@ namespace lib { using ChainType = meta::Append,NewFrame>; template - NewFrame - operator() (INIT&& ...initArgs) + static NewFrame + build (INIT&& ...initArgs) { return {initArgs ...}; } @@ -165,18 +165,26 @@ namespace lib { public: static size_t constexpr size() { return 0; } - template - struct Constructor + template + using Elm_t = void; + }; + + template + class HeteroData + : public HeteroData, meta::NullType>> + { + using _Front = HeteroData, meta::NullType>>; + + public: + using NewFrame = typename _Front::Frame; + using ChainType = _Front; + + template + static NewFrame + build (INIT&& ...initArgs) { - using Chain = HeteroData, meta::NullType>>; - - template - typename Chain::Frame - operator() (INIT&& ...initArgs) - { - return {initArgs ...}; - } - }; + return {initArgs ...}; + } }; diff --git a/tests/library/hetero-data-test.cpp b/tests/library/hetero-data-test.cpp index 3b3685207..a8803412f 100644 --- a/tests/library/hetero-data-test.cpp +++ b/tests/library/hetero-data-test.cpp @@ -18,12 +18,16 @@ #include "lib/test/run.hpp" #include "lib/hetero-data.hpp" +#include "lib/meta/trait.hpp" +#include "lib/test/diagnostic-output.hpp"/////////////////TODO namespace lib { namespace test{ + using meta::is_Subclass; + namespace { // probe victims }//(End) test data @@ -54,7 +58,12 @@ namespace test{ void checkSingleKill () { + using Block1 = HeteroData; + CHECK ((is_Subclass>())); + auto b1 = Block1::build (42, 1.61803); +SHOW_EXPR(b1) + CHECK (1.61803 == std::get<1> (b1)); } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 7e9514aae..f878d8dfa 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -87855,8 +87855,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Konkret ist das Problem, daß die Fold-Expression von meinem Compiler nicht als constexpr akzeptiert wird (weil man ja über die Fold-Expression einen Index inkrementiert). Möglicherweise würde das dann mit C++20 gehen?

- - + @@ -87963,8 +87962,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...diese ist ein Funktor, der von gans woanders stammt — nämlich von dem Builder aus dem High-Level-Model gewrappt, z.B. Auswertung einer Bézier-Kurve

- - +
@@ -87984,8 +87982,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
gestern habe ich mich furchbar geplagt, weil ich fest davon überzeugt war, daß dieses Anhängen im Konstruktor untergebracht werden muß

- - +
@@ -88054,8 +88051,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Konsequenz: die Funktion, die an den Chain anhängt, muß die Längen-Info haben

- - +
@@ -88067,8 +88063,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
insofern ist es ja schon attraktiv, mit dem Konstruktor-Funktor zu »zaubern«

- - +
@@ -88083,8 +88078,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
an einen Chain der richtigen Länge angehängt werden

- - +
@@ -88101,8 +88095,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Daten-Record wird markiert mit Template-Parameter prefixLen

- - +
@@ -88113,8 +88106,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
die kann unmittelbar die Länge prüfen und dann an's Ende gehen und den Pointer dort setzen

- - +
@@ -88136,8 +88128,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
weil es ja für den gesamten Teilbaum relevant ist

- - + @@ -88169,6 +88160,23 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + + + + + + +