From c3fc5ad1747141229339dc3e898665a96d390e51 Mon Sep 17 00:00:00 2001 From: jishnub Date: Sat, 29 May 2021 14:40:20 +0400 Subject: [PATCH] indexing OneTo with IdentityUnitRange preserves axes --- base/indices.jl | 4 ++++ test/ranges.jl | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/base/indices.jl b/base/indices.jl index 462e62c6d8883..ef9e2c52ca6a3 100644 --- a/base/indices.jl +++ b/base/indices.jl @@ -400,6 +400,10 @@ getindex(S::IdentityUnitRange, i::StepRange{<:Integer}) = (@_inline_meta; @bound show(io::IO, r::IdentityUnitRange) = print(io, "Base.IdentityUnitRange(", r.indices, ")") iterate(S::IdentityUnitRange, s...) = iterate(S.indices, s...) +# For OneTo, the values and indices of the values are identical, so this may be defined in Base. +# In general such an indexing operation would produce offset ranges +getindex(S::OneTo, I::IdentityUnitRange{<:AbstractUnitRange{<:Integer}}) = (@_inline_meta; @boundscheck checkbounds(S, I); I) + """ LinearIndices(A::AbstractArray) diff --git a/test/ranges.jl b/test/ranges.jl index eb4fadfac6253..b06bae88b02a7 100644 --- a/test/ranges.jl +++ b/test/ranges.jl @@ -1933,3 +1933,13 @@ end @test (10:-1:1) * 0.1 == 1:-0.1:0.1 @test 0.2 * (-2:2:2) == [-0.4, 0, 0.4] end + +@testset "Indexing OneTo with IdentityUnitRange" begin + for endpt in Any[10, big(10), UInt(10)] + r = Base.OneTo(endpt) + inds = Base.IdentityUnitRange(3:5) + rs = r[inds] + @test rs === inds + @test_throws BoundsError r[Base.IdentityUnitRange(-1:100)] + end +end