fix a lot of subtle bugs
This commit is contained in:
parent
760c879fc4
commit
99dbd942f9
1 changed files with 47 additions and 49 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue