Skip to content

Commit 516df47

Browse files
authored
Fix indexing with Slice (#210)
* Fix indexing with Slice * remove trailing whitespace * Add test for IdOffsetRange(::Base.OneTo) * specify array eltypes as Any in tests
1 parent 23de436 commit 516df47

File tree

2 files changed

+54
-22
lines changed

2 files changed

+54
-22
lines changed

src/OffsetArrays.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,17 +349,17 @@ end
349349

350350
for OR in [:IIUR, :IdOffsetRange]
351351
for R in [:StepRange, :StepRangeLen, :LinRange, :UnitRange]
352-
@eval @propagate_inbounds Base.getindex(r::$R, s::$OR) = OffsetArray(r[no_offset_view(s)], axes(s))
352+
@eval @propagate_inbounds Base.getindex(r::$R, s::$OR) = OffsetArray(r[UnitRange(s)], axes(s))
353353
end
354354

355355
# this method is needed for ambiguity resolution
356356
@eval @propagate_inbounds Base.getindex(r::StepRangeLen{T,<:Base.TwicePrecision,<:Base.TwicePrecision}, s::$OR) where T =
357-
OffsetArray(r[no_offset_view(s)], axes(s))
357+
OffsetArray(r[UnitRange(s)], axes(s))
358358

359359
#= Integer UnitRanges may return an appropriate AbstractUnitRange{<:Integer}, as the result may be used in indexing, and
360360
indexing is faster with ranges =#
361361
@eval @propagate_inbounds function Base.getindex(r::UnitRange{<:Integer}, s::$OR)
362-
rs = r[no_offset_view(s)]
362+
rs = r[UnitRange(s)]
363363
offset_s = first(axes(s,1)) - 1
364364
IdOffsetRange(UnitRange(rs .- offset_s), offset_s)
365365
end

test/runtests.jl

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ end
817817
r2 = r1[:]
818818
@test r2 == r1
819819

820-
for r1 in [
820+
for r1 in Any[
821821
# AbstractArrays
822822
OffsetArray(10:1000, 0), # 1-based index
823823
OffsetArray(10:3:1000, 3), # offset index
@@ -829,9 +829,12 @@ end
829829
OffsetArray(IdOffsetRange(IdOffsetRange(10:1000, -1), 1), 3), # offset index
830830

831831
# AbstractRanges
832-
1:1000,
833-
1:3:1000,
832+
1:1000,
833+
UnitRange(1.0, 1000.0),
834+
1:3:1000,
834835
1.0:3.0:1000.0,
836+
StepRangeLen(Float64(1), Float64(1000), 1000),
837+
LinRange(1, 1000, 1000),
835838
IdOffsetRange(ZeroBasedUnitRange(1:1000), 1), # 1-based index
836839
IdOffsetRange(ZeroBasedUnitRange(1:1000), 2), # offset index
837840
ZeroBasedUnitRange(1:1000), # offset range
@@ -840,27 +843,52 @@ end
840843
]
841844

842845
# AbstractArrays with 1-based indices
843-
for r2 in [
844-
OffsetArray(5:80, 0),
845-
OffsetArray(5:2:80, 0),
846-
OffsetArray(IdentityUnitRange(5:80), -4),
846+
for r2 in Any[
847+
OffsetArray(5:80, 0),
848+
OffsetArray(5:2:80, 0),
849+
OffsetArray(IdentityUnitRange(5:80), -4),
847850
OffsetArray(IdOffsetRange(5:80), 0),
848851
]
849852

850853
test_indexing_axes_and_vals(r1, r2)
851854
end
852855

853856
# AbstractRanges with 1-based indices
854-
for r2 in [
855-
5:80,
856-
5:2:80,
857-
IdOffsetRange(5:80),
857+
for r2 in Any[
858+
5:80,
859+
5:2:80,
860+
IdOffsetRange(5:80),
858861
IdOffsetRange(ZeroBasedUnitRange(4:79), 1),
859862
]
860863

861864
test_indexing_axes_and_vals(r1, r2)
862865
end
863866
end
867+
868+
# Indexing with IdentityUnitRange(::Base.OneTo) or Base.Slice(::OneTo) is special.
869+
# This is because axes(::IdentityUnitRange{<:Base.OneTo}, 1) isa Base.OneTo, and not an IdentityUnitRange.
870+
# These therefore may pass through no_offset_view unchanged.
871+
# This had led to a stack-overflow in indexing, as getindex was using no_offset_view.
872+
# Issue 209
873+
for r1 in Any[
874+
# This set of tests is for ranges r1 that have 1-based indices
875+
UnitRange(1.0, 99.0),
876+
1:99,
877+
1:1:99,
878+
1.0:1.0:99.0,
879+
StepRangeLen(Float64(1), Float64(99), 99),
880+
LinRange(1, 99, 99),
881+
]
882+
883+
for r2 in Any[
884+
IdentityUnitRange(Base.OneTo(10)),
885+
Base.Slice(Base.OneTo(10)),
886+
IdOffsetRange(Base.OneTo(10)),
887+
]
888+
889+
test_indexing_axes_and_vals(r1, r2)
890+
end
891+
end
864892
end
865893

866894
@testset "Vector indexing with offset ranges" begin
@@ -887,7 +915,7 @@ end
887915
@test a[ax[i]] == a[ax][i]
888916
end
889917

890-
for r1 in [
918+
for r1 in Any[
891919
# AbstractArrays
892920
OffsetArray(10:1000, 0), # 1-based index
893921
OffsetArray(10:1000, 3), # offset index
@@ -902,8 +930,10 @@ end
902930

903931
# AbstractRanges
904932
1:1000,
933+
UnitRange(1.0, 1000.0),
905934
1:2:2000,
906935
1.0:2.0:2000.0,
936+
StepRangeLen(Float64(1), Float64(1000), 1000),
907937
LinRange(1.0, 2000.0, 2000),
908938
IdOffsetRange(1:1000, 0), # 1-based index
909939
IdOffsetRange(ZeroBasedUnitRange(1:1000), 1), # 1-based index
@@ -916,9 +946,10 @@ end
916946
]
917947

918948
# AbstractArrays with offset axes
919-
for r2 in [OffsetArray(5:80, 40), OffsetArray(5:2:80, 40),
920-
OffsetArray(IdentityUnitRange(5:80), 2),
921-
OffsetArray(IdOffsetRange(5:80, 1), 3),
949+
for r2 in Any[OffsetArray(5:80, 40),
950+
OffsetArray(5:2:80, 40),
951+
OffsetArray(IdentityUnitRange(5:80), 2),
952+
OffsetArray(IdOffsetRange(5:80, 1), 3),
922953
OffsetArray(IdOffsetRange(IdOffsetRange(5:80, 4), 1), 3),
923954
OffsetArray(IdOffsetRange(IdentityUnitRange(5:80), 1), 3),
924955
OffsetArray(IdentityUnitRange(IdOffsetRange(5:80, 1)), 3),
@@ -928,11 +959,12 @@ end
928959
end
929960

930961
# AbstractRanges with offset axes
931-
for r2 in [IdOffsetRange(5:80, 1),
962+
for r2 in Any[IdOffsetRange(5:80, 1),
932963
IdentityUnitRange(5:80),
933-
IdOffsetRange(IdOffsetRange(5:80, 2), 1),
964+
IdOffsetRange(Base.OneTo(9), 4),
965+
IdOffsetRange(IdOffsetRange(5:80, 2), 1),
934966
IdOffsetRange(IdOffsetRange(IdOffsetRange(5:80, -1), 2), 1),
935-
IdentityUnitRange(IdOffsetRange(1:10, 5)),
967+
IdentityUnitRange(IdOffsetRange(1:10, 5)),
936968
IdOffsetRange(IdentityUnitRange(15:20), -2),
937969
ZeroBasedUnitRange(5:80),
938970
ZeroBasedRange(5:80),
@@ -1189,7 +1221,7 @@ end
11891221
@test String(take!(io)) == "3:5 with indices 0:2"
11901222

11911223
# issue #198
1192-
for r in [axes(OffsetVector(1:10, -5), 1), 1:1:2, 1.0:1.0:2.0, 1:-1:-5]
1224+
for r in Any[axes(OffsetVector(1:10, -5), 1), 1:1:2, 1.0:1.0:2.0, 1:-1:-5]
11931225
a = OffsetVector(r, 5)
11941226
show(io, a)
11951227
@test String(take!(io)) == "$r with indices $(UnitRange(axes(a,1)))"

0 commit comments

Comments
 (0)