1#[cfg(feature = "parquet")]
26use std::io::Seek;
27
28use bytes::{Buf, BufMut, Bytes, BytesMut};
29use internal::SegmentedReader;
30#[cfg(feature = "parquet")]
31use parquet::errors::ParquetError;
32use serde::{Deserialize, Serialize};
33use smallvec::SmallVec;
34
35#[cfg(feature = "parquet")]
36use crate::cast::CastFrom;
37
38#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
51pub struct SegmentedBytes<const N: usize = 1> {
52 segments: SmallVec<[(Bytes, Padding); N]>,
54 len: usize,
56}
57
58type Padding = usize;
61
62const PADDING_DEFAULT: usize = 0;
64
65impl Default for SegmentedBytes {
66 fn default() -> Self {
67 SegmentedBytes {
68 segments: SmallVec::new(),
69 len: 0,
70 }
71 }
72}
73
74impl SegmentedBytes {
75 pub fn new<const N: usize>() -> SegmentedBytes<N> {
79 SegmentedBytes {
80 segments: SmallVec::new(),
81 len: 0,
82 }
83 }
84}
85
86impl<const N: usize> SegmentedBytes<N> {
87 pub fn with_capacity(capacity: usize) -> SegmentedBytes<N> {
89 SegmentedBytes {
90 segments: SmallVec::with_capacity(capacity),
91 len: 0,
92 }
93 }
94
95 pub fn len(&self) -> usize {
97 self.len
98 }
99
100 pub fn is_empty(&self) -> bool {
102 self.len() == 0
103 }
104
105 pub fn into_segments(self) -> impl Iterator<Item = Bytes> {
108 self.segments.into_iter().map(|(bytes, _len)| bytes)
109 }
110
111 pub fn into_contiguous(mut self) -> Vec<u8> {
113 self.copy_to_bytes(self.remaining()).into()
114 }
115
116 #[inline]
120 pub fn push<B: Into<Bytes>>(&mut self, b: B) {
121 let b: Bytes = b.into();
122 if !b.is_empty() {
123 self.len += b.len();
124 self.segments.push((b, PADDING_DEFAULT));
125 }
126 }
127
128 pub fn reader(self) -> SegmentedReader<N> {
136 SegmentedReader::new(self)
137 }
138}
139
140impl<const N: usize> Buf for SegmentedBytes<N> {
141 fn remaining(&self) -> usize {
142 self.len()
143 }
144
145 fn chunk(&self) -> &[u8] {
146 self.segments
148 .iter()
149 .filter(|(c, _len)| !c.is_empty())
150 .map(|(c, _len)| Buf::chunk(c))
151 .next()
152 .unwrap_or_default()
153 }
154
155 fn advance(&mut self, mut cnt: usize) {
156 assert!(cnt <= self.len, "Advance past the end of buffer");
157 self.len -= cnt;
158
159 while cnt > 0 {
160 if let Some((seg, _len)) = self.segments.first_mut() {
161 if seg.remaining() > cnt {
162 seg.advance(cnt);
163 cnt = 0;
165 } else {
166 cnt = cnt.saturating_sub(seg.remaining());
168 self.segments.remove(0);
169 }
170 }
171 }
172 }
173
174 fn copy_to_bytes(&mut self, len: usize) -> Bytes {
175 if let Some((seg, _len)) = self.segments.first_mut() {
177 if len <= seg.len() {
178 self.len -= len;
179 return seg.copy_to_bytes(len);
180 }
181 }
182 assert!(
184 len <= self.len(),
185 "tried to copy {len} bytes with {} remaining",
186 self.len()
187 );
188 let mut out = BytesMut::with_capacity(len);
189 out.put(self.take(len));
190 out.freeze()
191 }
192}
193
194#[cfg(feature = "parquet")]
195impl parquet::file::reader::Length for SegmentedBytes {
196 fn len(&self) -> u64 {
197 u64::cast_from(self.len)
198 }
199}
200
201#[cfg(feature = "parquet")]
202impl parquet::file::reader::ChunkReader for SegmentedBytes {
203 type T = internal::SegmentedReader;
204
205 fn get_read(&self, start: u64) -> parquet::errors::Result<Self::T> {
206 let mut reader = self.clone().reader();
207 reader.seek(std::io::SeekFrom::Start(start))?;
208 Ok(reader)
209 }
210
211 fn get_bytes(&self, start: u64, length: usize) -> parquet::errors::Result<Bytes> {
212 let start = usize::cast_from(start);
213 let mut buf = self.clone();
214 if start > buf.remaining() {
215 return Err(ParquetError::EOF(format!(
216 "seeking {start} bytes ahead, but only {} remaining",
217 buf.remaining()
218 )));
219 }
220 buf.advance(start);
221 if length > buf.remaining() {
222 return Err(ParquetError::EOF(format!(
223 "copying {length} bytes, but only {} remaining",
224 buf.remaining()
225 )));
226 }
227 let bytes = buf.copy_to_bytes(length);
228 Ok(bytes)
229 }
230}
231
232impl From<Bytes> for SegmentedBytes {
233 fn from(value: Bytes) -> Self {
234 let mut s = SegmentedBytes::default();
235 s.push(value);
236 s
237 }
238}
239
240impl From<Vec<u8>> for SegmentedBytes {
241 fn from(value: Vec<u8>) -> Self {
242 let b = Bytes::from(value);
243 SegmentedBytes::from(b)
244 }
245}
246
247impl From<Vec<Bytes>> for SegmentedBytes {
248 fn from(value: Vec<Bytes>) -> Self {
249 let mut s = SegmentedBytes::with_capacity(value.len());
250 for segment in value {
251 s.push(segment);
252 }
253 s
254 }
255}
256
257impl<const N: usize> FromIterator<Bytes> for SegmentedBytes<N> {
258 fn from_iter<T: IntoIterator<Item = Bytes>>(iter: T) -> Self {
259 let mut s = SegmentedBytes::new();
260 for segment in iter {
261 s.push(segment);
262 }
263 s
264 }
265}
266
267impl<const N: usize> FromIterator<Vec<u8>> for SegmentedBytes<N> {
268 fn from_iter<T: IntoIterator<Item = Vec<u8>>>(iter: T) -> Self {
269 iter.into_iter().map(Bytes::from).collect()
270 }
271}
272
273mod internal {
274 use std::io;
275
276 use smallvec::SmallVec;
277
278 use crate::bytes::{Bytes, SegmentedBytes};
279 use crate::cast::CastFrom;
280
281 #[derive(Debug)]
283 pub struct SegmentedReader<const N: usize = 1> {
284 segments: SmallVec<[(Bytes, usize); N]>,
285 len: usize,
287 overall_ptr: usize,
289 segment_ptr: usize,
291 }
292
293 impl<const N: usize> SegmentedReader<N> {
294 pub fn new(mut bytes: SegmentedBytes<N>) -> Self {
295 let mut accum_length = 0;
300 for (segment, len) in &mut bytes.segments {
301 accum_length += segment.len();
302 *len = accum_length;
303 }
304
305 SegmentedReader {
306 segments: bytes.segments,
307 len: bytes.len,
308 overall_ptr: 0,
309 segment_ptr: 0,
310 }
311 }
312
313 pub fn len(&self) -> usize {
315 self.len
316 }
317
318 pub fn position(&self) -> usize {
323 self.overall_ptr
324 }
325 }
326
327 impl<const N: usize> io::Read for SegmentedReader<N> {
328 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
329 if self.overall_ptr >= self.len {
331 return Ok(0);
332 }
333
334 let (segment, accum_length) = &self.segments[self.segment_ptr];
335
336 let remaining_len = accum_length.checked_sub(self.overall_ptr).unwrap();
338 let segment_pos = segment.len().checked_sub(remaining_len).unwrap();
340
341 let len = core::cmp::min(remaining_len, buf.len());
343 let segment_buf = &segment[..];
345 buf[..len].copy_from_slice(&segment_buf[segment_pos..segment_pos + len]);
346
347 self.overall_ptr += len;
349
350 if self.overall_ptr == *accum_length {
352 self.segment_ptr += 1;
353 }
354
355 Ok(len)
356 }
357 }
358
359 impl<const N: usize> io::Seek for SegmentedReader<N> {
360 fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
361 use io::SeekFrom;
362
363 let maybe_offset = match pos {
365 SeekFrom::Start(n) => Some(usize::cast_from(n)),
366 SeekFrom::End(n) => {
367 let n = isize::cast_from(n);
368 self.len().checked_add_signed(n)
369 }
370 SeekFrom::Current(n) => {
371 let n = isize::cast_from(n);
372 self.overall_ptr.checked_add_signed(n)
373 }
374 };
375
376 let offset = maybe_offset.ok_or_else(|| {
382 io::Error::new(
383 io::ErrorKind::InvalidInput,
384 "Invalid seek to an overflowing position",
385 )
386 })?;
387
388 if offset == 0 {
390 self.overall_ptr = 0;
391 self.segment_ptr = 0;
392
393 return Ok(u64::cast_from(offset));
394 }
395
396 let result = self
398 .segments
399 .binary_search_by(|(_s, accum_len)| accum_len.cmp(&offset));
400
401 self.segment_ptr = match result {
402 Ok(segment_ptr) => segment_ptr + 1,
403 Err(segment_ptr) => segment_ptr,
404 };
405 self.overall_ptr = offset;
406
407 Ok(u64::cast_from(offset))
408 }
409 }
410}
411
412#[cfg(test)]
413mod tests {
414 use std::io::{Read, Seek, SeekFrom};
415
416 use bytes::{Buf, Bytes};
417 use proptest::prelude::*;
418
419 use super::SegmentedBytes;
420 use crate::cast::CastFrom;
421
422 #[crate::test]
423 fn test_empty() {
424 let s = SegmentedBytes::default();
425
426 assert!(s.is_empty());
428 assert_eq!(s.len(), 0);
429
430 let mut i = s.clone().into_segments();
432 assert_eq!(i.next(), None);
433
434 assert_eq!(s.remaining(), 0);
436 assert!(s.chunk().is_empty());
438
439 let mut reader = s.reader();
441
442 let mut buf = Vec::new();
444 let bytes_read = reader.read(&mut buf[..]).unwrap();
445 assert_eq!(bytes_read, 0);
446
447 reader.seek(SeekFrom::Current(20)).unwrap();
449 let bytes_read = reader.read(&mut buf[..]).unwrap();
450 assert_eq!(bytes_read, 0);
451 }
452
453 #[crate::test]
454 fn test_bytes_buf() {
455 let mut s = SegmentedBytes::from(vec![0, 1, 2, 3, 4, 5, 6, 7]);
456
457 assert_eq!(s.len(), 8);
458 assert_eq!(s.len(), s.remaining());
459 assert_eq!(s.chunk(), &[0, 1, 2, 3, 4, 5, 6, 7]);
460
461 s.advance(6);
463 assert_eq!(s.len(), 2);
464 assert_eq!(s.len(), s.remaining());
465 assert_eq!(s.chunk(), &[6, 7]);
466 }
467
468 #[crate::test]
469 fn test_bytes_buf_multi() {
470 let segments = vec![vec![0, 1, 2, 3], vec![4, 5, 6, 7], vec![8, 9, 10, 11]];
471 let mut s: SegmentedBytes<2> = segments.into_iter().collect();
472
473 assert_eq!(s.len(), 12);
474 assert_eq!(s.len(), s.remaining());
475
476 assert_eq!(s.chunk(), &[0, 1, 2, 3]);
478
479 s.advance(6);
481 assert_eq!(s.len(), 6);
482 assert_eq!(s.len(), s.remaining());
483
484 assert_eq!(s.chunk(), &[6, 7]);
486
487 let x = s.get_u32();
489 assert_eq!(x, u32::from_be_bytes([6, 7, 8, 9]));
490
491 assert_eq!(s.len(), 2);
493 assert_eq!(s.len(), s.remaining());
494
495 let mut s = s.chain(&[12, 13, 14, 15][..]);
496
497 assert_eq!(s.remaining(), 6);
499 assert_eq!(s.chunk(), &[10, 11]);
501
502 s.advance(3);
504 assert_eq!(s.chunk(), &[13, 14, 15]);
506 }
507
508 #[crate::test]
509 fn test_io_read() {
510 let s = SegmentedBytes::from(vec![0, 1, 2, 3, 4, 5, 6, 7]);
511 let mut reader = s.reader();
512
513 assert_eq!(reader.len(), 8);
514 assert_eq!(reader.position(), 0);
515
516 let mut buf = [0; 4];
518 let bytes_read = reader.read(&mut buf).unwrap();
519 assert_eq!(bytes_read, 4);
520 assert_eq!(buf, [0, 1, 2, 3]);
521
522 assert_eq!(reader.len(), 8);
524 assert_eq!(reader.position(), 4);
526
527 reader.seek(SeekFrom::Current(1)).unwrap();
529 let bytes_read = reader.read(&mut buf).unwrap();
530 assert_eq!(bytes_read, 3);
531 assert_eq!(buf, [5, 6, 7, 3]);
532
533 assert_eq!(reader.len(), 8);
534 assert_eq!(reader.position(), 8);
536
537 let bytes_read = reader.read(&mut buf).unwrap();
539 assert_eq!(bytes_read, 0);
540 assert_eq!(buf, [5, 6, 7, 3]);
542
543 reader.seek(SeekFrom::Start(2)).unwrap();
545 let bytes_read = reader.read(&mut buf).unwrap();
546 assert_eq!(bytes_read, 4);
547 assert_eq!(buf, [2, 3, 4, 5]);
548 }
549
550 #[crate::test]
551 fn test_io_read_multi() {
552 let segments = vec![vec![0, 1, 2, 3], vec![4, 5, 6, 7, 8, 9], vec![10, 11]];
553 let s: SegmentedBytes<2> = segments.into_iter().collect();
554 let mut reader = s.reader();
555
556 assert_eq!(reader.len(), 12);
557 assert_eq!(reader.position(), 0);
558
559 let mut buf = [0; 6];
561 let bytes_read = reader.read(&mut buf).unwrap();
562 assert_eq!(bytes_read, 4);
563 assert_eq!(buf, [0, 1, 2, 3, 0, 0]);
564
565 let bytes_read = reader.read(&mut buf[1..]).unwrap();
567 assert_eq!(bytes_read, 5);
568 assert_eq!(buf, [0, 4, 5, 6, 7, 8]);
569
570 reader.seek(SeekFrom::Start(2)).unwrap();
572 let bytes_read = reader.read(&mut buf).unwrap();
573 assert_eq!(bytes_read, 2);
574 assert_eq!(buf, [2, 3, 5, 6, 7, 8]);
575
576 reader.seek(SeekFrom::Start(1000)).unwrap();
578 let bytes_read = reader.read(&mut buf).unwrap();
579 assert_eq!(bytes_read, 0);
580
581 assert_eq!(reader.len(), 12);
582 assert_eq!(reader.position(), 1000);
583
584 reader.seek(SeekFrom::Start(6)).unwrap();
586 let mut buf = Vec::new();
588 let bytes_read = reader.read_to_end(&mut buf).unwrap();
589 assert_eq!(bytes_read, 6);
590 assert_eq!(buf, &[6, 7, 8, 9, 10, 11]);
591 }
592
593 #[crate::test]
594 fn test_multi() {
595 let segments = vec![vec![0, 1, 2, 3], vec![4, 5, 6, 7, 8, 9], vec![10, 11]];
596 let mut s: SegmentedBytes<2> = segments.into_iter().collect();
597
598 assert_eq!(s.len(), 12);
599 assert_eq!(s.remaining(), 12);
600
601 assert_eq!(s.chunk(), [0, 1, 2, 3]);
603
604 s.advance(6);
606 assert_eq!(s.remaining(), 6);
607
608 let mut reader = s.reader();
610 assert_eq!(reader.len(), 6);
612 assert_eq!(reader.position(), 0);
613
614 let mut buf = [0; 8];
616 let bytes_read = reader.read(&mut buf).unwrap();
617 assert_eq!(bytes_read, 4);
618 assert_eq!(buf, [6, 7, 8, 9, 0, 0, 0, 0]);
619
620 let bytes_read = reader.read(&mut buf[4..]).unwrap();
622 assert_eq!(bytes_read, 2);
623 assert_eq!(buf, [6, 7, 8, 9, 10, 11, 0, 0]);
624
625 reader.seek(SeekFrom::Start(0)).unwrap();
627 reader.read_exact(&mut buf[..6]).unwrap();
629 assert_eq!(buf, [6, 7, 8, 9, 10, 11, 0, 0]);
630 }
631
632 #[crate::test]
633 fn test_single_empty_segment() {
634 let s = SegmentedBytes::from(Vec::<u8>::new());
635
636 assert_eq!(s.len(), 0);
638 assert_eq!(s.remaining(), 0);
639 assert!(s.chunk().is_empty());
640
641 let mut reader = s.reader();
642
643 let mut buf = [0; 4];
645 let bytes_read = reader.read(&mut buf).unwrap();
646 assert_eq!(bytes_read, 0);
647 assert_eq!(buf, [0, 0, 0, 0]);
648 }
649
650 #[crate::test]
651 fn test_middle_segment_empty() {
652 let segments = vec![vec![1, 2], vec![], vec![3, 4, 5, 6]];
653 let mut s: SegmentedBytes = segments.clone().into_iter().collect();
654
655 assert_eq!(s.len(), 6);
656 assert_eq!(s.remaining(), 6);
657
658 let first_chunk = s.chunk();
660 assert_eq!(first_chunk, [1, 2]);
661 s.advance(first_chunk.len());
662
663 assert_eq!(s.remaining(), 4);
664
665 let second_chunk = s.chunk();
667 assert_eq!(second_chunk, [3, 4, 5, 6]);
668
669 let s: SegmentedBytes = segments.into_iter().collect();
671 let mut reader = s.reader();
672
673 let mut buf = [0; 4];
675 let bytes_read = reader.read(&mut buf).unwrap();
676 assert_eq!(bytes_read, 2);
677 assert_eq!(buf, [1, 2, 0, 0]);
678
679 let bytes_read = reader.read(&mut buf).unwrap();
681 assert_eq!(bytes_read, 4);
682 assert_eq!(buf, [3, 4, 5, 6]);
683
684 reader.seek(SeekFrom::Current(-2)).unwrap();
686 let bytes_read = reader.read(&mut buf).unwrap();
687 assert_eq!(bytes_read, 2);
688 assert_eq!(buf, [5, 6, 5, 6]);
689 }
690
691 #[crate::test]
692 fn test_last_segment_empty() {
693 let segments = vec![vec![1, 2], vec![3, 4, 5, 6], vec![]];
694 let mut s: SegmentedBytes = segments.clone().into_iter().collect();
695
696 assert_eq!(s.len(), 6);
697 assert_eq!(s.remaining(), 6);
698
699 let first_chunk = s.chunk();
701 assert_eq!(first_chunk, [1, 2]);
702 s.advance(first_chunk.len());
703
704 assert_eq!(s.remaining(), 4);
705
706 let second_chunk = s.chunk();
708 assert_eq!(second_chunk, [3, 4, 5, 6]);
709 s.advance(second_chunk.len());
710
711 assert_eq!(s.remaining(), 0);
713 assert!(s.chunk().is_empty());
714
715 let s: SegmentedBytes = segments.into_iter().collect();
717 let mut reader = s.reader();
718
719 let mut buf = [0; 4];
721 let bytes_read = reader.read(&mut buf).unwrap();
722 assert_eq!(bytes_read, 2);
723 assert_eq!(buf, [1, 2, 0, 0]);
724
725 let bytes_read = reader.read(&mut buf).unwrap();
727 assert_eq!(bytes_read, 4);
728 assert_eq!(buf, [3, 4, 5, 6]);
729
730 let bytes_read = reader.read(&mut buf).unwrap();
732 assert_eq!(bytes_read, 0);
733 assert_eq!(buf, [3, 4, 5, 6]);
735
736 reader.seek(SeekFrom::Current(-2)).unwrap();
738 let bytes_read = reader.read(&mut buf).unwrap();
739 assert_eq!(bytes_read, 2);
740 assert_eq!(buf, [5, 6, 5, 6]);
741 }
742
743 #[crate::test]
744 #[cfg_attr(miri, ignore)] fn proptest_copy_to_bytes() {
746 fn test(segments: Vec<Vec<u8>>, num_bytes: usize) {
747 let contiguous: Vec<u8> = segments.clone().into_iter().flatten().collect();
748 let mut contiguous = Bytes::from(contiguous);
749 let mut segmented: SegmentedBytes = segments.into_iter().map(Bytes::from).collect();
750
751 let num_bytes = contiguous.len() % num_bytes;
753 let remaining = contiguous.len() - num_bytes;
754
755 let copied_c = contiguous.copy_to_bytes(num_bytes);
756 let copied_s = segmented.copy_to_bytes(num_bytes);
757
758 assert_eq!(copied_c, copied_s);
759
760 let copied_c = contiguous.copy_to_bytes(remaining);
761 let copied_s = segmented.copy_to_bytes(remaining);
762
763 assert_eq!(copied_c, copied_s);
764 }
765
766 proptest!(|(segments in any::<Vec<Vec<u8>>>(), num_bytes in any::<usize>())| {
767 test(segments, num_bytes);
768 })
769 }
770
771 #[crate::test]
772 #[cfg_attr(miri, ignore)] fn proptest_read_to_end() {
774 fn test(segments: Vec<Vec<u8>>) {
775 let contiguous: Vec<u8> = segments.clone().into_iter().flatten().collect();
776 let contiguous = Bytes::from(contiguous);
777 let segmented: SegmentedBytes = segments.into_iter().map(Bytes::from).collect();
778
779 let mut reader_c = contiguous.reader();
780 let mut reader_s = segmented.reader();
781
782 let mut buf_c = Vec::new();
783 reader_c.read_to_end(&mut buf_c).unwrap();
784
785 let mut buf_s = Vec::new();
786 reader_s.read_to_end(&mut buf_s).unwrap();
787
788 assert_eq!(buf_s, buf_s);
789 }
790
791 proptest!(|(segments in any::<Vec<Vec<u8>>>())| {
792 test(segments);
793 })
794 }
795
796 #[crate::test]
797 #[cfg_attr(miri, ignore)] fn proptest_read_and_seek() {
799 fn test(segments: Vec<Vec<u8>>, from_start: u64, from_current: i64, from_end: i64) {
800 let contiguous: Vec<u8> = segments.clone().into_iter().flatten().collect();
801 let total_len = contiguous.len();
802 let contiguous = std::io::Cursor::new(&contiguous[..]);
803 let segmented: SegmentedBytes = segments.into_iter().map(Bytes::from).collect();
804
805 let mut reader_c = contiguous;
806 let mut reader_s = segmented.reader();
807
808 let mut buf_c = Vec::new();
809 let mut buf_s = Vec::new();
810
811 let from_start = from_start % (u64::cast_from(total_len).max(1));
814 reader_c.seek(SeekFrom::Start(from_start)).unwrap();
815 reader_s.seek(SeekFrom::Start(from_start)).unwrap();
816
817 reader_c.read_to_end(&mut buf_c).unwrap();
818 reader_s.read_to_end(&mut buf_s).unwrap();
819
820 assert_eq!(&buf_c, &buf_s);
821 buf_c.clear();
822 buf_s.clear();
823
824 let from_current = from_current % i64::try_from(total_len).unwrap().max(1);
827 reader_c.seek(SeekFrom::Current(from_current)).unwrap();
828 reader_s.seek(SeekFrom::Current(from_current)).unwrap();
829
830 reader_c.read_to_end(&mut buf_c).unwrap();
831 reader_s.read_to_end(&mut buf_s).unwrap();
832
833 assert_eq!(&buf_c, &buf_s);
834 buf_c.clear();
835 buf_s.clear();
836
837 let from_end = from_end % i64::try_from(total_len).unwrap().max(1);
840 reader_c.seek(SeekFrom::End(from_end)).unwrap();
841 reader_s.seek(SeekFrom::End(from_end)).unwrap();
842
843 reader_c.read_to_end(&mut buf_c).unwrap();
844 reader_s.read_to_end(&mut buf_s).unwrap();
845
846 assert_eq!(&buf_c, &buf_s);
847 buf_c.clear();
848 buf_s.clear();
849 }
850
851 proptest!(|(segments in any::<Vec<Vec<u8>>>(), s in any::<u64>(), c in any::<i64>(), e in any::<i64>())| {
852 test(segments, s, c, e);
853 })
854 }
855
856 #[crate::test]
857 #[cfg_attr(miri, ignore)] fn proptest_non_empty_segments() {
859 fn test(segments: Vec<Vec<u8>>) {
860 let segment = segments.first().cloned().unwrap_or_default();
862 let s = SegmentedBytes::from(segment.clone());
863 assert!(s.into_segments().all(|segment| !segment.is_empty()));
864
865 let bytes = Bytes::from(segment.clone());
867 let s = SegmentedBytes::from(bytes);
868 assert!(s.into_segments().all(|segment| !segment.is_empty()));
869
870 let mut s = SegmentedBytes::default();
872 s.push(Bytes::from(segment));
873 assert!(s.into_segments().all(|segment| !segment.is_empty()));
874
875 let s: SegmentedBytes = segments.clone().into_iter().collect();
877 assert!(s.into_segments().all(|segment| !segment.is_empty()));
878
879 let s: SegmentedBytes = segments.clone().into_iter().map(Bytes::from).collect();
881 assert!(s.into_segments().all(|segment| !segment.is_empty()));
882
883 let segments: Vec<_> = segments.into_iter().map(Bytes::from).collect();
885 let s = SegmentedBytes::from(segments);
886 assert!(s.into_segments().all(|segment| !segment.is_empty()));
887 }
888
889 proptest!(|(segments in any::<Vec<Vec<u8>>>())| {
890 test(segments);
891 })
892 }
893}