1use core::marker::PhantomData;
2
3use crate::{
4 de::{BitReader, BitReaderExt, r#as::BitUnpackAs},
5 ser::{BitWriter, BitWriterExt, r#as::BitPackAs},
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<Option<T>> for DefaultOnNone<As>
15where
16 T: Default,
17 As: BitPackAs<T>,
18{
19 fn pack_as<W>(source: &Option<T>, mut writer: W) -> Result<(), W::Error>
20 where
21 W: BitWriter,
22 {
23 match source {
24 Some(v) => writer.pack_as::<_, &As>(v)?,
25 None => writer.pack_as::<_, As>(T::default())?,
26 };
27 Ok(())
28 }
29}
30
31impl<'de, T, As> BitUnpackAs<'de, T> for DefaultOnNone<As>
32where
33 T: Default,
34 As: BitUnpackAs<'de, T>,
35{
36 #[inline]
37 fn unpack_as<R>(mut reader: R) -> Result<T, R::Error>
38 where
39 R: BitReader<'de>,
40 {
41 reader
42 .unpack_as::<_, Option<As>>()
43 .map(Option::unwrap_or_default)
44 }
45}