From 719479085edea35c2f8381a5e7e3bb408cf5f79e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 23 Apr 2022 10:36:51 +0100 Subject: [PATCH] occult ilks: Provide clone_id and clone_iilk Signed-off-by: Ian Jackson --- src/occultilks.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/occultilks.rs b/src/occultilks.rs index 57772d85..e1c7cfe0 100644 --- a/src/occultilks.rs +++ b/src/occultilks.rs @@ -20,7 +20,7 @@ pub struct OccultIlkOwningId(Id); pub type OccultIlkName = Arc; -#[derive(Debug,Serialize,Deserialize)] +#[derive(Debug,Clone,Serialize,Deserialize)] pub struct OccultIlkData { pub p_occ: Arc, } @@ -118,6 +118,10 @@ impl OccultIlks { IOI::Distinct(_data) => { }, IOI::Mix(id) => self.dispose(id), } } + pub fn clone_iilk(&mut self, iilk: &IOccultIlk) -> IOccultIlk { match iilk { + IOI::Distinct(data) => IOI::Distinct(data.clone()), + IOI::Mix(id) => IOI::Mix(self.clone_id(id)), + } } /// Ensure there's an entry for `K`, perhaps creating from `V` pub fn create_coalesce(&mut self, k: K, v: V) -> OId { @@ -136,6 +140,12 @@ impl OccultIlks { OccultIlkOwningId(id) } + pub fn clone_id(&mut self, id: &OId) -> OId { + let id: Id = id.0; + let data = &mut self.table[id]; + data.refcount = data.refcount.checked_add(1).unwrap(); + OccultIlkOwningId(id) + } pub fn dispose(&mut self, id: OId) { let id: Id = id.0; let data = &mut self.table[id]; -- 2.30.2