Skip to content

Commit 83df130

Browse files
authored
Fix nested IdOffsetRange constructors (#178)
1 parent 0749d26 commit 83df130

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

src/axes.jl

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ must start with value 1.
6262
6363
has `r[1] == 3` and `r[2] == 4` and would satisfy `r == 3:4`, whereas
6464
65-
```
65+
```julia
6666
julia> convert(OffsetArrays.IdOffsetRange{Int,Base.OneTo{Int}}, 3:4) # future behavior, not present behavior
6767
ERROR: ArgumentError: first element must be 1, got 3
6868
```
@@ -86,22 +86,23 @@ function IdOffsetRange{T,I}(r::AbstractUnitRange, offset::Integer = 0) where {T<
8686
return IdOffsetRange{T,I}(rc, convert(T, o+offset))
8787
end
8888
function IdOffsetRange{T}(r::AbstractUnitRange, offset::Integer = 0) where T<:Integer
89-
rc = convert(AbstractUnitRange{T}, r)::AbstractUnitRange{T}
89+
rc = convert(AbstractUnitRange{T}, r)
9090
return IdOffsetRange{T,typeof(rc)}(rc, convert(T, offset))
9191
end
9292
IdOffsetRange(r::AbstractUnitRange{T}, offset::Integer = 0) where T<:Integer =
9393
IdOffsetRange{T,typeof(r)}(r, convert(T, offset))
9494

9595
# Coercion from other IdOffsetRanges
96-
IdOffsetRange{T,I}(r::IdOffsetRange{T,I}) where {T<:Integer,I<:AbstractUnitRange{T}} = r
97-
function IdOffsetRange{T,I}(r::IdOffsetRange) where {T<:Integer,I<:AbstractUnitRange{T}}
98-
rc, offset = offset_coerce(I, r.parent)
99-
return IdOffsetRange{T,I}(rc, r.offset+offset)
96+
IdOffsetRange{T,I}(r::IdOffsetRange{T,I}) where {T,I} = r
97+
function IdOffsetRange{T,I}(r::IdOffsetRange, offset::Integer = 0) where {T<:Integer,I<:AbstractUnitRange{T}}
98+
rc, offset_rc = offset_coerce(I, r.parent)
99+
return IdOffsetRange{T,I}(rc, r.offset + offset + offset_rc)
100100
end
101-
function IdOffsetRange{T}(r::IdOffsetRange) where T<:Integer
102-
return IdOffsetRange(convert(AbstractUnitRange{T}, r.parent), r.offset)
101+
function IdOffsetRange{T}(r::IdOffsetRange, offset::Integer = 0) where T<:Integer
102+
return IdOffsetRange{T}(r.parent, r.offset + offset)
103103
end
104104
IdOffsetRange(r::IdOffsetRange) = r
105+
IdOffsetRange(r::IdOffsetRange, offset::Integer) = typeof(r)(r.parent, offset + r.offset)
105106

106107
# TODO: uncomment these when Julia is ready
107108
# # Conversion preserves both the values and the indexes, throwing an InexactError if this
@@ -121,7 +122,7 @@ end
121122
# rc, o = offset_coerce(Base.OneTo{T}, r.parent)
122123

123124
# Fallback, specialze this method if `convert(I, r)` doesn't do what you need
124-
offset_coerce(::Type{I}, r::AbstractUnitRange) where I<:AbstractUnitRange{T} where T =
125+
offset_coerce(::Type{I}, r::AbstractUnitRange) where I<:AbstractUnitRange =
125126
convert(I, r), 0
126127

127128
@inline Base.parent(r::IdOffsetRange) = r.parent

test/runtests.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ end
8888
@test same_value(r, 4:5)
8989
check_indexed_by(r, 4:5)
9090

91+
r = IdOffsetRange{Int, UnitRange{Int}}(IdOffsetRange(3:5, 2), 2)
92+
@test typeof(r) == IdOffsetRange{Int, UnitRange{Int}}
93+
@test same_value(r, 7:9)
94+
check_indexed_by(r, 5:7)
95+
96+
r = IdOffsetRange{Int, Base.OneTo{Int}}(IdOffsetRange(Base.OneTo(3), 1), 1)
97+
@test typeof(r) == IdOffsetRange{Int,Base.OneTo{Int}}
98+
@test same_value(r, 3:5)
99+
check_indexed_by(r, 3:5)
100+
101+
r = IdOffsetRange(IdOffsetRange(3:5, 2), 1)
102+
@test parent(r) isa UnitRange
103+
91104
# conversion preserves both the values and the axes, throwing an error if this is not possible
92105
@test @inferred(oftype(ro, ro)) === ro
93106
@test @inferred(convert(OffsetArrays.IdOffsetRange{Int}, ro)) === ro

0 commit comments

Comments
 (0)