// size 24, align 8. // first byte always the u8 discriminant, then 7 bytes of padding until the // payload union since the align of the payload is the greatest of the align of // all the variants, which is 8 (from // CheckedBitPatternCDefaultDiscriminantEnumWithFields) #[derive(Debug, Clone, Copy, CheckedBitPattern, PartialEq, Eq)] #[repr(C, u8)] enum CheckedBitPatternEnumNested {
A(CheckedBitPatternCEnumWithFields),
B(CheckedBitPatternCDefaultDiscriminantEnumWithFields),
}
#[test] fn passes_cast_noncontiguous() { let res =
bytemuck::checked::from_bytes::<CheckedBitPatternEnumNonContiguous>(&[ 56u8,
]);
assert_eq!(*res, CheckedBitPatternEnumNonContiguous::E);
}
#[test] fn fails_cast_bytelit() { let can_cast = CheckedBitPatternEnumByteLit::is_valid_bit_pattern(&b'a');
assert!(!can_cast);
}
#[test] fn passes_cast_bytelit() { let res =
bytemuck::checked::cast_slice::<u8, CheckedBitPatternEnumByteLit>(b"CAB");
assert_eq!(
res,
[
CheckedBitPatternEnumByteLit::C,
CheckedBitPatternEnumByteLit::A,
CheckedBitPatternEnumByteLit::B
]
);
}
#[test] fn fails_cast_struct() { let pod = [0u8, 24u8]; let res = bytemuck::checked::try_from_bytes::<CheckedBitPatternStruct>(&pod);
assert!(res.is_err());
}
#[test] fn passes_cast_struct() { let pod = [0u8, 8u8]; let res = bytemuck::checked::from_bytes::<CheckedBitPatternStruct>(&pod);
assert_eq!(
*res,
CheckedBitPatternStruct { a: 0, b: CheckedBitPatternEnumNonContiguous::B }
);
}
#[test] fn anybitpattern_implies_zeroable() { let test = AnyBitPatternTest::<isize, usize>::zeroed();
assert_eq!(test, AnyBitPatternTest { a: 0isize, b: 0usize });
}
#[test] fn checkedbitpattern_try_pod_read_unaligned() { let pod = [0u8]; let res = bytemuck::checked::try_pod_read_unaligned::<
CheckedBitPatternEnumWithValues,
>(&pod);
assert!(res.is_ok());
let pod = [5u8]; let res = bytemuck::checked::try_pod_read_unaligned::<
CheckedBitPatternEnumWithValues,
>(&pod);
assert!(res.is_err());
}
#[test] fn checkedbitpattern_aligned_struct() { let pod = [0u8; 8];
bytemuck::checked::pod_read_unaligned::<CheckedBitPatternAlignedStruct>(&pod);
}
#[test] fn checkedbitpattern_c_default_discriminant_enum_with_fields() { let pod = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xcc,
]; let value = bytemuck::checked::pod_read_unaligned::<
CheckedBitPatternCDefaultDiscriminantEnumWithFields,
>(&pod);
assert_eq!(
value,
CheckedBitPatternCDefaultDiscriminantEnumWithFields::A(0xcc555555555555cc)
);
let pod = [ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xcc,
]; let value = bytemuck::checked::pod_read_unaligned::<
CheckedBitPatternCDefaultDiscriminantEnumWithFields,
>(&pod);
assert_eq!(
value,
CheckedBitPatternCDefaultDiscriminantEnumWithFields::B {
c: 0xcc555555555555cc
}
);
}
#[test] fn checkedbitpattern_c_enum_with_fields() { let pod = [0x00, 0x00, 0x00, 0x00, 0xcc, 0x55, 0x55, 0xcc]; let value = bytemuck::checked::pod_read_unaligned::<
CheckedBitPatternCEnumWithFields,
>(&pod);
assert_eq!(value, CheckedBitPatternCEnumWithFields::A(0xcc5555cc));
let pod = [0x01, 0x00, 0x00, 0x00, 0xcc, 0x55, 0x55, 0xcc]; let value = bytemuck::checked::pod_read_unaligned::<
CheckedBitPatternCEnumWithFields,
>(&pod);
assert_eq!(value, CheckedBitPatternCEnumWithFields::B { c: 0xcc5555cc });
}
#[test] fn checkedbitpattern_int_enum_with_fields() { let pod = [0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; let value = bytemuck::checked::pod_read_unaligned::<
CheckedBitPatternIntEnumWithFields,
>(&pod);
assert_eq!(value, CheckedBitPatternIntEnumWithFields::A(0x55));
let pod = [0x01, 0x00, 0x00, 0x00, 0xcc, 0x55, 0x55, 0xcc]; let value = bytemuck::checked::pod_read_unaligned::<
CheckedBitPatternIntEnumWithFields,
>(&pod);
assert_eq!(value, CheckedBitPatternIntEnumWithFields::B { c: 0xcc5555cc });
}
#[test] fn checkedbitpattern_nested_enum_with_fields() { // total size 24 bytes. first byte always the u8 discriminant.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.