On Friday, 28 November 2014 at 10:55:27 UTC, bearophile wrote:
In D code it's a good idea to set as const/immutable (where possible) all variables that don't need to change, for both safety and compiler-enforced code documentation. In my D functions sometimes I create dynamic arrays that later don't have to change length nor to be reassigned, but I have to mutate or assign their items. So their length and ptr can be const/immutable, unlike the array contents. The D type system doesn't allow this. So is it a good idea to try to add to Phobos a headConst function similar to this (only for built-in dynamic arrays) that tries to enforce those constraints?



import std.traits, std.range;

struct HeadConst(T) {
    T[] data;
    alias data this;
    @property size_t length() const pure nothrow @safe @nogc {
        return data.length;
    }
    @disable void opAssign();
}

HeadConst!(ElementType!R) headConst(R)(R arr)
if (isDynamicArray!R) {
    return typeof(return)(arr);
}

void main() {
    import std.stdio;
    auto arr = new int[2].headConst;
    arr[1] = 10;
    arr[1].writeln;
    arr.length.writeln;
    //arr.length = arr.length + 1; // error
    auto b = new int[2];
    //arr = b; // error
    arr[] = b[];
    b = arr;
    arr[] = 1;
    HeadConst!int c = arr;
    HeadConst!int d;
    arr = d; // fail
}

Bye,
bearophile

I wouldn't call it HeadConst, as that is a very general term.

A common situation for me is where I know the length at compile-time, I want to make use of that knowledge (either in a template somewhere or in hope of a compiler optimisation) but I don't want the memory on the stack. That doesn't necessarily mean I don't want to change the pointer though.

There's quite a lot of different possibilities that are useful, a small set of utilities to help manage them would be great.

Reply via email to