From ec53fdf477abdee4cfd40c76f08fd163b6b0e767 Mon Sep 17 00:00:00 2001 From: Ward Wouts Date: Tue, 12 Feb 2008 15:16:53 +0000 Subject: [PATCH] avoid making copies of arrays --- trunk/ripnews/set/intspan.rb | 49 ++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/trunk/ripnews/set/intspan.rb b/trunk/ripnews/set/intspan.rb index d4a2603..b343beb 100644 --- a/trunk/ripnews/set/intspan.rb +++ b/trunk/ripnews/set/intspan.rb @@ -218,10 +218,13 @@ def run_list print edges.join("/"),"\n" if Debuglevel > 0 - while(edges.length>0) + i = 0 + while i < edges.length print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0 - lower = edges.delete_at(0) - upper = edges.delete_at(0) + lower = edges[i] + i += 1 + upper = edges[i] + i += 1 print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0 if !(lower.to_s == '(') and !(upper.to_s == ')') and ((lower+1) == upper) print "#{upper}\n" if Debuglevel > 0 @@ -577,20 +580,18 @@ def member?(n) inSet end -# XXX name should end with a '!' -def insert(n) +def insert!(n) inSet = neg_inf? - edge = @set["edges"] - if (edge.length == 0) + if (@set["edges"].length == 0) @set["edges"] = [n-1, n] return end - if n > edge[-1]+1 + if n > @set["edges"][-1]+1 @set["edges"].push(n-1, n) return - elsif n > edge[-1] + elsif n > @set["edges"][-1] @set["edges"][-1] += 1 return end @@ -598,19 +599,19 @@ def insert(n) # XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken # XXX this should probably have some recursion to make it faster l = 0 - r = edge.length-1 + r = @set["edges"].length-1 i = r/2 while true - if n < edge[i] && n > edge[i-1] + if n < @set["edges"][i] && n > @set["edges"][i-1] inSet = i.odd? break - elsif n < edge[i] && i == 0 + elsif n < @set["edges"][i] && i == 0 inSet = false break - elsif n < edge[i] + elsif n < @set["edges"][i] r = i i = l + ((r-l)/2) - elsif n == edge[i] + elsif n == @set["edges"][i] inSet = i.odd? break else @@ -621,28 +622,22 @@ def insert(n) inSet and return - lGap = i == 0 || n-1 - edge[i-1] + lGap = i == 0 || n-1 - @set["edges"][i-1] lGap = false if lGap == 0 - rGap = i == edge.length-1 ? i : edge[i] - n + rGap = i == @set["edges"].length-1 ? i : @set["edges"][i] - n rGap = false if rGap == 0 if ( lGap and rGap) - lower = edge[0...i] - upper = edge[i...edge.length] - edge = lower - edge.push(n-1, n) - edge.concat(upper) + @set["edges"] = @set["edges"].insert(i, n-1, n) elsif (not lGap and rGap) - edge[i-1] += 1 + @set["edges"][i-1] += 1 elsif ( lGap and not rGap) - edge[i] -= 1 + @set["edges"][i] -= 1 else - edge.delete_at(i-1) - edge.delete_at(i-1) + @set["edges"].delete_at(i-1) + @set["edges"].delete_at(i-1) end - - @set["edges"] = edge end def remove!(n)