Skip to content

Commit 3a9b52f

Browse files
authored
Use no_offset_view in indexing AbstractRanges (#199)
* The util method _unwrap has been replaced by no_offset_view * no_offset_view is a no-op for AbstractUnitRanges with axes of type Base.OneTo
1 parent 3b5b11b commit 3a9b52f

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

src/OffsetArrays.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -353,18 +353,18 @@ end
353353

354354
for OR in [:IIUR, :IdOffsetRange]
355355
for R in [:StepRange, :StepRangeLen, :LinRange, :UnitRange]
356-
@eval @propagate_inbounds Base.getindex(r::$R, s::$OR) = OffsetArray(r[_unwrap(s)], axes(s))
356+
@eval @propagate_inbounds Base.getindex(r::$R, s::$OR) = OffsetArray(r[no_offset_view(s)], axes(s))
357357
end
358358

359359
# this method is needed for ambiguity resolution
360360
@eval @propagate_inbounds Base.getindex(r::StepRangeLen{T,<:Base.TwicePrecision,<:Base.TwicePrecision}, s::$OR) where T =
361-
OffsetArray(r[_unwrap(s)], axes(s))
361+
OffsetArray(r[no_offset_view(s)], axes(s))
362362
end
363363

364364
#= Integer UnitRanges may return an appropriate AbstractUnitRange{<:Integer}, as the result may be used in indexing, and
365365
indexing is faster with ranges =#
366-
@propagate_inbounds Base.getindex(r::UnitRange{<:Integer}, s::IdOffsetRange) = IdOffsetRange(r[_unwrap(s)] .- s.offset, s.offset)
367-
@propagate_inbounds Base.getindex(r::UnitRange{<:Integer}, s::IIUR) = IdentityUnitRange(r[_unwrap(s)])
366+
@propagate_inbounds Base.getindex(r::UnitRange{<:Integer}, s::IdOffsetRange) = IdOffsetRange(r[no_offset_view(s)] .- s.offset, s.offset)
367+
@propagate_inbounds Base.getindex(r::UnitRange{<:Integer}, s::IIUR) = IdentityUnitRange(r[no_offset_view(s)])
368368

369369
function Base.show(io::IO, r::OffsetRange)
370370
show(io, r.parent)
@@ -435,7 +435,6 @@ julia> A
435435
```
436436
"""
437437
no_offset_view(A::OffsetArray) = no_offset_view(parent(A))
438-
no_offset_view(a::AbstractUnitRange) = UnitRange(a)
439438
if isdefined(Base, :IdentityUnitRange)
440439
no_offset_view(a::Base.Slice) = Base.Slice(UnitRange(a)) # valid only if Slice is distinguished from IdentityUnitRange
441440
no_offset_view(S::SubArray) = view(parent(S), map(no_offset_view, parentindices(S))...)
@@ -445,7 +444,10 @@ no_offset_view(i::Number) = i
445444
no_offset_view(A::AbstractArray) = _no_offset_view(axes(A), A)
446445
_no_offset_view(::Tuple{}, A::AbstractArray{T,0}) where T = A
447446
_no_offset_view(::Tuple{<:Base.OneTo,Vararg{<:Base.OneTo}}, A::AbstractArray) = A
447+
# the following method is needed for ambiguity resolution
448+
_no_offset_view(::Tuple{<:Base.OneTo,Vararg{<:Base.OneTo}}, A::AbstractUnitRange) = A
448449
_no_offset_view(::Any, A::AbstractArray) = OffsetArray(A, Origin(1))
450+
_no_offset_view(::Any, A::AbstractUnitRange) = UnitRange(A)
449451

450452
####
451453
# work around for segfault in searchsorted*

src/utils.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,3 @@ function _checkindices(N::Integer, indices, label)
7171
throw_argumenterror(N, indices, label) = throw(ArgumentError(label*" $indices are not compatible with a $(N)D array"))
7272
N == length(indices) || throw_argumenterror(N, indices, label)
7373
end
74-
75-
_unwrap(r::IdOffsetRange) = r.parent .+ r.offset
76-
_unwrap(r::IdentityUnitRange) = r.indices

test/runtests.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,9 @@ Base.getindex(x::PointlessWrapper, i...) = x.parent[i...]
14461446
@test axes(noffax, 1) == 1:10 # ideally covered by the above, but current it isn't
14471447
@test isa(noffax, AbstractUnitRange)
14481448

1449+
r = Base.OneTo(4)
1450+
@test OffsetArrays.no_offset_view(r) isa typeof(r)
1451+
14491452
# SubArrays
14501453
A = reshape(1:12, 3, 4)
14511454
V = view(A, OffsetArrays.IdentityUnitRange(2:3), OffsetArrays.IdentityUnitRange(2:3))

0 commit comments

Comments
 (0)