compressed/
compressed.rs

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}