From 489dde36d8bebce92cd8d1dd19507cc1f774840b Mon Sep 17 00:00:00 2001 From: Matt Bauman Date: Tue, 21 Jul 2015 19:15:36 -0400 Subject: [PATCH] Deprecate storing 0 in IntSets This paves the way towards better IndexSet semantics. --- base/intset.jl | 29 ++++++++++++++++++++--------- test/intset.jl | 10 +++++----- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/base/intset.jl b/base/intset.jl index 5a5f4e3f67e03..a251913406f8e 100644 --- a/base/intset.jl +++ b/base/intset.jl @@ -55,8 +55,12 @@ function push!(s::IntSet, n::Integer) lim = Int(n + div(n,2)) sizehint!(s, lim) end - elseif n < 0 - throw(ArgumentError("IntSet elements cannot be negative")) + elseif n <= 0 + if n < 0 + throw(ArgumentError("IntSet elements cannot be negative")) + else + depwarn("storing zero in IntSets is deprecated", :push!) + end end s.bits[n>>5 + 1] |= (UInt32(1)<<(n&31)) return s @@ -78,8 +82,12 @@ function pop!(s::IntSet, n::Integer, deflt) return deflt end end - if n < 0 - return deflt + if n <= 0 + if n < 0 + return deflt + else + depwarn("stored zeros in IntSet is deprecated", :pop!) + end end mask = UInt32(1)<<(n&31) idx = n>>5 + 1 @@ -147,12 +155,15 @@ function in(n::Integer, s::IntSet) if n >= s.limit # max IntSet length is typemax(Int), so highest possible element is # typemax(Int)-1 - s.fill1s && n >= 0 && n < typemax(Int) - elseif n < 0 - return false - else - (s.bits[n>>5 + 1] & (UInt32(1)<<(n&31))) != 0 + return s.fill1s && n >= 0 && n < typemax(Int) + elseif n <= 0 + if n < 0 + return false + else + depwarn("stored zeros in IntSet is deprecated", :in) + end end + (s.bits[n>>5 + 1] & (UInt32(1)<<(n&31))) != 0 end start(s::IntSet) = Int64(0) diff --git a/test/intset.jl b/test/intset.jl index 7653c8e88cb54..4564582e6821c 100644 --- a/test/intset.jl +++ b/test/intset.jl @@ -21,16 +21,16 @@ data_out = collect(s) @test sprint(show, IntSet([1,2,3])) == "IntSet([1, 2, 3])" -s = IntSet([0,1,10,20,200,300,1000,10000,10002]) +s = IntSet([1,2,10,20,200,300,1000,10000,10002]) @test last(s) == 10002 -@test first(s) == 0 +@test first(s) == 1 @test length(s) == 9 @test pop!(s) == 10002 @test_throws KeyError pop!(s, -1) @test length(s) == 8 -@test shift!(s) == 0 +@test shift!(s) == 1 @test length(s) == 7 -@test !in(0,s) +@test !in(1,s) @test !in(10002,s) @test in(10000,s) @test_throws ArgumentError first(IntSet()) @@ -53,7 +53,7 @@ s = IntSet(255) # issue #7851 @test_throws ArgumentError IntSet(-1) -@test !(-1 in IntSet(0:10)) +@test !(-1 in IntSet(1:10)) # # issue #8570 # This requires 2^29 bytes of storage, which is too much for a simple test