[−][src]Crate cluFullTransmute
A more complete and advanced version of data transmutation.
Opportunities
- Reduction of any A to any B, without checking the dimensionality of the data.
- The ability to use transmute with const functions.
- Possibility of delayed transmutation.
- The library uses #![no_std]
A warning!
- This library only works in a nightly compiler, we expect stabilization features.
- You really need to understand what you are doing.
Use
- Easy
use cluFullTransmute::mem::full_transmute; fn main() { let a: bool = unsafe{ full_transmute(1u8) }; assert_eq!(a, true); let b: bool = unsafe{ full_transmute(0u8) }; assert_eq!(b, false); // Why does this work? // // Is bool one bit? // No, bool is not one bit, but u8. // assert_eq!(std::mem::size_of::<bool>(), 1); }
- GenericType
use cluFullTransmute::mem::full_transmute; #[allow(dead_code)] struct A<T>(T); impl<T> Drop for A<T> { fn drop(&mut self) { panic!("Strange behavior of the internal library."); } } #[allow(dead_code)] struct B<T>(T); impl<T> B<T> { pub fn my_fn(&self) {} } fn main() { let data = A(9999usize); //ignore drop! let b: B<usize> = unsafe{ full_transmute(data) }; assert_eq!(b.0, 9999); b.my_fn(); }
- MaybeTransmute
use cluFullTransmute::mem::MaybeTransmute; struct MyData { data: MaybeTransmute<String, Vec<u8>>, } impl MyData { #[inline] pub fn new<I: Into<String>>(t: I) -> Self { Self::__new(t.into()) } #[inline] const fn __new(t: String) -> Self { Self { data: MaybeTransmute::new(t), } } #[inline] pub fn as_string(&mut self) -> &mut String { &mut self.data } #[inline] pub fn into(self) -> Vec<u8> { unsafe { self.data.into() } } } fn main() { let mut data = MyData::new("Test"); assert_eq!(data.as_string().as_bytes(), b"Test"); assert_eq!(data.as_string(), "Test"); let vec = data.into(); assert_eq!(vec, b"Test"); }
Modules
mem | Methods for converting data in RAM. |