Skip to content

Commit

Permalink
equalto is now just isequal (JuliaLang/julia#26436)
Browse files Browse the repository at this point in the history
Still waiting on Compat support for this to work on julia 0.6 as well.
  • Loading branch information
garrison committed Mar 16, 2018
1 parent 06ef1b3 commit 5656c45
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 61 deletions.
40 changes: 21 additions & 19 deletions src/UniqueVectors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ include("delegate.jl")

import Base: copy, in, getindex, findfirst, findlast, length, size, isempty, start, done, next, empty!, push!, pop!, setindex!, indexin, findin, findnext, findprev, find, count

import Base: EqualTo

abstract type AbstractUniqueVector{T} <: AbstractVector{T} end

Base.@deprecate_binding UniqueVectorError ArgumentError
Expand Down Expand Up @@ -49,10 +51,10 @@ end
in(item::T, uv::UniqueVector{T}) where {T} = haskey(uv.lookup, item)
in(item, uv::UniqueVector{T}) where {T} = in(convert(T, item), uv)

findfirst(p::equalto{<:T}, uv::UniqueVector{T}) where {T} =
findfirst(p::EqualTo{<:T}, uv::UniqueVector{T}) where {T} =
get(uv.lookup, p.x, 0)

function findfirst!(p::equalto{<:T}, uv::UniqueVector{T}) where {T}
function findfirst!(p::EqualTo{<:T}, uv::UniqueVector{T}) where {T}
rv = get!(uv.lookup, p.x) do
# NOTE: does not provide any exception safety guarantee
push!(uv.items, p.x)
Expand All @@ -62,51 +64,51 @@ function findfirst!(p::equalto{<:T}, uv::UniqueVector{T}) where {T}
return rv
end

findfirst(p::equalto, uv::UniqueVector{T}) where {T} =
findfirst(equalto(convert(T, p.x)), uv)
findfirst(p::EqualTo, uv::UniqueVector{T}) where {T} =
findfirst(isequal(convert(T, p.x)), uv)

findfirst!(p::equalto, uv::UniqueVector{T}) where {T} =
findfirst!(equalto(convert(T, p.x)), uv)
findfirst!(p::EqualTo, uv::UniqueVector{T}) where {T} =
findfirst!(isequal(convert(T, p.x)), uv)

findlast(p::equalto, uv::AbstractUniqueVector) =
findlast(p::EqualTo, uv::AbstractUniqueVector) =
findfirst(p, uv)

if VERSION >= v"0.7.0-DEV"
@deprecate findfirst(uv::UniqueVector, item) findfirst(equalto(item), uv)
@deprecate findfirst!(uv::UniqueVector, item) findfirst!(equalto(item), uv)
@deprecate findfirst(uv::UniqueVector, item) findfirst(isequal(item), uv)
@deprecate findfirst!(uv::UniqueVector, item) findfirst!(isequal(item), uv)
else
findfirst(uv::UniqueVector, item) = findfirst(equalto(item), uv)
findfirst!(uv::UniqueVector, item) = findfirst!(equalto(item), uv)
findfirst(uv::UniqueVector, item) = findfirst(isequal(item), uv)
findfirst!(uv::UniqueVector, item) = findfirst!(isequal(item), uv)
end

@deprecate findlast(uv::UniqueVector, item) findlast(equalto(item), uv)
@deprecate findlast(uv::UniqueVector, item) findlast(isequal(item), uv)

indexin(a::AbstractArray, b::AbstractUniqueVector) =
[findlast(equalto(elt), b) for elt in a]
[findlast(isequal(elt), b) for elt in a]

findin(a, b::AbstractUniqueVector) =
[i for (i, ai) in enumerate(a) if ai b]

function findnext(p::equalto, A::AbstractUniqueVector, i::Integer)
function findnext(p::EqualTo, A::AbstractUniqueVector, i::Integer)
idx = findfirst(p, A)
idx >= i ? idx : 0
end

@deprecate findnext(A::UniqueVector, v, i::Integer) findnext(equalto(v), A, i)
@deprecate findnext(A::UniqueVector, v, i::Integer) findnext(isequal(v), A, i)

function findprev(p::equalto, A::AbstractUniqueVector, i::Integer)
function findprev(p::EqualTo, A::AbstractUniqueVector, i::Integer)
idx = findfirst(p, A)
idx <= i ? idx : 0
end

@deprecate findprev(A::UniqueVector, v, i::Integer) findprev(equalto(v), A, i)
@deprecate findprev(A::UniqueVector, v, i::Integer) findprev(isequal(v), A, i)

function find(p::equalto, uv::AbstractUniqueVector)
function find(p::EqualTo, uv::AbstractUniqueVector)
idx = findfirst(p, uv)
(idx == 0) ? Int[] : Int[idx]
end

count(p::equalto, uv::AbstractUniqueVector) =
count(p::EqualTo, uv::AbstractUniqueVector) =
Int(p.x uv)

function push!(uv::UniqueVector{T}, item::T) where {T}
Expand Down
84 changes: 42 additions & 42 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,23 @@ uv = UniqueVector{String}()

@test isempty(uv)
@test_throws ArgumentError pop!(uv)
@test findfirst(equalto("cat"), uv) == 0
@test findfirst!(equalto("cat"), uv) == 1
@test findfirst(isequal("cat"), uv) == 0
@test findfirst!(isequal("cat"), uv) == 1
@test !isempty(uv)
@test "cat" in uv
@test "dog" uv
@test count(equalto("cat"), uv) == 1
@test count(equalto("dog"), uv) == 0
@test find(equalto("cat"), uv) == [1]
@test find(equalto("dog"), uv) == Int[]
@test findfirst!(equalto("dog"), uv) == 2
@test findfirst!(equalto("cat"), uv) == 1
@test findfirst!(equalto("mouse"), uv) == 3
@test findfirst!(equalto("dog"), uv) == 2
@test findfirst(equalto("cat"), uv) == 1
@test findlast(equalto("cat"), uv) == 1
@test findfirst(equalto("dog"), uv) == 2
@test findfirst(equalto("mouse"), uv) == 3
@test count(isequal("cat"), uv) == 1
@test count(isequal("dog"), uv) == 0
@test find(isequal("cat"), uv) == [1]
@test find(isequal("dog"), uv) == Int[]
@test findfirst!(isequal("dog"), uv) == 2
@test findfirst!(isequal("cat"), uv) == 1
@test findfirst!(isequal("mouse"), uv) == 3
@test findfirst!(isequal("dog"), uv) == 2
@test findfirst(isequal("cat"), uv) == 1
@test findlast(isequal("cat"), uv) == 1
@test findfirst(isequal("dog"), uv) == 2
@test findfirst(isequal("mouse"), uv) == 3
@test uv[1] == "cat"
@test uv[2] == "dog"
@test uv[3] == "mouse"
Expand All @@ -36,8 +36,8 @@ uv = UniqueVector{String}()
@test endof(uv) == 3

uv2 = UniqueVector([1, 2, 3])
@test findfirst(equalto(0x02), uv2) == 2
@test findfirst!(equalto(0x02), uv2) == 2
@test findfirst(isequal(0x02), uv2) == 2
@test findfirst!(isequal(0x02), uv2) == 2
@test uv2 == UniqueVector(i for i in 1:3)
for elt in [3,2,1]
@test pop!(uv2) == elt
Expand All @@ -49,19 +49,19 @@ uv2 = copy(uv)

@test empty!(uv) === uv
@test isempty(uv)
@test findfirst(equalto("cat"), uv) == 0
@test findfirst!(equalto("horse"), uv) == 1
@test findfirst(isequal("cat"), uv) == 0
@test findfirst!(isequal("horse"), uv) == 1
@test_throws ArgumentError push!(uv, "horse")
@test length(uv) == 1
@test push!(uv, "human") === uv
@test findfirst(equalto("human"), uv) == 2
@test findfirst(isequal("human"), uv) == 2
@test pop!(uv) == "human"
@test length(uv) == 1
@test uv[:] == ["horse"]
@test findfirst(equalto("human"), uv) == 0
@test findfirst(isequal("human"), uv) == 0

@test uv2[:] == ["cat", "dog", "mouse"]
@test findfirst(equalto("cat"), uv2) == 1
@test findfirst(isequal("cat"), uv2) == 1

let uv = UniqueVector(["cat", "dog", "mouse", "human"]), original = copy(uv)

Expand All @@ -72,24 +72,24 @@ let uv = UniqueVector(["cat", "dog", "mouse", "human"]), original = copy(uv)

swap!(uv, 2, 3)

@test findfirst(equalto("mouse"), uv) == 2
@test findfirst(equalto("mouse"), original) == 3
@test findfirst(isequal("mouse"), uv) == 2
@test findfirst(isequal("mouse"), original) == 3

@test findfirst(equalto("dog"), uv) == 3
@test findfirst(equalto("dog"), original) == 2
@test findfirst(isequal("dog"), uv) == 3
@test findfirst(isequal("dog"), original) == 2
end

@test UniqueVector([1,2,3,4]) == UniqueVector(1:4)

# Test it works with `Any` datatype
let uv3 = UniqueVector([1,"cat",2,"dog"])
@test eltype(uv3) == Any
@test findfirst(equalto(1), uv3) == 1
@test findlast(equalto(1), uv3) == 1
@test find(equalto(1), uv3) == [1]
@test count(equalto(1), uv3) == 1
@test findfirst!(equalto("dog"), uv3) == 4
@test findfirst!(equalto("horse"), uv3) == 5
@test findfirst(isequal(1), uv3) == 1
@test findlast(isequal(1), uv3) == 1
@test find(isequal(1), uv3) == [1]
@test count(isequal(1), uv3) == 1
@test findfirst!(isequal("dog"), uv3) == 4
@test findfirst!(isequal("horse"), uv3) == 5
end

# Test setindex!
Expand All @@ -110,20 +110,20 @@ push!(uv5, 3)
uv5[1] = 4
@test uv5[:] == [4.0]
@test 4 uv5
@test findfirst(equalto(4), uv5) == 1
@test findlast(equalto(4), uv5) == 1
@test find(equalto(4), uv5) == [1]
@test findfirst(isequal(4), uv5) == 1
@test findlast(isequal(4), uv5) == 1
@test find(isequal(4), uv5) == [1]

# Test indexin and findin
@test indexin([1,2,34,0,5,56], UniqueVector([34,56,35,1,5,0])) == [4,0,1,6,5,2]
@test findin([1,2,34,0,5,56], UniqueVector([34,56,35,1,5,0])) == [1,3,4,5,6]

# Test findnext and findprev
@test findnext(equalto(7), UniqueVector([3,5,7,9]), 1) == 3
@test findnext(equalto(7), UniqueVector([3,5,7,9]), 2) == 3
@test findnext(equalto(7), UniqueVector([3,5,7,9]), 3) == 3
@test findnext(equalto(7), UniqueVector([3,5,7,9]), 4) == 0
@test findprev(equalto(7), UniqueVector([3,5,7,9]), 1) == 0
@test findprev(equalto(7), UniqueVector([3,5,7,9]), 2) == 0
@test findprev(equalto(7), UniqueVector([3,5,7,9]), 3) == 3
@test findprev(equalto(7), UniqueVector([3,5,7,9]), 4) == 3
@test findnext(isequal(7), UniqueVector([3,5,7,9]), 1) == 3
@test findnext(isequal(7), UniqueVector([3,5,7,9]), 2) == 3
@test findnext(isequal(7), UniqueVector([3,5,7,9]), 3) == 3
@test findnext(isequal(7), UniqueVector([3,5,7,9]), 4) == 0
@test findprev(isequal(7), UniqueVector([3,5,7,9]), 1) == 0
@test findprev(isequal(7), UniqueVector([3,5,7,9]), 2) == 0
@test findprev(isequal(7), UniqueVector([3,5,7,9]), 3) == 3
@test findprev(isequal(7), UniqueVector([3,5,7,9]), 4) == 3

0 comments on commit 5656c45

Please sign in to comment.