1use core::marker::PhantomData;
2
3use crate::{
4 de::{BitReader, BitReaderExt, BitUnpackAs},
5 ser::{BitPackAs, BitWriter, BitWriterExt},
6};
7
8use super::Same;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
12pub struct DefaultOnNone<As: ?Sized = Same>(PhantomData<As>);
13
14impl<T, As> BitPackAs<T> for DefaultOnNone<As>
15where
16 T: Default + PartialEq,
17 As: BitPackAs<T>,
18{
19 type Args = As::Args;
20
21 fn pack_as<W>(source: &T, writer: &mut W, args: As::Args) -> Result<(), W::Error>
22 where
23 W: BitWriter + ?Sized,
24 {
25 writer.pack_as::<_, Option<&As>>((source != &T::default()).then_some(source), args)?;
26 Ok(())
27 }
28}
29
30impl<'de, T, As> BitUnpackAs<'de, T> for DefaultOnNone<As>
31where
32 T: Default,
33 As: BitUnpackAs<'de, T>,
34{
35 type Args = As::Args;
36
37 #[inline]
38 fn unpack_as<R>(reader: &mut R, args: As::Args) -> Result<T, R::Error>
39 where
40 R: BitReader<'de> + ?Sized,
41 {
42 reader
43 .unpack_as::<_, Option<As>>(args)
44 .map(Option::unwrap_or_default)
45 }
46}