[Issue 4725] std.algorithm.sum()
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun May 15 07:57:42 PDT 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4725
--- Comment #6 from bearophile_hugs at eml.cc 2011-05-15 07:53:34 PDT ---
A first slow and not much tested implementation:
import std.stdio, std.traits, std.range;
template IsSummable(T) {
enum bool IsSummable = __traits(compiles, {return T.init + T.init;});
}
auto sum(R, T)(R items, T start) if (IsSummable!T) {
foreach (item; items)
start += item;
return start;
}
auto sum(R)(R items) if (IsSummable!(ForeachType!R)) {
alias ForeachType!R T;
static if (is(T == cfloat) || is(T == cdouble) || is(T == creal))
T result = 0+0i;
else static if (is(T == bool))
int result;
else static if (isSomeChar!T)
uint result;
else
T result = 0;
foreach (item; items)
result += item;
return result;
}
void main() {
//assert(sum([]) == 0);
assert(sum(new int[0]) == 0);
assert(sum([1, 2, 3]) == 6);
assert(sum([1.5L, 2.5L, 3.5L]) == 7.5L);
assert(sum(iota(0)) == 0);
assert(sum(iota(10)) == 45);
assert(sum(iota(10)) == 45);
assert(sum([true, false, true]) == 2);
assert(sum([1+0i, 2+1i]) == 3+1i);
ubyte[] a1 = [100, 200];
assert(sum(a1, 0) == 300);
assert(sum(a1) == 44); // overflow!
assert(sum("hello") == 532);
assert(sum([1:10, 2:20]) == 30);
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list