diff --git a/trunk/ripnews/set/intspan.rb b/trunk/ripnews/set/intspan.rb index a947784..e8c3485 100644 --- a/trunk/ripnews/set/intspan.rb +++ b/trunk/ripnews/set/intspan.rb @@ -1,4 +1,4 @@ -# $Dwarf: intspan.rb,v 1.16 2005/03/09 14:22:52 ward Exp $ +# $Dwarf: intspan.rb,v 1.17 2005/03/09 15:02:21 ward Exp $ # $Source$ # @@ -17,6 +17,16 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # +class Integer + def even? + return self%2 == 0 + end + + def odd? + return self%2 == 1 + end +end + module Set class IntSpan @@ -258,7 +268,7 @@ def run_list end def elements - if (neg_inf? or pos_inf?) + if infinite? print "Set::IntSpan::elements: infinite set\n" exit end @@ -547,13 +557,6 @@ def empty? return true end -def finite - if ! neg_inf? and ! pos_inf? - return true - end - return false -end - def edges return @set["edges"] end @@ -578,8 +581,12 @@ def set_pos_inf(posInf) @set["posInf"] = posInf end -def infinite - return neg_inf? || pos_inf? +def finite? + return (! neg_inf? and ! pos_inf?) +end + +def infinite? + return ! finite? end def universal @@ -620,16 +627,45 @@ def insert(n) return end - for i in (0...edge.length) - if (inSet) - n <= edge[i] and return +# XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken + l = 0 + r = edge.length-1 + i = r/2 +#p "edge #{edge}" +#p "n #{n}" + while true +# p "i #{i}" +# p "edge[i] #{edge[i]}" + if n < edge[i] && n > edge[i-1] + inSet = i.odd? + break + elsif n < edge[i] && i == 0 inSet = false +# p "break 1" + break + elsif n < edge[i] + r = i + i = l + ((r-l)/2) + elsif n == edge[i] +# p "break 1" + inSet = i.odd? + break else - n <= edge[i] and break - inSet = true + l = i + i = l + ((r-l)/2) end end + #for i in (0...edge.length) + # if (inSet) + # n <= edge[i] and return + # inSet = false + # else + # n <= edge[i] and break + # inSet = true + # end + #end + inSet and return lGap = i == 0 || n-1 - edge[i-1] @@ -656,7 +692,7 @@ def insert(n) @set["edges"] = edge end -def remove(n) +def remove!(n) n or return inSet = neg_inf? @@ -699,6 +735,7 @@ def remove(n) end @set["edges"] = edge + return self end def min