From 2a0be5b1eee6c7b5c27bbe3e7956797c06e3bc8c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 2 Apr 2021 17:22:55 +0100 Subject: [PATCH] Provide insert() and remove() on SparseSecondaryEntry Signed-off-by: Ian Jackson --- src/utils.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/utils.rs b/src/utils.rs index 5aeb296a..853be507 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -491,3 +491,38 @@ macro_rules! want_let { want_let!{ $($variant(y))::+ = $input; ?; $($otherwise)* } }; } + +macro_rules! entry_define_insert_remove { + { $name:ident, $name_mod:ident, $entry:path, $into_key:ident } => + { + #[allow(non_snake_case)] + mod $name_mod { + use $crate::imports::extend::ext; + use $entry as Entry; + use Entry::{Occupied, Vacant}; + #[ext(pub, name=EntryExt)] + impl<'e,K,V> Entry<'e,K,V> where K: slotmap::Key { + fn insert(self, v: V) { + match self { + Vacant(ve) => { ve.insert(v); } + Occupied(mut oe) => { oe.insert(v); } + } + } + fn remove(self) -> (K, Option) { + match self { + Vacant(ve) => { let k = ve.$into_key(); (k, None) } + Occupied(oe) => { let (k,v) = oe.remove_entry(); (k, Some(v)) } + } + } + } + } + pub use $name_mod::EntryExt as $name; + } +} + +entry_define_insert_remove!{ + SlotmapSparseSecondaryEntryExt, + SlotmapSparseSecondaryEntryExt_mod, + slotmap::sparse_secondary::Entry, + key +} -- 2.30.2