Skip to content

Commit d98e673

Browse files
committed
Preserve ranges as ranges when indexing
1 parent 0513eed commit d98e673

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

src/OffsetArrays.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,16 @@ end
157157
val
158158
end
159159

160+
### Special handling for AbstractRange
161+
162+
const OffsetRange{T} = OffsetArray{T,1,<:AbstractRange{T}}
163+
164+
Base.step(a::OffsetRange) = step(parent(a))
165+
166+
Base.getindex(a::OffsetRange, r::OffsetRange) = OffsetArray(a[parent(r)], r.offsets)
167+
Base.getindex(a::OffsetRange, r::AbstractRange) = a.parent[r .- a.offsets[1]]
168+
Base.getindex(a::AbstractRange, r::OffsetRange) = OffsetArray(a[parent(r)], r.offsets)
169+
160170
### Convenience functions ###
161171

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

test/runtests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,17 @@ Ac[0,3,1] = 11
9494
@test A[1, [4,3]] == S[1, [4,3]] == [4,2]
9595
@test A[:, :] == S[:, :] == A
9696

97+
# Vector indexing with offset ranges
98+
r = OffsetArray(8:10, -1:1)
99+
r1 = r[0:1]
100+
@test r1 === 9:10
101+
r1 = (8:10)[OffsetArray(1:2, -5:-4)]
102+
@test axes(r1) === (IdentityUnitRange(-5:-4),)
103+
@test parent(r1) === 8:9
104+
r1 = OffsetArray(8:10, -1:1)[OffsetArray(0:1, -5:-4)]
105+
@test axes(r1) === (IdentityUnitRange(-5:-4),)
106+
@test parent(r1) === 9:10
107+
97108
# CartesianIndexing
98109
@test A[CartesianIndex((0,3))] == S[CartesianIndex((0,3))] == 1
99110
@test A[CartesianIndex((0,3)),1] == S[CartesianIndex((0,3)),1] == 1

0 commit comments

Comments
 (0)