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; EdgesVec::INLINE_CAPACITY]>,
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    pub(crate) const INLINE_CAPACITY: usize = 8;
23
24    #[inline]
25    pub(crate) fn new() -> Self {
26        Self::default()
27    }
28
29    #[inline]
30    pub(crate) fn push(&mut self, edge: DepNodeIndex) {
31        self.max = self.max.max(edge.as_u32());
32        self.edges.push(edge);
33    }
34
35    #[inline]
36    pub(crate) fn max_index(&self) -> u32 {
37        self.max
38    }
39}
40
41impl Deref for EdgesVec {
42    type Target = [DepNodeIndex];
43
44    #[inline]
45    fn deref(&self) -> &Self::Target {
46        self.edges.as_slice()
47    }
48}
49
50impl FromIterator<DepNodeIndex> for EdgesVec {
51    #[inline]
52    fn from_iter<T>(iter: T) -> Self
53    where
54        T: IntoIterator<Item = DepNodeIndex>,
55    {
56        let mut vec = EdgesVec::new();
57        for index in iter {
58            vec.push(index)
59        }
60        vec
61    }
62}
63
64impl Extend<DepNodeIndex> for EdgesVec {
65    #[inline]
66    fn extend<T>(&mut self, iter: T)
67    where
68        T: IntoIterator<Item = DepNodeIndex>,
69    {
70        for elem in iter {
71            self.push(elem);
72        }
73    }
74}