Dynamic array head const in library code?

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Nov 28 05:36:07 PST 2014


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.


More information about the Digitalmars-d-learn mailing list