@@ -142,6 +142,14 @@ RangeStepStyle(::Type{<:AbstractRange{<:Integer}}) = RangeStepRegular()
142142
143143convert (:: Type{T} , r:: AbstractRange ) where {T<: AbstractRange } = r isa T ? r : T (r)
144144
145+ AxesStartStyle (:: Type{<:AbstractRange} ) = AxesStartAny ()
146+ AxesStartStyle (r:: AbstractRange ) = AxesStartStyle (typeof (r))
147+
148+ require_one_based_indexing (r:: AbstractRange ) = _require_one_based_indexing (AxesStartStyle (r), r)
149+ _require_one_based_indexing (:: AxesStartStyle , r) =
150+ ! has_offset_axes (r) || throw (ArgumentError (" offset arrays are not supported but got an array with index other than 1" ))
151+ _require_one_based_indexing (:: AxesStart1 , r) = true
152+
145153# # ordinal ranges
146154
147155"""
@@ -250,6 +258,8 @@ steprange_last_empty(start, step, stop) = start - step
250258
251259StepRange (start:: T , step:: S , stop:: T ) where {T,S} = StepRange {T,S} (start, step, stop)
252260
261+ AxesStartStyle (:: Type{<:StepRange} ) = AxesStart1 ()
262+
253263"""
254264 UnitRange{T<:Real}
255265
@@ -297,6 +307,8 @@ if isdefined(Main, :Base)
297307 end
298308end
299309
310+ AxesStartStyle (:: Type{<:UnitRange} ) = AxesStart1 ()
311+
300312"""
301313 Base.OneTo(n)
302314
318330OneTo (stop:: T ) where {T<: Integer } = OneTo {T} (stop)
319331OneTo (r:: AbstractRange{T} ) where {T<: Integer } = OneTo {T} (r)
320332
333+ AxesStartStyle (:: Type{<:OneTo} ) = AxesStart1 ()
334+
321335# # Step ranges parameterized by length
322336
323337"""
@@ -350,6 +364,8 @@ StepRangeLen(ref::R, step::S, len::Integer, offset::Integer = 1) where {R,S} =
350364StepRangeLen {T} (ref:: R , step:: S , len:: Integer , offset:: Integer = 1 ) where {T,R,S} =
351365 StepRangeLen {T,R,S} (ref, step, len, offset)
352366
367+ AxesStartStyle (:: Type{<:StepRangeLen} ) = AxesStart1 ()
368+
353369# # range with computed step
354370
355371"""
@@ -387,6 +403,8 @@ function LinRange(start, stop, len::Integer)
387403 LinRange {T} (start, stop, len)
388404end
389405
406+ AxesStartStyle (:: Type{<:LinRange} ) = AxesStart1 ()
407+
390408function _range (start:: T , :: Nothing , stop:: S , len:: Integer ) where {T,S}
391409 a, b = promote (start, stop)
392410 _range (a, nothing , b, len)
@@ -713,10 +731,14 @@ show(io::IO, r::AbstractRange) = print(io, repr(first(r)), ':', repr(step(r)), '
713731show (io:: IO , r:: UnitRange ) = print (io, repr (first (r)), ' :' , repr (last (r)))
714732show (io:: IO , r:: OneTo ) = print (io, " Base.OneTo(" , r. stop, " )" )
715733
734+ range_axes_first_same (r, s) = _range_axes_first_same (AxesStartStyle (r), AxesStartStyle (s), r, s)
735+ _range_axes_first_same (:: AxesStart1 , :: AxesStart1 , r, s) = true
736+ _range_axes_first_same (:: AxesStartStyle , :: AxesStartStyle , r, s) = first (axes1 (r)) == first (axes1 (s))
737+
716738== (r:: T , s:: T ) where {T<: AbstractRange } =
717- (first (r) == first (s)) & (step (r) == step (s)) & (last (r) == last (s))
739+ (first (r) == first (s)) & (step (r) == step (s)) & (last (r) == last (s)) & range_axes_first_same (r, s)
718740== (r:: OrdinalRange , s:: OrdinalRange ) =
719- (first (r) == first (s)) & (step (r) == step (s)) & (last (r) == last (s))
741+ (first (r) == first (s)) & (step (r) == step (s)) & (last (r) == last (s)) & range_axes_first_same (r, s)
720742== (r:: T , s:: T ) where {T<: Union{StepRangeLen,LinRange} } =
721743 (first (r) == first (s)) & (length (r) == length (s)) & (last (r) == last (s))
722744== (r:: Union{StepRange{T},StepRangeLen{T,T}} , s:: Union{StepRange{T},StepRangeLen{T,T}} ) where {T} =
@@ -727,6 +749,7 @@ function ==(r::AbstractRange, s::AbstractRange)
727749 if lr != length (s)
728750 return false
729751 end
752+ range_axes_first_same (r, s) || return false
730753 yr, ys = iterate (r), iterate (s)
731754 while yr != = nothing
732755 yr[1 ] == ys[1 ] || return false
849872
850873# # linear operations on ranges ##
851874
852- - (r:: OrdinalRange ) = range (- first (r), step= - step (r), length= length (r))
875+ - (r:: OrdinalRange ) = ( require_one_based_indexing (r); range (- first (r), step= - step (r), length= length (r) ))
853876- (r:: StepRangeLen{T,R,S} ) where {T,R,S} =
854877 StepRangeLen {T,R,S} (- r. ref, - r. step, length (r), r. offset)
855878- (r:: LinRange ) = LinRange (- r. start, - r. stop, length (r))
@@ -873,8 +896,10 @@ OneTo{T}(r::OneTo) where {T<:Integer} = OneTo{T}(r.stop)
873896
874897promote_rule (a:: Type{UnitRange{T1}} , :: Type{UR} ) where {T1,UR<: AbstractUnitRange } =
875898 promote_rule (a, UnitRange{eltype (UR)})
876- UnitRange {T} (r:: AbstractUnitRange ) where {T<: Real } = UnitRange {T} (first (r), last (r))
877- UnitRange (r:: AbstractUnitRange ) = UnitRange (first (r), last (r))
899+ UnitRange {T} (r:: AbstractUnitRange ) where {T<: Real } =
900+ (require_one_based_indexing (r); UnitRange {T} (first (r), last (r)))
901+ UnitRange (r:: AbstractUnitRange ) =
902+ (require_one_based_indexing (r); UnitRange (first (r), last (r)))
878903
879904AbstractUnitRange {T} (r:: AbstractUnitRange{T} ) where {T} = r
880905AbstractUnitRange {T} (r:: UnitRange ) where {T} = UnitRange {T} (r)
@@ -889,10 +914,14 @@ StepRange{T1,T2}(r::StepRange{T1,T2}) where {T1,T2} = r
889914
890915promote_rule (a:: Type{StepRange{T1a,T1b}} , :: Type{UR} ) where {T1a,T1b,UR<: AbstractUnitRange } =
891916 promote_rule (a, StepRange{eltype (UR), eltype (UR)})
892- StepRange {T1,T2} (r:: AbstractRange ) where {T1,T2} =
917+ function StepRange {T1,T2} (r:: AbstractRange ) where {T1,T2}
918+ require_one_based_indexing (r)
893919 StepRange {T1,T2} (convert (T1, first (r)), convert (T2, step (r)), convert (T1, last (r)))
894- StepRange (r:: AbstractUnitRange{T} ) where {T} =
920+ end
921+ function StepRange (r:: AbstractUnitRange{T} ) where {T}
922+ require_one_based_indexing (r)
895923 StepRange {T,T} (first (r), step (r), last (r))
924+ end
896925(:: Type{StepRange{T1,T2} where T1} )(r:: AbstractRange ) where {T2} = StepRange {eltype(r),T2} (r)
897926
898927promote_rule (:: Type{StepRangeLen{T1,R1,S1}} ,:: Type{StepRangeLen{T2,R2,S2}} ) where {T1,T2,R1,R2,S1,S2} =
@@ -908,15 +937,16 @@ StepRangeLen{T}(r::StepRangeLen) where {T} =
908937promote_rule (a:: Type{StepRangeLen{T,R,S}} , :: Type{OR} ) where {T,R,S,OR<: AbstractRange } =
909938 promote_rule (a, StepRangeLen{eltype (OR), eltype (OR), eltype (OR)})
910939StepRangeLen {T,R,S} (r:: AbstractRange ) where {T,R,S} =
911- StepRangeLen {T,R,S} (R (first (r)), S (step (r)), length (r))
940+ ( require_one_based_indexing (r); StepRangeLen {T,R,S} (R (first (r)), S (step (r)), length (r) ))
912941StepRangeLen {T} (r:: AbstractRange ) where {T} =
913- StepRangeLen (T (first (r)), T (step (r)), length (r))
942+ ( require_one_based_indexing (r); StepRangeLen (T (first (r)), T (step (r)), length (r) ))
914943StepRangeLen (r:: AbstractRange ) = StepRangeLen {eltype(r)} (r)
915944
916945promote_rule (a:: Type{LinRange{T1}} , b:: Type{LinRange{T2}} ) where {T1,T2} =
917946 el_same (promote_type (T1,T2), a, b)
918947LinRange {T} (r:: LinRange{T} ) where {T} = r
919- LinRange {T} (r:: AbstractRange ) where {T} = LinRange {T} (first (r), last (r), length (r))
948+ LinRange {T} (r:: AbstractRange ) where {T} =
949+ (require_one_based_indexing (r); LinRange {T} (first (r), last (r), length (r)))
920950LinRange (r:: AbstractRange{T} ) where {T} = LinRange {T} (r)
921951
922952promote_rule (a:: Type{LinRange{T}} , :: Type{OR} ) where {T,OR<: OrdinalRange } =
944974Array {T,1} (r:: AbstractRange{T} ) where {T} = vcat (r)
945975collect (r:: AbstractRange ) = vcat (r)
946976
947- reverse (r:: OrdinalRange ) = (:)(last (r), - step (r), first (r))
977+ function reverse (r:: OrdinalRange )
978+ require_one_based_indexing (r)
979+ (:)(last (r), - step (r), first (r))
980+ end
948981function reverse (r:: StepRangeLen )
949982 # If `r` is empty, `length(r) - r.offset + 1 will be nonpositive hence
950983 # invalid. As `reverse(r)` is also empty, any offset would work so we keep
@@ -964,8 +997,11 @@ sort!(r::AbstractUnitRange) = r
964997
965998sort (r:: AbstractRange ) = issorted (r) ? r : reverse (r)
966999
967- sortperm (r:: AbstractUnitRange ) = 1 : length (r)
968- sortperm (r:: AbstractRange ) = issorted (r) ? (1 : 1 : length (r)) : (length (r): - 1 : 1 )
1000+ sortperm (r:: AbstractUnitRange ) = (require_one_based_indexing (r); 1 : length (r))
1001+ function sortperm (r:: AbstractRange )
1002+ require_one_based_indexing (r)
1003+ issorted (r) ? (1 : 1 : length (r)) : (length (r): - 1 : 1 )
1004+ end
9691005
9701006function sum (r:: AbstractRange{<:Real} )
9711007 l = length (r)
@@ -1004,6 +1040,7 @@ function _define_range_op(@nospecialize f)
10041040 r1l = length (r1)
10051041 (r1l == length (r2) ||
10061042 throw (DimensionMismatch (" argument dimensions must match" )))
1043+ require_one_based_indexing (r1, r2)
10071044 range ($ f (first (r1), first (r2)), step= $ f (step (r1), step (r2)), length= r1l)
10081045 end
10091046
0 commit comments