Skip to content

Commit a77f17a

Browse files
authored
give NoAllocSegmentTableInfo public visibility (#489)
1 parent cdc54a3 commit a77f17a

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

capnp/src/serialize.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
//! where each message is preceded by a segment table indicating the size of its segments.
2525
2626
pub(crate) mod no_alloc_buffer_segments;
27-
pub use no_alloc_buffer_segments::{NoAllocBufferSegments, NoAllocSliceSegments};
27+
pub use no_alloc_buffer_segments::{
28+
NoAllocBufferSegments, NoAllocSegmentTableInfo, NoAllocSliceSegments,
29+
};
2830

2931
use crate::io::{Read, Write};
3032

@@ -393,13 +395,13 @@ where
393395
}
394396
read.read_exact(&mut buffer[start..end])?;
395397

396-
let info = no_alloc_buffer_segments::ReadSegmentTableResult {
398+
let info = no_alloc_buffer_segments::NoAllocSegmentTableInfo {
397399
segments_count: segment_count,
398400
segment_table_length_bytes: (num_segment_counts_read + 1) * 4,
399401
total_segments_length_bytes: total_body_words * 8,
400402
};
401403

402-
let segments = NoAllocSliceSegments::from_segment_table(buffer, info);
404+
let segments = NoAllocSliceSegments::from_segment_table_info(buffer, info);
403405
Ok(Some(crate::message::Reader::new(segments, options)))
404406
}
405407

capnp/src/serialize/no_alloc_buffer_segments.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ use super::SEGMENTS_COUNT_LIMIT;
77

88
const U32_LEN_IN_BYTES: usize = core::mem::size_of::<u32>();
99

10-
pub(crate) struct ReadSegmentTableResult {
10+
/// Information about a message read from its segment table.
11+
pub struct NoAllocSegmentTableInfo {
12+
/// The number of segments in the message.
1113
pub segments_count: usize,
14+
15+
/// The number of bytes in the segment table.
1216
pub segment_table_length_bytes: usize,
17+
18+
/// The total number of bytes in all segments of the message.
1319
pub total_segments_length_bytes: usize,
1420
}
1521

16-
fn read_segment_table(slice: &[u8], options: ReaderOptions) -> Result<ReadSegmentTableResult> {
22+
fn read_segment_table(slice: &[u8], options: ReaderOptions) -> Result<NoAllocSegmentTableInfo> {
1723
let mut remaining = slice;
1824

1925
verify_alignment(remaining.as_ptr())?;
@@ -74,7 +80,7 @@ fn read_segment_table(slice: &[u8], options: ReaderOptions) -> Result<ReadSegmen
7480
)));
7581
}
7682

77-
Ok(ReadSegmentTableResult {
83+
Ok(NoAllocSegmentTableInfo {
7884
segments_count,
7985
segment_table_length_bytes: expected_data_offset,
8086
total_segments_length_bytes,
@@ -111,7 +117,11 @@ pub struct NoAllocBufferSegments<T> {
111117
}
112118

113119
impl<T> NoAllocBufferSegments<T> {
114-
pub(crate) fn from_segment_table(buffer: T, info: ReadSegmentTableResult) -> Self {
120+
/// Constructs a NoAllocBufferSegments from a buffer and a [`NoAllocSegmentTableInfo`].
121+
/// This method is used internally by [`NoAllocBufferSegments::from_slice()`]
122+
/// and [`NoAllocBufferSegments::from_buffer()`]. It has been made public to allow for
123+
/// situations where the segment table is read by nonstandard means.
124+
pub fn from_segment_table_info(buffer: T, info: NoAllocSegmentTableInfo) -> Self {
115125
if info.segments_count == 1 {
116126
Self {
117127
buffer,
@@ -144,7 +154,7 @@ impl<'b> NoAllocBufferSegments<&'b [u8]> {
144154
let message = &slice[..message_length];
145155
*slice = &slice[message_length..];
146156

147-
Ok(Self::from_segment_table(message, segment_table_info))
157+
Ok(Self::from_segment_table_info(message, segment_table_info))
148158
}
149159
}
150160

@@ -156,7 +166,7 @@ impl<T: AsRef<[u8]>> NoAllocBufferSegments<T> {
156166
/// Otherwise, `buffer` must be 8-byte aligned (attempts to read the message will trigger errors).
157167
pub fn from_buffer(buffer: T, options: ReaderOptions) -> Result<Self> {
158168
let segment_table_info = read_segment_table(buffer.as_ref(), options)?;
159-
Ok(Self::from_segment_table(buffer, segment_table_info))
169+
Ok(Self::from_segment_table_info(buffer, segment_table_info))
160170
}
161171
}
162172

0 commit comments

Comments
 (0)