bdk_core/
merge.rs

1use crate::alloc::vec::Vec;
2use crate::collections::{BTreeMap, BTreeSet};
3
4/// Trait that makes an object mergeable.
5pub trait Merge: Default {
6    /// Merge another object of the same type onto `self`.
7    fn merge(&mut self, other: Self);
8
9    /// Returns whether the structure is considered empty.
10    fn is_empty(&self) -> bool;
11
12    /// Take the value, replacing it with the default value.
13    fn take(&mut self) -> Option<Self> {
14        if self.is_empty() {
15            None
16        } else {
17            Some(core::mem::take(self))
18        }
19    }
20}
21
22impl<K: Ord, V> Merge for BTreeMap<K, V> {
23    fn merge(&mut self, other: Self) {
24        // We use `extend` instead of `BTreeMap::append` due to performance issues with `append`.
25        // Refer to https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
26        BTreeMap::extend(self, other)
27    }
28
29    fn is_empty(&self) -> bool {
30        BTreeMap::is_empty(self)
31    }
32}
33
34impl<T: Ord> Merge for BTreeSet<T> {
35    fn merge(&mut self, other: Self) {
36        // We use `extend` instead of `BTreeMap::append` due to performance issues with `append`.
37        // Refer to https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
38        BTreeSet::extend(self, other)
39    }
40
41    fn is_empty(&self) -> bool {
42        BTreeSet::is_empty(self)
43    }
44}
45
46impl<T> Merge for Vec<T> {
47    fn merge(&mut self, mut other: Self) {
48        Vec::append(self, &mut other)
49    }
50
51    fn is_empty(&self) -> bool {
52        Vec::is_empty(self)
53    }
54}
55
56macro_rules! impl_merge_for_tuple {
57    ($($a:ident $b:tt)*) => {
58        impl<$($a),*> Merge for ($($a,)*) where $($a: Merge),* {
59
60            fn merge(&mut self, _other: Self) {
61                $(Merge::merge(&mut self.$b, _other.$b) );*
62            }
63
64            fn is_empty(&self) -> bool {
65                $(Merge::is_empty(&self.$b) && )* true
66            }
67        }
68    }
69}
70
71impl_merge_for_tuple!();
72impl_merge_for_tuple!(T0 0);
73impl_merge_for_tuple!(T0 0 T1 1);
74impl_merge_for_tuple!(T0 0 T1 1 T2 2);
75impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3);
76impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4);
77impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5);
78impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6);
79impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7);
80impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7 T8 8);
81impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7 T8 8 T9 9);
82impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7 T8 8 T9 9 T10 10);