diff --git a/src/CxxWrap.jl b/src/CxxWrap.jl index 30e73e4..58fbfc8 100644 --- a/src/CxxWrap.jl +++ b/src/CxxWrap.jl @@ -948,8 +948,8 @@ ConstCxxPtr, ConstCxxRef, CxxRef, CxxPtr, CppEnum, ConstArray, CxxBool, CxxLong, CxxULong, CxxChar, CxxChar16, CxxChar32, CxxWchar, CxxUChar, CxxSignedChar, CxxLongLong, CxxULongLong, ptrunion, gcprotect, gcunprotect, isnull -using .StdLib: StdVector, StdString, StdWString, StdValArray, StdThread, StdDeque, StdQueue, StdSet, StdMultiset, StdUnorderedSet, StdUnorderedMultiset +using .StdLib: StdVector, StdString, StdWString, StdValArray, StdThread, StdDeque, StdQueue, StdSet, StdMultiset, StdUnorderedSet, StdUnorderedMultiset, StdPriorityQueue -export StdLib, StdVector, StdString, StdWString, StdValArray, StdThread, StdDeque, StdQueue, StdSet, StdMultiset, StdUnorderedSet, StdUnorderedMultiset +export StdLib, StdVector, StdString, StdWString, StdValArray, StdThread, StdDeque, StdQueue, StdSet, StdMultiset, StdUnorderedSet, StdUnorderedMultiset, StdPriorityQueue end # module diff --git a/src/StdLib.jl b/src/StdLib.jl index 7b1425c..dbd581d 100644 --- a/src/StdLib.jl +++ b/src/StdLib.jl @@ -230,6 +230,18 @@ for StdMultisetType in (StdMultiset, StdUnorderedMultiset) Base.count(x, v::StdMultisetType) = multiset_count(v, x) end +Base.size(v::StdPriorityQueue) = (Int(cppsize(v)),) +Base.length(v::StdPriorityQueue) = Int(cppsize(v)) +Base.isempty(v::StdPriorityQueue) = pq_isempty(v) +Base.first(v::StdPriorityQueue) = isempty(v) ? nothing : pq_top(v) +Base.push!(v::StdPriorityQueue, x) = (pq_push!(v, x); v) +function Base.pop!(v::StdPriorityQueue) + isempty(v) && throw(ArgumentError("Cannot pop from an empty priority queue")) + val = pq_top(v) + pq_pop!(v) + return val +end + function Base.fill!(v::T, x) where T <: Union{StdVector, StdValArray, StdDeque} StdFill(v, x) return v diff --git a/test/stdlib.jl b/test/stdlib.jl index 02932b6..29bfde7 100644 --- a/test/stdlib.jl +++ b/test/stdlib.jl @@ -327,6 +327,26 @@ let @test length(queue) == 1 end +@testset "StdPriorityQueue" begin + pq = StdPriorityQueue{Int64}() + @test length(pq) == 0 + push!(pq, 5) + push!(pq, 1) + @test isempty(pq) == false + pq = push!(pq, 4) + pq = push!(pq, 10) + @test length(pq) == 4 + @test first(pq) == 10 + @test pop!(pq) == 10 + @test length(pq) == 3 + @test pop!(pq) == 5 + @test pop!(pq) == 4 + @test pop!(pq) == 1 + @test isempty(pq) == true + @test isnothing(first(pq)) + @test_throws ArgumentError pop!(pq) +end + @testset "StdSet and StdUnorderedSet" begin for StdSetType in (StdSet, StdUnorderedSet) @testset "Set with integers" begin