[Issue 13796] New: A simple "array head const" struct for Phobos
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sat Nov 29 05:25:44 PST 2014
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 at puremagic.com
Reporter: bearophile_hugs at 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
}
--
More information about the Digitalmars-d-bugs
mailing list