1use std::{borrow::Cow, collections::BTreeSet, fs, path::Path};
2
3use vecdb::{
4 AnyStoredVec, AnyVec, CollectableVec, Database, GenericStoredVec, RawVec, Stamp, VecIterator,
5 Version,
6};
7
8#[allow(clippy::upper_case_acronyms)]
9type VEC = RawVec<usize, u32>;
10
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 let _ = fs::remove_dir_all("raw");
13
14 let version = Version::TWO;
15
16 let database = Database::open(Path::new("raw"))?;
17
18 let mut options = (&database, "vec", version).into();
19
20 {
21 let mut vec: VEC = RawVec::forced_import_with(options)?;
22
23 (0..21_u32).for_each(|v| {
24 vec.push(v);
25 });
26
27 let mut iter = vec.into_iter();
28 assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
29 assert!(iter.get(1) == Some(Cow::Borrowed(&1)));
30 assert!(iter.get(2) == Some(Cow::Borrowed(&2)));
31 assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
32 assert!(iter.get(21).is_none());
33 drop(iter);
34
35 vec.flush()?;
36
37 assert!(vec.header().stamp() == Stamp::new(0));
38 }
39
40 {
41 let mut vec: VEC = RawVec::forced_import_with(options)?;
42
43 vec.mut_header().update_stamp(Stamp::new(100));
44
45 assert!(vec.header().stamp() == Stamp::new(100));
46
47 let mut iter = vec.into_iter();
48 assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
49 assert!(iter.get(1) == Some(Cow::Borrowed(&1)));
50 assert!(iter.get(2) == Some(Cow::Borrowed(&2)));
51 assert!(iter.get(3) == Some(Cow::Borrowed(&3)));
52 assert!(iter.get(4) == Some(Cow::Borrowed(&4)));
53 assert!(iter.get(5) == Some(Cow::Borrowed(&5)));
54 assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
55 assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
56 assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
57 drop(iter);
58
59 vec.push(21);
60 vec.push(22);
61
62 assert!(vec.stored_len() == 21);
63 assert!(vec.pushed_len() == 2);
64 assert!(vec.len() == 23);
65
66 let mut iter = vec.into_iter();
67 assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
68 assert!(iter.get(21) == Some(Cow::Borrowed(&21)));
69 assert!(iter.get(22) == Some(Cow::Borrowed(&22)));
70 assert!(iter.get(23).is_none());
71 drop(iter);
72
73 vec.flush()?;
74 }
75
76 {
77 let mut vec: VEC = RawVec::forced_import_with(options)?;
78
79 assert!(vec.header().stamp() == Stamp::new(100));
80
81 assert!(vec.stored_len() == 23);
82 assert!(vec.pushed_len() == 0);
83 assert!(vec.len() == 23);
84
85 let mut iter = vec.into_iter();
86 assert!(iter.get(0) == Some(Cow::Borrowed(&0)));
87 assert!(iter.get(20) == Some(Cow::Borrowed(&20)));
88 assert!(iter.get(21) == Some(Cow::Borrowed(&21)));
89 assert!(iter.get(22) == Some(Cow::Borrowed(&22)));
90 drop(iter);
91
92 vec.truncate_if_needed(14)?;
93
94 assert_eq!(vec.stored_len(), 14);
95 assert_eq!(vec.pushed_len(), 0);
96 assert_eq!(vec.len(), 14);
97
98 let mut iter = vec.into_iter();
99 assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
100 assert_eq!(iter.get(5), Some(Cow::Borrowed(&5)));
101 assert_eq!(iter.get(20), None);
102 drop(iter);
103
104 assert_eq!(
105 vec.collect_signed_range(Some(-5), None)?,
106 vec![9, 10, 11, 12, 13]
107 );
108
109 vec.push(vec.len() as u32);
110 assert_eq!(
111 VecIterator::last(vec.into_iter()),
112 Some((14, Cow::Borrowed(&14)))
113 );
114
115 assert_eq!(
116 vec.into_iter()
117 .map(|(_, v)| v.into_owned())
118 .collect::<Vec<_>>(),
119 vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
120 );
121
122 vec.flush()?;
123 }
124
125 {
126 let mut vec: VEC = RawVec::forced_import_with(options)?;
127
128 assert_eq!(
129 VecIterator::last(vec.into_iter()),
130 Some((14, Cow::Borrowed(&14)))
131 );
132
133 assert_eq!(
134 vec.into_iter()
135 .map(|(_, v)| v.into_owned())
136 .collect::<Vec<_>>(),
137 vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
138 );
139
140 vec.reset()?;
141
142 assert_eq!(vec.pushed_len(), 0);
143 assert_eq!(vec.stored_len(), 0);
144 assert_eq!(vec.len(), 0);
145
146 (0..21_u32).for_each(|v| {
147 vec.push(v);
148 });
149
150 assert_eq!(vec.pushed_len(), 21);
151 assert_eq!(vec.stored_len(), 0);
152 assert_eq!(vec.len(), 21);
153
154 let mut iter = vec.into_iter();
155 assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
156 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
157 assert!(iter.get(21).is_none());
158 drop(iter);
159
160 let reader = vec.create_static_reader();
161 assert_eq!(vec.take(10, &reader)?, Some(10));
162 assert_eq!(vec.holes(), &BTreeSet::from([10]));
163 assert!(vec.get_or_read(10, &reader)?.is_none());
164 drop(reader);
165
166 vec.flush()?;
167
168 assert!(vec.holes() == &BTreeSet::from([10]));
169 }
170
171 {
172 let mut vec: VEC = RawVec::forced_import_with(options)?;
173
174 assert!(vec.holes() == &BTreeSet::from([10]));
175
176 let reader = vec.create_static_reader();
177 assert!(vec.get_or_read(10, &reader)?.is_none());
178 drop(reader);
179
180 vec.update(10, 10)?;
181 vec.update(0, 10)?;
182
183 let reader = vec.create_static_reader();
184 assert_eq!(vec.holes(), &BTreeSet::new());
185 assert_eq!(vec.get_or_read(0, &reader)?, Some(Cow::Borrowed(&10)));
186 assert_eq!(vec.get_or_read(10, &reader)?, Some(Cow::Borrowed(&10)));
187 drop(reader);
188
189 vec.flush()?;
190 }
191
192 options = options.with_saved_stamped_changes(10);
193
194 {
195 let mut vec: VEC = RawVec::forced_import_with(options)?;
196
197 assert_eq!(
198 vec.collect()?,
199 vec![
200 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
201 ]
202 );
203
204 vec.truncate_if_needed(10)?;
205
206 let reader = vec.create_static_reader();
207 vec.take(5, &reader)?;
208 vec.update(3, 5)?;
209 vec.push(21);
210 drop(reader);
211
212 assert_eq!(
213 vec.collect_holed()?,
214 vec![
215 Some(10),
216 Some(1),
217 Some(2),
218 Some(5),
219 Some(4),
220 None,
221 Some(6),
222 Some(7),
223 Some(8),
224 Some(9),
225 Some(21)
226 ]
227 );
228
229 vec.stamped_flush(Stamp::new(1))?;
230 }
231
232 {
233 let mut vec: VEC = RawVec::forced_import_with(options)?;
234
235 assert_eq!(vec.collect()?, vec![10, 1, 2, 5, 4]);
236
237 let reader = vec.create_static_reader();
238 vec.take(0, &reader)?;
239 vec.update(1, 5)?;
240 vec.push(5);
241 vec.push(6);
242 vec.push(7);
243 drop(reader);
244
245 assert_eq!(
246 vec.collect_holed()?,
247 vec![
248 None,
249 Some(5),
250 Some(2),
251 Some(5),
252 Some(4),
253 None,
254 Some(6),
255 Some(7),
256 Some(8),
257 Some(9),
258 Some(21),
259 Some(5),
260 Some(6),
261 Some(7)
262 ]
263 );
264
265 vec.stamped_flush(Stamp::new(2))?;
266 }
267
268 {
269 let mut vec: VEC = RawVec::forced_import_with(options)?;
270
271 assert_eq!(
272 vec.collect_holed()?,
273 vec![
274 None,
275 Some(5),
276 Some(2),
277 Some(5),
278 Some(4),
279 None,
280 Some(6),
281 Some(7),
282 Some(8),
283 Some(9),
284 Some(21),
285 Some(5),
286 Some(6),
287 Some(7)
288 ]
289 );
290
291 vec.rollback_stamp(Stamp::new(2))?;
292
293 assert_eq!(
294 vec.collect_holed()?,
295 vec![
296 Some(10),
297 Some(1),
298 Some(2),
299 Some(5),
300 Some(4),
301 None,
302 Some(6),
303 Some(7),
304 Some(8),
305 Some(9),
306 Some(21)
307 ]
308 );
309
310 vec.rollback_stamp(Stamp::new(1))?;
311
312 assert_eq!(
313 vec.collect()?,
314 vec![
315 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
316 ]
317 );
318
319 }
321
322 Ok(())
323}