avoid making copies of arrays

This commit is contained in:
Ward Wouts 2008-02-12 15:16:53 +00:00
parent 0c2d69676e
commit ec53fdf477

View file

@ -218,10 +218,13 @@ def run_list
print edges.join("/"),"\n" if Debuglevel > 0 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 print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0
lower = edges.delete_at(0) lower = edges[i]
upper = edges.delete_at(0) i += 1
upper = edges[i]
i += 1
print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0 print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0
if !(lower.to_s == '(') and !(upper.to_s == ')') and ((lower+1) == upper) if !(lower.to_s == '(') and !(upper.to_s == ')') and ((lower+1) == upper)
print "#{upper}\n" if Debuglevel > 0 print "#{upper}\n" if Debuglevel > 0
@ -577,20 +580,18 @@ def member?(n)
inSet inSet
end end
# XXX name should end with a '!' def insert!(n)
def insert(n)
inSet = neg_inf? inSet = neg_inf?
edge = @set["edges"]
if (edge.length == 0) if (@set["edges"].length == 0)
@set["edges"] = [n-1, n] @set["edges"] = [n-1, n]
return return
end end
if n > edge[-1]+1 if n > @set["edges"][-1]+1
@set["edges"].push(n-1, n) @set["edges"].push(n-1, n)
return return
elsif n > edge[-1] elsif n > @set["edges"][-1]
@set["edges"][-1] += 1 @set["edges"][-1] += 1
return return
end end
@ -598,19 +599,19 @@ def insert(n)
# XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken # XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken
# XXX this should probably have some recursion to make it faster # XXX this should probably have some recursion to make it faster
l = 0 l = 0
r = edge.length-1 r = @set["edges"].length-1
i = r/2 i = r/2
while true while true
if n < edge[i] && n > edge[i-1] if n < @set["edges"][i] && n > @set["edges"][i-1]
inSet = i.odd? inSet = i.odd?
break break
elsif n < edge[i] && i == 0 elsif n < @set["edges"][i] && i == 0
inSet = false inSet = false
break break
elsif n < edge[i] elsif n < @set["edges"][i]
r = i r = i
i = l + ((r-l)/2) i = l + ((r-l)/2)
elsif n == edge[i] elsif n == @set["edges"][i]
inSet = i.odd? inSet = i.odd?
break break
else else
@ -621,28 +622,22 @@ def insert(n)
inSet and return 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 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 rGap = false if rGap == 0
if ( lGap and rGap) if ( lGap and rGap)
lower = edge[0...i] @set["edges"] = @set["edges"].insert(i, n-1, n)
upper = edge[i...edge.length]
edge = lower
edge.push(n-1, n)
edge.concat(upper)
elsif (not lGap and rGap) elsif (not lGap and rGap)
edge[i-1] += 1 @set["edges"][i-1] += 1
elsif ( lGap and not rGap) elsif ( lGap and not rGap)
edge[i] -= 1 @set["edges"][i] -= 1
else else
edge.delete_at(i-1) @set["edges"].delete_at(i-1)
edge.delete_at(i-1) @set["edges"].delete_at(i-1)
end end
@set["edges"] = edge
end end
def remove!(n) def remove!(n)