Skip to content

Commit 663542a

Browse files
committed
Preserve axes when indexing ranges with IdentityUnitRange
1 parent 087a2c4 commit 663542a

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

src/OffsetArrays.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,28 @@ end
160160
### Special handling for AbstractRange
161161

162162
const OffsetRange{T} = OffsetArray{T,1,<:AbstractRange{T}}
163+
const IIUR = IdentityUnitRange{S} where S<:AbstractUnitRange{T} where T<:Integer
163164

164165
Base.step(a::OffsetRange) = step(parent(a))
165166

166167
Base.getindex(a::OffsetRange, r::OffsetRange) = OffsetArray(a[parent(r)], r.offsets)
167168
Base.getindex(a::OffsetRange, r::AbstractRange) = a.parent[r .- a.offsets[1]]
168169
Base.getindex(a::AbstractRange, r::OffsetRange) = OffsetArray(a[parent(r)], r.offsets)
169170

171+
@inline @propagate_inbounds Base.getindex(r::UnitRange, s::IIUR) =
172+
OffsetArray(r[s.indices], s)
173+
174+
@inline @propagate_inbounds Base.getindex(r::StepRange, s::IIUR) =
175+
OffsetArray(r[s.indices], s)
176+
177+
@inline @propagate_inbounds Base.getindex(r::StepRangeLen{T,<:Base.TwicePrecision,<:Base.TwicePrecision}, s::IIUR) where T =
178+
OffsetArray(r[s.indices], s)
179+
@inline @propagate_inbounds Base.getindex(r::StepRangeLen{T}, s::IIUR) where {T} =
180+
OffsetArray(r[s.indices], s)
181+
182+
@inline @propagate_inbounds Base.getindex(r::LinRange, s::IIUR) =
183+
OffsetArray(r[s.indices], s)
184+
170185
### Convenience functions ###
171186

172187
Base.fill(x, inds::Tuple{UnitRange,Vararg{UnitRange}}) =

test/runtests.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,12 @@ end
312312
@test axes(v) === (IdentityUnitRange(-4:-3),)
313313
v = view(A0, 1:1, i1)
314314
@test axes(v) === (Base.OneTo(1), IdentityUnitRange(-4:-3))
315+
316+
for r in (1:10, 1:1:10, StepRangeLen(1, 1, 10), LinRange(1, 10, 10))
317+
for s in (IdentityUnitRange(2:3), OffsetArray(2:3, 2:3))
318+
@test axes(r[s]) == axes(s)
319+
end
320+
end
315321
end
316322

317323
@testset "logical indexing" begin

0 commit comments

Comments
 (0)