Skip to content

Commit 39b286c

Browse files
committed
Specialize indexing a CartesianIndices with a StepRangeLen{<:CartesianIndex}
1 parent a23ce4b commit 39b286c

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

base/multidimensional.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,12 @@ module IteratorsMD
403403
getindex(iter, C.indices...)
404404
end
405405
@inline Base.getindex(iter::CartesianIndices{0}, ::CartesianIndices{0}) = iter
406+
@inline function Base.getindex(iter::CartesianIndices{N}, r::StepRangeLen{CartesianIndex{N},CartesianIndex{N},CartesianIndex{N},<:Integer}) where {N}
407+
@boundscheck checkbounds(iter, r)
408+
start = first(iter) + first(r) - CartesianIndex(first.(axes(iter)))
409+
stepsz = CartesianIndex(Tuple(step(iter)) .* Tuple(step(r)))
410+
StepRangeLen(start, stepsz, length(r))
411+
end
406412

407413
# If dimensions permit, we may index into a CartesianIndices directly instead of constructing a SubArray wrapper
408414
@propagate_inbounds function Base.view(c::CartesianIndices{N}, r::Vararg{Union{OrdinalRange{<:Integer, <:Integer}, Colon},N}) where {N}
@@ -743,7 +749,7 @@ end
743749
@inline checkindex(::Type{Bool}, inds::Tuple, I::CartesianIndex) =
744750
checkbounds_indices(Bool, inds, I.I)
745751
@inline checkindex(::Type{Bool}, inds::Tuple, i::AbstractRange{<:CartesianIndex}) =
746-
isempty(i) | (checkindex(Bool, inds, first(i)) & checkindex(Bool, inds, last(i)))
752+
isempty(i) || (checkindex(Bool, inds, first(i)) & checkindex(Bool, inds, last(i)))
747753

748754
# Indexing into Array with mixtures of Integers and CartesianIndices is
749755
# extremely performance-sensitive. While the abstract fallbacks support this,

0 commit comments

Comments
 (0)