toasty_core/stmt/
path_field_set.rs1use bit_set::BitSet;
2use std::ops::{BitAnd, BitOr, BitOrAssign};
3
4#[derive(Debug, Clone, Default, PartialEq, Eq, Hash)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24pub struct PathFieldSet {
25 container: BitSet<u32>,
26}
27
28pub struct PathFieldSetIter<I> {
34 inner: I,
35 len: usize,
36}
37
38impl<I: Iterator<Item = usize>> Iterator for PathFieldSetIter<I> {
39 type Item = usize;
40
41 fn next(&mut self) -> Option<Self::Item> {
42 let result = self.inner.next();
43 if result.is_some() {
44 self.len -= 1;
45 }
46 result
47 }
48
49 fn size_hint(&self) -> (usize, Option<usize>) {
50 (self.len, Some(self.len))
51 }
52}
53
54impl<I: Iterator<Item = usize>> ExactSizeIterator for PathFieldSetIter<I> {}
55
56impl PathFieldSet {
57 pub fn new() -> Self {
59 Self::default()
60 }
61
62 pub fn from_slice<T>(fields: &[T]) -> Self
64 where
65 for<'a> &'a T: Into<usize>,
66 {
67 Self {
68 container: fields.iter().map(Into::into).collect(),
69 }
70 }
71
72 pub fn contains(&self, val: impl Into<usize>) -> bool {
74 self.container.contains(val.into())
75 }
76
77 pub fn iter(&self) -> PathFieldSetIter<impl Iterator<Item = usize> + '_> {
79 PathFieldSetIter {
80 inner: self.container.iter(),
81 len: self.container.count(),
82 }
83 }
84
85 pub fn is_empty(&self) -> bool {
87 self.container.is_empty()
88 }
89
90 pub fn len(&self) -> usize {
92 self.container.count()
93 }
94
95 pub fn insert(&mut self, val: usize) {
97 self.container.insert(val);
98 }
99}
100
101impl BitOr for PathFieldSet {
102 type Output = Self;
103
104 fn bitor(mut self, rhs: Self) -> Self {
105 self.container.union_with(&rhs.container);
106 self
107 }
108}
109
110impl BitOrAssign for PathFieldSet {
111 fn bitor_assign(&mut self, rhs: Self) {
112 self.container.union_with(&rhs.container);
113 }
114}
115
116impl BitAnd for PathFieldSet {
117 type Output = Self;
118
119 fn bitand(mut self, rhs: Self) -> Self {
120 self.container.intersect_with(&rhs.container);
121 self
122 }
123}
124
125impl FromIterator<usize> for PathFieldSet {
126 fn from_iter<T: IntoIterator<Item = usize>>(iter: T) -> Self {
127 Self {
128 container: BitSet::from_iter(iter),
129 }
130 }
131}