Skip to content

Commit df172e1

Browse files
committed
specialize for Base.OneTo
1 parent fde311a commit df172e1

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

src/axes.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,13 @@ for f in [:firstindex, :lastindex, :first, :last]
162162
@eval @inline Base.$f(r::IdOffsetRange) = $f(r.parent) + r.offset
163163
end
164164

165-
@inline Base.iterate(r::IdOffsetRange, i...) = iterate(UnitRange(r), i...)
165+
Base.iterate(r::IdOffsetRange, i...) = _iterate(r, i...)
166+
@inline function _iterate(r::IdOffsetRange, i...)
167+
ret = iterate(r.parent, i...)
168+
ret === nothing && return nothing
169+
return (ret[1] + r.offset, ret[2])
170+
end
171+
@inline _iterate(r::IdOffsetRange{<:Integer, <:Base.OneTo}, i...) = iterate(r.parent .+ r.offset, i...)
166172

167173
@propagate_inbounds Base.getindex(r::IdOffsetRange, i::Integer) = r.parent[i - r.offset] + r.offset
168174
@propagate_inbounds function Base.getindex(r::IdOffsetRange, s::AbstractUnitRange{<:Integer})

test/runtests.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,22 @@ end
260260
end
261261
end
262262
@testset "iteration" begin
263+
# parent has Base.OneTo axes
263264
A = ones(4:10)
264265
ax = axes(A, 1)
265266
ind, st = iterate(ax)
266267
@test A[ind] == A[4]
267268
ind, st = iterate(ax, st)
268269
@test A[ind] == A[5]
270+
271+
# parent doesn't have Base.OneTo axes
272+
B = @view A[:]
273+
C = OffsetArray(B, 0)
274+
ax = axes(C, 1)
275+
ind, st = iterate(ax)
276+
@test C[ind] == C[4]
277+
ind, st = iterate(ax, st)
278+
@test C[ind] == C[5]
269279
end
270280
end
271281

0 commit comments

Comments
 (0)