dataview 1.0.2

Safe transmute between types and byte arrays of the same size.
Documentation

#[doc(hidden)]
#[macro_export]
macro_rules! __field_offsets {
	(
		$(#$meta:tt)*
		$vis:vis struct $name:ident {
			$(
				$(#[$field_meta:meta])*
				$field_vis:vis $field_name:ident: $field_ty:ty
			),*
			$(,)?
		}
	) => {
		const _: () = {
			#[derive(Copy, Clone, Debug)]
			$vis struct FieldOffsets {
				$($field_vis $field_name: usize,)*
			}
			impl $name where Self: $crate::Pod {
				const FIELD_OFFSETS: FieldOffsets = $crate::__field_offsets_impl!(0usize; {} $($field_name: $field_ty,)*);
			}
		};
	};
}

#[doc(hidden)]
#[macro_export]
macro_rules! __field_offsets_impl {
	(
		$offset:expr;
		{$($init_name:ident: $init_expr:expr,)*}
		$field_name:ident: $field_ty:ty,
		$($tail_name:ident: $tail_ty:ty,)*
	) => {
		$crate::__field_offsets_impl!(
			$offset + ::core::mem::size_of::<$field_ty>();
			{ $($init_name: $init_expr,)* $field_name: $offset, }
			$($tail_name: $tail_ty,)*
		)
	};
	(
		$offset:expr;
		{$($init_name:ident: $init_expr:expr,)*}
	) => {
		FieldOffsets {
			$($init_name: $init_expr,)*
		}
	};
}