1use std::{borrow::Cow, collections::BTreeSet, fs, path::Path};
2
3use vecdb::{
4 AnyStoredVec, AnyVec, CollectableVec, CompressedVec, Database, GenericStoredVec, Stamp,
5 VecIterator, Version,
6};
7
8#[allow(clippy::upper_case_acronyms)]
9type VEC = CompressedVec<usize, u32>;
10
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 let _ = fs::remove_dir_all("compressed");
13
14 let version = Version::TWO;
15
16 let database = Database::open(Path::new("compressed"))?;
17
18 let options = (&database, "vec", version).into();
19
20 {
21 let mut vec: VEC = CompressedVec::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_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
29 assert_eq!(iter.get(1), Some(Cow::Borrowed(&1)));
30 assert_eq!(iter.get(2), Some(Cow::Borrowed(&2)));
31 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
32 assert_eq!(iter.get(21), None);
33 drop(iter);
34
35 vec.flush()?;
36
37 assert_eq!(vec.header().stamp(), Stamp::new(0));
38 }
39
40 {
41 let mut vec: VEC = CompressedVec::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_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
49 assert_eq!(iter.get(1), Some(Cow::Borrowed(&1)));
50 assert_eq!(iter.get(2), Some(Cow::Borrowed(&2)));
51 assert_eq!(iter.get(3), Some(Cow::Borrowed(&3)));
52 assert_eq!(iter.get(4), Some(Cow::Borrowed(&4)));
53 assert_eq!(iter.get(5), Some(Cow::Borrowed(&5)));
54 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
55 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
56 assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
57 drop(iter);
58
59 vec.push(21);
60 vec.push(22);
61
62 assert_eq!(vec.stored_len(), 21);
63 assert_eq!(vec.pushed_len(), 2);
64 assert_eq!(vec.len(), 23);
65
66 let mut iter = vec.into_iter();
67 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
68 assert_eq!(iter.get(21), Some(Cow::Borrowed(&21)));
69 assert_eq!(iter.get(22), Some(Cow::Borrowed(&22)));
70 assert_eq!(iter.get(23), None);
71 drop(iter);
72
73 vec.flush()?;
74 }
75
76 {
77 let mut vec: VEC = CompressedVec::forced_import_with(options)?;
78
79 assert_eq!(vec.header().stamp(), Stamp::new(100));
80
81 assert_eq!(vec.stored_len(), 23);
82 assert_eq!(vec.pushed_len(), 0);
83 assert_eq!(vec.len(), 23);
84
85 let mut iter = vec.into_iter();
86 assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
87 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
88 assert_eq!(iter.get(21), Some(Cow::Borrowed(&21)));
89 assert_eq!(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 vec.flush()?;
116
117 assert_eq!(
118 vec.into_iter()
119 .map(|(_, v)| v.into_owned())
120 .collect::<Vec<_>>(),
121 vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
122 );
123 }
124
125 {
126 let mut vec: VEC = CompressedVec::forced_import_with(options)?;
127
128 assert_eq!(
129 vec.into_iter()
130 .map(|(_, v)| v.into_owned())
131 .collect::<Vec<_>>(),
132 vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
133 );
134
135 let mut iter = vec.into_iter();
136 assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
137 assert_eq!(iter.get(5), Some(Cow::Borrowed(&5)));
138 assert_eq!(iter.get(20), None);
139 drop(iter);
140
141 assert_eq!(
142 vec.collect_signed_range(Some(-5), None)?,
143 vec![10, 11, 12, 13, 14]
144 );
145
146 vec.reset()?;
147
148 assert_eq!(vec.pushed_len(), 0);
149 assert_eq!(vec.stored_len(), 0);
150 assert_eq!(vec.len(), 0);
151
152 (0..21_u32).for_each(|v| {
153 vec.push(v);
154 });
155
156 assert_eq!(vec.pushed_len(), 21);
157 assert_eq!(vec.stored_len(), 0);
158 assert_eq!(vec.len(), 21);
159
160 let mut iter = vec.into_iter();
161 assert_eq!(iter.get(0), Some(Cow::Borrowed(&0)));
162 assert_eq!(iter.get(20), Some(Cow::Borrowed(&20)));
163 assert_eq!(iter.get(21), None);
164 drop(iter);
165
166 vec.flush()?;
167 }
168
169 {
170 let mut vec: VEC = CompressedVec::forced_import_with(options)?;
171
172 assert_eq!(vec.pushed_len(), 0);
173 assert_eq!(vec.stored_len(), 21);
174 assert_eq!(vec.len(), 21);
175
176 let reader = vec.create_static_reader();
177 assert_eq!(vec.holes(), &BTreeSet::new());
178 assert_eq!(vec.get_or_read(0, &reader)?, Some(Cow::Borrowed(&0)));
179 assert_eq!(vec.get_or_read(10, &reader)?, Some(Cow::Borrowed(&10)));
180 drop(reader);
181
182 vec.flush()?;
183 }
184
185 {
186 let vec: VEC = CompressedVec::forced_import_with(options)?;
187
188 assert!(
189 vec.collect()?
190 == vec![
191 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
192 ]
193 );
194 }
195
196 Ok(())
197}