rustc_data_structures/sync/
vec.rs1use std::marker::PhantomData;
2
3use rustc_index::Idx;
4
5#[derive(#[automatically_derived]
impl<I: ::core::default::Default + Idx, T: ::core::default::Default + Copy>
::core::default::Default for AppendOnlyIndexVec<I, T> {
#[inline]
fn default() -> AppendOnlyIndexVec<I, T> {
AppendOnlyIndexVec {
vec: ::core::default::Default::default(),
_marker: ::core::default::Default::default(),
}
}
}Default)]
6pub struct AppendOnlyIndexVec<I: Idx, T: Copy> {
7 vec: elsa::sync::LockFreeFrozenVec<T>,
8 _marker: PhantomData<fn(&I)>,
9}
10
11impl<I: Idx, T: Copy> AppendOnlyIndexVec<I, T> {
12 pub fn new() -> Self {
13 Self { vec: elsa::sync::LockFreeFrozenVec::new(), _marker: PhantomData }
14 }
15
16 pub fn push(&self, val: T) -> I {
17 let i = self.vec.push(val);
18 I::new(i)
19 }
20
21 pub fn get(&self, i: I) -> Option<T> {
22 let i = i.index();
23 self.vec.get(i)
24 }
25}
26
27#[derive(#[automatically_derived]
impl<T: ::core::default::Default + Copy> ::core::default::Default for
AppendOnlyVec<T> {
#[inline]
fn default() -> AppendOnlyVec<T> {
AppendOnlyVec { vec: ::core::default::Default::default() }
}
}Default)]
28pub struct AppendOnlyVec<T: Copy> {
29 vec: parking_lot::RwLock<Vec<T>>,
30}
31
32impl<T: Copy> AppendOnlyVec<T> {
33 pub fn new() -> Self {
34 Self { vec: Default::default() }
35 }
36
37 pub fn push(&self, val: T) -> usize {
38 let mut v = self.vec.write();
39 let n = v.len();
40 v.push(val);
41 n
42 }
43
44 pub fn get(&self, i: usize) -> Option<T> {
45 self.vec.read().get(i).copied()
46 }
47
48 pub fn iter_enumerated(&self) -> impl Iterator<Item = (usize, T)> {
49 (0..).map_while(|i| Some((i, self.get(i)?)))
50 }
51
52 pub fn iter(&self) -> impl Iterator<Item = T> {
53 (0..).map_while(|i| self.get(i))
54 }
55}
56
57impl<T: Copy + PartialEq> AppendOnlyVec<T> {
58 pub fn contains(&self, val: T) -> bool {
59 self.iter().any(|v| v == val)
60 }
61}
62
63impl<A: Copy> FromIterator<A> for AppendOnlyVec<A> {
64 fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
65 let this = Self::new();
66 for val in iter {
67 this.push(val);
68 }
69 this
70 }
71}