1use crate::substrate::{self, DefaultMemoryImpl, Memory};
9pub use crate::{BTreeMap, Comparator, Config, Entry, Error, Lexicographic, Range};
10use ic_memory::RuntimeMemory;
11use std::ops::RangeBounds;
12pub use substrate::{Storable, storable};
13
14pub struct StableBTreeMap<K: Storable + Ord + Clone, V: Storable, M: Memory = DefaultMemoryImpl> {
16 inner: substrate::BTreeMap<K, V, RuntimeMemory<M>>,
17}
18impl<K: Storable + Ord + Clone, V: Storable, M: Memory> StableBTreeMap<K, V, M> {
19 pub fn new(memory: RuntimeMemory<M>) -> Self {
21 Self {
22 inner: substrate::BTreeMap::new(memory),
23 }
24 }
25 pub fn init(memory: RuntimeMemory<M>) -> Self {
27 Self {
28 inner: substrate::BTreeMap::init(memory),
29 }
30 }
31 pub fn load(memory: RuntimeMemory<M>) -> Self {
33 Self {
34 inner: substrate::BTreeMap::load(memory),
35 }
36 }
37 pub fn insert(&mut self, key: K, value: V) -> Option<V> {
39 self.inner.insert(key, value)
40 }
41 pub fn get(&self, key: &K) -> Option<V> {
43 self.inner.get(key)
44 }
45 pub fn contains_key(&self, key: &K) -> bool {
47 self.inner.contains_key(key)
48 }
49 pub fn is_empty(&self) -> bool {
51 self.inner.is_empty()
52 }
53 pub fn len(&self) -> u64 {
55 self.inner.len()
56 }
57 pub fn remove(&mut self, key: &K) -> Option<V> {
59 self.inner.remove(key)
60 }
61 pub fn first_key_value(&self) -> Option<(K, V)> {
63 self.inner.first_key_value()
64 }
65 pub fn last_key_value(&self) -> Option<(K, V)> {
67 self.inner.last_key_value()
68 }
69 pub fn pop_first(&mut self) -> Option<(K, V)> {
71 self.inner.pop_first()
72 }
73 pub fn pop_last(&mut self) -> Option<(K, V)> {
75 self.inner.pop_last()
76 }
77 pub fn iter(&self) -> MapIter<'_, K, V, M> {
79 self.inner.iter()
80 }
81 pub fn range(&self, key_range: impl RangeBounds<K>) -> MapIter<'_, K, V, M> {
83 self.inner.range(key_range)
84 }
85 pub fn keys(&self) -> impl DoubleEndedIterator<Item = K> + '_ {
87 self.inner.keys()
88 }
89 pub fn values(&self) -> impl DoubleEndedIterator<Item = V> + '_ {
91 self.inner.values()
92 }
93}
94
95pub struct StableBTreeSet<K: Storable + Ord + Clone, M: Memory = DefaultMemoryImpl> {
97 inner: substrate::BTreeSet<K, RuntimeMemory<M>>,
98}
99impl<K: Storable + Ord + Clone, M: Memory> StableBTreeSet<K, M> {
100 pub fn new(memory: RuntimeMemory<M>) -> Self {
102 Self {
103 inner: substrate::BTreeSet::new(memory),
104 }
105 }
106 pub fn init(memory: RuntimeMemory<M>) -> Self {
108 Self {
109 inner: substrate::BTreeSet::init(memory),
110 }
111 }
112 pub fn load(memory: RuntimeMemory<M>) -> Self {
114 Self {
115 inner: substrate::BTreeSet::load(memory),
116 }
117 }
118 pub fn insert(&mut self, key: K) -> bool {
120 self.inner.insert(key)
121 }
122 pub fn contains(&self, key: &K) -> bool {
124 self.inner.contains(key)
125 }
126 pub fn is_empty(&self) -> bool {
128 self.inner.is_empty()
129 }
130 pub fn len(&self) -> u64 {
132 self.inner.len()
133 }
134 pub fn remove(&mut self, key: &K) -> bool {
136 self.inner.remove(key)
137 }
138 pub fn first(&self) -> Option<K> {
140 self.inner.first()
141 }
142 pub fn last(&self) -> Option<K> {
144 self.inner.last()
145 }
146 pub fn pop_first(&mut self) -> Option<K> {
148 self.inner.pop_first()
149 }
150 pub fn pop_last(&mut self) -> Option<K> {
152 self.inner.pop_last()
153 }
154 pub fn iter(&self) -> SetIter<'_, K, M> {
156 self.inner.iter()
157 }
158 pub fn range(&self, key_range: impl RangeBounds<K>) -> SetIter<'_, K, M> {
160 self.inner.range(key_range)
161 }
162 pub fn clear(&mut self) {
164 self.inner.clear();
165 }
166}
167
168pub struct StableCell<T: Storable, M: Memory = DefaultMemoryImpl> {
170 inner: substrate::Cell<T, RuntimeMemory<M>>,
171}
172impl<T: Storable, M: Memory> StableCell<T, M> {
173 pub fn new(memory: RuntimeMemory<M>, value: T) -> Self {
175 Self {
176 inner: substrate::Cell::new(memory, value),
177 }
178 }
179 pub fn init(memory: RuntimeMemory<M>, default_value: T) -> Self {
181 Self {
182 inner: substrate::Cell::init(memory, default_value),
183 }
184 }
185 pub fn get(&self) -> &T {
187 self.inner.get()
188 }
189 pub fn set(&mut self, value: T) -> T {
191 self.inner.set(value)
192 }
193}
194
195pub struct StableVec<T: Storable, M: Memory = DefaultMemoryImpl> {
197 inner: substrate::Vec<T, RuntimeMemory<M>>,
198}
199impl<T: Storable, M: Memory> StableVec<T, M> {
200 pub fn new(memory: RuntimeMemory<M>) -> Self {
202 Self {
203 inner: substrate::Vec::new(memory),
204 }
205 }
206 pub fn init(memory: RuntimeMemory<M>) -> Self {
208 Self {
209 inner: substrate::Vec::init(memory),
210 }
211 }
212 pub fn get(&self, index: u64) -> Option<T> {
214 self.inner.get(index)
215 }
216 pub fn set(&self, index: u64, item: &T) {
218 self.inner.set(index, item);
219 }
220 pub fn push(&self, item: &T) {
222 self.inner.push(item);
223 }
224 pub fn pop(&self) -> Option<T> {
226 self.inner.pop()
227 }
228 pub fn len(&self) -> u64 {
230 self.inner.len()
231 }
232 pub fn is_empty(&self) -> bool {
234 self.inner.is_empty()
235 }
236 pub fn iter(&self) -> impl DoubleEndedIterator<Item = T> + '_ {
238 self.inner.iter()
239 }
240}
241
242pub struct StableMinHeap<T: Storable + Ord, M: Memory = DefaultMemoryImpl> {
244 inner: substrate::MinHeap<T, RuntimeMemory<M>>,
245}
246impl<T: Storable + Ord, M: Memory> StableMinHeap<T, M> {
247 pub fn new(memory: RuntimeMemory<M>) -> Self {
249 Self {
250 inner: substrate::MinHeap::new(memory),
251 }
252 }
253 pub fn init(memory: RuntimeMemory<M>) -> Self {
255 Self {
256 inner: substrate::MinHeap::init(memory),
257 }
258 }
259 pub fn push(&mut self, item: &T) {
261 self.inner.push(item);
262 }
263 pub fn pop(&mut self) -> Option<T> {
265 self.inner.pop()
266 }
267 pub fn peek(&self) -> Option<T> {
269 self.inner.peek()
270 }
271 pub fn len(&self) -> u64 {
273 self.inner.len()
274 }
275 pub fn is_empty(&self) -> bool {
277 self.inner.is_empty()
278 }
279 pub fn iter(&self) -> impl Iterator<Item = T> + '_ {
281 self.inner.iter()
282 }
283}
284
285pub struct StableLog<T: Storable, M: Memory = DefaultMemoryImpl> {
287 inner: substrate::Log<T, RuntimeMemory<M>, RuntimeMemory<M>>,
288}
289impl<T: Storable, M: Memory> StableLog<T, M> {
290 pub fn new(index_memory: RuntimeMemory<M>, data_memory: RuntimeMemory<M>) -> Self {
292 Self {
293 inner: substrate::Log::new(index_memory, data_memory),
294 }
295 }
296 pub fn init(index_memory: RuntimeMemory<M>, data_memory: RuntimeMemory<M>) -> Self {
298 Self {
299 inner: substrate::Log::init(index_memory, data_memory),
300 }
301 }
302 pub fn first(&self) -> Option<T> {
304 self.inner.first()
305 }
306 pub fn last(&self) -> Option<T> {
308 self.inner.last()
309 }
310 pub fn get(&self, idx: u64) -> Option<T> {
312 self.inner.get(idx)
313 }
314 pub fn len(&self) -> u64 {
316 self.inner.len()
317 }
318 pub fn is_empty(&self) -> bool {
320 self.inner.is_empty()
321 }
322 pub fn append(&self, item: &T) -> Result<u64, LogWriteError> {
326 self.inner.append(item)
327 }
328 pub fn iter(&self) -> LogIter<'_, T, M> {
330 self.inner.iter()
331 }
332}
333
334pub type MapIter<'a, K, V, M = DefaultMemoryImpl> =
336 substrate::btreemap::Iter<'a, K, V, RuntimeMemory<M>>;
337pub type SetIter<'a, K, M = DefaultMemoryImpl> = substrate::btreeset::Iter<'a, K, RuntimeMemory<M>>;
339pub type LogIter<'a, T, M = DefaultMemoryImpl> =
341 substrate::log::Iter<'a, T, RuntimeMemory<M>, RuntimeMemory<M>>;
342
343pub use substrate::cell::{InitError as CellInitError, ValueError as CellValueError};
344pub use substrate::log::{InitError as LogInitError, NoSuchEntry, WriteError as LogWriteError};
345pub use substrate::vec::InitError as VecInitError;
346
347impl<'a, K: Storable + Ord + Clone, V: Storable, M: Memory> IntoIterator
348 for &'a StableBTreeMap<K, V, M>
349{
350 type Item = <MapIter<'a, K, V, M> as Iterator>::Item;
351 type IntoIter = MapIter<'a, K, V, M>;
352 fn into_iter(self) -> Self::IntoIter {
353 self.iter()
354 }
355}
356
357impl<'a, K: Storable + Ord + Clone, M: Memory> IntoIterator for &'a StableBTreeSet<K, M> {
358 type Item = K;
359 type IntoIter = SetIter<'a, K, M>;
360 fn into_iter(self) -> Self::IntoIter {
361 self.iter()
362 }
363}
364
365impl<'a, T: Storable, M: Memory> IntoIterator for &'a StableLog<T, M> {
366 type Item = T;
367 type IntoIter = LogIter<'a, T, M>;
368 fn into_iter(self) -> Self::IntoIter {
369 self.iter()
370 }
371}