Sparsh Mittal:

So, is there a way, an array can be made immutable and still initialized? Thanks a lot for your time.

There are various ways to do it. One of the safest way to do it is to create a mutable array inside a strongly pure function, and then when you return it assign it to immutable:


import std.stdio, std.datetime, std.range;

double myAbs(in double n) pure nothrow {
    return n > 0 ? n : -n;
}

enum long DIM = 1024L * 1024L * 128L;

double[] genSignal() pure nothrow {
    auto signal = new double[DIM + 1];

    foreach (immutable i; 0 .. DIM + 1) {
        signal[i] = (i + DIM) % 7 + (i + DIM + 1) % 5;
    }

    return signal;
}

void main() {
    immutable signal = genSignal();

    double sample[2] = [4.1, 7.2];

    StopWatch sw;
    sw.start;
    foreach (immutable i; 0 .. DIM) {
        double temp = myAbs(sample[0] - signal[i]) +
                      myAbs(sample[1] - signal[i + 1]);
    }
    sw.stop;

    writeln(" Total time: ", sw.peek.msecs / 1000, "[sec]");
}



A less safe way to do it is to use assumeUnique from Phobos.

Bye,
bearophile

Reply via email to