shared arrray problem

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Nov 20 03:42:56 PST 2016


On 11/20/2016 04:34 AM, Charles Hixson via Digitalmars-d-learn wrote:
> Whether you would call the change "break things for your code" might be
> dubious.  It would be effectively broken, even if technically my code
> was doing the correct thing.  But my code wouldn't be storing the data
> that needed storing, so effectively it would be broken.

I don't see how it's dubious. It's an error by the user. When users are 
given a dynamic array (and not by reference), they cannot expect that 
your code sees changes to length. That's just not how arrays work. When 
a user has that wrong expectation, and writes wrong code because of it, 
then it's arguably their own fault. However, if you want you can hold 
their hand a bit and make the mistake less likely.

> "Write something
> for yourself" is what I'd like to do, given that the language doesn't
> have that built-in support, but I can't see how to do it.

Wrap the array in a struct that has indexing, but doesn't allow setting 
the length or appending. Here's a quick prototype:

----
struct ConstLengthArray(E)
{
     private E[] data;
     this(E[] arr) { this.data = arr; }
     ref inout(E) opIndex(size_t i) inout { return data[i]; }
     @property size_t length() const { return data.length; }
}

void main()
{
     auto cla = ConstLengthArray!ubyte([1, 2, 3, 4, 5]);

     /* Mutating elements is allowed: */
     cla[0] = 10;
     assert(cla[0] == 10);

     /* No setting length, no appending: */
     static assert(!__traits(compiles, cla.length = 3));
     static assert(!__traits(compiles, cla ~= 6));
}
----

You might want to add support for slicing, concatenation, etc. Maybe 
allow implicit conversion to const(E[]), though that would also allow 
conversion to const(E)[] and that has a settable length again.


More information about the Digitalmars-d-learn mailing list