From a8703aa20e37949012fbd75c541f6917277dbbef Mon Sep 17 00:00:00 2001 From: Ben Arthur Date: Thu, 27 Jul 2023 19:54:50 -0400 Subject: [PATCH] add deleteat! for OrderedDict --- src/OrderedCollections.jl | 3 ++- src/ordered_dict.jl | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/OrderedCollections.jl b/src/OrderedCollections.jl index 47e1128..af7e1c3 100644 --- a/src/OrderedCollections.jl +++ b/src/OrderedCollections.jl @@ -15,7 +15,8 @@ module OrderedCollections searchsortedfirst, searchsortedlast, in, filter, filter!, ValueIterator, eachindex, keytype, valtype, lastindex, nextind, - copymutable, emptymutable, dict_with_eltype + copymutable, emptymutable, dict_with_eltype, + deleteat! export OrderedDict, OrderedSet, LittleDict export freeze diff --git a/src/ordered_dict.jl b/src/ordered_dict.jl index 28945fe..b4d4500 100644 --- a/src/ordered_dict.jl +++ b/src/ordered_dict.jl @@ -449,6 +449,33 @@ function delete!(h::OrderedDict, key) return h end +function deleteat!(od::OrderedDict, i::Integer, rehash=true) + key = od.keys[i] + index = OrderedCollections.ht_keyindex(od, key, false) + @inbounds ki = od.slots[index] + @inbounds od.slots[index] = -ki + ccall(:jl_arrayunset, Cvoid, (Any, UInt), od.keys, ki-1) + ccall(:jl_arrayunset, Cvoid, (Any, UInt), od.vals, ki-1) + od.ndel += 1 + od.dirty = true + rehash && OrderedCollections.rehash!(od) +end + +function deleteat!(od::OrderedDict, + inds::Union{AbstractUnitRange{<:Integer}, AbstractVector{<:Integer}}) + for i in inds + deleteat!(od, i, false) + end + OrderedCollections.rehash!(od) +end + +function deleteat!(od::OrderedDict, inds::AbstractVector{<:Bool}) + for (i,b) in enumerate(inds) + b && deleteat!(od, i, false) + end + OrderedCollections.rehash!(od) +end + function iterate(t::OrderedDict) t.ndel > 0 && rehash!(t) length(t.keys) < 1 && return nothing