Skip to content

Commit b5fc561

Browse files
authored
Improve vortex-buffer Debug repr (#1901)
1 parent 14c52b0 commit b5fc561

File tree

4 files changed

+35
-26
lines changed

4 files changed

+35
-26
lines changed

vortex-buffer/src/buffer.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use std::any::type_name;
12
use std::collections::Bound;
23
use std::fmt::{Debug, Formatter};
34
use std::ops::{Deref, RangeBounds};
45

56
use bytes::{Buf, Bytes};
67
use vortex_error::{vortex_panic, VortexExpect};
78

9+
use crate::debug::TruncatedDebug;
810
use crate::{Alignment, BufferMut, ByteBuffer};
911

1012
/// An immutable buffer of items of `T`.
@@ -281,21 +283,13 @@ impl<T> Buffer<T> {
281283
}
282284
}
283285

284-
impl<T> Debug for Buffer<T> {
286+
impl<T: Debug> Debug for Buffer<T> {
285287
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
286-
const TRUNC_SIZE: usize = 512;
287-
let mut binding = f.debug_struct("Buffer");
288-
let mut fields = binding
288+
f.debug_struct(&format!("Buffer<{}>", type_name::<T>()))
289289
.field("length", &self.length)
290-
.field("alignment", &self.alignment);
291-
292-
let mut bytes = self.bytes.clone();
293-
if bytes.len() > TRUNC_SIZE {
294-
fields = fields.field("truncated", &true);
295-
}
296-
297-
bytes.truncate(TRUNC_SIZE);
298-
fields.field("bytes", &bytes).finish()
290+
.field("alignment", &self.alignment)
291+
.field("as_slice", &TruncatedDebug(self.as_slice()))
292+
.finish()
299293
}
300294
}
301295

vortex-buffer/src/buffer_mut.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use core::mem::MaybeUninit;
2+
use std::any::type_name;
23
use std::fmt::{Debug, Formatter};
34
use std::ops::{Deref, DerefMut};
45

56
use bytes::buf::UninitSlice;
67
use bytes::{Buf, BufMut, BytesMut};
78
use vortex_error::{vortex_panic, VortexExpect};
89

10+
use crate::debug::TruncatedDebug;
911
use crate::{Alignment, Buffer, ByteBufferMut};
1012

1113
/// A mutable buffer that maintains a runtime-defined alignment through resizing operations.
@@ -338,21 +340,13 @@ impl<T> Clone for BufferMut<T> {
338340
}
339341
}
340342

341-
impl<T> Debug for BufferMut<T> {
343+
impl<T: Debug> Debug for BufferMut<T> {
342344
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
343-
const TRUNC_SIZE: usize = 512;
344-
let mut binding = f.debug_struct("Buffer");
345-
let mut fields = binding
345+
f.debug_struct(&format!("BufferMut<{}>", type_name::<T>()))
346346
.field("length", &self.length)
347-
.field("alignment", &self.alignment);
348-
349-
let mut bytes = self.bytes.clone();
350-
if bytes.len() > TRUNC_SIZE {
351-
fields = fields.field("truncated", &true);
352-
}
353-
354-
bytes.truncate(TRUNC_SIZE);
355-
fields.field("bytes", &bytes).finish()
347+
.field("alignment", &self.alignment)
348+
.field("as_slice", &TruncatedDebug(self.as_slice()))
349+
.finish()
356350
}
357351
}
358352

vortex-buffer/src/debug.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::fmt::{Debug, Formatter};
2+
3+
/// A wrapper around a slice that truncates the debug output if it is too long.
4+
pub(crate) struct TruncatedDebug<'a, T>(pub(crate) &'a [T]);
5+
6+
impl<T: Debug> Debug for TruncatedDebug<'_, T> {
7+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
8+
const TRUNC_SIZE: usize = 16;
9+
if self.0.len() <= TRUNC_SIZE {
10+
write!(f, "{:?}", self.0)
11+
} else {
12+
write!(f, "[")?;
13+
for elem in self.0.iter().take(TRUNC_SIZE) {
14+
write!(f, "{:?}, ", *elem)?;
15+
}
16+
write!(f, "...")?;
17+
write!(f, "]")
18+
}
19+
}
20+
}

vortex-buffer/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ mod buffer;
5757
mod buffer_mut;
5858
mod bytes;
5959
mod r#const;
60+
mod debug;
6061
mod macros;
6162
mod string;
6263

0 commit comments

Comments
 (0)