Skip to content

Commit a50fc82

Browse files
committed
Impl, docs, & tests for searchsortedbefore
1 parent 2a73458 commit a50fc82

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

docs/src/sorted_containers.md

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ regress(token::Token)
140140
Base.searchsortedfirst(m::SortedContainer, k)
141141
Base.searchsortedlast(m::SortedContainer, k)
142142
searchsortedafter(m::SortedContainer, k)
143+
searchsortedbefore(m::SortedContainer, k)
143144
searchequalrange(smd::SortedMultiDict, k)
144145
findkey(m::SortedSet, k)
145146
findkey(sd::SortedDict, k)

src/DataStructures.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ module DataStructures
3737
export SetSemiToken
3838
export pastendsemitoken, beforestartsemitoken
3939
export pastendtoken, beforestarttoken
40-
export searchsortedafter, searchequalrange
40+
export searchsortedafter, searchsortedbefore, searchequalrange
4141
export packcopy, packdeepcopy
4242
export exclusive, inclusive, semitokens, inclusive_key, exclusive_key
4343
export orderobject, ordtype, Lt, compare, onlysemitokens

src/sorted_container_iteration.jl

+13
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,19 @@ function Base.searchsortedlast(m::SortedContainer, k_)
455455
end
456456

457457

458+
"""
459+
searchsortedbefore(m::SortedContainer, k)
460+
461+
Return the semitoken of the last item in the container that is less than
462+
`k` in the sort order. If there is no
463+
such item, then the before-start semitoken is returned. Time: O(*c* log *n*)
464+
"""
465+
function searchsortedbefore(m::SortedContainer, k_)
466+
i = findkeyless(m.bt, convert(keytype(m), k_))
467+
IntSemiToken(i)
468+
end
469+
470+
458471
## The next four are correctness-checking routines. They are
459472
## not exported.
460473

test/test_sorted_containers.jl

+11
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,10 @@ function testSortedDictMethods()
485485
i17 = searchsortedlast(m1, 48)
486486
my_assert(deref_key((m1,i16)) == 47)
487487
my_assert(deref_key((m1,i17)) == 47)
488+
i16 = searchsortedbefore(m1, 47)
489+
i17 = searchsortedbefore(m1, 48)
490+
my_assert(deref_key((m1,i16)) == 43)
491+
my_assert(deref_key((m1,i17)) == 47)
488492
ww = my_primes(N)
489493
cc = last(m1)
490494
my_assert(cc[1] == last(ww))
@@ -1337,6 +1341,8 @@ function testSortedMultiDict()
13371341
my_assert(deref((factors,i)) == Pair(77,77))
13381342
i = searchsortedafter(factors,77)
13391343
my_assert(deref((factors,i)) == Pair(78,1))
1344+
i = searchsortedbefore(factors,77)
1345+
my_assert(deref((factors,i)) == Pair(76,76))
13401346
expected = [1,2,4,5,8,10,16,20,40,80]
13411347
i1,i2 = searchequalrange(factors, 80)
13421348
i = i1
@@ -1613,16 +1619,21 @@ function testSortedSet()
16131619
j1 = searchsortedfirst(m,0.5)
16141620
j2 = searchsortedlast(m,0.5)
16151621
j3 = searchsortedafter(m,0.5)
1622+
j4 = searchsortedbefore(m,0.5)
16161623
my_assert(deref((m,j1)) > 0.5)
16171624
my_assert(deref((m,j2)) < 0.5)
16181625
my_assert(advance((m,j2)) == j1)
16191626
my_assert(j1 == j3)
1627+
my_assert(j2 == j4)
16201628
k1 = searchsortedfirst(m,smallest)
16211629
k2 = searchsortedlast(m,smallest)
16221630
k3 = searchsortedafter(m,smallest)
1631+
k4 = searchsortedbefore(m,smallest)
16231632
my_assert(deref((m,k1)) == smallest)
16241633
my_assert(deref((m,k2)) == smallest)
16251634
my_assert(deref((m,regress((m,k3)))) == smallest)
1635+
my_assert(deref((m,advance((m,k4)))) == smallest)
1636+
my_assert(k4 == beforestartsemitoken(m))
16261637
secondsmallest = deref((m,k3))
16271638
sk = searchsortedfirst(m,0.4)
16281639
ek = searchsortedfirst(m,0.6)

0 commit comments

Comments
 (0)