};
}
- let mut first = true;
- for idx in set_in_self.iter() {
- let delim = if first {
- "\u{001f}+"
- } else if f.alternate() {
- "\n\u{001f}+"
- } else {
- ", "
- };
+ fmt_diff(&set_in_self, &cleared_in_self, ctxt, f)
+ }
+}
- write!(f, "{}", delim)?;
- idx.fmt_with(ctxt, f)?;
- first = false;
- }
+impl<T, C> DebugWithContext<C> for ChunkedBitSet<T>
+where
+ T: Idx + DebugWithContext<C>,
+{
+ fn fmt_with(&self, ctxt: &C, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_set().entries(self.iter().map(|i| DebugWithAdapter { this: i, ctxt })).finish()
+ }
- if !f.alternate() {
- first = true;
- if !set_in_self.is_empty() && !cleared_in_self.is_empty() {
- write!(f, "\t")?;
- }
- }
+ fn fmt_diff_with(&self, old: &Self, ctxt: &C, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ let size = self.domain_size();
+ assert_eq!(size, old.domain_size());
- for idx in cleared_in_self.iter() {
- let delim = if first {
- "\u{001f}-"
- } else if f.alternate() {
- "\n\u{001f}-"
- } else {
- ", "
- };
+ let mut set_in_self = HybridBitSet::new_empty(size);
+ let mut cleared_in_self = HybridBitSet::new_empty(size);
- write!(f, "{}", delim)?;
- idx.fmt_with(ctxt, f)?;
- first = false;
+ for i in (0..size).map(T::new) {
+ match (self.contains(i), old.contains(i)) {
+ (true, false) => set_in_self.insert(i),
+ (false, true) => cleared_in_self.insert(i),
+ _ => continue,
+ };
}
- Ok(())
+ fmt_diff(&set_in_self, &cleared_in_self, ctxt, f)
}
}
-impl<T, C> DebugWithContext<C> for ChunkedBitSet<T>
+fn fmt_diff<T, C>(
+ inserted: &HybridBitSet<T>,
+ removed: &HybridBitSet<T>,
+ ctxt: &C,
+ f: &mut fmt::Formatter<'_>,
+) -> fmt::Result
where
T: Idx + DebugWithContext<C>,
{
- fn fmt_with(&self, _ctxt: &C, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
- unimplemented!("implement when/if needed");
+ let mut first = true;
+ for idx in inserted.iter() {
+ let delim = if first {
+ "\u{001f}+"
+ } else if f.alternate() {
+ "\n\u{001f}+"
+ } else {
+ ", "
+ };
+
+ write!(f, "{}", delim)?;
+ idx.fmt_with(ctxt, f)?;
+ first = false;
+ }
+
+ if !f.alternate() {
+ first = true;
+ if !inserted.is_empty() && !removed.is_empty() {
+ write!(f, "\t")?;
+ }
}
- fn fmt_diff_with(&self, _old: &Self, _ctxt: &C, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
- unimplemented!("implement when/if needed");
+ for idx in removed.iter() {
+ let delim = if first {
+ "\u{001f}-"
+ } else if f.alternate() {
+ "\n\u{001f}-"
+ } else {
+ ", "
+ };
+
+ write!(f, "{}", delim)?;
+ idx.fmt_with(ctxt, f)?;
+ first = false;
}
+
+ Ok(())
}
impl<T, C> DebugWithContext<C> for &'_ T