Coverage Report

Created: 2025-12-31 06:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/inout-0.1.4/src/inout_buf.rs
Line
Count
Source
1
use crate::{
2
    errors::{IntoArrayError, NotEqualError},
3
    InOut,
4
};
5
use core::{marker::PhantomData, slice};
6
use generic_array::{ArrayLength, GenericArray};
7
8
/// Custom slice type which references one immutable (input) slice and one
9
/// mutable (output) slice of equal length. Input and output slices are
10
/// either the same or do not overlap.
11
pub struct InOutBuf<'inp, 'out, T> {
12
    pub(crate) in_ptr: *const T,
13
    pub(crate) out_ptr: *mut T,
14
    pub(crate) len: usize,
15
    pub(crate) _pd: PhantomData<(&'inp T, &'out mut T)>,
16
}
17
18
impl<'a, T> From<&'a mut [T]> for InOutBuf<'a, 'a, T> {
19
    #[inline(always)]
20
482
    fn from(buf: &'a mut [T]) -> Self {
21
482
        let p = buf.as_mut_ptr();
22
482
        Self {
23
482
            in_ptr: p,
24
482
            out_ptr: p,
25
482
            len: buf.len(),
26
482
            _pd: PhantomData,
27
482
        }
28
482
    }
29
}
30
31
impl<'a, T> InOutBuf<'a, 'a, T> {
32
    /// Create `InOutBuf` from a single mutable reference.
33
    #[inline(always)]
34
479
    pub fn from_mut(val: &'a mut T) -> InOutBuf<'a, 'a, T> {
35
479
        let p = val as *mut T;
36
479
        Self {
37
479
            in_ptr: p,
38
479
            out_ptr: p,
39
479
            len: 1,
40
479
            _pd: PhantomData,
41
479
        }
42
479
    }
43
}
44
45
impl<'inp, 'out, T> IntoIterator for InOutBuf<'inp, 'out, T> {
46
    type Item = InOut<'inp, 'out, T>;
47
    type IntoIter = InOutBufIter<'inp, 'out, T>;
48
49
    #[inline(always)]
50
890
    fn into_iter(self) -> Self::IntoIter {
51
890
        InOutBufIter { buf: self, pos: 0 }
52
890
    }
<inout::inout_buf::InOutBuf<generic_array::GenericArray<generic_array::GenericArray<u8, 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::B0>>, 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>>> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
50
890
    fn into_iter(self) -> Self::IntoIter {
51
890
        InOutBufIter { buf: self, pos: 0 }
52
890
    }
Unexecuted instantiation: <inout::inout_buf::InOutBuf<generic_array::GenericArray<generic_array::GenericArray<u8, 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::B0>>, typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>>> as core::iter::traits::collect::IntoIterator>::into_iter
Unexecuted instantiation: <inout::inout_buf::InOutBuf<generic_array::GenericArray<u8, 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::B0>>> as core::iter::traits::collect::IntoIterator>::into_iter
53
}
54
55
impl<'inp, 'out, T> InOutBuf<'inp, 'out, T> {
56
    /// Create `InOutBuf` from a pair of immutable and mutable references.
57
    #[inline(always)]
58
    pub fn from_ref_mut(in_val: &'inp T, out_val: &'out mut T) -> Self {
59
        Self {
60
            in_ptr: in_val as *const T,
61
            out_ptr: out_val as *mut T,
62
            len: 1,
63
            _pd: PhantomData,
64
        }
65
    }
66
67
    /// Create `InOutBuf` from immutable and mutable slices.
68
    ///
69
    /// Returns an error if length of slices is not equal to each other.
70
    #[inline(always)]
71
    pub fn new(in_buf: &'inp [T], out_buf: &'out mut [T]) -> Result<Self, NotEqualError> {
72
        if in_buf.len() != out_buf.len() {
73
            Err(NotEqualError)
74
        } else {
75
            Ok(Self {
76
                in_ptr: in_buf.as_ptr(),
77
                out_ptr: out_buf.as_mut_ptr(),
78
                len: in_buf.len(),
79
                _pd: Default::default(),
80
            })
81
        }
82
    }
83
84
    /// Get length of the inner buffers.
85
    #[inline(always)]
86
9.11k
    pub fn len(&self) -> usize {
87
9.11k
        self.len
88
9.11k
    }
<inout::inout_buf::InOutBuf<u8>>::len
Line
Count
Source
86
2.75k
    pub fn len(&self) -> usize {
87
2.75k
        self.len
88
2.75k
    }
<inout::inout_buf::InOutBuf<generic_array::GenericArray<generic_array::GenericArray<u8, 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::B0>>, 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>>>>::len
Line
Count
Source
86
3.69k
    pub fn len(&self) -> usize {
87
3.69k
        self.len
88
3.69k
    }
Unexecuted instantiation: <inout::inout_buf::InOutBuf<generic_array::GenericArray<generic_array::GenericArray<u8, 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::B0>>, typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>>>>::len
<inout::inout_buf::InOutBuf<generic_array::GenericArray<u8, 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::B0>>>>::len
Line
Count
Source
86
2.67k
    pub fn len(&self) -> usize {
87
2.67k
        self.len
88
2.67k
    }
89
90
    /// Returns `true` if the buffer has a length of 0.
91
    #[inline(always)]
92
    pub fn is_empty(&self) -> bool {
93
        self.len == 0
94
    }
95
96
    /// Returns `InOut` for given position.
97
    ///
98
    /// # Panics
99
    /// If `pos` greater or equal to buffer length.
100
    #[inline(always)]
101
1.89k
    pub fn get<'a>(&'a mut self, pos: usize) -> InOut<'a, 'a, T> {
102
1.89k
        assert!(pos < self.len);
103
        unsafe {
104
1.89k
            InOut {
105
1.89k
                in_ptr: self.in_ptr.add(pos),
106
1.89k
                out_ptr: self.out_ptr.add(pos),
107
1.89k
                _pd: PhantomData,
108
1.89k
            }
109
        }
110
1.89k
    }
