Skip to content

Commit 6887f83

Browse files
committed
Specialize indexing a CartesianIndices with a StepRangeLen{<:CartesianIndex}
1 parent 7b7ba33 commit 6887f83

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
@@ -397,6 +397,12 @@ module IteratorsMD
397397
getindex(iter, C.indices...)
398398
end
399399
@inline Base.getindex(iter::CartesianIndices{0}, ::CartesianIndices{0}) = iter
400+
@inline function Base.getindex(iter::CartesianIndices{N}, r::StepRangeLen{CartesianIndex{N},CartesianIndex{N},CartesianIndex{N},<:Integer}) where {N}
401+
@boundscheck checkbounds(iter, r)
402+
start = first(iter) + first(r) - CartesianIndex(first.(axes(iter)))
403+
stepsz = CartesianIndex(Tuple(step(iter)) .* Tuple(step(r)))
404+
StepRangeLen(start, stepsz, length(r))
405+
end
400406

401407
# If dimensions permit, we may index into a CartesianIndices directly instead of constructing a SubArray wrapper
402408
@propagate_inbounds function Base.view(c::CartesianIndices{N}, r::Vararg{Union{OrdinalRange{<:Integer, <:Integer}, Colon},N}) where {N}
@@ -735,7 +741,7 @@ end
735741
@inline checkindex(::Type{Bool}, inds::Tuple, I::CartesianIndex) =
736742
checkbounds_indices(Bool, inds, I.I)
737743
@inline checkindex(::Type{Bool}, inds::Tuple, i::AbstractRange{<:CartesianIndex}) =
738-
isempty(i) | (checkindex(Bool, inds, first(i)) & checkindex(Bool, inds, last(i)))
744+
isempty(i) || (checkindex(Bool, inds, first(i)) & checkindex(Bool, inds, last(i)))
739745

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

0 commit comments

Comments
 (0)