gear_common/storage/primitives/
triple_map.rs1pub trait TripleMapStorage {
15 type Key1;
17 type Key2;
19 type Key3;
21 type Value;
23
24 fn contains_keys(key1: &Self::Key1, key2: &Self::Key2, key3: &Self::Key3) -> bool;
26
27 fn get(key1: &Self::Key1, key2: &Self::Key2, key3: &Self::Key3) -> Option<Self::Value>;
29
30 fn insert(key1: Self::Key1, key2: Self::Key2, key3: Self::Key3, value: Self::Value);
32
33 fn mutate<R, F: FnOnce(&mut Option<Self::Value>) -> R>(
38 key1: Self::Key1,
39 key2: Self::Key2,
40 key3: Self::Key3,
41 f: F,
42 ) -> R;
43
44 fn mutate_exists<R, F: FnOnce(&mut Self::Value) -> R>(
46 key1: Self::Key1,
47 key2: Self::Key2,
48 key3: Self::Key3,
49 f: F,
50 ) -> Option<R> {
51 Self::mutate(key1, key2, key3, |opt_val| opt_val.as_mut().map(f))
52 }
53
54 fn mutate_values<F: FnMut(Self::Value) -> Self::Value>(f: F);
56
57 fn remove(key1: Self::Key1, key2: Self::Key2, key3: Self::Key3);
59
60 fn clear();
62
63 fn take(key1: Self::Key1, key2: Self::Key2, key3: Self::Key3) -> Option<Self::Value>;
66
67 fn clear_prefix(key1: Self::Key1, key2: Self::Key2);
69
70 fn iter_prefix(
71 key1: &Self::Key1,
72 key2: &Self::Key2,
73 ) -> impl Iterator<Item = (Self::Key3, Self::Value)>;
74}
75
76#[allow(clippy::crate_in_macro_def)]
87#[macro_export]
88macro_rules! wrap_storage_triple_map {
89 (storage: $storage: ident, name: $name: ident,
90 key1: $key1: ty,
91 key2: $key2: ty,
92 key3: $key3: ty,
93 value: $val: ty) => {
94 pub struct $name<T>(PhantomData<T>);
95
96 impl<T: crate::Config> TripleMapStorage for $name<T> {
97 type Key1 = $key1;
98 type Key2 = $key2;
99 type Key3 = $key3;
100 type Value = $val;
101
102 fn contains_keys(key1: &Self::Key1, key2: &Self::Key2, key3: &Self::Key3) -> bool {
103 $storage::<T>::contains_key((key1, key2, key3))
104 }
105
106 fn get(key1: &Self::Key1, key2: &Self::Key2, key3: &Self::Key3) -> Option<Self::Value> {
107 $storage::<T>::get((key1, key2, key3))
108 }
109
110 fn insert(key1: Self::Key1, key2: Self::Key2, key3: Self::Key3, value: Self::Value) {
111 $storage::<T>::insert((key1, key2, key3), value)
112 }
113
114 fn mutate<R, F: FnOnce(&mut Option<Self::Value>) -> R>(
115 key1: Self::Key1,
116 key2: Self::Key2,
117 key3: Self::Key3,
118 f: F,
119 ) -> R {
120 $storage::<T>::mutate((key1, key2, key3), f)
121 }
122
123 fn mutate_values<F: FnMut(Self::Value) -> Self::Value>(mut f: F) {
124 let f = |v| Some(f(v));
125 $storage::<T>::translate_values(f)
126 }
127
128 fn remove(key1: Self::Key1, key2: Self::Key2, key3: Self::Key3) {
129 $storage::<T>::remove((key1, key2, key3))
130 }
131
132 fn clear() {
133 let _ = $storage::<T>::clear(u32::MAX, None);
134 }
135
136 fn take(key1: Self::Key1, key2: Self::Key2, key3: Self::Key3) -> Option<Self::Value> {
137 $storage::<T>::take((key1, key2, key3))
138 }
139
140 fn clear_prefix(key1: Self::Key1, key2: Self::Key2) {
141 let _ = $storage::<T>::clear_prefix((key1, key2), u32::MAX, None);
142 }
143
144 fn iter_prefix(
145 key1: &Self::Key1,
146 key2: &Self::Key2,
147 ) -> impl Iterator<Item = (Self::Key3, Self::Value)> {
148 $storage::<T>::iter_prefix((key1, key2))
149 }
150 }
151 };
152}