Skip to main content

rustc_data_structures/sync/
vec.rs

1use 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}