Skip to main content

le_stream/
prefixed.rs

1use core::fmt::Debug;
2use core::marker::PhantomData;
3use core::ops::{Deref, DerefMut};
4
5mod alloc;
6
7/// A wrapper type that adds a size prefix to the data it contains.
8#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
9#[repr(transparent)]
10pub struct Prefixed<P, D> {
11    data: D,
12    prefix: PhantomData<P>,
13}
14
15impl<P, D> Prefixed<P, D> {
16    /// Extract the data.
17    pub fn into_data(self) -> D {
18        self.data
19    }
20}
21
22impl<P, D, T> AsRef<T> for Prefixed<P, D>
23where
24    T: ?Sized,
25    D: AsRef<T>,
26{
27    fn as_ref(&self) -> &T {
28        self.data.as_ref()
29    }
30}
31
32impl<P, D, T> AsMut<T> for Prefixed<P, D>
33where
34    T: ?Sized,
35    D: AsMut<T>,
36{
37    fn as_mut(&mut self) -> &mut T {
38        self.data.as_mut()
39    }
40}
41
42impl<P, D> Deref for Prefixed<P, D>
43where
44    D: Deref,
45{
46    type Target = D::Target;
47
48    fn deref(&self) -> &Self::Target {
49        &self.data
50    }
51}
52
53impl<P, D> DerefMut for Prefixed<P, D>
54where
55    D: DerefMut,
56{
57    fn deref_mut(&mut self) -> &mut Self::Target {
58        &mut self.data
59    }
60}
61
62impl<P, D> IntoIterator for Prefixed<P, D>
63where
64    D: IntoIterator,
65{
66    type Item = D::Item;
67    type IntoIter = D::IntoIter;
68
69    fn into_iter(self) -> Self::IntoIter {
70        self.data.into_iter()
71    }
72}