util.array: Fix for array:filter() (in-place filtering)
authorMatthew Wild <mwild1@gmail.com>
Mon, 5 Oct 2009 16:56:31 +0000 (17:56 +0100)
committerMatthew Wild <mwild1@gmail.com>
Mon, 5 Oct 2009 16:56:31 +0000 (17:56 +0100)
util/array.lua

index ae3a0b5bdf178f247356e093eef15c512a56f64b..bbf26f3214ae4992beda62004503641df6ca04d4 100644 (file)
@@ -33,11 +33,22 @@ function array_base.map(outa, ina, func)
 end
 
 function array_base.filter(outa, ina, func)
-       for k,v in ipairs(ina) do
+       local inplace, start_length = ina == outa, #ina;
+       local write = 1;
+       for read=1,start_length do
+               local v = ina[read];
                if func(v) then
-                       outa:push(v);
+                       outa[write] = v;
+                       write = write + 1;
+               end
+       end
+       
+       if inplace and write < start_length then
+               for i=write,start_length do
+                       outa[i] = nil;
                end
        end
+       
        return outa;
 end