Skip to content

Commit

Permalink
Merge pull request JuliaLang#30215 from blegat/ReverseEmptyStepRangeLen
Browse files Browse the repository at this point in the history
Fix reverse with empty StepRangeLen
  • Loading branch information
timholy authored Nov 30, 2018
2 parents 245bc6d + b409238 commit 055da33
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
8 changes: 7 additions & 1 deletion base/range.jl
Original file line number Diff line number Diff line change
Expand Up @@ -941,7 +941,13 @@ Array{T,1}(r::AbstractRange{T}) where {T} = vcat(r)
collect(r::AbstractRange) = vcat(r)

reverse(r::OrdinalRange) = (:)(last(r), -step(r), first(r))
reverse(r::StepRangeLen) = StepRangeLen(r.ref, -r.step, length(r), length(r)-r.offset+1)
function reverse(r::StepRangeLen)
# If `r` is empty, `length(r) - r.offset + 1 will be nonpositive hence
# invalid. As `reverse(r)` is also empty, any offset would work so we keep
# `r.offset`
offset = isempty(r) ? r.offset : length(r)-r.offset+1
StepRangeLen(r.ref, -r.step, length(r), offset)
end
reverse(r::LinRange) = LinRange(r.stop, r.start, length(r))

## sorting ##
Expand Down
10 changes: 10 additions & 0 deletions test/ranges.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1435,3 +1435,13 @@ end
# require a keyword arg
@test_throws ArgumentError range(1, 100)
end

@testset "Reverse empty ranges" begin
@test reverse(1:0) === 0:-1:1
@test reverse(Base.OneTo(0)) === 0:-1:1
# Almost `1.0:-1.0:2.0`, only different is the step which is
# `Base.TwicePrecision(-1.0, 0.0)`
@test reverse(1.0:0.0) === StepRangeLen(Base.TwicePrecision(1.0, 0.0),
Base.TwicePrecision(-1.0, -0.0), 0)
@test reverse(reverse(1.0:0.0)) === 1.0:0.0
end

0 comments on commit 055da33

Please sign in to comment.