You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Since we have the pattern of returning float.nan from opCmp to signal incomparable values, it makes sense to have a trait to identify this behavior. Something like this:
template hasNanComparison(T1, T2 = T1)
{
static if (isFloatingPoint!T1)
enum hasNanComparison = true;
else static if (!isAggregateType!T1)
enum hasNanComparison = false;
else static if (!is(typeof((T1 a, T2 b) => a.opCmp(b))))
enum hasNanComparison = false;
else
enum hasNanComparison = hasNanComparison!(ReturnType!((T1 a, T2 b) => a.opCmp(b)));
}
///
@safe unittest
{
assert( hasNanComparison!float);
assert( hasNanComparison!real);
assert(!hasNanComparison!int);
assert(!hasNanComparison!string);
assert(!hasNanComparison!(int*));
assert(!hasNanComparison!(int[]));
struct S{ float opCmp(S s) { return float.nan; }}assert( hasNanComparison!S);struct S2{ S opCmp(S2 s) { return S(); }}assert( hasNanComparison!S2);
}
The text was updated successfully, but these errors were encountered:
simen.kjaras reported this on 2020-01-03T20:53:53Z
Transfered from https://issues.dlang.org/show_bug.cgi?id=20478
Description
Since we have the pattern of returning float.nan from opCmp to signal incomparable values, it makes sense to have a trait to identify this behavior. Something like this: template hasNanComparison(T1, T2 = T1) { static if (isFloatingPoint!T1) enum hasNanComparison = true; else static if (!isAggregateType!T1) enum hasNanComparison = false; else static if (!is(typeof((T1 a, T2 b) => a.opCmp(b)))) enum hasNanComparison = false; else enum hasNanComparison = hasNanComparison!(ReturnType!((T1 a, T2 b) => a.opCmp(b))); } /// @safe unittest { assert( hasNanComparison!float); assert( hasNanComparison!real); assert(!hasNanComparison!int); assert(!hasNanComparison!string); assert(!hasNanComparison!(int*)); assert(!hasNanComparison!(int[])); struct S { float opCmp(S s) { return float.nan; } } assert( hasNanComparison!S); struct S2 { S opCmp(S2 s) { return S(); } } assert( hasNanComparison!S2); }The text was updated successfully, but these errors were encountered: