ic_storage/adapter/
set.rs1use super::error::{CollectionError as Error, Result, ensure};
3use super::{MapIter, Memory, StableBTreeMap, Storable};
4use crate::DefaultMemoryImpl;
5use crate::RuntimeMemory;
6
7pub struct StableBTreeSet<K: Storable + Ord + Clone, M: Memory = DefaultMemoryImpl> {
9 inner: StableBTreeMap<K, (), M>,
10}
11impl<K: Storable + Ord + Clone, M: Memory> StableBTreeSet<K, M> {
12 pub fn create(memory: RuntimeMemory<M>) -> Result<Self> {
17 ensure(memory.size() == 0, Error::NotEmpty)?;
18 Self::reset(memory)
19 }
20
21 pub fn reset(memory: RuntimeMemory<M>) -> Result<Self> {
26 Ok(Self {
27 inner: StableBTreeMap::reset(memory)?,
28 })
29 }
30
31 pub fn load(memory: RuntimeMemory<M>) -> Result<Self> {
36 Ok(Self {
37 inner: StableBTreeMap::load(memory)?,
38 })
39 }
40 pub fn insert(&mut self, key: K) -> Result<bool> {
45 Ok(self.inner.insert(key, ())?.is_none())
46 }
47 pub fn contains(&self, key: &K) -> Result<bool> {
52 self.inner.contains_key(key)
53 }
54 pub fn is_empty(&self) -> bool {
59 self.inner.is_empty()
60 }
61 pub fn len(&self) -> u64 {
63 self.inner.len()
64 }
65 pub fn remove(&mut self, key: &K) -> Result<bool> {
70 Ok(self.inner.remove(key)?.is_some())
71 }
72 pub fn iter(&self) -> SetIter<'_, K, M> {
74 SetIter(self.inner.iter())
75 }
76}
77
78impl<'a, K: Storable + Ord + Clone, M: Memory> IntoIterator for &'a StableBTreeSet<K, M> {
79 type Item = Result<K>;
80 type IntoIter = SetIter<'a, K, M>;
81 fn into_iter(self) -> Self::IntoIter {
82 self.iter()
83 }
84}
85
86pub struct SetIter<'a, K: Storable + Ord + Clone, M: Memory>(MapIter<'a, K, (), M>);
92impl<K: Storable + Ord + Clone, M: Memory> Iterator for SetIter<'_, K, M> {
93 type Item = Result<K>;
94 fn next(&mut self) -> Option<Result<K>> {
95 self.0
96 .next()
97 .map(|entry| entry.map(super::MapEntry::into_key))
98 }
99}
100impl<K: Storable + Ord + Clone, M: Memory> DoubleEndedIterator for SetIter<'_, K, M> {
101 fn next_back(&mut self) -> Option<Result<K>> {
102 self.0
103 .next_back()
104 .map(|entry| entry.map(super::MapEntry::into_key))
105 }
106}