osom_lib_btree/btree/operations/
clone.rs1use osom_lib_try_clone::TryClone;
2
3use crate::{
4 btree::{BTree, BTreeConfig},
5 errors::BTreeTryCloneError,
6};
7
8impl<TKey, TValue, TConfig> TryClone for BTree<TKey, TValue, TConfig>
9where
10 TKey: Ord + TryClone,
11 TValue: TryClone,
12 TConfig: BTreeConfig + TryClone,
13{
14 type Error = BTreeTryCloneError;
15
16 fn try_clone(&self) -> Result<Self, Self::Error> {
17 let new_config = self.config.try_clone().map_err(|_| BTreeTryCloneError::OtherError)?;
18 let mut new_tree = Self::with_config(new_config);
19
20 for kvp in self.iter() {
21 let key = kvp.key.try_clone().map_err(|_| BTreeTryCloneError::KeyCloningError)?;
22 let value = kvp
23 .value
24 .try_clone()
25 .map_err(|_| BTreeTryCloneError::ValueCloningError)?;
26 new_tree
27 .try_insert(key, value)
28 .map_err(|_| BTreeTryCloneError::OtherError)?;
29 }
30
31 Ok(new_tree)
32 }
33}
34
35impl<TKey, TValue, TConfig> Clone for BTree<TKey, TValue, TConfig>
36where
37 TKey: Ord + TryClone,
38 TValue: TryClone,
39 TConfig: BTreeConfig + TryClone,
40{
41 fn clone(&self) -> Self {
42 self.try_clone().expect("[BTree::clone] failure")
43 }
44}