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 #[must_use]
57 pub const fn is_empty(&self) -> bool {
58 self.inner.is_empty()
59 }
60 #[must_use]
62 pub const 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 #[must_use]
74 pub fn iter(&self) -> SetIter<'_, K, M> {
75 SetIter(self.inner.iter())
76 }
77}
78
79impl<'a, K: Storable + Ord + Clone, M: Memory> IntoIterator for &'a StableBTreeSet<K, M> {
80 type Item = Result<K>;
81 type IntoIter = SetIter<'a, K, M>;
82 fn into_iter(self) -> Self::IntoIter {
83 self.iter()
84 }
85}
86
87pub struct SetIter<'a, K: Storable + Ord + Clone, M: Memory>(MapIter<'a, K, (), M>);
93impl<K: Storable + Ord + Clone, M: Memory> Iterator for SetIter<'_, K, M> {
94 type Item = Result<K>;
95 fn next(&mut self) -> Option<Result<K>> {
96 self.0
97 .next()
98 .map(|entry| entry.map(super::MapEntry::into_key))
99 }
100 fn nth(&mut self, n: usize) -> Option<Self::Item> {
101 self.0
102 .nth(n)
103 .map(|entry| entry.map(super::MapEntry::into_key))
104 }
105 fn count(self) -> usize {
106 self.0.count()
107 }
108 fn last(self) -> Option<Self::Item> {
109 self.0
110 .last()
111 .map(|entry| entry.map(super::MapEntry::into_key))
112 }
113 fn size_hint(&self) -> (usize, Option<usize>) {
114 self.0.size_hint()
115 }
116}
117impl<K: Storable + Ord + Clone, M: Memory> DoubleEndedIterator for SetIter<'_, K, M> {
118 fn next_back(&mut self) -> Option<Result<K>> {
119 self.0
120 .next_back()
121 .map(|entry| entry.map(super::MapEntry::into_key))
122 }
123 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
124 self.0
125 .nth_back(n)
126 .map(|entry| entry.map(super::MapEntry::into_key))
127 }
128}