Parameters: verify the clamping operation

- systematic testing of boundary values for various numeric types
 - verify even clamping of an uint-128 when targeting float
 - verify signed / unsigned of different rank
 - demonstrate the clamping now integrated into `extractAs()`

As an aside, move the `isNeg()` function (safe test for negative numbers)
into util.hpp and fix related bugs with unsigned there.
This commit is contained in:
Fischlurch 2026-07-22 22:17:04 +02:00
parent e3b6b87e93
commit e48c03e35d
4 changed files with 161 additions and 66 deletions

View file

@ -47,6 +47,7 @@
namespace lib { namespace lib {
namespace par { namespace par {
using util::isNeg;
using std::same_as; using std::same_as;
using std::floating_point; using std::floating_point;
using std::numeric_limits; using std::numeric_limits;
@ -178,13 +179,6 @@ _Pragma("GCC diagnostic ignored \"-Woverloaded-virtual\"")
or std::numeric_limits<SUB>::lowest() > std::numeric_limits<BAS>::lowest() or std::numeric_limits<SUB>::lowest() > std::numeric_limits<BAS>::lowest()
; ;
template<typename NUM>
inline constexpr bool
isNeg (NUM const& num)
{
return num < NUM(0);
};
_Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wsign-compare\"") _Pragma("GCC diagnostic ignored \"-Wsign-compare\"")

View file

@ -60,7 +60,9 @@ namespace util {
inline constexpr int inline constexpr int
sgn (NUM n) sgn (NUM n)
{ {
return (n==0)? 0 :((n<0)? -1:+1 ); return n== NUM{0}? 0
: n < NUM{0}? -1
: +1;
} }
template <class N1, class N2> template <class N1, class N2>
@ -77,12 +79,20 @@ namespace util {
return n1 < n2? N1(n2) : n1; return n1 < n2? N1(n2) : n1;
} }
/** @remark safe to use also on unsigned */
template<typename NUM>
inline constexpr bool
isNeg (NUM const& num)
{
return num < NUM{0};
};
/** cut a numeric value to be >=0 */ /** cut a numeric value to be >=0 */
template <typename NUM> template <typename NUM>
inline constexpr NUM inline constexpr NUM
noneg (NUM val) noneg (NUM val)
{ {
return (0<val? val : 0); return max (val, NUM(0));
} }
/** force a numeric to be within bounds, inclusively */ /** force a numeric to be within bounds, inclusively */

View file

@ -24,6 +24,7 @@
//#include <utility> //#include <utility>
//#include <string> //#include <string>
//#include <vector> //#include <vector>
#include <concepts>
//using std::string; //using std::string;
//using std::vector; //using std::vector;
@ -35,19 +36,18 @@ namespace par {
namespace test{ namespace test{
// using lumiera::error::LUMIERA_ERROR_LOGIC; // using lumiera::error::LUMIERA_ERROR_LOGIC;
using std::floating_point;
namespace {//Test fixture.... namespace {//Test fixture....
class Thing template<typename NUM>
{ }; constexpr NUM _MAX = std::numeric_limits<NUM>::max();
template<typename X> template<typename NUM>
struct Some constexpr NUM _MIN = std::numeric_limits<NUM>::lowest();
{
X x;
};
typedef Some<Thing> SomeThing; template<floating_point FLO>
constexpr FLO _EPSILON = std::numeric_limits<FLO>::epsilon();
}//(End)Test fixture }//(End)Test fixture
@ -69,6 +69,7 @@ namespace test{
run (Arg) run (Arg)
{ {
seedRand(); seedRand();
basics(); basics();
verify_valueLimits(); verify_valueLimits();
verify_valueAccess(); verify_valueAccess();
@ -81,37 +82,93 @@ namespace test{
} }
/** @test base operation to bracket a given value
* so that it fits within another target type's value domain.
* @note properly handles the signed vs. unsigned mismatch, so that
* conversion from signed to unsigned can not wrap.
*/
void void
verify_valueLimits() verify_valueLimits()
{ {
SHOW_EXPR(preClamp<int> (23)) // Generic check if the first (target) type can hold
SHOW_EXPR(preClamp<int> (-55)) // only a limited part of the second (source) type's domain
SHOW_EXPR(preClamp<uint> (23)) CHECK ((sub_domain<uint,int> == true));
SHOW_EXPR(preClamp<uint> (-55)) CHECK ((sub_domain<int,uint> == true));
SHOW_EXPR((sub_domain<uint,int>)) CHECK ((sub_domain<short,long> == true));
SHOW_EXPR((sub_domain<int,uint>)) CHECK ((sub_domain<long,short> == false));
SHOW_EXPR((sub_domain<short,long>)) CHECK ((sub_domain<float,double> == true));
SHOW_EXPR((sub_domain<long,short>)) CHECK ((sub_domain<double,float> == false));
SHOW_EXPR(std::numeric_limits<uint>::max())
SHOW_EXPR(std::numeric_limits<int>::max())
SHOW_EXPR(std::numeric_limits<uint>::lowest())
SHOW_EXPR(std::numeric_limits<int>::lowest())
SHOW_EXPR(preClamp<short> (INT64_MAX)) // Limit a value to within a target type's domain
SHOW_EXPR(preClamp<short> (INT64_MIN)) // (without actually converting into the target type)
CHECK (preClamp<int> (23) == 23);
CHECK (preClamp<int> (-55) == -55);
CHECK (preClamp<uint> (23) == 23);
CHECK (preClamp<uint>(-55) == 0);
SHOW_EXPR(preClamp<ushort> (numeric_limits<float>::max())) CHECK (preClamp<short> (_MAX<int64_t>) == 32767);
SHOW_EXPR(preClamp<ushort> (numeric_limits<float>::lowest())) CHECK (preClamp<short> (_MIN<int64_t>) == -32768);
SHOW_EXPR(preClamp<float> (numeric_limits<uint64_t>::max())) CHECK (preClamp<ushort> (_MAX<float>) == 65535);
SHOW_EXPR(preClamp<float> (numeric_limits<double>::lowest())) CHECK (preClamp<ushort> (_MIN<float>) == 0 );
SHOW_EXPR(preClamp<bool> (0.5)); // the return value has the same type as the argument...
SHOW_EXPR(preClamp<bool> (0.5 + numeric_limits<double>::epsilon())) CHECK (preClamp<float> (_MAX<uint64_t>) == _MAX<uint64_t>);
SHOW_EXPR(preClamp<bool> (numeric_limits<double>::min())) CHECK (preClamp<float> (_MIN<double>) == double(_MIN<float>) );
// Warning: the following is not standard C++, yet supported on GCC / CLang / libstdc++
static_assert (_MAX<float> < _MAX<unsigned __int128>);
CHECK (float(_MAX<unsigned __int128>) == "inf"_expect );
CHECK ((unsigned __int128)_MAX<float> == "340282346638528859811704183484516925440"_expect );
CHECK (preClamp<float> (_MAX<unsigned __int128>) == (unsigned __int128)_MAX<float>);
// Note: a trigger at 0.5+ε is built into the clamp towards bool
CHECK (preClamp<bool> (0.5) == 0 );
CHECK (preClamp<bool> (0.5+_EPSILON<double>) == 1 );
CHECK (preClamp<bool> (_MIN<double>) == 0 );
// Systematic coverage of signed ⟷ unsigned
CHECK (preClamp<int8_t> (_MAX<int16_t>) == 127);
CHECK (preClamp<int8_t> ( int16_t{0}) == 0);
CHECK (preClamp<int8_t> (_MIN<int16_t>) == -128);
CHECK (preClamp<int8_t> (_MAX<uint16_t>) == 127);
CHECK (preClamp<int8_t> (_MIN<uint16_t>) == 0);
CHECK (preClamp<uint8_t> (_MAX<int16_t>) == 255);
CHECK (preClamp<uint8_t> ( int16_t{0}) == 0);
CHECK (preClamp<uint8_t> (_MIN<int16_t>) == 0);
CHECK (preClamp<int16_t> (_MAX<int8_t>) == 127);
CHECK (preClamp<int16_t> ( int8_t{0}) == 0);
CHECK (preClamp<int16_t> (_MIN<int8_t>) == -128);
CHECK (preClamp<int16_t> (_MAX<uint8_t>) == 255);
CHECK (preClamp<int16_t> (_MIN<uint8_t>) == 0);
CHECK (preClamp<uint16_t> (_MAX<int8_t>) == 127);
CHECK (preClamp<uint16_t> ( int8_t{0}) == 0);
CHECK (preClamp<uint16_t> (_MIN<int8_t>) == 0);
CHECK (preClamp<int8_t> (_MAX<int8_t>) == 127);
CHECK (preClamp<int8_t> ( int8_t{0}) == 0);
CHECK (preClamp<int8_t> (_MIN<int8_t>) == -128);
CHECK (preClamp<int8_t> (_MAX<uint8_t>) == 127);
CHECK (preClamp<int8_t> (_MIN<uint8_t>) == 0);
CHECK (preClamp<uint8_t> (_MAX<int8_t>) == 127);
CHECK (preClamp<uint8_t> ( int8_t{0}) == 0);
CHECK (preClamp<uint8_t> (_MIN<int8_t>) == 0);
} }
/** @test base function to access the contents of an opaque buffer
* with known type, and convert into another target type.
*/
void void
verify_valueAccess() verify_valueAccess()
{ {
@ -133,6 +190,13 @@ SHOW_EXPR(preClamp<bool> (numeric_limits<double>::min()))
TypeHandler<float>& df1{d1}; TypeHandler<float>& df1{d1};
df1.extractAs (target2, src1); df1.extractAs (target2, src1);
CHECK (target2 == float(val1)); CHECK (target2 == float(val1));
// value clamped to target domain...
val1 = _MIN<int>;
uint64_t target3{55};
TypeHandler<uint64_t>& du64{d1};
du64.extractAs (target3, src1);
CHECK (target3 == _MIN<uint64_t>);
} }
}; };

View file

@ -83122,16 +83122,32 @@
</node> </node>
<node CREATED="1784583716571" ID="ID_38727535" MODIFIED="1784583732840" TEXT="das Conforming mu&#xdf; u.U mehrstufig sein"> <node CREATED="1784583716571" ID="ID_38727535" MODIFIED="1784583732840" TEXT="das Conforming mu&#xdf; u.U mehrstufig sein">
<icon BUILTIN="messagebox_warning"/> <icon BUILTIN="messagebox_warning"/>
<node CREATED="1784583737728" ID="ID_388891052" MODIFIED="1784583753674" TEXT="ein erster Schritt mu&#xdf; in der Quell-Domain erfolgen"> <node COLOR="#435e98" CREATED="1784583737728" ID="ID_388891052" MODIFIED="1784754065176" TEXT="ein erster Schritt mu&#xdf; in der Quell-Domain erfolgen">
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1784593401491" ID="ID_1670494263" MODIFIED="1784593411005" TEXT="Vorsicht Falle: signed vs unsigned"> <icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0c28d" COLOR="#9a075c" CREATED="1784593401491" ID="ID_1670494263" MODIFIED="1784740605113" TEXT="Vorsicht Falle: signed vs unsigned">
<icon BUILTIN="broken-line"/> <icon BUILTIN="broken-line"/>
<node CREATED="1784593415546" ID="ID_985867046" MODIFIED="1784593437214" TEXT="die numeric-Limits werden im jeweiligen Typ angegeben"/> <node CREATED="1784593415546" ID="ID_985867046" MODIFIED="1784593437214" TEXT="die numeric-Limits werden im jeweiligen Typ angegeben"/>
<node CREATED="1784593442299" ID="ID_814649582" MODIFIED="1784593459136" TEXT="bei direkten Vergleichen passiert zwar die erwartete Promotion"/> <node CREATED="1784593442299" ID="ID_814649582" MODIFIED="1784593459136" TEXT="bei direkten Vergleichen passiert zwar die erwartete Promotion"/>
<node COLOR="#5b280f" CREATED="1784593459863" ID="ID_492548018" MODIFIED="1784593634425" TEXT="aber signed vs. unsigned- Werte lassen sich &#xfc;berhaupt nicht ohne Weiteres vergleichen"> <node COLOR="#5b280f" CREATED="1784593459863" ID="ID_492548018" MODIFIED="1784740659183">
<arrowlink COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" STARTARROW="None" STARTINCLINATION="195;6;"/> <richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
aber signed vs. unsigned- Werte lassen sich
</p>
<p>
gar nicht so ohne Weiteres vergleichen
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" STARTARROW="None" STARTINCLINATION="28;3;"/>
<icon BUILTIN="closed"/> <icon BUILTIN="closed"/>
<node CREATED="1784669864149" ID="ID_1893387322" MODIFIED="1784669867944" TEXT="man k&#xf6;nnte...."> <node CREATED="1784669864149" ID="ID_1893387322" MODIFIED="1784669867944" TEXT="man k&#xf6;nnte....">
<node CREATED="1784669870432" ID="ID_111028032" MODIFIED="1784669894580" TEXT="in Einzelf&#xe4;lle aufteilen"> <node COLOR="#5b280f" CREATED="1784669870432" ID="ID_111028032" MODIFIED="1784740683624" TEXT="in Einzelf&#xe4;lle aufteilen">
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1784669944683" ID="ID_739218208" MODIFIED="1784670003838" STYLE="fork" TEXT="Stackoverflow.AI generiert folgende Fallunterscheidung...."> <node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1784669944683" ID="ID_739218208" MODIFIED="1784670003838" STYLE="fork" TEXT="Stackoverflow.AI generiert folgende Fallunterscheidung....">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
@ -83341,13 +83357,12 @@
<font face="Monospaced" size="2">}</font> <font face="Monospaced" size="2">}</font>
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/> <edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="wizard"/> <icon BUILTIN="wizard"/>
</node> </node>
</node> </node>
<node CREATED="1784669896248" ID="ID_406155259" LINK="https://stackoverflow.com/a/53027613/444796" MODIFIED="1784670033706" TEXT="die Vergleichsoperation sicher machen"> <node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1784669896248" ID="ID_406155259" LINK="https://stackoverflow.com/a/53027613/444796" MODIFIED="1784740687444" TEXT="die Vergleichsoperation sicher machen">
<node CREATED="1784670911841" ID="ID_601580251" MODIFIED="1784671009442" TEXT="man kann sicher auf &quot;negativ&quot; testen"> <node CREATED="1784670911841" ID="ID_601580251" MODIFIED="1784671009442" TEXT="man kann sicher auf &quot;negativ&quot; testen">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
@ -83356,8 +83371,7 @@
Unter der Annahme, da&#223; lediglich die signed/unsigned Integers das Problem sind; denn f&#252;r jeden Integer-Typ kann man val &lt; TY(0) bilden Unter der Annahme, da&#223; lediglich die signed/unsigned Integers das Problem sind; denn f&#252;r jeden Integer-Typ kann man val &lt; TY(0) bilden
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<node CREATED="1784671014259" ID="ID_242078970" MODIFIED="1784671026710" TEXT="&#xd83e;&#xdc32; das sollte in util-hpp"/> <node CREATED="1784671014259" ID="ID_242078970" MODIFIED="1784671026710" TEXT="&#xd83e;&#xdc32; das sollte in util-hpp"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784671027530" ID="ID_398950707" MODIFIED="1784671109521" TEXT="oops ... da ist geich daneben ein Bug"> <node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784671027530" ID="ID_398950707" MODIFIED="1784671109521" TEXT="oops ... da ist geich daneben ein Bug">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
@ -83367,8 +83381,7 @@
die Funktion &quot;noneg()&quot; macht den Verlgeich genau falsch herum:&#160; <font color="#a10000">0 &lt; uint(-1) &#10233; true</font> die Funktion &quot;noneg()&quot; macht den Verlgeich genau falsch herum:&#160; <font color="#a10000">0 &lt; uint(-1) &#10233; true</font>
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
<icon BUILTIN="broken-line"/> <icon BUILTIN="broken-line"/>
</node> </node>
</node> </node>
@ -83381,8 +83394,7 @@
hier hilft uns die automatische Promotion in den Typ mit dem h&#246;heren Rank: nur deshalb k&#246;nnen wir die Vergleichsoperation machen. Zudem kann der Verleich im negativen Segment &#252;berhaupt nur stattfinden, wenn beide Typen negativ sind, also mithin signed hier hilft uns die automatische Promotion in den Typ mit dem h&#246;heren Rank: nur deshalb k&#246;nnen wir die Vergleichsoperation machen. Zudem kann der Verleich im negativen Segment &#252;berhaupt nur stattfinden, wenn beide Typen negativ sind, also mithin signed
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node CREATED="1784676822935" ID="ID_148161124" MODIFIED="1784676835365" TEXT="sonst gen&#xfc;gt es, festzustellen, wer auf der negativen Seite steht"/> <node CREATED="1784676822935" ID="ID_148161124" MODIFIED="1784676835365" TEXT="sonst gen&#xfc;gt es, festzustellen, wer auf der negativen Seite steht"/>
</node> </node>
@ -83398,16 +83410,34 @@
</node> </node>
</node> </node>
</node> </node>
<node COLOR="#338800" CREATED="1784740694926" HGAP="116" ID="ID_884664715" MODIFIED="1784753995212" TEXT="Testabdeckung....">
<icon BUILTIN="yes"/>
<node CREATED="1784753603557" ID="ID_673330401" MODIFIED="1784753614651" TEXT="int &#x27f7; uint"/>
<node CREATED="1784753615308" ID="ID_882206102" MODIFIED="1784753629486" TEXT="integer &#x27f7; floating point"/>
<node CREATED="1784753630562" ID="ID_380930919" MODIFIED="1784753657666" TEXT="non-standard type 128-bit integer">
<node CREATED="1784753670316" ID="ID_1012177379" MODIFIED="1784753695781" TEXT="(unterst&#xfc;tzt in GCC und libstdc++ im Gnu-Modus)"/>
<node CREATED="1784753660673" ID="ID_282192889" MODIFIED="1784753664932" TEXT="wird in float gekappt"/>
</node>
<node CREATED="1784753701406" ID="ID_585682892" MODIFIED="1784753725785" TEXT="trigger-Schwelle f&#xfc;r bool bei 0.5+&#x3b5;"/>
<node CREATED="1784753874143" ID="ID_801539454" MODIFIED="1784753893936" TEXT="systematisch alle Domain-Relationen signed &#x27f7; unsigned">
<node CREATED="1784753898316" ID="ID_1214113459" MODIFIED="1784753906114" TEXT="integers von verschiedenem Rank"/>
<node CREATED="1784753908650" ID="ID_350184416" MODIFIED="1784753916276" TEXT="aber auch der gleiche Rank auf beiden Seiten"/>
</node>
<node CREATED="1784753940609" ID="ID_1656941400" MODIFIED="1784753975081" TEXT="Limitieren auch in extracAs&lt;TY&gt;() demonstrieren">
<linktarget COLOR="#4da5bd" DESTINATION="ID_1656941400" ENDARROW="Default" ENDINCLINATION="-128;80;" ID="Arrow_ID_543303907" SOURCE="ID_1748150865" STARTARROW="None" STARTINCLINATION="803;34;"/>
</node> </node>
</node> </node>
</node> </node>
</node> </node>
</node>
<node COLOR="#435e98" CREATED="1784754033268" ID="ID_1076783794" MODIFIED="1784754058137" TEXT="erst danach den limitierten Wert zuweisen oder konvertieren"/>
</node>
<node CREATED="1784583754452" ID="ID_1524391258" MODIFIED="1784583768830" TEXT="dann kann innerhalb der Wert-BaseDomain eine weitere Einschr&#xe4;nkung folgen"/> <node CREATED="1784583754452" ID="ID_1524391258" MODIFIED="1784583768830" TEXT="dann kann innerhalb der Wert-BaseDomain eine weitere Einschr&#xe4;nkung folgen"/>
<node CREATED="1784586543839" ID="ID_1702195769" MODIFIED="1784586550867" TEXT="Teil-Operationen"> <node CREATED="1784586543839" ID="ID_1702195769" MODIFIED="1784586550867" TEXT="Teil-Operationen">
<node CREATED="1784586551999" ID="ID_1288354893" MODIFIED="1784586565918" TEXT="preClamp&lt;TAR&gt; (SRC const&amp;)"> <node CREATED="1784586551999" ID="ID_1288354893" MODIFIED="1784586565918" TEXT="preClamp&lt;TAR&gt; (SRC const&amp;)">
<node CREATED="1784586572069" ID="ID_70379943" MODIFIED="1784586582520" TEXT="l&#xe4;&#xdf;t sich komplett generisch implementieren"/> <node CREATED="1784586572069" ID="ID_70379943" MODIFIED="1784586582520" TEXT="l&#xe4;&#xdf;t sich komplett generisch implementieren"/>
<node CREATED="1784586675600" ID="ID_876196754" MODIFIED="1784588546088" TEXT="concept sub_domain&lt;SUB,BAS&gt;"> <node CREATED="1784586675600" ID="ID_876196754" MODIFIED="1784588546088" TEXT="concept sub_domain&lt;SUB,BAS&gt;">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#a4060f" CREATED="1784593517692" ID="ID_1240698281" MODIFIED="1784593627634" TEXT="mu&#xdf; hier signed &#x2260; unsigned explizit pr&#xfc;fen"> <node BACKGROUND_COLOR="#e0ceaa" COLOR="#a4060f" CREATED="1784593517692" ID="ID_1240698281" MODIFIED="1784740659183" TEXT="mu&#xdf; hier signed &#x2260; unsigned explizit pr&#xfc;fen">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
<body> <body>
@ -83416,7 +83446,7 @@
</p> </p>
</body> </body>
</html></richcontent> </html></richcontent>
<linktarget COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" SOURCE="ID_492548018" STARTARROW="None" STARTINCLINATION="195;6;"/> <linktarget COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" SOURCE="ID_492548018" STARTARROW="None" STARTINCLINATION="28;3;"/>
</node> </node>
</node> </node>
<node COLOR="#338800" CREATED="1784593545688" ID="ID_1890105632" MODIFIED="1784593569629" TEXT="kann au&#xdf;erdem gleich das Trigger-Verhalten f&#xfc;r Booleans implementieren"> <node COLOR="#338800" CREATED="1784593545688" ID="ID_1890105632" MODIFIED="1784593569629" TEXT="kann au&#xdf;erdem gleich das Trigger-Verhalten f&#xfc;r Booleans implementieren">
@ -83433,7 +83463,7 @@
</node> </node>
</node> </node>
<node CREATED="1784588917160" ID="ID_174389664" MODIFIED="1784588970730" TEXT="beide Zuweisungs-Operationen auf Basis des &#xbb;conforming&#xab;- reimplementieren"> <node CREATED="1784588917160" ID="ID_174389664" MODIFIED="1784588970730" TEXT="beide Zuweisungs-Operationen auf Basis des &#xbb;conforming&#xab;- reimplementieren">
<node CREATED="1784589831498" HGAP="30" ID="ID_1748150865" MODIFIED="1784591447465" TEXT="denn auch beim Extrahieren kann eine Limitierung notwendig sein" VSHIFT="-6"> <node CREATED="1784589831498" HGAP="30" ID="ID_1748150865" MODIFIED="1784753983595" TEXT="denn auch beim Extrahieren kann eine Limitierung notwendig sein" VSHIFT="-6">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
<body> <body>
@ -83442,6 +83472,7 @@
</p> </p>
</body> </body>
</html></richcontent> </html></richcontent>
<arrowlink COLOR="#4da5bd" DESTINATION="ID_1656941400" ENDARROW="Default" ENDINCLINATION="-128;80;" ID="Arrow_ID_543303907" STARTARROW="None" STARTINCLINATION="803;34;"/>
<linktarget COLOR="#4490cf" DESTINATION="ID_1748150865" ENDARROW="Default" ENDINCLINATION="-102;-5;" ID="Arrow_ID_1245799800" SOURCE="ID_1119403748" STARTARROW="None" STARTINCLINATION="-15;97;"/> <linktarget COLOR="#4490cf" DESTINATION="ID_1748150865" ENDARROW="Default" ENDINCLINATION="-102;-5;" ID="Arrow_ID_1245799800" SOURCE="ID_1119403748" STARTARROW="None" STARTINCLINATION="-15;97;"/>
</node> </node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#b3020b" CREATED="1784674883894" ID="ID_25505345" MODIFIED="1784674910088" TEXT="viele offene Flanken hier: setzt eigentlich &#xbb;zahlenartige&#xab; Basistypen vorraus"> <node BACKGROUND_COLOR="#e0ceaa" COLOR="#b3020b" CREATED="1784674883894" ID="ID_25505345" MODIFIED="1784674910088" TEXT="viele offene Flanken hier: setzt eigentlich &#xbb;zahlenartige&#xab; Basistypen vorraus">
@ -83510,8 +83541,7 @@
</li> </li>
</ul> </ul>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node CREATED="1784672543927" ID="ID_1055715376" MODIFIED="1784673139404" TEXT="beruhen die BaseDomains eigentlich immer auf einem &#xbb;numerischen&#xab; Parameter?"> <node CREATED="1784672543927" ID="ID_1055715376" MODIFIED="1784673139404" TEXT="beruhen die BaseDomains eigentlich immer auf einem &#xbb;numerischen&#xab; Parameter?">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
@ -83521,8 +83551,7 @@
Im ersten Entwurf habe ich die unterliegenden Typen einfach in eine Typelist gepackt. Die Analyse zeigte ganz klar, da&#223; diese Menge der Basiswerte bereits zur Compile-time festgelegt sein mu&#223;, sonst tun sich ganz ekelhafte Probleme auf mit Registrierung und Locking im Zusammenhang mit dem Laden von dynamischen Objekten (Plug-ins).... Im ersten Entwurf habe ich die unterliegenden Typen einfach in eine Typelist gepackt. Die Analyse zeigte ganz klar, da&#223; diese Menge der Basiswerte bereits zur Compile-time festgelegt sein mu&#223;, sonst tun sich ganz ekelhafte Probleme auf mit Registrierung und Locking im Zusammenhang mit dem Laden von dynamischen Objekten (Plug-ins)....
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node CREATED="1784672259758" ID="ID_1765265570" MODIFIED="1784673727205" TEXT="wie gehen wir mit Produkttypen um (Vektoren, Farben)?"> <node CREATED="1784672259758" ID="ID_1765265570" MODIFIED="1784673727205" TEXT="wie gehen wir mit Produkttypen um (Vektoren, Farben)?">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
@ -83532,8 +83561,7 @@
Ein billiger Ansatz w&#228;re, das Thema zu ignorieren, und solche Parameter einfach als eine Gruppe von Einzelparametern zu behandeln. Das w&#228;re angemessen, wenn man das als Randthema betrachtet. Gegen diesen Ansatz spricht, da&#223; man an einen Farbwert auch eine Kalibrierungskurve und einen Farbraum anh&#228;ngen m&#246;chte, sonst wird Arbeiten mit professionellen Medien-Produktionsprozessen (HDR, Grading, Mastering) praktisch unm&#246;glich. Auch an verschiedene Spielarten von &#187;3D&#171; sollte man denken, incl. virtueller Projektionsr&#228;ume. Ein MIttelweg w&#228;re, da&#223; man Parameter-Tupel unterst&#252;tzt, denen Metadaten angeh&#228;ngt werden Ein billiger Ansatz w&#228;re, das Thema zu ignorieren, und solche Parameter einfach als eine Gruppe von Einzelparametern zu behandeln. Das w&#228;re angemessen, wenn man das als Randthema betrachtet. Gegen diesen Ansatz spricht, da&#223; man an einen Farbwert auch eine Kalibrierungskurve und einen Farbraum anh&#228;ngen m&#246;chte, sonst wird Arbeiten mit professionellen Medien-Produktionsprozessen (HDR, Grading, Mastering) praktisch unm&#246;glich. Auch an verschiedene Spielarten von &#187;3D&#171; sollte man denken, incl. virtueller Projektionsr&#228;ume. Ein MIttelweg w&#228;re, da&#223; man Parameter-Tupel unterst&#252;tzt, denen Metadaten angeh&#228;ngt werden
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node CREATED="1784672899810" ID="ID_116986809" MODIFIED="1784673414049" TEXT="wie steht&apos;s mit der Animation von &#xbb;shape Keys&#xab; und Masken?"> <node CREATED="1784672899810" ID="ID_116986809" MODIFIED="1784673414049" TEXT="wie steht&apos;s mit der Animation von &#xbb;shape Keys&#xab; und Masken?">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
@ -83543,8 +83571,7 @@
....zun&#228;chst einmal sind das Produkttypen, aber mit einer hohen Kardinalit&#228;t. Das Konzept der Shape-Keys reduziert das wieder auf eine Achse, auf der man einen Kontrollparameter animieren kann. Bei Masken besteht das zus&#228;tzliche (in der Praxis sehr relevante) Problem, da&#223; &#187;unterwegs&#171; weitere Maskenpunkte dazukommen k&#246;nnen, und da&#223; einzelne Maskenpunkte noch weitere Parameter tragen k&#246;nnen, wie z.B. eine feather-strength, was extrem wichtig ist f&#252;r Rotoscoping. ....zun&#228;chst einmal sind das Produkttypen, aber mit einer hohen Kardinalit&#228;t. Das Konzept der Shape-Keys reduziert das wieder auf eine Achse, auf der man einen Kontrollparameter animieren kann. Bei Masken besteht das zus&#228;tzliche (in der Praxis sehr relevante) Problem, da&#223; &#187;unterwegs&#171; weitere Maskenpunkte dazukommen k&#246;nnen, und da&#223; einzelne Maskenpunkte noch weitere Parameter tragen k&#246;nnen, wie z.B. eine feather-strength, was extrem wichtig ist f&#252;r Rotoscoping.
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node CREATED="1784673142319" ID="ID_79827229" MODIFIED="1784673414046" TEXT="es k&#xf6;nnte auf zwei Kategorien hinauslaufen: einfach vs komplex"> <node CREATED="1784673142319" ID="ID_79827229" MODIFIED="1784673414046" TEXT="es k&#xf6;nnte auf zwei Kategorien hinauslaufen: einfach vs komplex">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>