mod private
{
#[ allow( unsafe_code ) ]
pub fn same_data< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool
{
extern "C" { fn memcmp( s1 : *const u8, s2 : *const u8, n : usize ) -> i32; }
let mem1 = core::ptr::from_ref::<T1>(src1).cast::<u8>();
let mem2 = core::ptr::from_ref::<T2>(src2).cast::<u8>();
if !same_size( src1, src2 )
{
return false;
}
unsafe { memcmp( mem1, mem2, core::mem::size_of_val( src1 ) ) == 0 }
}
pub fn same_ptr< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool
{
let mem1 = core::ptr::from_ref::<T1>(src1).cast::<()>();
let mem2 = core::ptr::from_ref::<T2>(src2).cast::<()>();
mem1 == mem2
}
pub fn same_size< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool
{
core::mem::size_of_val( src1 ) == core::mem::size_of_val( src2 )
}
pub fn same_region< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool
{
same_ptr( src1, src2 ) && same_size( src1, src2 )
}
}
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
pub use own::*;
#[ allow( unused_imports ) ]
pub mod own
{
use super::*;
#[ doc( inline ) ]
pub use super::
{
orphan::*,
};
}
#[ allow( unused_imports ) ]
pub mod orphan
{
use super::*;
#[ doc( inline ) ]
pub use super::
{
exposed::*,
private::same_data,
private::same_ptr,
private::same_size,
private::same_region,
};
}
#[ allow( unused_imports ) ]
pub mod exposed
{
use super::*;
pub use super::super::mem;
#[ doc( inline ) ]
pub use prelude::*;
}
#[ allow( unused_imports ) ]
pub mod prelude
{
use super::*;
}