From baa75016e3890ec9148c0fa7b47f57828fe33864 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Mon, 22 Aug 2016 07:06:11 -0500 Subject: [PATCH] Fix r[::AbstractUnitRange] --- src/URange.jl | 7 +++++++ src/ZeroRange.jl | 4 ++-- test/urange.jl | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/URange.jl b/src/URange.jl index 9798228..edce0fd 100644 --- a/src/URange.jl +++ b/src/URange.jl @@ -16,6 +16,13 @@ Base.start{T}(r::URange{T}) = oftype(r.start + one(T), r.start) Base.intersect{T1<:Integer,T2<:Integer}(r::URange{T1}, s::URange{T2}) = URange(max(first(r),first(s)), min(last(r),last(s))) +@inline function Base.getindex{R,S<:Integer}(r::URange{R}, s::AbstractUnitRange{S}) + @boundscheck checkbounds(r, s) + f = first(r) + strt = f + first(s) - 1 + URange{R}(strt, strt+length(s)-1) +end + Base.promote_rule{T1,T2}(::Type{URange{T1}},::Type{URange{T2}}) = URange{promote_type(T1,T2)} Base.convert{T<:Real}(::Type{URange{T}}, r::URange{T}) = r diff --git a/src/ZeroRange.jl b/src/ZeroRange.jl index 60a54d3..62a6667 100644 --- a/src/ZeroRange.jl +++ b/src/ZeroRange.jl @@ -33,9 +33,9 @@ Base.done{T}(r::ZeroRange{T}, i) = i == oftype(i, r.len) convert(T, i-1) end -@inline function Base.getindex{T}(r::ZeroRange{T}, s::AbstractUnitRange) +@inline function Base.getindex{R,S<:Integer}(r::ZeroRange{R}, s::AbstractUnitRange{S}) @boundscheck checkbounds(r, s) - T(first(s)-1):T(last(s)-1) + R(first(s)-1):R(last(s)-1) end Base.intersect(r::ZeroRange, s::ZeroRange) = ZeroRange(min(r.len,s.len)) diff --git a/test/urange.jl b/test/urange.jl index d605a2d..f7d1054 100644 --- a/test/urange.jl +++ b/test/urange.jl @@ -49,6 +49,7 @@ using ModU: URange @test r[9] == 3 @test_throws BoundsError r[10] @test_throws BoundsError r[0] + @test r[2:8] === URange(T(-4), T(2)) @test r+1 === -T(4):T(4) @test 2*r === -T(10):T(2):T(6) k = -6