On Tue, 24 Aug 2010 11:18:35 -0400, 0ffh
<fr...@youknow.what.todo.internetz> wrote:
Hi, all!
Try this:
---< snip >---
void remove(T)(out T[] array,T element) {
int r=0,w=0;
while (r<array.length) {
if (array[r]!=element)
array[w++]=array[r];
++r;
}
array.length=w;
}
void test() {
int[] array;
int element=2;
//
array=[1,3,2,2,1,3,1,1,2];
writef("direct\n");
writef(" before : ",array,"\n");
int r=0,w=0;
while (r<array.length) {
if (array[r]!=element)
array[w++]=array[r];
++r;
}
array.length=w;
writef(" after : ",array,"\n");
//
array=[1,3,2,2,1,3,1,1,2];
writef("template\n");
writef(" before : ",array,"\n");
remove!(int)(array,element);
writef(" after : ",array,"\n");
}
---< snap >---
I get the following output:
direct
before : [1,3,2,2,1,3,1,1,2]
after : [1,3,1,3,1,1]
template
before : [1,3,2,2,1,3,1,1,2]
after : []
So, my question is: Huh?
s/out/ref
out means "return this argument by reference, but initialize it to its
initial value first" which for arrays means, a null array.
ref means "pass the argument by reference."
Also, btw, you should not need to specifically call the !int version, you
can just do remove(array, element).
-Steve