Skip to content

Commit 9125a9c

Browse files
committed
Faster and simpler indices for SubArray
1 parent eff2593 commit 9125a9c

File tree

2 files changed

+9
-11
lines changed

2 files changed

+9
-11
lines changed

base/abstractarray.jl

+4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ end
5151
indices1{T}(A::AbstractArray{T,0}) = OneTo(1)
5252
indices1{T}(A::AbstractArray{T}) = (@_inline_meta; indices(A)[1])
5353

54+
unsafe_indices(A) = indices(A)
55+
unsafe_indices(r::Range) = (OneTo(unsafe_length(r)),) # Ranges use checked_sub for size
56+
5457
"""
5558
linearindices(A)
5659
@@ -252,6 +255,7 @@ Throw an error if the specified `indexes` are not in bounds for the given `array
252255
function checkbounds(A::AbstractArray, I...)
253256
@_inline_meta
254257
checkbounds(Bool, A, I...) || throw_boundserror(A, I)
258+
nothing
255259
end
256260
function checkbounds(A::AbstractArray, i)
257261
@_inline_meta

base/subarray.jl

+5-11
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,11 @@ end
278278
# they are taken from the range/vector
279279
# Since bounds-checking is performance-critical and uses
280280
# indices, it's worth optimizing these implementations thoroughly
281-
indices(S::SubArray) = (@_inline_meta; _indices_sub(S, 1, S.indexes...))
282-
_indices_sub(S::SubArray, dim::Int) = ()
283-
_indices_sub(S::SubArray, dim::Int, ::Real, I...) = (@_inline_meta; _indices_sub(S, dim+1, I...))
284-
_indices_sub(S::SubArray, dim::Int, ::Colon, I...) = (@_inline_meta; (indices(parent(S), dim), _indices_sub(S, dim+1, I...)...))
285-
_indices_sub(S::SubArray, dim::Int, i1::AbstractArray, I...) = (@_inline_meta; (indices(i1)..., _indices_sub(S, dim+1, I...)...))
286-
indices1(S::SubArray) = (@_inline_meta; _indices1(S, 1, S.indexes...))
287-
_indices1(S::SubArray, dim) = OneTo(1)
288-
_indices1(S::SubArray, dim, i1::Real, I...) = (@_inline_meta; _indices1(S, dim+1, I...))
289-
_indices1(S::SubArray, dim, i1::Colon, I...) = (@_inline_meta; indices(parent(S), dim))
290-
_indices1(S::SubArray, dim, i1::AbstractArray, I...) = (@_inline_meta; indices1(i1))
291-
_indices1{T}(S::SubArray, dim, i1::AbstractArray{T,0}, I...) = (@_inline_meta; _indices1(S, dim+1, I...))
281+
indices(S::SubArray) = (@_inline_pure_meta; _indices_sub(S, indices(S.parent), S.indexes...))
282+
_indices_sub(S::SubArray, pinds) = ()
283+
_indices_sub(S::SubArray, pinds, ::Real, I...) = _indices_sub(S, tail(pinds), I...)
284+
_indices_sub(S::SubArray, pinds, ::Colon, I...) = (pinds[1], _indices_sub(S, tail(pinds), I...)...)
285+
_indices_sub(S::SubArray, pinds, i1::AbstractArray, I...) = (unsafe_indices(i1)..., _indices_sub(S, tail(pinds), I...)...)
292286

293287
## Compatability
294288
# deprecate?

0 commit comments

Comments
 (0)