111
112
    /// Get input slice.
113
    #[inline(always)]
114
479
    pub fn get_in<'a>(&'a self) -> &'a [T] {
115
479
        unsafe { slice::from_raw_parts(self.in_ptr, self.len) }
116
479
    }
117
118
    /// Get output slice.
119
    #[inline(always)]
120
479
    pub fn get_out<'a>(&'a mut self) -> &'a mut [T] {
121
479
        unsafe { slice::from_raw_parts_mut(self.out_ptr, self.len) }
122
479
    }
123
124
    /// Consume self and return output slice with lifetime `'a`.
125
    #[inline(always)]
126
    pub fn into_out(self) -> &'out mut [T] {
127
        unsafe { slice::from_raw_parts_mut(self.out_ptr, self.len) }
128
    }
129
130
    /// Get raw input and output pointers.
131
    #[inline(always)]
132
    pub fn into_raw(self) -> (*const T, *mut T) {
133
        (self.in_ptr, self.out_ptr)
134
    }
135
136
    /// Reborrow `self`.
137
    #[inline(always)]
138
    pub fn reborrow<'a>(&'a mut self) -> InOutBuf<'a, 'a, T> {
139
        Self {
140
            in_ptr: self.in_ptr,
141
            out_ptr: self.out_ptr,
142
            len: self.len,
143
            _pd: PhantomData,
144
        }
145
    }
146
147
    /// Create [`InOutBuf`] from raw input and output pointers.
148
    ///
149
    /// # Safety
150
    /// Behavior is undefined if any of the following conditions are violated:
151
    /// - `in_ptr` must point to a properly initialized value of type `T` and
152
    /// must be valid for reads for `len * mem::size_of::<T>()` many bytes.
153
    /// - `out_ptr` must point to a properly initialized value of type `T` and
154
    /// must be valid for both reads and writes for `len * mem::size_of::<T>()`
155
    /// many bytes.
156
    /// - `in_ptr` and `out_ptr` must be either equal or non-overlapping.
157
    /// - If `in_ptr` and `out_ptr` are equal, then the memory referenced by
158
    /// them must not be accessed through any other pointer (not derived from
159
    /// the return value) for the duration of lifetime 'a. Both read and write
160
    /// accesses are forbidden.
161
    /// - If `in_ptr` and `out_ptr` are not equal, then the memory referenced by
162
    /// `out_ptr` must not be accessed through any other pointer (not derived from
163
    /// the return value) for the duration of lifetime 'a. Both read and write
164
    /// accesses are forbidden. The memory referenced by `in_ptr` must not be
165
    /// mutated for the duration of lifetime `'a`, except inside an `UnsafeCell`.
166
    /// - The total size `len * mem::size_of::<T>()`  must be no larger than `isize::MAX`.
167
    #[inline(always)]
168
    pub unsafe fn from_raw(
169
        in_ptr: *const T,
170
        out_ptr: *mut T,
171
        len: usize,
172
    ) -> InOutBuf<'inp, 'out, T> {
173
        Self {
174
            in_ptr,
175
            out_ptr,
176
            len,
177
            _pd: PhantomData,
178
        }
179
    }
