Skip to content

Commit 7385876

Browse files
committed
Fix equality for one-element ranges
1 parent 7c980c6 commit 7385876

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

base/range.jl

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -741,14 +741,29 @@ show(io::IO, r::AbstractRange) = print(io, repr(first(r)), ':', repr(step(r)), '
741741
show(io::IO, r::UnitRange) = print(io, repr(first(r)), ':', repr(last(r)))
742742
show(io::IO, r::OneTo) = print(io, "Base.OneTo(", r.stop, ")")
743743

744-
==(r::T, s::T) where {T<:AbstractRange} =
745-
(isempty(r) & isempty(s)) | ((first(r) == first(s)) & (step(r) == step(s)) & (last(r) == last(s)))
746-
==(r::OrdinalRange, s::OrdinalRange) =
747-
(isempty(r) & isempty(s)) | ((first(r) == first(s)) & (step(r) == step(s)) & (last(r) == last(s)))
744+
function ==(r::T, s::T) where {T<:AbstractRange}
745+
isempty(r) && return isempty(s)
746+
_has_length_one(r) && return _has_length_one(s) & (first(r) == first(s))
747+
(first(r) == first(s)) & (step(r) == step(s)) & (last(r) == last(s))
748+
end
749+
750+
function ==(r::OrdinalRange, s::OrdinalRange)
751+
isempty(r) && return isempty(s)
752+
_has_length_one(r) && return _has_length_one(s) & (first(r) == first(s))
753+
(first(r) == first(s)) & (step(r) == step(s)) & (last(r) == last(s))
754+
end
755+
748756
==(r::T, s::T) where {T<:Union{StepRangeLen,LinRange}} =
749757
(isempty(r) & isempty(s)) | ((first(r) == first(s)) & (length(r) == length(s)) & (last(r) == last(s)))
750-
==(r::Union{StepRange{T},StepRangeLen{T,T}}, s::Union{StepRange{T},StepRangeLen{T,T}}) where {T} =
751-
(isempty(r) & isempty(s)) | ((first(r) == first(s)) & (step(r) == step(s)) & (last(r) == last(s)))
758+
759+
function ==(r::Union{StepRange{T},StepRangeLen{T,T}}, s::Union{StepRange{T},StepRangeLen{T,T}}) where {T}
760+
isempty(r) && return isempty(s)
761+
_has_length_one(r) && return _has_length_one(s) & (first(r) == first(s))
762+
(first(r) == first(s)) & (step(r) == step(s)) & (last(r) == last(s))
763+
end
764+
765+
_has_length_one(r::OrdinalRange) = first(r) == last(r)
766+
_has_length_one(r::AbstractRange) = isone(length(r))
752767

753768
function ==(r::AbstractRange, s::AbstractRange)
754769
lr = length(r)

test/ranges.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,9 @@ end
819819
0.0:0.1:1.0, map(Float32,0.0:0.1:1.0),map(Float32,LinRange(0.0, 1.0, 11)),
820820
1.0:eps():1.0 .+ 10eps(), 9007199254740990.:1.0:9007199254740994,
821821
range(0, stop=1, length=20), map(Float32, range(0, stop=1, length=20)),
822-
3:2, 5:-2:7, range(0.0, step=2.0, length=0), 3//2:3//2:0//1, LinRange(2,3,0)]
822+
3:2, 5:-2:7, range(0.0, step=2.0, length=0), 3//2:3//2:0//1, LinRange(2,3,0),
823+
Base.OneTo(1), 1:1, 1:-3:1, 1//1:1//3:1//1, range(1.0, step=2.5, length=1),
824+
LinRange(1,1,1), LinRange(1,1,2)]
823825
for r in Rs
824826
local r
825827
ar = Vector(r)

0 commit comments

Comments
 (0)