summaryrefslogtreecommitdiff
path: root/src/dtree.erl
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2014-02-10 16:04:09 +0000
committerSimon MacMullen <simon@rabbitmq.com>2014-02-10 16:04:09 +0000
commit8eb42f47a10f084fbc3d9e36b8b562d7f3c590b5 (patch)
treebead758eef0c5ae759cbe1ed7938c6ce99ae9627 /src/dtree.erl
parent03bcc89029dae7ab611b3436a1a139a0a071f1a0 (diff)
parent8e2791065b6954931b6ec985dc63bab57d7f281e (diff)
downloadrabbitmq-server-git-8eb42f47a10f084fbc3d9e36b8b562d7f3c590b5.tar.gz
Merge bug26000
Diffstat (limited to 'src/dtree.erl')
-rw-r--r--src/dtree.erl11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/dtree.erl b/src/dtree.erl
index 5ff36bd922..72abe248f5 100644
--- a/src/dtree.erl
+++ b/src/dtree.erl
@@ -32,7 +32,7 @@
-module(dtree).
--export([empty/0, insert/4, take/3, take/2, take_all/2,
+-export([empty/0, insert/4, take/3, take/2, take_all/2, drop/2,
is_defined/2, is_empty/1, smallest/1, size/1]).
%%----------------------------------------------------------------------------
@@ -53,6 +53,7 @@
-spec(take/3 :: ([pk()], sk(), ?MODULE()) -> {[kv()], ?MODULE()}).
-spec(take/2 :: (sk(), ?MODULE()) -> {[kv()], ?MODULE()}).
-spec(take_all/2 :: (sk(), ?MODULE()) -> {[kv()], ?MODULE()}).
+-spec(drop/2 :: (pk(), ?MODULE()) -> ?MODULE()).
-spec(is_defined/2 :: (sk(), ?MODULE()) -> boolean()).
-spec(is_empty/1 :: (?MODULE()) -> boolean()).
-spec(smallest/1 :: (?MODULE()) -> kv()).
@@ -120,6 +121,14 @@ take_all(SK, {P, S}) ->
{KVs, {P1, prune(SKS, PKS, S)}}
end.
+%% Drop all entries for the given primary key (which does not have to exist).
+drop(PK, {P, S}) ->
+ case gb_trees:lookup(PK, P) of
+ none -> {P, S};
+ {value, {SKS, _V}} -> {gb_trees:delete(PK, P),
+ prune(SKS, gb_sets:singleton(PK), S)}
+ end.
+
is_defined(SK, {_P, S}) -> gb_trees:is_defined(SK, S).
is_empty({P, _S}) -> gb_trees:is_empty(P).