Skip to content

Commit 32c8564

Browse files
authored
Corrects offset1 computing of SubArray for IdOffsetRange (#101)
IdOffsetRange is another kind of index-preserving range case, thus should not contribute to the SubArray offsets before its construction
1 parent ff1acb3 commit 32c8564

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

src/axes.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ offset_coerce(::Type{I}, r::AbstractUnitRange) where I<:AbstractUnitRange{T} whe
128128
@inline Base.axes1(r::IdOffsetRange) = IdOffsetRange(Base.axes1(r.parent), r.offset)
129129
@inline Base.unsafe_indices(r::IdOffsetRange) = (r,)
130130
@inline Base.length(r::IdOffsetRange) = length(r.parent)
131+
# issue 100: IdOffsetRange as another index-preserving case shouldn't comtribute offsets
132+
@inline Base.compute_offset1(parent, stride1::Integer, dims::Tuple{Int}, inds::Tuple{IdOffsetRange}, I::Tuple) =
133+
Base.compute_linindex(parent, I) - stride1*first(axes(parent, dims[1]))
131134

132135
@inline function Base.iterate(r::IdOffsetRange)
133136
ret = iterate(r.parent)

test/runtests.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,37 @@ end
278278
@test S[1,4] == S[4] == 4
279279
@test_throws BoundsError S[1,1]
280280
@test axes(S) == IdentityUnitRange.((0:1, 3:4))
281+
S = view(A, axes(A)...)
282+
@test S == A
283+
@test S[0,3] == S[1] == 1
284+
@test S[1,3] == S[2] == 2
285+
@test S[0,4] == S[3] == 3
286+
@test S[1,4] == S[4] == 4
287+
@test_throws BoundsError S[1,1]
288+
@test axes(S) == OffsetArrays.IdOffsetRange.((0:1, 3:4))
289+
# issue 100
290+
S = view(A, axes(A, 1), 3)
291+
@test S == A[:, 3]
292+
@test S[0] == 1
293+
@test S[1] == 2
294+
@test_throws BoundsError S[length(S)]
295+
@test axes(S) == (OffsetArrays.IdOffsetRange(0:1), )
296+
# issue 100
297+
S = view(A, 1, axes(A, 2))
298+
@test S == A[1, :]
299+
@test S[3] == 2
300+
@test S[4] == 4
301+
@test_throws BoundsError S[1]
302+
@test axes(S) == (OffsetArrays.IdOffsetRange(3:4), )
303+
304+
A0 = collect(reshape(1:24, 2, 3, 4))
305+
A = OffsetArray(A0, (-1,2,1))
306+
S = view(A, axes(A, 1), 3:4, axes(A, 3))
307+
@test S == A[:, 3:4, :]
308+
@test S[0, 1, 2] == A[0, 3, 2]
309+
@test S[0, 2, 2] == A[0, 4, 2]
310+
@test S[1, 1, 2] == A[1, 3, 2]
311+
@test axes(S) == (OffsetArrays.IdOffsetRange(0:1), Base.OneTo(2), OffsetArrays.IdOffsetRange(2:5))
281312
end
282313

283314
@testset "iteration" begin

0 commit comments

Comments
 (0)