1use crate::substrate::{self, DefaultMemoryImpl, Memory};
10pub use crate::{BTreeMap, Comparator, Config, Entry, Error, Lexicographic, Range};
11use ic_memory::RuntimeMemory;
12use std::ops::RangeBounds;
13pub use substrate::{Storable, storable};
14
15pub struct StableBTreeMap<K: Storable + Ord + Clone, V: Storable, M: Memory = DefaultMemoryImpl> {
17 inner: substrate::BTreeMap<K, V, RuntimeMemory<M>>,
18}
19impl<K: Storable + Ord + Clone, V: Storable, M: Memory> StableBTreeMap<K, V, M> {
20 pub fn new(memory: RuntimeMemory<M>) -> Self {
22 Self {
23 inner: substrate::BTreeMap::new(memory),
24 }
25 }
26 pub fn init(memory: RuntimeMemory<M>) -> Self {
28 Self {
29 inner: substrate::BTreeMap::init(memory),
30 }
31 }
32 pub fn load(memory: RuntimeMemory<M>) -> Self {
34 Self {
35 inner: substrate::BTreeMap::load(memory),
36 }
37 }
38 pub fn insert(&mut self, key: K, value: V) -> Option<V> {
40 self.inner.insert(key, value)
41 }
42 pub fn get(&self, key: &K) -> Option<V> {
44 self.inner.get(key)
45 }
46 pub fn contains_key(&self, key: &K) -> bool {
48 self.inner.contains_key(key)
49 }
50 pub fn is_empty(&self) -> bool {
52 self.inner.is_empty()
53 }
54 pub fn len(&self) -> u64 {
56 self.inner.len()
57 }
58 pub fn remove(&mut self, key: &K) -> Option<V> {
60 self.inner.remove(key)
61 }
62 pub fn first_key_value(&self) -> Option<(K, V)> {
64 self.inner.first_key_value()
65 }
66 pub fn last_key_value(&self) -> Option<(K, V)> {
68 self.inner.last_key_value()
69 }
70 pub fn pop_first(&mut self) -> Option<(K, V)> {
72 self.inner.pop_first()
73 }
74 pub fn pop_last(&mut self) -> Option<(K, V)> {
76 self.inner.pop_last()
77 }
78 pub fn iter(&self) -> MapIter<'_, K, V, M> {
80 self.inner.iter()
81 }
82 pub fn range(&self, key_range: impl RangeBounds<K>) -> MapIter<'_, K, V, M> {
84 self.inner.range(key_range)
85 }
86 pub fn keys(&self) -> impl DoubleEndedIterator<Item = K> + '_ {
88 self.inner.keys()
89 }
90 pub fn values(&self) -> impl DoubleEndedIterator<Item = V> + '_ {
92 self.inner.values()
93 }
94}
95
96pub struct StableBTreeSet<K: Storable + Ord + Clone, M: Memory = DefaultMemoryImpl> {
98 inner: substrate::BTreeSet<K, RuntimeMemory<M>>,
99}
100impl<K: Storable + Ord + Clone, M: Memory> StableBTreeSet<K, M> {
101 pub fn new(memory: RuntimeMemory<M>) -> Self {
103 Self {
104 inner: substrate::BTreeSet::new(memory),
105 }
106 }
107 pub fn init(memory: RuntimeMemory<M>) -> Self {
109 Self {
110 inner: substrate::BTreeSet::init(memory),
111 }
112 }
113 pub fn load(memory: RuntimeMemory<M>) -> Self {
115 Self {
116 inner: substrate::BTreeSet::load(memory),
117 }
118 }
119 pub fn insert(&mut self, key: K) -> bool {
121 self.inner.insert(key)
122 }
123 pub fn contains(&self, key: &K) -> bool {
125 self.inner.contains(key)
126 }
127 pub fn is_empty(&self) -> bool {
129 self.inner.is_empty()
130 }
131 pub fn len(&self) -> u64 {
133 self.inner.len()
134 }
135 pub fn remove(&mut self, key: &K) -> bool {
137 self.inner.remove(key)
138 }
139 pub fn first(&self) -> Option<K> {
141 self.inner.first()
142 }
143 pub fn last(&self) -> Option<K> {
145 self.inner.last()
146 }
147 pub fn pop_first(&mut self) -> Option<K> {
149 self.inner.pop_first()
150 }
151 pub fn pop_last(&mut self) -> Option<K> {
153 self.inner.pop_last()
154 }
155 pub fn iter(&self) -> SetIter<'_, K, M> {
157 self.inner.iter()
158 }
159 pub fn range(&self, key_range: impl RangeBounds<K>) -> SetIter<'_, K, M> {
161 self.inner.range(key_range)
162 }
163 pub fn clear(&mut self) {
165 self.inner.clear();
166 }
167}
168
169pub struct StableCell<T: Storable, M: Memory = DefaultMemoryImpl> {
171 inner: substrate::Cell<T, RuntimeMemory<M>>,
172}
173impl<T: Storable, M: Memory> StableCell<T, M> {
174 pub fn new(memory: RuntimeMemory<M>, value: T) -> Self {
176 Self {
177 inner: substrate::Cell::new(memory, value),
178 }
179 }
180 pub fn init(memory: RuntimeMemory<M>, default_value: T) -> Self {
182 Self {
183 inner: substrate::Cell::init(memory, default_value),
184 }
185 }
186 pub fn get(&self) -> &T {
188 self.inner.get()
189 }
190 pub fn set(&mut self, value: T) -> T {
192 self.inner.set(value)
193 }
194}
195
196pub struct StableVec<T: Storable, M: Memory = DefaultMemoryImpl> {
198 inner: substrate::Vec<T, RuntimeMemory<M>>,
199}
200impl<T: Storable, M: Memory> StableVec<T, M> {
201 pub fn new(memory: RuntimeMemory<M>) -> Self {
203 Self {
204 inner: substrate::Vec::new(memory),
205 }
206 }
207 pub fn init(memory: RuntimeMemory<M>) -> Self {
209 Self {
210 inner: substrate::Vec::init(memory),
211 }
212 }
213 pub fn get(&self, index: u64) -> Option<T> {
215 self.inner.get(index)
216 }
217 pub fn set(&self, index: u64, item: &T) {
219 self.inner.set(index, item);
220 }
221 pub fn push(&self, item: &T) {
223 self.inner.push(item);
224 }
225 pub fn pop(&self) -> Option<T> {
227 self.inner.pop()
228 }
229 pub fn len(&self) -> u64 {
231 self.inner.len()
232 }
233 pub fn is_empty(&self) -> bool {
235 self.inner.is_empty()
236 }
237 pub fn iter(&self) -> impl DoubleEndedIterator<Item = T> + '_ {
239 self.inner.iter()
240 }
241}
242
243pub struct StableMinHeap<T: Storable + Ord, M: Memory = DefaultMemoryImpl> {
245 inner: substrate::MinHeap<T, RuntimeMemory<M>>,
246}
247impl<T: Storable + Ord, M: Memory> StableMinHeap<T, M> {
248 pub fn new(memory: RuntimeMemory<M>) -> Self {
250 Self {
251 inner: substrate::MinHeap::new(memory),
252 }
253 }
254 pub fn init(memory: RuntimeMemory<M>) -> Self {
256 Self {
257 inner: substrate::MinHeap::init(memory),
258 }
259 }
260 pub fn push(&mut self, item: &T) {
262 self.inner.push(item);
263 }
264 pub fn pop(&mut self) -> Option<T> {
266 self.inner.pop()
267 }
268 pub fn peek(&self) -> Option<T> {
270 self.inner.peek()
271 }
272 pub fn len(&self) -> u64 {
274 self.inner.len()
275 }
276 pub fn is_empty(&self) -> bool {
278 self.inner.is_empty()
279 }
280 pub fn iter(&self) -> impl Iterator<Item = T> + '_ {
282 self.inner.iter()
283 }
284}
285
286pub struct StableLog<T: Storable, M: Memory = DefaultMemoryImpl> {
288 inner: substrate::Log<T, RuntimeMemory<M>, RuntimeMemory<M>>,
289}
290impl<T: Storable, M: Memory> StableLog<T, M> {
291 pub fn new(index_memory: RuntimeMemory<M>, data_memory: RuntimeMemory<M>) -> Self {
293 Self {
294 inner: substrate::Log::new(index_memory, data_memory),
295 }
296 }
297 pub fn init(index_memory: RuntimeMemory<M>, data_memory: RuntimeMemory<M>) -> Self {
299 Self {
300 inner: substrate::Log::init(index_memory, data_memory),
301 }
302 }
303 pub fn first(&self) -> Option<T> {
305 self.inner.first()
306 }
307 pub fn last(&self) -> Option<T> {
309 self.inner.last()
310 }
311 pub fn get(&self, idx: u64) -> Option<T> {
313 self.inner.get(idx)
314 }
315 pub fn len(&self) -> u64 {
317 self.inner.len()
318 }
319 pub fn is_empty(&self) -> bool {
321 self.inner.is_empty()
322 }
323 pub fn append(&self, item: &T) -> Result<u64, LogWriteError> {
327 self.inner.append(item)
328 }
329 pub fn iter(&self) -> LogIter<'_, T, M> {
331 self.inner.iter()
332 }
333}
334
335pub type MapIter<'a, K, V, M = DefaultMemoryImpl> =
337 substrate::btreemap::Iter<'a, K, V, RuntimeMemory<M>>;
338pub type SetIter<'a, K, M = DefaultMemoryImpl> = substrate::btreeset::Iter<'a, K, RuntimeMemory<M>>;
340pub type LogIter<'a, T, M = DefaultMemoryImpl> =
342 substrate::log::Iter<'a, T, RuntimeMemory<M>, RuntimeMemory<M>>;
343
344pub use substrate::log::WriteError as LogWriteError;
345
346impl<'a, K: Storable + Ord + Clone, V: Storable, M: Memory> IntoIterator
347 for &'a StableBTreeMap<K, V, M>
348{
349 type Item = <MapIter<'a, K, V, M> as Iterator>::Item;
350 type IntoIter = MapIter<'a, K, V, M>;
351 fn into_iter(self) -> Self::IntoIter {
352 self.iter()
353 }
354}
355
356impl<'a, K: Storable + Ord + Clone, M: Memory> IntoIterator for &'a StableBTreeSet<K, M> {
357 type Item = K;
358 type IntoIter = SetIter<'a, K, M>;
359 fn into_iter(self) -> Self::IntoIter {
360 self.iter()
361 }
362}
363
364impl<'a, T: Storable, M: Memory> IntoIterator for &'a StableLog<T, M> {
365 type Item = T;
366 type IntoIter = LogIter<'a, T, M>;
367 fn into_iter(self) -> Self::IntoIter {
368 self.iter()
369 }
370}