Skip to content

Commit 5b31642

Browse files
authored
Unique may return an AbstractFill (#382)
* Unique may return an AbstractFill * unique for OneElement
1 parent d498a3e commit 5b31642

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

src/FillArrays.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ diff(x::AbstractFillVector{T}) where T = Zeros{T}(length(x)-1)
607607
# unique
608608
#########
609609

610-
unique(x::AbstractFill{T}) where T = isempty(x) ? T[] : T[getindex_value(x)]
610+
unique(x::AbstractFill) = fillsimilar(x, Int(!isempty(x)))
611611
allunique(x::AbstractFill) = length(x) < 2
612612

613613
#########

src/oneelement.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,14 @@ permutedims(o::OneElementMatrix) = OneElement(o.val, reverse(o.ind), reverse(o.a
436436
permutedims(o::OneElementVector) = reshape(o, (1, length(o)))
437437
permutedims(o::OneElement, dims) = OneElement(o.val, _permute(o.ind, dims), _permute(o.axes, dims))
438438

439+
# unique
440+
function unique(O::OneElement)
441+
v = getindex_value(O)
442+
len = iszero(v) ? 1 : min(2, length(O))
443+
OneElement(getindex_value(O), len, len)
444+
end
445+
allunique(O::OneElement) = length(O) <= 1 || (length(O) < 3 && !iszero(getindex_value(O)))
446+
439447
# show
440448
_maybesize(t::Tuple{Base.OneTo{Int}, Vararg{Base.OneTo{Int}}}) = size.(t,1)
441449
_maybesize(t) = t

test/runtests.jl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ end
12451245
@testset "unique" begin
12461246
@test unique(Fill(12, 20)) == unique(fill(12, 20))
12471247
@test unique(Fill(1, 0)) == []
1248-
@test unique(Zeros(0)) isa Vector{Float64}
1248+
@test unique(Zeros(0)) == Zeros(0)
12491249
@test !allunique(Fill("a", 2))
12501250
@test allunique(Ones(0))
12511251
end
@@ -2708,6 +2708,25 @@ end
27082708
@test repr(B) == "OneElement(2, (1, 2), (Base.IdentityUnitRange(1:1), Base.IdentityUnitRange(2:2)))"
27092709
end
27102710

2711+
@testset "unique" begin
2712+
@testset for n in 1:3
2713+
O = OneElement(5, 2, n)
2714+
@test unique(O) == unique(Array(O))
2715+
@test allunique(O) == allunique(Array(O))
2716+
O = OneElement(0, 2, n)
2717+
@test unique(O) == unique(Array(O))
2718+
@test allunique(O) == allunique(Array(O))
2719+
@testset for m in 1:4
2720+
O2 = OneElement(2, (2,1), (m,n))
2721+
@test unique(O2) == unique(Array(O2))
2722+
@test allunique(O2) == allunique(Array(O2))
2723+
O2 = OneElement(0, (2,1), (m,n))
2724+
@test unique(O2) == unique(Array(O2))
2725+
@test allunique(O2) == allunique(Array(O2))
2726+
end
2727+
end
2728+
end
2729+
27112730
@testset "sum" begin
27122731
@testset "OneElement($v, $ind, $sz)" for (v, ind, sz) in (
27132732
(Int8(2), 3, 4),

0 commit comments

Comments
 (0)