On Wednesday, 18 September 2013 at 20:46:21 UTC, Namespace wrote:
D's Array length is currently of type size_t, which means on 32 bit it's an uint and on 64 bit an ulong. This is difficult: What if I want to give the length of an array as parameter to some C functions which accepts only an int? What is the right/safe way to do this? A cast? Or is there something better?
I like to avoid cast's if they aren't necessary.

Perfectly safe way is to do run-time range check followed by a cast. Maybe using a wrapper:

auto shrinkTo(Target, Source)(Source source)
if (is(Target : Source)) // is implicitly convertable other way around
{
    assert(source <= Target.max);
    static if (is(typeof(Taget.min)))
        assert(source >= Target.min);
    return cast(Target)source;
}

void main()
{
        import std.stdio;
        long a = 50;
        long b = int.max; b++;
        writeln(shrinkTo!int(a));
        writeln(shrinkTo!int(b));
}

Reply via email to