180
181
    /// Divides one buffer into two at `mid` index.
182
    ///
183
    /// The first will contain all indices from `[0, mid)` (excluding
184
    /// the index `mid` itself) and the second will contain all
185
    /// indices from `[mid, len)` (excluding the index `len` itself).
186
    ///
187
    /// # Panics
188
    ///
189
    /// Panics if `mid > len`.
190
    #[inline(always)]
191
    pub fn split_at(self, mid: usize) -> (InOutBuf<'inp, 'out, T>, InOutBuf<'inp, 'out, T>) {
192
        assert!(mid <= self.len);
193
        let (tail_in_ptr, tail_out_ptr) = unsafe { (self.in_ptr.add(mid), self.out_ptr.add(mid)) };
194
        (
195
            InOutBuf {
196
                in_ptr: self.in_ptr,
197
                out_ptr: self.out_ptr,
198
                len: mid,
199
                _pd: PhantomData,
200
            },
201
            InOutBuf {
202
                in_ptr: tail_in_ptr,
203
                out_ptr: tail_out_ptr,
204
                len: self.len() - mid,
205
                _pd: PhantomData,
206
            },
207
        )
208
    }
209
210
    /// Partition buffer into 2 parts: buffer of arrays and tail.
211
    #[inline(always)]
212
1.30k
    pub fn into_chunks<N: ArrayLength<T>>(
213
1.30k
        self,
214
1.30k
    ) -> (
215
1.30k
        InOutBuf<'inp, 'out, GenericArray<T, N>>,
216
1.30k
        InOutBuf<'inp, 'out, T>,
217
1.30k
    ) {
218
1.30k
        let chunks = self.len() / N::USIZE;
219
1.30k
        let tail_pos = N::USIZE * chunks;
220
1.30k
        let tail_len = self.len() - tail_pos;
221
        unsafe {
222
1.30k
            let chunks = InOutBuf {
223
1.30k
                in_ptr: self.in_ptr as *const GenericArray<T, N>,
224
1.30k
                out_ptr: self.out_ptr as *mut GenericArray<T, N>,
225
1.30k
                len: chunks,
226
1.30k
                _pd: PhantomData,
227
1.30k
            };
228
1.30k
            let tail = InOutBuf {
229
1.30k
                in_ptr: self.in_ptr.add(tail_pos),
230
1.30k
                out_ptr: self.out_ptr.add(tail_pos),
231
1.30k
                len: tail_len,
232
1.30k
                _pd: PhantomData,
233
1.30k
            };
234
1.30k
            (chunks, tail)
235
        }
236
1.30k
    }
<inout::inout_buf::InOutBuf<u8>>::into_chunks::<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::B0>>
Line
Count
Source
212
411
    pub fn into_chunks<N: ArrayLength<T>>(
213
411
        self,
214
411
    ) -> (
215
411
        InOutBuf<'inp, 'out, GenericArray<T, N>>,
216
411
        InOutBuf<'inp, 'out, T>,
217
411
    ) {
218
411
        let chunks = self.len() / N::USIZE;
219
411
        let tail_pos = N::USIZE * chunks;
220
411
        let tail_len = self.len() - tail_pos;
221
        unsafe {
222
411
            let chunks = InOutBuf {
223
411
                in_ptr: self.in_ptr as *const GenericArray<T, N>,
224
411
                out_ptr: self.out_ptr as *mut GenericArray<T, N>,
225
411
                len: chunks,
226
411
                _pd: PhantomData,
227
411
            };
228
411
            let tail = InOutBuf {
229
411
                in_ptr: self.in_ptr.add(tail_pos),
230
411
                out_ptr: self.out_ptr.add(tail_pos),
231
411
                len: tail_len,
232
411
                _pd: PhantomData,
233
411
            };
234
411
            (chunks, tail)
235
        }
236
411
    }
