sigmd 0.1.0

Windows API signature metadata
Documentation
/// rkyv `with` adapter that archives any `bitflags::Flags`-typed field as
/// its underlying primitive.
pub struct AsBits;

macro_rules! impl_as_bits {
    ($prim:ty) => {
        impl<T: bitflags::Flags<Bits = $prim> + Copy> ::rkyv::with::ArchiveWith<T> for AsBits {
            type Archived = $prim;
            type Resolver = ();

            fn resolve_with(field: &T, _: (), out: ::rkyv::place::Place<$prim>) {
                out.write(field.bits());
            }
        }

        impl<T, S> ::rkyv::with::SerializeWith<T, S> for AsBits
        where
            T: ::bitflags::Flags<Bits = $prim> + Copy,
            S: ::rkyv::rancor::Fallible + ?Sized,
        {
            fn serialize_with(_: &T, _: &mut S) -> Result<(), S::Error> {
                Ok(())
            }
        }

        impl<T, D> ::rkyv::with::DeserializeWith<$prim, T, D> for AsBits
        where
            T: ::bitflags::Flags<Bits = $prim>,
            D: ::rkyv::rancor::Fallible + ?Sized,
        {
            fn deserialize_with(field: &$prim, _: &mut D) -> Result<T, D::Error> {
                Ok(T::from_bits_truncate(*field))
            }
        }
    };
}

impl_as_bits!(u8);