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

Reply via email to