struct_scalpel 0.1.1

memory layout analysis tool for structs, enums, unions, tuples, and references
Documentation
use crate::{Dissectible, LayoutInfo};

#[cfg(feature="dissect_std")]
pub mod std;

pub mod tuples;

#[macro_export]
macro_rules! impl_mirror_mock {
    (with <$($generics: ident),*>: $mock: ty => $real: ty) => {
        impl<$($generics,)*> Dissectible for $real {
            fn field_info() -> $crate::LayoutInfo {
                let mut info = <$mock as Dissectible>::field_info();
                info.name = ::std::any::type_name::<$real>();
                info
            }
        }
    };
    (with <$($generics: ident),*>: $mock: ty => $real: ty where $($constraint: tt)*) => {
        impl<$($generics,)*> Dissectible for $real where $($constraint)* {
            fn field_info() -> $crate::LayoutInfo {
                let mut info = <$mock as Dissectible>::field_info();
                info.name = ::std::any::type_name::<$real>();
                info
            }
        }
    };
    ($mock: ty => $real: ty) => {
        impl Dissectible for $real {
            fn field_info() -> $crate::LayoutInfo {
                let mut info = <$mock as Dissectible>::field_info();
                info.name = ::std::any::type_name::<$real>();
                info
            }
        }
    };
}

impl<T> Dissectible for &T where T: ?Sized {
    fn field_info() -> crate::LayoutInfo {
        LayoutInfo {
            attrs: vec![],
            name: ::std::any::type_name::<T>(),
            size: ::std::mem::size_of::<&T>(),
            align: ::std::mem::align_of::<&T>(),
            structure: crate::Structure::Reference(false),
        }
    }
}

impl<T> Dissectible for &mut T where T: ?Sized {
    fn field_info() -> crate::LayoutInfo {
        LayoutInfo {
            attrs: vec![],
            name: ::std::any::type_name::<T>(),
            size: ::std::mem::size_of::<&T>(),
            align: ::std::mem::align_of::<&T>(),
            structure: crate::Structure::Reference(true),
        }
    }
}