@@ -771,74 +771,25 @@ centered(A::AbstractArray, cp::Dims=center(A)) = OffsetArray(A, .-cp)
771
771
772
772
centered (A:: AbstractArray , i:: CartesianIndex ) = centered (A, Tuple (i))
773
773
774
- # ###
775
- # work around for segfault in searchsorted*
776
- # https://github.com/JuliaLang/julia/issues/33977
777
- # ###
778
-
779
- function _safe_searchsorted (v:: OffsetArray , x, ilo:: T , ihi:: T , o:: Base.Ordering ) where T<: Integer
780
- u = T (1 )
781
- lo = ilo - u
782
- hi = ihi + u
783
- @inbounds while lo < hi - u
784
- m = (lo + hi) ÷ 2
785
- if Base. lt (o, v[m], x)
786
- lo = m
787
- elseif Base. lt (o, x, v[m])
788
- hi = m
789
- else
790
- a = searchsortedfirst (v, x, max (lo,ilo), m, o)
791
- b = searchsortedlast (v, x, m, min (hi,ihi), o)
792
- return a : b
793
- end
774
+ # we may pass the searchsorted* functions to the parent, and wrap the offset
775
+ for f in [:searchsortedfirst , :searchsortedlast , :searchsorted ]
776
+ _safe_f = Symbol (" _safe_" * String (f))
777
+ @eval function $_safe_f (v:: OffsetVector , x, ilo, ihi, o:: Base.Ordering )
778
+ offset = v. offsets[1 ]
779
+ $ f (parent (v), x, ilo - offset, ihi - offset, o) .+ offset
794
780
end
795
- return (lo + 1 ) : (hi - 1 )
796
- end
797
- function _safe_searchsortedfirst (v:: OffsetArray , x, lo:: T , hi:: T , o:: Base.Ordering ) where T<: Integer
798
- u = T (1 )
799
- lo = lo - u
800
- hi = hi + u
801
- @inbounds while lo < hi - u
802
- m = (lo + hi) ÷ 2
803
- if Base. lt (o, v[m], x)
804
- lo = m
805
- else
806
- hi = m
807
- end
808
- end
809
- return hi
810
- end
811
- function _safe_searchsortedlast (v:: OffsetArray , x, lo:: T , hi:: T , o:: Base.Ordering ) where T<: Integer
812
- u = T (1 )
813
- lo = lo - u
814
- hi = hi + u
815
- @inbounds while lo < hi - u
816
- m = (lo + hi) ÷ 2
817
- if Base. lt (o, x, v[m])
818
- hi = m
819
- else
820
- lo = m
821
- end
822
- end
823
- return lo
781
+ @eval Base.$ f (v:: OffsetVector , x, ilo:: T , ihi:: T , o:: Base.Ordering ) where T<: Integer =
782
+ $ _safe_f (v, x, ilo, ihi, o)
824
783
end
825
784
826
- if VERSION ≤ v " 1.2"
785
+ if VERSION <= v " 1.2"
827
786
# ambiguity warnings in earlier versions
828
- Base. searchsorted (v:: OffsetArray , x, ilo:: Int , ihi:: Int , o:: Base.Ordering ) =
829
- _safe_searchsorted (v, x, ilo, ihi, o)
830
- Base. searchsortedfirst (v:: OffsetArray , x, lo:: Int , hi:: Int , o:: Base.Ordering ) =
831
- _safe_searchsortedfirst (v, x, lo, hi, o)
832
- Base. searchsortedlast (v:: OffsetArray , x, lo:: Int , hi:: Int , o:: Base.Ordering ) =
833
- _safe_searchsortedlast (v, x, lo, hi, o)
834
- end
835
-
836
- Base. searchsorted (v:: OffsetArray , x, ilo:: T , ihi:: T , o:: Base.Ordering ) where T<: Integer =
837
- _safe_searchsorted (v, x, ilo, ihi, o)
838
- Base. searchsortedfirst (v:: OffsetArray , x, lo:: T , hi:: T , o:: Base.Ordering ) where T<: Integer =
839
- _safe_searchsortedfirst (v, x, lo, hi, o)
840
- Base. searchsortedlast (v:: OffsetArray , x, lo:: T , hi:: T , o:: Base.Ordering ) where T<: Integer =
841
- _safe_searchsortedlast (v, x, lo, hi, o)
787
+ for f in [:searchsortedfirst , :searchsortedlast , :searchsorted ]
788
+ _safe_f = Symbol (" _safe_" * String (f))
789
+ @eval Base.$ f (v:: OffsetVector , x, ilo:: Int , ihi:: Int , o:: Base.Ordering ) =
790
+ $ _safe_f (v, x, ilo, ihi, o)
791
+ end
792
+ end
842
793
843
794
if VERSION < v " 1.1.0-DEV.783"
844
795
Base. copyfirst! (dest:: OffsetArray , src:: OffsetArray ) = (maximum! (parent (dest), parent (src)); return dest)
0 commit comments