s2n_quic_core/buffer/reader/
empty.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::{
5    buffer::{
6        reader::{storage::Chunk, Reader, Storage},
7        writer,
8    },
9    varint::VarInt,
10};
11
12/// Returns an empty buffer for the current offset of an inner reader
13#[derive(Debug)]
14pub struct Empty<'a, R: Reader + ?Sized>(&'a R);
15
16impl<'a, R: Reader + ?Sized> Empty<'a, R> {
17    #[inline]
18    pub fn new(reader: &'a R) -> Self {
19        Self(reader)
20    }
21}
22
23impl<R: Reader + ?Sized> Storage for Empty<'_, R> {
24    type Error = core::convert::Infallible;
25
26    #[inline(always)]
27    fn buffered_len(&self) -> usize {
28        0
29    }
30
31    #[inline(always)]
32    fn read_chunk(&mut self, _watermark: usize) -> Result<Chunk<'_>, Self::Error> {
33        Ok(Chunk::empty())
34    }
35
36    #[inline(always)]
37    fn partial_copy_into<Dest>(&mut self, _dest: &mut Dest) -> Result<Chunk<'_>, Self::Error>
38    where
39        Dest: writer::Storage + ?Sized,
40    {
41        Ok(Chunk::empty())
42    }
43}
44
45impl<R: Reader + ?Sized> Reader for Empty<'_, R> {
46    #[inline]
47    fn current_offset(&self) -> VarInt {
48        self.0.current_offset()
49    }
50
51    #[inline]
52    fn final_offset(&self) -> Option<VarInt> {
53        self.0.final_offset()
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60    use crate::stream::testing::Data;
61
62    #[test]
63    fn empty_test() {
64        let mut reader = Data::new(1000);
65        assert_eq!(reader.buffered_len(), 1000);
66        let mut reader = reader.with_checks();
67
68        {
69            assert_eq!(reader.with_empty_buffer().buffered_len(), 0);
70        }
71
72        let mut dest = &mut [0u8; 16][..];
73        let chunk = reader.partial_copy_into(&mut dest).unwrap();
74        assert_eq!(chunk.len(), 16);
75
76        let mut reader = reader.with_empty_buffer();
77
78        assert_eq!(reader.buffered_len(), 0);
79        assert!(reader.buffer_is_empty());
80
81        let chunk = reader.partial_copy_into(&mut dest).unwrap();
82        assert_eq!(chunk.len(), 0);
83    }
84}