8 releases
0.1.7 | Oct 12, 2024 |
---|---|
0.1.6 | Sep 28, 2024 |
0.1.5 | Jul 19, 2024 |
0.1.4 | Jun 22, 2024 |
0.1.2 | Mar 29, 2022 |
#105 in Concurrency
33,570 downloads per month
Used in 20 crates
(12 directly)
20KB
292 lines
Append-only-vec
Note: currently there are frequent CI failures above, which are simply due to failure to install miri to run the test. The tests do pass when run locally.
This crate defines a single data simple structure, which is a vector to which you can only append data. It allows you to push new data values even when there are outstanding references to elements of the AppendOnlyVec
. Reading from a AppendOnlyVec
is much faster than if it had been protected by a std::sync::RwLock
.
lib.rs
:
AppendOnlyVec
This is a pretty simple type, which is a vector that you can push into, but cannot modify the elements of. The data structure never moves an element once allocated, so you can push to the vec even while holding references to elements that have already been pushed.
Scaling
-
Accessing an element is O(1), but slightly more expensive than for a standard
Vec
. -
Pushing a new element amortizes to O(1), but may require allocation of a new chunk.
Example
use append_only_vec::AppendOnlyVec;
static V: AppendOnlyVec<String> = AppendOnlyVec::<String>::new();
let mut threads = Vec::new();
for thread_num in 0..10 {
threads.push(std::thread::spawn(move || {
for n in 0..100 {
let s = format!("thread {} says {}", thread_num, n);
let which = V.push(s.clone());
assert_eq!(&V[which], &s);
}
}));
}
for t in threads {
t.join();
}
assert_eq!(V.len(), 1000);