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: -------

Reply via email to