www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 13796] New: A simple "array head const" struct for Phobos

https://issues.dlang.org/show_bug.cgi?id=13796

          Issue ID: 13796
           Summary: A simple "array head const" struct for Phobos
           Product: D
           Version: D2
          Hardware: x86
                OS: Windows
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: Phobos
          Assignee: nobody puremagic.com
          Reporter: bearophile_hugs eml.cc

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 arrayHeadConst function similar
to this (only for built-in dynamic arrays) that tries to enforce those
constraints?



import std.traits, std.range;

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

ArrayHeadConst!(ElementType!R) arrayHeadConst(R)(R arr)
if (isDynamicArray!R) {
    return typeof(return)(arr);
}

void main() {
    import std.stdio;
    auto arr = new int[2].arrayHeadConst;
    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;
    ArrayHeadConst!int c = arr;
    ArrayHeadConst!int d;
    arr = d; // fail
}

--
Nov 29 2014