generated from PlexSheep/baserepo
bintols work with generic hmnsize
This commit is contained in:
parent
12ac4ebb38
commit
3334920d18
|
@ -1,7 +1,9 @@
|
||||||
//* # See what's behind the datatypes of Rust
|
//* # See what's behind the datatypes of Rust
|
||||||
//*
|
//*
|
||||||
//* This Crate shows off how datatypes of rust are stored in memory.
|
//* This Crate shows off how datatypes of rust are stored in memory.
|
||||||
use crate::display::{bytes_to_bin, byte_bit_display};
|
|
||||||
|
// reexport macros
|
||||||
|
pub use crate::investigate_memory_layout;
|
||||||
|
|
||||||
/// ## Investigate the internal representation of variables
|
/// ## Investigate the internal representation of variables
|
||||||
///
|
///
|
||||||
|
@ -9,9 +11,9 @@ use crate::display::{bytes_to_bin, byte_bit_display};
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! investigate_memory_layout {
|
macro_rules! investigate_memory_layout {
|
||||||
($t:ty, $v:tt) => {
|
($t:ty, $v:tt) => {
|
||||||
println!("Type:\t{}", type_name::<$t>());
|
println!("Type:\t{}", std::any::type_name::<$t>());
|
||||||
println!("\talign:\t{:?} B", std::mem::align_of::<$t>());
|
println!("\talign:\t{:?} B", std::mem::align_of::<$t>());
|
||||||
println!("\tID:\t{:?}\n", TypeId::of::<$t>());
|
println!("\tID:\t{:?}\n", std::any::TypeId::of::<$t>());
|
||||||
println!("\tItems:");
|
println!("\tItems:");
|
||||||
unsafe {
|
unsafe {
|
||||||
for (index, item) in $v.iter().enumerate() {
|
for (index, item) in $v.iter().enumerate() {
|
||||||
|
@ -28,10 +30,10 @@ macro_rules! investigate_memory_layout {
|
||||||
\t\tnote: \tmemory order reversed\n\
|
\t\tnote: \tmemory order reversed\n\
|
||||||
",
|
",
|
||||||
pointer,
|
pointer,
|
||||||
byte_bit_display(std::mem::align_of_val(item)),
|
display::byte_bit_display(std::mem::align_of_val(item)),
|
||||||
byte_bit_display(memory.len()),
|
display::byte_bit_display(memory.len()),
|
||||||
memory,
|
memory,
|
||||||
bytes_to_bin(&memory)
|
display::bytes_to_bin(&memory)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
//* # Tools that help display binary values, data sizes, etc
|
//* # Tools that help display binary values, data sizes, etc
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
pub use num_traits::{PrimInt, ToPrimitive};
|
||||||
|
|
||||||
/// ## Get the binary representation for a Byte array [`&[u8]`]
|
/// ## Get the binary representation for a Byte array [`&[u8]`]
|
||||||
///
|
///
|
||||||
/// ### Arguments
|
/// ### Arguments
|
||||||
|
@ -18,5 +21,47 @@ pub fn bytes_to_bin(data: &[u8]) -> String {
|
||||||
/// Quickly format a number of Bytes [`usize`] with the corresponding
|
/// Quickly format a number of Bytes [`usize`] with the corresponding
|
||||||
/// number of bits
|
/// number of bits
|
||||||
pub fn byte_bit_display(data: usize) -> String {
|
pub fn byte_bit_display(data: usize) -> String {
|
||||||
format!("{:07} B = {:08} bit", data.clone(), data * 8)
|
format!("{} B = {} bit", data.clone(), data * 8)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// ## Format total byte sizes to human readable sizes
|
||||||
|
pub fn humanbytes<T>(total: T) -> String
|
||||||
|
where
|
||||||
|
T: PrimInt,
|
||||||
|
T: ToPrimitive,
|
||||||
|
T: Ord,
|
||||||
|
T: std::fmt::Display,
|
||||||
|
T: std::fmt::Debug,
|
||||||
|
{
|
||||||
|
if total < T::from(KIBI).unwrap() {
|
||||||
|
return format!("{total} B");
|
||||||
|
} else if T::from(KIBI).unwrap() <= total && total < T::from(MEBI).unwrap() {
|
||||||
|
return format!("{:.2} K", total.to_f64().unwrap() / KIBI as f64);
|
||||||
|
} else if T::from(MEBI).unwrap() <= total && total < T::from(GIBI).unwrap() {
|
||||||
|
return format!("{:.2} M", total.to_f64().unwrap() / MEBI as f64);
|
||||||
|
} else if T::from(GIBI).unwrap() <= total && total < T::from(TEBI).unwrap() {
|
||||||
|
return format!("{:.2} G", total.to_f64().unwrap() / GIBI as f64);
|
||||||
|
} else if T::from(TEBI).unwrap() <= total && total < T::from(PEBI).unwrap() {
|
||||||
|
return format!("{:.2} T", total.to_f64().unwrap() / TEBI as f64);
|
||||||
|
} else if T::from(PEBI).unwrap() <= total && total < T::from(EXBI).unwrap() {
|
||||||
|
return format!("{:.2} P", total.to_f64().unwrap() / PEBI as f64);
|
||||||
|
}
|
||||||
|
// now we are starting to reach the sizes that are pretty unrealistic
|
||||||
|
// (as of 2023 that is, hello future)
|
||||||
|
//
|
||||||
|
// the later ones overflow `usize` on 64 Bit computers, so we have
|
||||||
|
// to work with a fixed, larger sized datatype
|
||||||
|
else {
|
||||||
|
let total: u128 = total.to_u128().unwrap();
|
||||||
|
if EXBI <= total && total < ZEBI {
|
||||||
|
return format!("{:.2} E", total.to_f64().unwrap() / EXBI as f64);
|
||||||
|
} else if ZEBI <= total && total < YOBI {
|
||||||
|
return format!("{:.2} Z", total.to_f64().unwrap() / ZEBI as f64);
|
||||||
|
} else if YOBI <= total {
|
||||||
|
return format!("{:.2} Y", total.to_f64().unwrap() / YOBI as f64);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unreachable!()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,24 @@
|
||||||
|
//* # Tools to work with binary values, memory, storage
|
||||||
|
|
||||||
|
// official binary prefixes, see [https://en.wikipedia.org/wiki/Binary_prefix]
|
||||||
|
/// 2^10
|
||||||
|
pub const KIBI: usize = 2usize.pow(10);
|
||||||
|
/// 2^20
|
||||||
|
pub const MEBI: usize = 2usize.pow(20);
|
||||||
|
/// 2^30
|
||||||
|
pub const GIBI: usize = 2usize.pow(30);
|
||||||
|
/// 2^40
|
||||||
|
pub const TEBI: usize = 2usize.pow(40);
|
||||||
|
/// 2^50
|
||||||
|
pub const PEBI: usize = 2usize.pow(50);
|
||||||
|
/// 2^60
|
||||||
|
pub const EXBI: u128 = 2u128.pow(60);
|
||||||
|
// at this point, `usize` would overflow, so we have to switch to a bigger datatype.
|
||||||
|
/// 2^70
|
||||||
|
pub const ZEBI: u128 = 2u128.pow(70);
|
||||||
|
/// 2^80
|
||||||
|
pub const YOBI: u128 = 2u128.pow(80);
|
||||||
|
|
||||||
// use pt_core;
|
// use pt_core;
|
||||||
pub mod datalayout;
|
pub mod datalayout;
|
||||||
pub mod display;
|
pub mod display;
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
use pt_bintols::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mkdmp() {
|
||||||
|
let v = vec![true, true, false];
|
||||||
|
investigate_memory_layout!(bool, v);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
use pt_bintols::*;
|
||||||
|
use pt_bintols::display::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn btobin() {
|
||||||
|
let data = [19, 19];
|
||||||
|
let r = bytes_to_bin(&data);
|
||||||
|
assert_eq!(r, format!("0b00010011_00010011"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn big_btobin() {
|
||||||
|
let data = [12,31,82,32,123,32,92,23,12,32,12,1,1,1];
|
||||||
|
let r = bytes_to_bin(&data);
|
||||||
|
assert_eq!(r, format!("0b00001100_00011111_01010010_\
|
||||||
|
00100000_01111011_00100000_01011100_00010111_00001100\n\
|
||||||
|
_00100000_00001100_00000001_00000001_00000001"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bybit() {
|
||||||
|
assert_eq!(byte_bit_display(120), format!("120 B = 960 bit"));
|
||||||
|
assert_eq!(byte_bit_display(12), format!("12 B = 96 bit"));
|
||||||
|
assert_eq!(byte_bit_display(8), format!("8 B = 64 bit"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hmnbytes() {
|
||||||
|
assert_eq!(humanbytes(0), format!("0 B"));
|
||||||
|
assert_eq!(humanbytes(1), format!("1 B"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(KIBI-1), format!("1023 B"));
|
||||||
|
assert_eq!(humanbytes(KIBI), format!("1.00 K"));
|
||||||
|
assert_eq!(humanbytes(KIBI+1), format!("1.00 K"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(MEBI-1), format!("1024.00 K"));
|
||||||
|
assert_eq!(humanbytes(MEBI), format!("1.00 M"));
|
||||||
|
assert_eq!(humanbytes(MEBI+1), format!("1.00 M"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(GIBI-1), format!("1024.00 M"));
|
||||||
|
assert_eq!(humanbytes(GIBI), format!("1.00 G"));
|
||||||
|
assert_eq!(humanbytes(GIBI+1), format!("1.00 G"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(TEBI-1), format!("1024.00 G"));
|
||||||
|
assert_eq!(humanbytes(TEBI), format!("1.00 T"));
|
||||||
|
assert_eq!(humanbytes(TEBI+1), format!("1.00 T"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(PEBI-1), format!("1024.00 T"));
|
||||||
|
assert_eq!(humanbytes(PEBI), format!("1.00 P"));
|
||||||
|
assert_eq!(humanbytes(PEBI+1), format!("1.00 P"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(EXBI-1), format!("1024.00 P"));
|
||||||
|
assert_eq!(humanbytes(EXBI), format!("1.00 E"));
|
||||||
|
assert_eq!(humanbytes(EXBI+1), format!("1.00 E"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(ZEBI-1), format!("1024.00 E"));
|
||||||
|
assert_eq!(humanbytes(ZEBI), format!("1.00 Z"));
|
||||||
|
assert_eq!(humanbytes(ZEBI+1), format!("1.00 Z"));
|
||||||
|
|
||||||
|
assert_eq!(humanbytes(YOBI-1), format!("1024.00 Z"));
|
||||||
|
assert_eq!(humanbytes(YOBI), format!("1.00 Y"));
|
||||||
|
assert_eq!(humanbytes(YOBI+1), format!("1.00 Y"));
|
||||||
|
}
|
Reference in New Issue