11#  This file is a part of Julia. License is MIT: https://julialang.org/license
22
3- (:)(a:: Real , b:: Real ) =  (:)(promote (a,b)... )
3+ (:)(a:: Real , b:: Real ) =  (:)(promote (a,  b)... )
44
55(:)(start:: T , stop:: T ) where  {T<: Real } =  UnitRange {T} (start, stop)
66
7- (:)(start:: T , stop:: T ) where  {T} =  (:)(start, oftype (stop- start,  1 ), stop)
7+ (:)(start:: T , stop:: T ) where  {T} =  (:)(start, oneunit (stop  >=  start  ?  stop  -   start  :  start  -  stop ), stop)
88
99#  promote start and stop, leaving step alone
10- (:)(start:: A , step, stop:: C ) where  {A<: Real ,C<: Real } = 
11-     (:)(convert (promote_type (A,C),start), step, convert (promote_type (A,C),stop))
10+ (:)(start:: A , step, stop:: C ) where  {A<: Real ,  C<: Real } = 
11+     (:)(convert (promote_type (A,  C),  start), step, convert (promote_type (A,  C),  stop))
1212
1313#  AbstractFloat specializations
14- (:)(a:: T , b:: T ) where  {T<: AbstractFloat } =  (:)(a, T ( 1 ), b)
14+ (:)(a:: T , b:: T ) where  {T<: AbstractFloat } =  (:)(a, oneunit (T ), b)
1515
16- (:)(a:: T , b:: AbstractFloat , c:: T ) where  {T<: Real } =  (:)(promote (a,b, c)... )
17- (:)(a:: T , b:: AbstractFloat , c:: T ) where  {T<: AbstractFloat } =  (:)(promote (a,b, c)... )
18- (:)(a:: T , b:: Real , c:: T ) where  {T<: AbstractFloat } =  (:)(promote (a,b, c)... )
16+ (:)(a:: T , b:: AbstractFloat , c:: T ) where  {T<: Real } =  (:)(promote (a, b,  c)... )
17+ (:)(a:: T , b:: AbstractFloat , c:: T ) where  {T<: AbstractFloat } =  (:)(promote (a, b,  c)... )
18+ (:)(a:: T , b:: Real , c:: T ) where  {T<: AbstractFloat } =  (:)(promote (a, b,  c)... )
1919
2020(:)(start:: T , step:: T , stop:: T ) where  {T<: AbstractFloat } = 
2121    _colon (OrderStyle (T), ArithmeticStyle (T), start, step, stop)
@@ -168,15 +168,15 @@ range_stop(stop) = range_start_stop(oneunit(stop), stop)
168168range_stop (stop:: Integer ) =  range_length (stop)
169169
170170#  Stop and length as the only argument
171- range_stop_length (a:: Real ,          len:: Integer ) =  UnitRange {typeof(a)} ( oftype (a, a - len+ 1 ) , a)
172- range_stop_length (a:: AbstractFloat , len:: Integer ) =  range_step_stop_length (oftype (a,  1 ), a, len)
173- range_stop_length (a,                len:: Integer ) =  range_step_stop_length (oftype (a - a,  1 ), a, len)
171+ range_stop_length (a:: Real ,          len:: Integer ) =  UnitRange ( promote (a  -  ( len  -   oneunit (len)) , a) ... )
172+ range_stop_length (a:: AbstractFloat , len:: Integer ) =  range_step_stop_length (oneunit (a ), a, len)
173+ range_stop_length (a,                len:: Integer ) =  range_step_stop_length (oneunit (a  -  a ), a, len)
174174
175175range_step_stop_length (step, stop, length) =  reverse (range_start_step_length (stop, - step, length))
176176
177- range_start_length (a:: Real ,          len:: Integer ) =  UnitRange {typeof(a)} (a, oftype (a, a + len- 1 ) )
178- range_start_length (a:: AbstractFloat , len:: Integer ) =  range_start_step_length (a, oftype (a,  1 ), len)
179- range_start_length (a,                len:: Integer ) =  range_start_step_length (a, oftype (a - a,  1 ), len)
177+ range_start_length (a:: Real ,          len:: Integer ) =  UnitRange ( promote (a, a  +  ( len  -   oneunit (len))) ... )
178+ range_start_length (a:: AbstractFloat , len:: Integer ) =  range_start_step_length (a, oneunit (a ), len)
179+ range_start_length (a,                len:: Integer ) =  range_start_step_length (a, oneunit (a  -  a ), len)
180180
181181range_start_stop (start, stop) =  start: stop
182182
@@ -200,10 +200,15 @@ function range_start_step_length(a::T, step, len::Integer) where {T}
200200    _rangestyle (OrderStyle (T), ArithmeticStyle (T), a, step, len)
201201end 
202202
203- _rangestyle (:: Ordered , :: ArithmeticWraps , a:: T , step:: S , len:: Integer ) where  {T,S} = 
204-     StepRange {typeof(a+zero(step)),S} (a, step, a+ step* (len- 1 ))
205- _rangestyle (:: Any , :: Any , a:: T , step:: S , len:: Integer ) where  {T,S} = 
206-     StepRangeLen {typeof(a+zero(step)),T,S} (a, step, len)
203+ function  _rangestyle (:: Ordered , :: ArithmeticWraps , a, step, len:: Integer )
204+     stop =  a +  step *  (len -  oneunit (len))
205+     T =  typeof (stop)
206+     return  StepRange {T,typeof(step)} (convert (T, a), step, stop)
207+ end 
208+ function  _rangestyle (:: Any , :: Any , a:: T , step, len:: Integer ) where  {T}
209+     stop =  a +  step *  len -  step
210+     return  StepRangeLen {typeof(stop),T,typeof(step)} (a, step, len)
211+ end 
207212
208213range_start_step_stop (start, step, stop) =  start: step: stop
209214
@@ -397,7 +402,7 @@ unitrange_last(start::T, stop::T) where {T<:Integer} =
397402    stop >=  start ?  stop :  convert (T,start- oneunit (start- stop))
398403unitrange_last (start:: T , stop:: T ) where  {T} = 
399404    stop >=  start ?  convert (T,start+ floor (stop- start)) : 
400-                     convert (T,start- oneunit (stop - start))
405+                     convert (T,start- oneunit (start- stop ))
401406
402407unitrange (x) =  UnitRange (x)
403408
@@ -556,7 +561,7 @@ function LinRange{T}(start, stop, len::Integer) where T
556561end 
557562
558563function  LinRange (start, stop, len:: Integer )
559-     T =  typeof ((stop- start) / len)
564+     T =  typeof ((len  >=   0   ?   stop  -   start  :  start  -  stop)  /   oneunit ( len) )
560565    LinRange {T} (start, stop, len)
561566end 
562567
@@ -962,29 +967,32 @@ function getindex(r::AbstractUnitRange, s::AbstractUnitRange{T}) where {T<:Integ
962967    @boundscheck  checkbounds (r, s)
963968
964969    if  T ===  Bool
965-         range (first (s) ?  first (r) :  last (r), length =  Integer ( last (s) ))
970+         return   range (first (s) ?  first (r) :  last (r), length =  last (s))
966971    else 
967972        f =  first (r)
968-         st =  oftype (f, f +  first (s)- firstindex (r))
969-         return  range (st, length= length (s))
973+         start =  oftype (f, f +  first (s)- firstindex (r))
974+         stop =  oftype (f, start +  (length (s) -  1 ))
975+         return  range (start, stop)
970976    end 
971977end 
972978
973979function  getindex (r:: OneTo{T} , s:: OneTo ) where  T
974980    @inline 
975981    @boundscheck  checkbounds (r, s)
976-     OneTo (T (s. stop))
982+     return   OneTo (T (s. stop))
977983end 
978984
979985function  getindex (r:: AbstractUnitRange , s:: StepRange{T} ) where  {T<: Integer }
980986    @inline 
981987    @boundscheck  checkbounds (r, s)
982988
983989    if  T ===  Bool
984-         range (first (s) ?  first (r) :  last (r), step= oneunit (eltype (r)), length =  Integer ( last (s) ))
990+         return   range (first (s) ?  first (r) :  last (r), step= oneunit (eltype (r)), length =  last (s))
985991    else 
986-         st =  oftype (first (r), first (r) +  s. start- firstindex (r))
987-         return  range (st, step= step (s), length= length (s))
992+         f =  first (r)
993+         start =  oftype (f, f +  s. start- firstindex (r))
994+         stop =  oftype (f, start +  (length (s) -  1 ) *  step (s))
995+         return  range (start, stop; step= step (s))
988996    end 
989997end 
990998
@@ -994,19 +1002,21 @@ function getindex(r::StepRange, s::AbstractRange{T}) where {T<:Integer}
9941002
9951003    if  T ===  Bool
9961004        if  length (s) ==  0 
997-             return   range ( first (r), step = step (r), length = 0 ) 
1005+             start, len  =   first (r), 0 
9981006        elseif  length (s) ==  1 
9991007            if  first (s)
1000-                 return   range ( first (r), step = step (r), length = 1 ) 
1008+                 start, len  =   first (r), 1 
10011009            else 
1002-                 return   range ( first (r), step = step (r), length = 0 ) 
1010+                 start, len  =   first (r), 0 
10031011            end 
10041012        else  #  length(s) == 2
1005-             return   range ( last (r), step = step (r), length = 1 ) 
1013+             start, len  =   last (r), 1 
10061014        end 
1015+         return  range (start, step= step (r); length= len)
10071016    else 
1008-         st =  oftype (r. start, r. start +  (first (s)- 1 )* step (r))
1009-         return  range (st, step= step (r)* step (s), length= length (s))
1017+         f =  r. start
1018+         start =  oftype (f, f +  (first (s)- 1 )* step (r))
1019+         return  range (start; step= step (r)* step (s), length= length (s))
10101020    end 
10111021end 
10121022
0 commit comments