pub enum Endian<T> {
Little(T),
Big(T),
Native(T),
}
Expand description
Endian This wraps a scalar value and specializes the value for a specific endianness. In doing so it allows us to tag endian sensitive content, and safely pass it between functions for applications that may require this.
Variants§
Implementations§
Source§impl<T: Copy + Default> Endian<T>
impl<T: Copy + Default> Endian<T>
Sourcepub fn new(value: T) -> Endian<T>
pub fn new(value: T) -> Endian<T>
All values are read in as “Endian::Native(T)”. It can be converted between to the desired endianness when needed.
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::new(42u16);
}
Sourcepub fn from_stream<StreamT: Read>(stream: &mut StreamT) -> Option<Endian<T>>
pub fn from_stream<StreamT: Read>(stream: &mut StreamT) -> Option<Endian<T>>
UNSAFE
Reads and returns a Endian::Native(T) from any type that implements the std:io::Read trait. Advances the stream by the size of type T bytes.
Marked unsafe as it uses a raw pointer; however, the unsafe code is bounded by the size of the variable and should never reach unowned memory.
use scalar_types::Endian;
use std::io::{BufReader, Result};
fn read_some_stuff() -> Result<()> {
let file = std::fs::File::open("file.bin")?;
let mut reader = BufReader::new(file);
let endian_value = Endian::<u32>::from_stream(&mut reader);
let parsed_value = match endian_value {
Some(value) => value,
None => panic!("Unable to parse value from stream!")
};
Ok(())
}
Sourcepub fn as_big(&self) -> Option<T>
pub fn as_big(&self) -> Option<T>
Attempts to cast the value held by Endian to a big endian value. Only fail condition is if get_native_endianness fails somehow
This shouldn’t really be possible; however, it does call unsafe. so, out of abundance of caution we include the fail condition.
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::new(42u16);
let be_scalar_types = match scalar_types.as_big() {
Some(value) => value,
None => panic!("Unable to convert endianness!")
};
}
Sourcepub fn as_little(&self) -> Option<T>
pub fn as_little(&self) -> Option<T>
Attempts to cast the value held by Endian to a little endian value. Only fail condition is if get_native_endianness fails somehow
This shouldn’t really be possible; however, it does call unsafe. so, out of abundance of caution we include the fail condition.
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::new(42u16);
let le_scalar_types = match scalar_types.as_little() {
Some(value) => value,
None => panic!("Unable to convert endianness!")
};
}
Sourcepub fn as_native(&self) -> Option<T>
pub fn as_native(&self) -> Option<T>
Attempts to cast the value held by Endian to a native endian value. Only fail condition is if get_native_endianness fails somehow
This shouldn’t really be possible; however, it does call unsafe. so, out of abundance of caution we include the fail condition.
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::new(42u16);
let le_scalar_types = match scalar_types.as_native() {
Some(value) => value,
None => panic!("Unable to convert endianness!")
};
}
Sourcepub fn cast(&self, order: Endian<()>) -> Option<T>
pub fn cast(&self, order: Endian<()>) -> Option<T>
Attempts to cast the value held by Endian to a specified endianness Only fail condition is if get_native_endianness fails somehow
This shouldn’t really be possible; however, it does call unsafe. so, out of abundance of caution we include the fail condition.
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::new(42u16);
let le_scalar_types = scalar_types.cast(Endian::Little(()));
let be_scalar_types = scalar_types.cast(Endian::Big(()));
let ne_scalar_types = scalar_types.cast(Endian::Native(()));
}
Sourcepub fn is_little(&self) -> bool
pub fn is_little(&self) -> bool
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::Little(42u16);
assert_eq!(scalar_types.is_little(), true)
}
Sourcepub fn is_big(&self) -> bool
pub fn is_big(&self) -> bool
use scalar_types::Endian;
fn main() {
let scalar_types = Endian::Big(42u16);
assert_eq!(scalar_types.is_big(), true)
}
Sourcepub fn is_native(&self) -> bool
pub fn is_native(&self) -> bool
use scalar_types::Endian;
fn main() {
// new() creates a Endian::Native
let scalar_types = Endian::new(42u16);
let ne_scalar_types = Endian::Native(42u16);
assert_eq!(scalar_types.is_native(), true);
assert_eq!(ne_scalar_types.is_native(), true);
}
Sourcepub fn unpack(&self) -> T
pub fn unpack(&self) -> T
Unpack the value as a native endian value. If casting fails, the default value for the type is returned instead Not recommended for production.
use scalar_types::Endian;
fn main() {
// new() creates a Endian::Native
let scalar_types = Endian::new(42u16);
println!("the meaning of life the universe and everything: {}", scalar_types.unpack());
}
Output:
"the meaning of life the universe and everything: 42"