Skip to main content

osom_lib_btree/btree/operations/
clone.rs

1use 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}