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}