1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
/// Internal namespace.
pub( crate ) mod private
{
// use meta_tools::*;
/* xxx : qqq : move to mem_tools. discuss */
///
/// Are two pointers are the same, not taking into accoint type.
///
/// Unlike `std::ptr::eq()` does not require arguments to have the same type.
///
pub fn mem_same_ptr< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool
{
let mem1 = src1 as *const _ as *const ();
let mem2 = src2 as *const _ as *const ();
// let mem1 = src1.as_ptr().cast::<()>();
// let mem2 = src2.as_ptr().cast::<()>();
mem1 == mem2
}
///
/// Are two pointers points on data of the same size.
///
pub fn mem_same_size< T1 : ?Sized, T2 : ?Sized >( _src1 : &T1, _src2 : &T2 ) -> bool
{
core::mem::size_of_val( _src1 ) == core::mem::size_of_val( _src2 )
}
// /// Get size of memory.
// trait MemSize< T >
// {
// /// Get size of memory.
// fn size( src : &T ) -> usize;
// }
//
// impl< T > MemSize< T > for T
// where
// T : Sized,
// {
// fn size( src : &T ) -> usize
// {
// 0
// }
// }
//
// impl< T > MemSize< T > for T
// where
// T : ?Sized,
// {
// fn size( src : &T ) -> usize
// {
// 0
// }
// }
///
/// Are two pointers points on the same region.
///
pub fn mem_same_region< T1 : ?Sized, T2 : ?Sized >( src1 : &T1, src2 : &T2 ) -> bool
{
mem_same_ptr( src1, src2 ) && mem_same_size( src1, src2 )
}
/* zzz : qqq : implement mem_same_region, comparing also data */
///
/// Required to convert integets to floats.
///
#[ macro_export ]
macro_rules! num
{
() =>
{
};
( $num : expr ) =>
{
num_traits::cast::< _, T >( $num ).unwrap()
};
( $( $num : expr ),+ ) =>
{(
$( num_traits::cast::< _, T >( $num ).unwrap() ),+
)};
}
pub use num;
}
/// Exposed namespace of the module.
pub mod exposed
{
pub use super::prelude::*;
}
pub use exposed::*;
/// Prelude to use essentials: `use my_module::prelude::*`.
pub mod prelude
{
pub use super::private::
{
mem_same_ptr,
mem_same_size,
mem_same_region,
num,
};
}
