Weird interaction of design choices: Duration + sum
jmh530
john.michael.hall at gmail.com
Fri Oct 13 20:38:46 UTC 2017
On Friday, 13 October 2017 at 19:28:03 UTC, Steven Schveighoffer
wrote:
>>
>> This wouldn't help, sum is in phobos, Duration in druntime.
>>
>> The answer is that sum shouldn't be too clever. IMO,
>> initializing to 0 should be only done if the type's .init
>> value doesn't match 0. Since only floating points and
>> char/wchar/dchar do this, just do the Seed(0) for those, else
>> use Seed.init.
>
> I take the last part back a bit. Some custom types may default
> to NaN-like values, so Seed(0) is necessary.
>
> What should happen is that sum should test if Seed(0) is
> viable, and if not, use Seed.init.
>
> -Steve
Ah, I see. Something like:
private enum bool canZeroConstruct(R) = is(typeof(R(0)) == R);
auto sum(R)(R r)
if (isInputRange!R && !isInfinite!R && is(typeof(r.front +
r.front)))
{
import std.algorithm : sum;
alias E = Unqual!(ElementType!R);
static if (isFloatingPoint!E)
alias Seed = typeof(E.init + 0.0); //biggest of
double/real
else
alias Seed = typeof(r.front + r.front);
static if (canZeroConstruct!E)
return sum(r, Unqual!Seed(0));
else
return sum(r, Unqual!Seed.init);
}
More information about the Digitalmars-d
mailing list