Coverage Report

Created: 2025-08-03 07:00

/rust/registry/src/index.crates.io-6f17d22bba15001f/block-buffer-0.10.4/src/sealed.rs
Line
Count
Source
1
use super::{ArrayLength, Block};
2
use core::slice;
3
4
/// Sealed trait for buffer kinds.
5
pub trait Sealed {
6
    /// Invariant guaranteed by a buffer kind, i.e. with correct
7
    /// buffer code this function always returns true.
8
    fn invariant(pos: usize, block_size: usize) -> bool;
9
10
    /// Split input data into slice of blocks and tail.
11
    fn split_blocks<N: ArrayLength<u8>>(data: &[u8]) -> (&[Block<N>], &[u8]);
12
}
13
14
impl Sealed for super::Eager {
15
    #[inline(always)]
16
20.4M
    fn invariant(pos: usize, block_size: usize) -> bool {
17
20.4M
        pos < block_size
18
20.4M
    }
19
20
    #[inline(always)]
21
9.10k
    fn split_blocks<N: ArrayLength<u8>>(data: &[u8]) -> (&[Block<N>], &[u8]) {
22
9.10k
        let nb = data.len() / N::USIZE;
23
9.10k
        let blocks_len = nb * N::USIZE;
24
9.10k
        let tail_len = data.len() - blocks_len;
25
9.10k
        // SAFETY: we guarantee that created slices do not point
26
9.10k
        // outside of `data`
27
9.10k
        unsafe {
28
9.10k
            let blocks_ptr = data.as_ptr() as *const Block<N>;
29
9.10k
            let tail_ptr = data.as_ptr().add(blocks_len);
30
9.10k
            (
31
9.10k
                slice::from_raw_parts(blocks_ptr, nb),
32
9.10k
                slice::from_raw_parts(tail_ptr, tail_len),
33
9.10k
            )
34
9.10k
        }
35
9.10k
    }
Unexecuted instantiation: <block_buffer::Eager as block_buffer::sealed::Sealed>::split_blocks::<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>>
<block_buffer::Eager as block_buffer::sealed::Sealed>::split_blocks::<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>>
Line
Count
Source
21
9.10k
    fn split_blocks<N: ArrayLength<u8>>(data: &[u8]) -> (&[Block<N>], &[u8]) {
22
9.10k
        let nb = data.len() / N::USIZE;
23
9.10k
        let blocks_len = nb * N::USIZE;
24
9.10k
        let tail_len = data.len() - blocks_len;
25
9.10k
        // SAFETY: we guarantee that created slices do not point
26
9.10k
        // outside of `data`
27
9.10k
        unsafe {
28
9.10k
            let blocks_ptr = data.as_ptr() as *const Block<N>;
29
9.10k
            let tail_ptr = data.as_ptr().add(blocks_len);
30
9.10k
            (
31
9.10k
                slice::from_raw_parts(blocks_ptr, nb),
32
9.10k
                slice::from_raw_parts(tail_ptr, tail_len),
33
9.10k
            )
34
9.10k
        }
35
9.10k
    }
Unexecuted instantiation: <block_buffer::Eager as block_buffer::sealed::Sealed>::split_blocks::<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>>
Unexecuted instantiation: <block_buffer::Eager as block_buffer::sealed::Sealed>::split_blocks::<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>>
Unexecuted instantiation: <block_buffer::Eager as block_buffer::sealed::Sealed>::split_blocks::<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>>
36
}
37
38
impl Sealed for super::Lazy {
39
    #[inline(always)]
40
    fn invariant(pos: usize, block_size: usize) -> bool {
41
        pos <= block_size
42
    }
43
44
    #[inline(always)]
45
    fn split_blocks<N: ArrayLength<u8>>(data: &[u8]) -> (&[Block<N>], &[u8]) {
46
        if data.is_empty() {
47
            return (&[], &[]);
48
        }
49
        let (nb, tail_len) = if data.len() % N::USIZE == 0 {
50
            (data.len() / N::USIZE - 1, N::USIZE)
51
        } else {
52
            let nb = data.len() / N::USIZE;
53
            (nb, data.len() - nb * N::USIZE)
54
        };
55
        let blocks_len = nb * N::USIZE;
56
        // SAFETY: we guarantee that created slices do not point
57
        // outside of `data`
58
        unsafe {
59
            let blocks_ptr = data.as_ptr() as *const Block<N>;
60
            let tail_ptr = data.as_ptr().add(blocks_len);
61
            (
62
                slice::from_raw_parts(blocks_ptr, nb),
63
                slice::from_raw_parts(tail_ptr, tail_len),
64
            )
65
        }
66
    }
67
}