http://d.puremagic.com/issues/show_bug.cgi?id=4725
--- Comment #6 from bearophile_h...@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: -------