Skip to content

Commit d50463f

Browse files
dlfivefiftyfredrikekre
authored andcommitted
searchsorted overrides, resolves #85 (#86)
1 parent 0a68fac commit d50463f

File tree

5 files changed

+93
-5
lines changed

5 files changed

+93
-5
lines changed

.travis.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ os:
55
- osx
66

77
julia:
8-
- 0.7
98
- 1.0
10-
- 1.1
9+
- 1.3
1110
- nightly
1211

1312
notifications:

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "OffsetArrays"
22
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
3-
version = "0.11.1"
3+
version = "0.11.2"
44

55
[compat]
66
julia = "0.7, 1"

appveyor.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
environment:
22
matrix:
3-
- julia_version: 0.7
43
- julia_version: 1.0
5-
- julia_version: 1.1
4+
- julia_version: 1.3
65
- julia_version: nightly
76

87
platform:

src/OffsetArrays.jl

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,4 +278,75 @@ end
278278

279279
no_offset_view(A::OffsetArray) = no_offset_view(parent(A))
280280

281+
282+
####
283+
# work around for segfault in searchsorted*
284+
# https://github.com/JuliaLang/julia/issues/33977
285+
####
286+
287+
function _safe_searchsorted(v::OffsetArray, x, ilo::T, ihi::T, o::Base.Ordering) where T<:Integer
288+
u = T(1)
289+
lo = ilo - u
290+
hi = ihi + u
291+
@inbounds while lo < hi - u
292+
m = (lo + hi) ÷ 2
293+
if Base.lt(o, v[m], x)
294+
lo = m
295+
elseif Base.lt(o, x, v[m])
296+
hi = m
297+
else
298+
a = searchsortedfirst(v, x, max(lo,ilo), m, o)
299+
b = searchsortedlast(v, x, m, min(hi,ihi), o)
300+
return a : b
301+
end
302+
end
303+
return (lo + 1) : (hi - 1)
304+
end
305+
function _safe_searchsortedfirst(v::OffsetArray, x, lo::T, hi::T, o::Base.Ordering) where T<:Integer
306+
u = T(1)
307+
lo = lo - u
308+
hi = hi + u
309+
@inbounds while lo < hi - u
310+
m = (lo + hi) ÷ 2
311+
if Base.lt(o, v[m], x)
312+
lo = m
313+
else
314+
hi = m
315+
end
316+
end
317+
return hi
318+
end
319+
function _safe_searchsortedlast(v::OffsetArray, x, lo::T, hi::T, o::Base.Ordering) where T<:Integer
320+
u = T(1)
321+
lo = lo - u
322+
hi = hi + u
323+
@inbounds while lo < hi - u
324+
m = (lo + hi) ÷ 2
325+
if Base.lt(o, x, v[m])
326+
hi = m
327+
else
328+
lo = m
329+
end
330+
end
331+
return lo
332+
end
333+
334+
if VERSION  v"1.2"
335+
# ambiguity warnings in earlier versions
336+
Base.searchsorted(v::OffsetArray, x, ilo::Int, ihi::Int, o::Base.Ordering) =
337+
_safe_searchsorted(v, x, ilo, ihi, o)
338+
Base.searchsortedfirst(v::OffsetArray, x, lo::Int, hi::Int, o::Base.Ordering) =
339+
_safe_searchsortedfirst(v, x, lo, hi, o)
340+
Base.searchsortedlast(v::OffsetArray, x, lo::Int, hi::Int, o::Base.Ordering) =
341+
_safe_searchsortedlast(v, x, lo, hi, o)
342+
end
343+
344+
Base.searchsorted(v::OffsetArray, x, ilo::T, ihi::T, o::Base.Ordering) where T<:Integer =
345+
_safe_searchsorted(v, x, ilo, ihi, o)
346+
Base.searchsortedfirst(v::OffsetArray, x, lo::T, hi::T, o::Base.Ordering) where T<:Integer =
347+
_safe_searchsortedfirst(v, x, lo, hi, o)
348+
Base.searchsortedlast(v::OffsetArray, x, lo::T, hi::T, o::Base.Ordering) where T<:Integer =
349+
_safe_searchsortedlast(v, x, lo, hi, o)
350+
351+
281352
end # module

test/runtests.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,3 +578,22 @@ end
578578
@test empty!(o) === o
579579
@test axes(o, 1) == 0:-1
580580
end
581+
582+
@testset "searchsorted (#85)" begin
583+
o = OffsetVector([1,3,4,5],-2)
584+
@test searchsortedfirst(o,-2) == -1
585+
@test searchsortedfirst(o, 1) == -1
586+
@test searchsortedfirst(o, 2) == 0
587+
@test searchsortedfirst(o, 5) == 2
588+
@test searchsortedfirst(o, 6) == 3
589+
@test searchsortedlast(o, -2) == -2
590+
@test searchsortedlast(o, 1) == -1
591+
@test searchsortedlast(o, 2) == -1
592+
@test searchsortedlast(o, 5) == 2
593+
@test searchsortedlast(o, 6) == 2
594+
@test searchsorted(o, -2) == -1:-2
595+
@test searchsorted(o, 1) == -1:-1
596+
@test searchsorted(o, 2) == 0:-1
597+
@test searchsorted(o, 5) == 2:2
598+
@test searchsorted(o, 6) == 3:2
599+
end

0 commit comments

Comments
 (0)