Skip to content

Commit a6eba5a

Browse files
authored
Don't require the element to be provided to percolate_down! and percolate_up! (#960)
* Don't require the element to be provided to `percolate_down!` * Also fix percolate_up! * Add tests * Add changelog entry * v0.19.3
1 parent c9961a9 commit a6eba5a

File tree

4 files changed

+96
-6
lines changed

4 files changed

+96
-6
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ Starting from version 0.19.0, CHANGELOG.md is managed in a format that follows <
99
[0.19.2]: https://github.com/JuliaCollections/DataStructures.jl/compare/v0.19.1...v0.19.2
1010
<!-- links end -->
1111

12+
[0.19.3]
13+
=====================
14+
15+
## Fixed
16+
17+
- Reintroduce a method for `percolate_up!` `percolate_down!` that doesn't require the element to be passed, which was unintentionally removed in 0.19.2 (JuliaCollections/DataStructures.jl#960).
18+
1219
[0.19.2]
1320
=====================
1421

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "DataStructures"
22
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
3-
version = "0.19.2"
3+
version = "0.19.3"
44

55
[deps]
66
OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"

src/heaps/arrays_as_heaps.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Base.@propagate_inbounds function percolate_down!(xs::AbstractArray, i::Integer,
2727
end
2828
@inbounds xs[i] = x
2929
end
30-
Base.@propagate_inbounds percolate_down!(xs::AbstractArray, i::Integer, o::Ordering, len::Integer=length(xs)) = percolate_down!(xs, i, xs[i], o, len)
30+
Base.@propagate_inbounds percolate_down!(xs::AbstractArray, i::Integer, o::Ordering=Forward, len::Integer=length(xs)) = percolate_down!(xs, i, xs[i], o, len)
3131

3232

3333
# Binary min-heap percolate up.
@@ -41,7 +41,7 @@ Base.@propagate_inbounds function percolate_up!(xs::AbstractArray, i::Integer, x
4141
end
4242
@inbounds xs[i] = x
4343
end
44-
Base.@propagate_inbounds percolate_up!(xs::AbstractArray, i::Integer, o::Ordering) = percolate_up!(xs, i, xs[i], o)
44+
Base.@propagate_inbounds percolate_up!(xs::AbstractArray, i::Integer, o::Ordering=Forward) = percolate_up!(xs, i, xs[i], o)
4545

4646
"""
4747
heappop!(v, [ord])

test/test_priority_queue.jl

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ import Base.Order.Reverse
116116
Base.IteratorSize(i::EltypeUnknownIterator) = Base.IteratorSize(i.x)
117117
Base.length(i::EltypeUnknownIterator) = Base.length(i.x)
118118
Base.size(i::EltypeUnknownIterator) = Base.size(i.x)
119-
119+
120120
@test_nowarn PriorityQueue(Dict(zip(1:5, 2:6)))
121121
@test_nowarn PriorityQueue(EltypeUnknownIterator(Dict(zip(1:5, 2:6))))
122122
@test_throws ArgumentError PriorityQueue(EltypeUnknownIterator(['a']))
@@ -133,7 +133,7 @@ import Base.Order.Reverse
133133
Base.IteratorSize(i::EltypeAnyIterator) = Base.IteratorSize(i.x)
134134
Base.length(i::EltypeAnyIterator) = Base.length(i.x)
135135
Base.size(i::EltypeAnyIterator) = Base.size(i.x)
136-
136+
137137
@test_nowarn PriorityQueue(EltypeAnyIterator(Dict(zip(1:5, 2:6))))
138138
@test_throws ArgumentError PriorityQueue(EltypeAnyIterator(['a']))
139139
end
@@ -338,6 +338,89 @@ import Base.Order.Reverse
338338
@test isheap([1, 2, 3], Base.Order.Forward)
339339
@test !isheap([1, 2, 3], Base.Order.Reverse)
340340
end
341-
end
342341

342+
@testset "percolate_down!" begin
343+
@testset "Basic percolate down" begin
344+
xs = [10, 2, 3, 4, 5]
345+
DataStructures.percolate_down!(xs, 1, 10, Base.Order.Forward)
346+
@test xs == [2, 4, 3, 10, 5]
347+
end
348+
349+
@testset "Element in correct position" begin
350+
xs = [1, 2, 3, 4, 5]
351+
DataStructures.percolate_down!(xs, 1, 1, Base.Order.Forward)
352+
@test xs == [1, 2, 3, 4, 5]
353+
end
354+
355+
@testset "Reverse ordering" begin
356+
xs = [1, 5, 4, 3, 2]
357+
DataStructures.percolate_down!(xs, 1, 1, Base.Order.Reverse)
358+
@test xs == [5, 3, 4, 1, 2]
359+
end
360+
361+
@testset "Custom length" begin
362+
xs = [10, 2, 3, 4, 5]
363+
DataStructures.percolate_down!(xs, 1, 10, Base.Order.Forward, 3)
364+
@test xs == [2, 10, 3, 4, 5]
365+
end
366+
367+
@testset "Without explicit x parameter" begin
368+
xs = [10, 2, 3, 4, 5]
369+
DataStructures.percolate_down!(xs, 1, Base.Order.Forward)
370+
@test xs == [2, 4, 3, 10, 5]
371+
372+
xs = [10, 2, 3, 4, 5]
373+
DataStructures.percolate_down!(xs, 1)
374+
@test xs == [2, 4, 3, 10, 5]
375+
end
376+
377+
@testset "From middle position" begin
378+
xs = [2, 0, 3, 4, 5]
379+
DataStructures.percolate_down!(xs, 2, 10, Base.Order.Forward)
380+
@test xs == [2, 4, 3, 10, 5]
381+
end
382+
end
383+
384+
@testset "percolate_up!" begin
385+
@testset "Basic percolate up" begin
386+
xs = [1, 2, 3, 4, 0]
387+
DataStructures.percolate_up!(xs, 5, 0, Base.Order.Forward)
388+
@test xs == [0, 1, 3, 4, 2]
389+
end
390+
391+
@testset "Element in correct position" begin
392+
xs = [1, 2, 3, 4, 5]
393+
DataStructures.percolate_up!(xs, 5, 5, Base.Order.Forward)
394+
@test xs == [1, 2, 3, 4, 5]
395+
end
396+
397+
@testset "Reverse ordering" begin
398+
xs = [5, 4, 3, 2, 10]
399+
DataStructures.percolate_up!(xs, 5, 10, Base.Order.Reverse)
400+
@test xs == [10, 5, 3, 2, 4]
401+
end
402+
403+
@testset "Percolate to root" begin
404+
xs = [2, 3, 4, 5, 1]
405+
DataStructures.percolate_up!(xs, 5, 1, Base.Order.Forward)
406+
@test xs == [1, 2, 4, 5, 3]
407+
end
408+
409+
@testset "Without explicit x parameter" begin
410+
xs = [1, 2, 3, 4, 0]
411+
DataStructures.percolate_up!(xs, 5, Base.Order.Forward)
412+
@test xs == [0, 1, 3, 4, 2]
413+
414+
xs = [1, 2, 3, 4, 0]
415+
DataStructures.percolate_up!(xs, 5)
416+
@test xs == [0, 1, 3, 4, 2]
417+
end
418+
419+
@testset "From middle position" begin
420+
xs = [1, 5, 3, 10, 8]
421+
DataStructures.percolate_up!(xs, 4, 0, Base.Order.Forward)
422+
@test xs == [0, 1, 3, 5, 8]
423+
end
424+
end
425+
end
343426
end # @testset "PriorityQueue"

0 commit comments

Comments
 (0)