fix a lot of subtle bugs

This commit is contained in:
Ward Wouts 2005-03-09 14:22:52 +00:00
parent 760c879fc4
commit 99dbd942f9

View file

@ -1,4 +1,4 @@
# $Dwarf: intspan.rb,v 1.14 2003/07/20 20:32:24 ward Exp $
# $Dwarf: intspan.rb,v 1.15 2004/06/16 08:13:35 ward Exp $
# $Source$
#
@ -21,11 +21,10 @@ module Set
class IntSpan
Empty_String = '-'
Empty_String = ''
Debuglevel = 0
def initialize(setspec=nil)
@set = { "empty_string" => Empty_String }
print "initialize: Calling copy\n" if Debuglevel > 0
copy(setspec)
end
@ -63,7 +62,7 @@ def copy(set_spec)
end
end
def _copy_empty # makes @set the empty set
def _copy_empty # makes @set the empty se
@set = { "negInf" => false }
@set["posInf"] = false
@set["edges"] = []
@ -91,8 +90,8 @@ def _copy_array(array) # copies an array into @set
end
def _copy_set(src) # copies one set to another
@set["negInf"] = src.neg_inf
@set["posInf"] = src.pos_inf
@set["negInf"] = src.neg_inf?
@set["posInf"] = src.pos_inf?
@set["edges"] = src.edges
@set["run"] = []
end
@ -104,7 +103,6 @@ def _copy_run_list(runlist)
runlist.gsub!(/\s|_/, '')
return true if runlist == ""
print "copy run list...\n" if Debuglevel > 0
first = true
@ -137,15 +135,15 @@ def _copy_run_list(runlist)
print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n"
exit
end
@set = {"negInf" => true}
set_neg_inf(true)
edges.push($1.to_i)
next
end
if i =~ /^(-?\d+)-\)$/x
print "match rule 3\n"
# print "match rule 3\n"
edges.push(($1.to_i-1))
@set = {"posInf" => true}
set_pos_inf(true)
last = true
next
end
@ -156,8 +154,8 @@ def _copy_run_list(runlist)
print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n"
exit
end
@set = {"negInf" => true}
@set = {"posInf" => true}
set_neg_inf(true)
set_pos_inf(true)
last = true
next
end
@ -216,9 +214,13 @@ end
# return array
#end
def to_s
return run_list
end
def run_list
if empty
return @set["empty_string"]
if empty?
return Empty_String
end
print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0
@ -227,8 +229,8 @@ def run_list
runs = []
if edges.length > 0
edges = ['(', edges] if @set["negInf"]
edges.push(')') if @set["posInf"]
edges.unshift('(') if neg_inf?
edges.push(')') if pos_inf?
print edges.join("/"),"\n" if Debuglevel > 0
@ -237,10 +239,7 @@ def run_list
lower = edges.delete_at(0)
upper = edges.delete_at(0)
print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0
if ((lower.to_s <=> '(')!=0 and
(upper.to_s <=> ')')!=0 and
((lower+1) == upper))
if !(lower.to_s == '(') and !(upper.to_s == ')') and ((lower+1) == upper)
print "#{upper}\n" if Debuglevel > 0
runs.push("#{upper}")
else
@ -282,14 +281,14 @@ def union(set_spec)
b = _real_set(set_spec)
s = IntSpan.new
s.set_neg_inf(@set["negInf"] || b.neg_inf)
s.set_neg_inf(@set["negInf"] || b.neg_inf?)
eA = @set["edges"]
eB = b.edges
eS = s.edges
inA = @set["negInf"]
inB = b.neg_inf
inB = b.neg_inf?
iA = 0
iB = 0
@ -318,7 +317,7 @@ def union(set_spec)
iA < eA.length and (! inB) and eS.concat(eA[iA..eA.length])
iB < eB.length and (! inA) and eS.concat(eB[iB..eB.length])
s.set_pos_inf(@set["posInf"] || b.pos_inf)
s.set_pos_inf(@set["posInf"] || b.pos_inf?)
s.set_edges(eS)
return s
@ -328,14 +327,14 @@ def intersect(set_spec)
b = _real_set(set_spec)
s = IntSpan.new
s.set_neg_inf(@set["negInf"] && b.neg_inf)
s.set_neg_inf(@set["negInf"] && b.neg_inf?)
eA = @set["edges"]
eB = b.edges
eS = s.edges
inA = @set["negInf"]
inB = b.neg_inf
inB = b.neg_inf?
iA = 0
iB = 0
@ -364,7 +363,7 @@ def intersect(set_spec)
iA < eA.length and inB and eS.concat(eA[iA..eA.length])
iB < eB.length and inA and eS.concat(eB[iB..eB.length])
s.set_neg_inf(@set["posInf"] && b.pos_inf)
s.set_neg_inf(@set["posInf"] && b.pos_inf?)
s.set_edges(eS)
return s
end
@ -373,14 +372,14 @@ def diff (set_spec)
b = _real_set(set_spec)
s = IntSpan.new
s.set_neg_inf(@set["negInf"] && ! b.neg_inf)
s.set_neg_inf(@set["negInf"] && ! b.neg_inf?)
eA = @set["edges"]
eB = b.edges
eS = s.edges
inA = @set["negInf"]
inB = b.neg_inf
inB = b.neg_inf?
iA = 0
iB = 0
@ -411,7 +410,7 @@ def diff (set_spec)
s.set_edges(eS)
s.set_pos_inf(@set["posInf"] && ! b.pos_inf)
s.set_pos_inf(@set["posInf"] && ! b.pos_inf?)
return s
end
@ -419,7 +418,7 @@ def xor(set_spec)
b = _real_set(set_spec)
s = IntSpan.new
s.set_neg_inf(@set["negInf"] ^ b.neg_inf)
s.set_neg_inf(@set["negInf"] ^ b.neg_inf?)
eA = @set["edges"]
eB = b.edges
@ -447,7 +446,7 @@ def xor(set_spec)
iA < eA.length and eS.concat(eA[iA..eA.length])
iB < eB.length and eS.concat(eB[iB..eB.length])
s.set_pos_inf(@set["posInf"] ^ b.pos_inf)
s.set_pos_inf(@set["posInf"] ^ b.pos_inf?)
s.set_edges(eS)
return s
end
@ -471,8 +470,8 @@ def complement
end
end
comp.set_neg_inf(! comp.neg_inf)
comp.set_pos_inf(! comp.pos_inf)
comp.set_neg_inf(! comp.neg_inf?)
comp.set_pos_inf(! comp.pos_inf?)
return comp
end
@ -482,7 +481,7 @@ def superset(set_spec)
# $b->diff($a)->empty
s = b.diff(self)
return s.empty
return s.empty?
end
@ -491,7 +490,7 @@ def subset(set_spec)
# $a->diff($b)->empty
s = diff(b)
return s.empty
return s.empty?
end
@ -499,9 +498,9 @@ def equal(set_spec)
b = _real_set(set_spec)
print "a\n"
@set["negInf"] == b.neg_inf or return false
@set["negInf"] == b.neg_inf? or return false
print "b\n"
@set["posInf"] == b.pos_inf or return false
@set["posInf"] == b.pos_inf? or return false
aEdge = @set["edges"]
bEdge = b.edges
@ -539,9 +538,8 @@ def cardinality
return car
end
def empty
if @set["negInf"] == false and @set["edges"].length > 0 and
@set["posInf"] == false
def empty?
if neg_inf? || pos_inf? || @set["edges"].length > 0
return false
end
return true
@ -562,7 +560,7 @@ def set_edges(edges)
@set["edges"] = edges
end
def neg_inf
def neg_inf?
return @set["negInf"]
end
@ -570,7 +568,7 @@ def set_neg_inf(negInf)
@set["negInf"] = negInf
end
def pos_inf
def pos_inf?
return @set["posInf"]
end
@ -702,15 +700,15 @@ def remove(n)
end
def min
empty and return nil
neg_inf and return nil
empty? and return nil
neg_inf? and return nil
@set["edges"][0]+1
end
def max
empty and return nil
pos_inf and return nil
empty? and return nil
pos_inf? and return nil
@set["edges"][-1]
end
@ -907,10 +905,10 @@ end # module
# [x] equal
# [x] equivalent
# [x] cardinality
# [x] empty
# [x] empty?
# [x] finite
# [x] neg_inf { shift->{negInf} }
# [x] pos_inf { shift->{posInf} }
# [x] neg_inf? { shift->{negInf} }
# [x] pos_inf? { shift->{posInf} }
# [x] infinite
# [ ] universal
# [x] member