use crate::dep_graph::DepNodeIndex; use smallvec::SmallVec; use std::hash::{Hash, Hasher}; use std::ops::Deref; #[derive(Default, Debug)] pub(crate) struct EdgesVec { max: u32, edges: SmallVec<[DepNodeIndex; EdgesVec::INLINE_CAPACITY]>, } impl Hash for EdgesVec { #[inline] fn hash(&self, hasher: &mut H) { Hash::hash(&self.edges, hasher) } } impl EdgesVec { pub(crate) const INLINE_CAPACITY: usize = 8; #[inline] pub(crate) fn new() -> Self { Self::default() } #[inline] pub(crate) fn push(&mut self, edge: DepNodeIndex) { self.max = self.max.max(edge.as_u32()); self.edges.push(edge); } #[inline] pub(crate) fn max_index(&self) -> u32 { self.max } } impl Deref for EdgesVec { type Target = [DepNodeIndex]; #[inline] fn deref(&self) -> &Self::Target { self.edges.as_slice() } } impl FromIterator for EdgesVec { #[inline] fn from_iter(iter: T) -> Self where T: IntoIterator, { let mut vec = EdgesVec::new(); for index in iter { vec.push(index) } vec } } impl Extend for EdgesVec { #[inline] fn extend(&mut self, iter: T) where T: IntoIterator, { for elem in iter { self.push(elem); } } }