<inout::inout_buf::InOutBuf<generic_array::GenericArray<u8, 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::B0>>>>::into_chunks::<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>>
Line
Count
Source
212
890
    pub fn into_chunks<N: ArrayLength<T>>(
213
890
        self,
214
890
    ) -> (
215
890
        InOutBuf<'inp, 'out, GenericArray<T, N>>,
216
890
        InOutBuf<'inp, 'out, T>,
217
890
    ) {
218
890
        let chunks = self.len() / N::USIZE;
219
890
        let tail_pos = N::USIZE * chunks;
220
890
        let tail_len = self.len() - tail_pos;
221
        unsafe {
222
890
            let chunks = InOutBuf {
223
890
                in_ptr: self.in_ptr as *const GenericArray<T, N>,
224
890
                out_ptr: self.out_ptr as *mut GenericArray<T, N>,
225
890
                len: chunks,
226
890
                _pd: PhantomData,
227
890
            };
228
890
            let tail = InOutBuf {
229
890
                in_ptr: self.in_ptr.add(tail_pos),
230
890
                out_ptr: self.out_ptr.add(tail_pos),
231
890
                len: tail_len,
232
890
                _pd: PhantomData,
233
890
            };
234
890
            (chunks, tail)
235
        }
236
890
    }
Unexecuted instantiation: <inout::inout_buf::InOutBuf<generic_array::GenericArray<u8, 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::B0>>>>::into_chunks::<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>>
237
}
238
239
impl<'inp, 'out> InOutBuf<'inp, 'out, u8> {
240
    /// XORs `data` with values behind the input slice and write
241
    /// result to the output slice.
242
    ///
243
    /// # Panics
244
    /// If `data` length is not equal to the buffer length.
245
    #[inline(always)]
246
    #[allow(clippy::needless_range_loop)]
247
    pub fn xor_in2out(&mut self, data: &[u8]) {
248
        assert_eq!(self.len(), data.len());
249
        unsafe {
250
            for i in 0..data.len() {
251
                let in_ptr = self.in_ptr.add(i);
252
                let out_ptr = self.out_ptr.add(i);
253
                *out_ptr = *in_ptr ^ data[i];
254
            }
255
        }
256
    }
257
}
258
259
impl<'inp, 'out, T, N> TryInto<InOut<'inp, 'out, GenericArray<T, N>>> for InOutBuf<'inp, 'out, T>
260
where
261
    N: ArrayLength<T>,
262
{
263
    type Error = IntoArrayError;
264
265
    #[inline(always)]
266
    fn try_into(self) -> Result<InOut<'inp, 'out, GenericArray<T, N>>, Self::Error> {
267
        if self.len() == N::USIZE {
268
            Ok(InOut {
269
                in_ptr: self.in_ptr as *const _,
270
                out_ptr: self.out_ptr as *mut _,
271
                _pd: PhantomData,
272
            })
273
        } else {
274
            Err(IntoArrayError)
275
        }
276
    }
277
}
278
279
/// Iterator over [`InOutBuf`].
280
pub struct InOutBufIter<'inp, 'out, T> {
281
    buf: InOutBuf<'inp, 'out, T>,
282
    pos: usize,
283
}
284
285
impl<'inp, 'out, T> Iterator for InOutBufIter<'inp, 'out, T> {
286
    type Item = InOut<'inp, 'out, T>;
287
288
    #[inline(always)]
289
3.69k
    fn next(&mut self) -> Option<Self::Item> {
290
3.69k
        if self.buf.len() == self.pos {
291
890
            return None;
292
2.80k
        }
293
2.80k
        let res = unsafe {
294
2.80k
            InOut {
295
2.80k
                in_ptr: self.buf.in_ptr.add(self.pos),
296
2.80k
                out_ptr: self.buf.out_ptr.add(self.pos),
297
2.80k
                _pd: PhantomData,
298
2.80k
            }
299
        };
300
2.80k
        self.pos += 1;
301
2.80k
        Some(res)
302
3.69k
    }
<inout::inout_buf::InOutBufIter<generic_array::GenericArray<generic_array::GenericArray<u8, 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::B0>>, 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>>> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
289
3.69k
    fn next(&mut self) -> Option<Self::Item> {
290
3.69k
        if self.buf.len() == self.pos {
291
890
            return None;
292
2.80k
        }
293
2.80k
        let res = unsafe {
294
2.80k
            InOut {
295
2.80k
                in_ptr: self.buf.in_ptr.add(self.pos),
296
2.80k
                out_ptr: self.buf.out_ptr.add(self.pos),
297
2.80k
                _pd: PhantomData,
298
2.80k
            }
299
        };
300
2.80k
        self.pos += 1;
301
2.80k
        Some(res)
302
3.69k
    }
Unexecuted instantiation: <inout::inout_buf::InOutBufIter<generic_array::GenericArray<generic_array::GenericArray<u8, 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::B0>>, typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>>> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <inout::inout_buf::InOutBufIter<generic_array::GenericArray<u8, 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::B0>>> as core::iter::traits::iterator::Iterator>::next
303
}