From cece955a9e356f28c223c541eed948cf13c9c540 Mon Sep 17 00:00:00 2001 From: soruh Date: Fri, 31 Jul 2026 03:26:28 +0200 Subject: [PATCH] Implement safe metadata Debug output --- src/guard.rs | 12 ++++++++++++ src/lib.rs | 12 ++++++++++++ src/send.rs | 12 ++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/guard.rs b/src/guard.rs index 5e23cea..56f9069 100644 --- a/src/guard.rs +++ b/src/guard.rs @@ -1,4 +1,5 @@ use crate::TypeErasedVec; +use std::fmt; use std::marker::PhantomData; use std::mem::ManuallyDrop; @@ -11,6 +12,17 @@ pub struct ContentGuard<'vec, T> { _phantom: PhantomData, } +impl fmt::Debug for ContentGuard<'_, T> { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("ContentGuard") + .field("layout", &self.erased.layout()) + .field("length", &self.erased.length()) + .field("capacity", &self.erased.capacity()) + .finish() + } +} + impl<'vec, T> ContentGuard<'vec, T> { pub(crate) fn new_scoped(erased: &'vec mut TypeErasedVec) -> Self { debug_assert!(!std::mem::needs_drop::()); diff --git a/src/lib.rs b/src/lib.rs index 12e8981..1ca253d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ pub use guard::ContentGuard; pub use send::{SendSyncTypeErasedVec, SendTypeErasedVec, SendableTypeErasedVec}; use std::alloc::Layout; +use std::fmt; use vtable::TypeErasedVecVtable; use crate::parts::VecParts; @@ -50,6 +51,17 @@ pub struct TypeErasedVec { pub(crate) vtable: TypeErasedVecVtable, } +impl fmt::Debug for TypeErasedVec { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("TypeErasedVec") + .field("layout", &self.layout) + .field("length", &self.parts.len) + .field("capacity", &self.parts.cap) + .finish() + } +} + impl TypeErasedVec { /// Type erase the underlying Capacity of a `Vec` remembering the `Layout` it was allocated with. /// Elements inside the `Vec` are retained. diff --git a/src/send.rs b/src/send.rs index d670e17..0b69809 100644 --- a/src/send.rs +++ b/src/send.rs @@ -1,5 +1,6 @@ use crate::{ContentGuard, TypeErasedVec}; use std::alloc::Layout; +use std::fmt; macro_rules! define_thread_safe_erased_vec { ( @@ -10,6 +11,17 @@ macro_rules! define_thread_safe_erased_vec { $(#[$meta])* pub struct $name(TypeErasedVec); + impl fmt::Debug for $name { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter + .debug_struct(stringify!($name)) + .field("layout", &self.0.layout()) + .field("length", &self.0.length()) + .field("capacity", &self.0.capacity()) + .finish() + } + } + impl $name { /// Type erase a vector while retaining its elements and allocation. #[must_use]