Array Operations: a[] + b[] etc.
Era Scarecrow
rtcvb32 at yahoo.com
Fri Nov 23 05:15:14 PST 2012
On Wednesday, 21 November 2012 at 18:15:51 UTC, Walter Bright
wrote:
> On 11/21/2012 10:02 AM, John Colvin wrote:
>> My vision of how things could work:
>> c = a[] opBinary b[];
>> should be legal. It should create a new array that is then
>> reference assigned to c.
>
> This is not done because it puts excessive pressure on the
> garbage collector. Array ops do not allocate memory by design.
But if they wanted it anyways, could implement it as a struct...
Here's a rough build... Should be fairly obvious what's happening.
struct AllocatingVectorArray(T) {
T[] data;
alias data this;
alias AllocatingVectorArray AVA;
//forces slice operations for vector format only
static struct AVASlice {
T[] data;
alias data this;
this(T[] rhs) {
data = rhs;
}
AVA opBinary(string op)(const AVASlice rhs) {
assert(rhs.length == data.length, "Lengths don't match,
cannot use vector operations");
AVA var; var.data = data.dup;
mixin("var[] " ~ op ~ "= rhs[];");
return var;
}
}
this(T[] rhs) {
data = rhs;
}
ref AVA opAssign(T[] rhs) {
data = rhs;
return this;
}
AVASlice opSlice() {
return AVASlice(this);
}
}
unittest {
alias AllocatingVectorArray!int AVAint;
AVAint a = [1,2,3,4];
AVAint b = [5,6,7,8];
AVAint c;
// c = a + b; //not allowed, 'not implemented error'
// assert(c == [6,8,10,12]);
c = a[] + b[]; //known vector syntax
assert(c == [6,8,10,12]);
c[] = a[] + b[]; //more obvious what's happening
assert(c == [6,8,10,12]);
}
More information about the Digitalmars-d
mailing list