diff --git a/src/lib/par/domain.hpp b/src/lib/par/domain.hpp index 9881ca1bb..2f668eece 100644 --- a/src/lib/par/domain.hpp +++ b/src/lib/par/domain.hpp @@ -92,7 +92,9 @@ namespace par { class TypeHandler { public: - virtual void conformInto (ValBuff&, X const&) =0; + virtual void extractAs (X& targetVal, ValBuff const& valBuff) =0; + virtual void conform (ValBuff& targetBuff, X const& srcVal) =0; + }; // using lib::meta::typeseq; @@ -127,13 +129,7 @@ namespace par { virtual ~Domain(); ///< this is an interface virtual void applyLimit (ValBuff&) =0; - virtual void supply(ValBuff const& src, ValBuff& target, Domain& targetDomain) =0; - - template - void extractAs (X& targetVal, ValBuff const& valBuff); - - template - void conform (ValBuff& targetBuff, X&& srcVal); + virtual void assignInto (ValBuff& target, Domain& targetDomain, ValBuff const& source) =0; protected: }; @@ -157,7 +153,8 @@ _Pragma("GCC diagnostic ignored \"-Woverloaded-virtual\"") class TypeHandlerImpl : public BAS { - void conformInto (ValBuff& targetBuff, X const& srcVal) override; + void extractAs (X& targetVal, ValBuff const& valBuff) override; + void conform (ValBuff& targetBuff, X const& srcVal) override; }; using TypeHandlerChain = meta::InstantiateChained; @@ -171,7 +168,7 @@ _Pragma("GCC diagnostic ignored \"-Woverloaded-virtual\"") { public: void applyLimit (ValBuff&) override; - void supply (ValBuff const& src, ValBuff& target, Domain& targetDomain) override; + void assignInto (ValBuff& target, Domain& targetDomain, ValBuff const& source) override; }; @@ -253,15 +250,6 @@ _Pragma("GCC diagnostic pop") - template - inline void - BaseDomain::applyLimit (ValBuff& valBuff) - { - V& val{asValue (valBuff)}; - val = preClamp (val); - } - - template inline void assignConverted (V& targetVal, X const& srcVal) @@ -284,7 +272,17 @@ _Pragma("GCC diagnostic pop") template template inline void - DomainSetup::TypeHandlerImpl::conformInto (ValBuff& targetBuff, X const& srcVal) + DomainSetup::TypeHandlerImpl::extractAs (X& targetVal, ValBuff const& valBuff) + { + V const& srcVal = asValue (valBuff); + assignConverted (targetVal, srcVal); + } + + + template + template + inline void + DomainSetup::TypeHandlerImpl::conform (ValBuff& targetBuff, X const& srcVal) { V& targetVal = asValue (targetBuff); assignConverted (targetVal, srcVal); @@ -293,31 +291,22 @@ _Pragma("GCC diagnostic pop") template inline void - BaseDomain::supply (ValBuff const& srcBuff, ValBuff& targetBuff, Domain& targetDomain) + BaseDomain::applyLimit (ValBuff& valBuff) { - targetDomain.conform (targetBuff, asValue (srcBuff)); + V& val{asValue (valBuff)}; + val = preClamp (val); } - template + + template inline void - Domain::extractAs (X& targetVal, ValBuff const& valBuff) + BaseDomain::assignInto (ValBuff& target, Domain& targetDomain, ValBuff const& source) { - BaseDomain target; - ValBuff& targetBuff{asValBuff (targetVal)}; - supply (valBuff, targetBuff, target); + TypeHandler& typeHandler{targetDomain}; + typeHandler.conform (target, asValue (source)); + targetDomain.applyLimit (target); } - template - inline void - Domain::conform (ValBuff& targetBuff, X&& srcVal) - { - using Src = std::decay_t; - TypeHandler& typeHandler{*this}; - typeHandler.conformInto (targetBuff, srcVal); - applyLimit (targetBuff); - } - - }} // namespace lib::par diff --git a/tests/lib/par/parameter-domain-test.cpp b/tests/lib/par/parameter-domain-test.cpp index eafec7d4b..3aa35b4fd 100644 --- a/tests/lib/par/parameter-domain-test.cpp +++ b/tests/lib/par/parameter-domain-test.cpp @@ -181,24 +181,21 @@ namespace test{ uint target1{0}; CHECK (not target1); -// TypeHandler& du1{d1}; -// du1.extractAs (target1, src1); - d1.extractAs(target1, src1); + TypeHandler& du1{d1}; + du1.extractAs (target1, src1); CHECK (target1 == uint(val1)); float target2{0}; -// TypeHandler& df1{d1}; -// df1.extractAs (target2, src1); - d1.extractAs(target2, src1); + TypeHandler& df1{d1}; + df1.extractAs (target2, src1); CHECK (target2 == float(val1)); // value clamped to target domain... val1 = _MIN; uint64_t target3{55}; -// TypeHandler& du64{d1}; -// du64.extractAs (target3, src1); - d1.extractAs (target3, src1); + TypeHandler& du64{d1}; + du64.extractAs (target3, src1); CHECK (target3 == _MIN); } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 04792773f..9d2da9a93 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -83144,8 +83144,7 @@ gar nicht so ohne Weiteres vergleichen

- - + @@ -83491,8 +83490,7 @@ kann nun auch generisch implementieren: conform (Buffer, TY&&)

- - +
@@ -83525,8 +83523,7 @@ ...sonst funktioniert diese doppelte Indirektion gar nicht; die erste aufgerufene Funktion ist ja ein visit(opaqueTarget) — und erst in der Implementierung  derselben kenne ich den konkreten »Quell«-Typ. Hier aber ist die Sache nochmal komplexer, da ich die Idee hatte, den Visitor "reflexiv" zu machen, womit ich meine, daß der Mechanismus in beide Richtungen anwendbar ist; keine Ahnung ob das überhaupt geht...

- - +
@@ -83560,8 +83557,7 @@ - - + @@ -83601,8 +83597,7 @@ - - + @@ -83616,8 +83611,7 @@ virtual void supply(ValBuff  const& src, ValBuff&  target, Domain& targetDomain)

- - +
@@ -83631,8 +83625,7 @@ kann nun auf dieser Basis die umgekehrte Richtung auch implementieren

- - +
@@ -83646,15 +83639,49 @@ Zwischenfazit: ja man kann

- - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -189692,7 +189719,7 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo - + @@ -189869,7 +189896,7 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo - +