rustc_query_system/dep_graph/edges.rs
1use std::hash::{Hash, Hasher};
2use std::ops::Deref;
3
4use smallvec::SmallVec;
5
6use crate::dep_graph::DepNodeIndex;
7
8#[derive(Default, Debug)]
9pub(crate) struct EdgesVec {
10    max: u32,
11    edges: SmallVec<[DepNodeIndex; 8]>,
12}
13
14impl Hash for EdgesVec {
15    #[inline]
16    fn hash<H: Hasher>(&self, hasher: &mut H) {
17        Hash::hash(&self.edges, hasher)
18    }
19}
20
21impl EdgesVec {
22    #[inline]
23    pub(crate) fn new() -> Self {
24        Self::default()
25    }
26
27    #[inline]
28    pub(crate) fn push(&mut self, edge: DepNodeIndex) {
29        self.max = self.max.max(edge.as_u32());
30        self.edges.push(edge);
31    }
32
33    #[inline]
34    pub(crate) fn max_index(&self) -> u32 {
35        self.max
36    }
37}
38
39impl Deref for EdgesVec {
40    type Target = [DepNodeIndex];
41
42    #[inline]
43    fn deref(&self) -> &Self::Target {
44        self.edges.as_slice()
45    }
46}
47
48impl FromIterator<DepNodeIndex> for EdgesVec {
49    #[inline]
50    fn from_iter<T>(iter: T) -> Self
51    where
52        T: IntoIterator<Item = DepNodeIndex>,
53    {
54        let mut vec = EdgesVec::new();
55        for index in iter {
56            vec.push(index)
57        }
58        vec
59    }
60}
61
62impl Extend<DepNodeIndex> for EdgesVec {
63    #[inline]
64    fn extend<T>(&mut self, iter: T)
65    where
66        T: IntoIterator<Item = DepNodeIndex>,
67    {
68        for elem in iter {
69            self.push(elem);
70        }
71    }
72}