2017-11-23 00:02:24 -05:00
|
|
|
use spellbook::components::DynamicArray;
|
|
|
|
|
2016-08-24 13:23:56 -04:00
|
|
|
#[cfg(feature="convert_sigils")]
|
2016-01-07 05:51:53 -05:00
|
|
|
use sigils::{Zero, Number, Real};
|
2017-02-15 17:51:13 -05:00
|
|
|
|
2016-08-24 13:23:56 -04:00
|
|
|
#[cfg(feature="convert_sigils")]
|
2017-11-23 00:02:24 -05:00
|
|
|
use sigils::vector::{DynamicArraytor, DynamicArraytor2, DynamicArraytor3, DynamicArraytor4};
|
2017-02-15 17:51:13 -05:00
|
|
|
|
2016-08-24 13:23:56 -04:00
|
|
|
#[cfg(feature="convert_sigils")]
|
2016-01-07 05:51:53 -05:00
|
|
|
use sigils::quaternion::Quaternion;
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2016-04-14 13:33:07 -04:00
|
|
|
use ::byte_sized::{ByteSized, get_byte_size_of_string};
|
2016-01-05 17:46:31 -05:00
|
|
|
use ::converter::Converter;
|
2016-06-17 04:34:36 -04:00
|
|
|
use ::endian::{BigEndian, LittleEndian, PlatformEndian, NetworkEndian};
|
|
|
|
use ::endian::Endianess;
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2016-01-05 17:46:31 -05:00
|
|
|
|
|
|
|
|
2016-01-07 17:49:21 -05:00
|
|
|
// From and Into are not used because we need to also
|
|
|
|
// know the endianess to use for converting.
|
|
|
|
/// A type that can be converted to and from bytes.
|
2017-11-23 00:02:24 -05:00
|
|
|
pub trait Transmutable: Sized
|
2016-01-07 17:49:21 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
/// Transmute an array of bytes in the
|
|
|
|
/// platform's endian to this type.
|
2017-11-23 00:02:24 -05:00
|
|
|
fn from_bytes(buffer: &[u8]) -> Self
|
|
|
|
{
|
|
|
|
Self::from_endian_bytes(buffer, Endianess::Platform)
|
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
|
|
|
|
/// Transmute an array of bytes in the
|
|
|
|
/// given endian to this type.
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self;
|
|
|
|
|
|
|
|
|
|
|
|
/// Transmute this type to an array of bytes in
|
|
|
|
/// the Platform's endian.
|
2017-11-23 00:02:24 -05:00
|
|
|
fn to_bytes(self) -> DynamicArray<u8>
|
|
|
|
{
|
|
|
|
self.as_endian_bytes(Endianess::Platform)
|
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
|
|
|
|
/// Transmute this type to an array of bytes in
|
|
|
|
/// the desired endian.
|
2017-11-23 00:02:24 -05:00
|
|
|
fn to_endian_bytes(self, endianess: Endianess) -> DynamicArray<u8>
|
|
|
|
{
|
|
|
|
self.as_endian_bytes(endianess)
|
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
|
|
|
|
|
|
|
|
/// Transmute this type to an array of bytes in
|
|
|
|
/// the Platform's endian.
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_bytes(&self) -> DynamicArray<u8>
|
|
|
|
{
|
|
|
|
self.as_endian_bytes(Endianess::Platform)
|
|
|
|
}
|
2016-12-22 13:47:56 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
/// Transmute this type to an array of bytes in
|
|
|
|
/// the desired endian.
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>;
|
2016-12-22 13:47:56 -05:00
|
|
|
|
2016-04-14 18:08:50 -04:00
|
|
|
|
|
|
|
/// Get the current size of this Transmutable in bytes.
|
|
|
|
fn determine_byte_size(&self) -> usize;
|
2016-01-07 17:49:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-01-05 23:42:08 -05:00
|
|
|
/// Handles the repetative endianess matching
|
|
|
|
/// for the primitive number types when converting
|
|
|
|
/// a number to bytes.
|
2016-01-05 17:46:31 -05:00
|
|
|
macro_rules! handle_endianess_to_bytes
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
($val: ident, $endianess: ident, $func: ident) =>
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
match $endianess
|
|
|
|
{
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Big =>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
BigEndian::$func(*$val)
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
|
|
|
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Little =>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
LittleEndian::$func(*$val)
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
|
|
|
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Platform =>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
PlatformEndian::$func(*$val)
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2016-06-17 04:34:36 -04:00
|
|
|
|
|
|
|
Endianess::Network =>
|
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
NetworkEndian::$func(*$val)
|
2016-06-17 04:34:36 -04:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2016-01-05 23:42:08 -05:00
|
|
|
/// Handles the repetative endianess matching
|
|
|
|
/// for the primitive number types when converting
|
|
|
|
/// a number from bytes.
|
2016-01-05 17:46:31 -05:00
|
|
|
macro_rules! handle_endianess_from_bytes
|
|
|
|
{
|
|
|
|
($buffer: ident, $endianess: ident, $func: ident) =>
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
match $endianess
|
|
|
|
{
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Big =>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
BigEndian::$func(&$buffer)
|
|
|
|
}
|
|
|
|
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Little =>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
LittleEndian::$func(&$buffer)
|
|
|
|
}
|
|
|
|
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Platform =>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
PlatformEndian::$func(&$buffer)
|
|
|
|
}
|
2016-06-17 04:34:36 -04:00
|
|
|
|
|
|
|
Endianess::Network =>
|
|
|
|
{
|
|
|
|
NetworkEndian::$func(&$buffer)
|
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2016-01-05 17:46:31 -05:00
|
|
|
impl Transmutable for u8
|
|
|
|
{
|
2016-12-22 13:47:56 -05:00
|
|
|
#[allow(unused_variables)]
|
2017-02-15 17:51:13 -05:00
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-12-22 13:47:56 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= u8::BYTES);
|
2016-12-22 13:47:56 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
// Just return the byte from the buffer.
|
|
|
|
// A single byte has no endian form.
|
|
|
|
buffer[0]
|
|
|
|
}
|
2016-12-22 13:47:56 -05:00
|
|
|
|
2016-01-05 17:46:31 -05:00
|
|
|
#[allow(unused_variables)]
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
// A single byte has no endian form.
|
|
|
|
vec![*self]
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
|
|
|
|
2016-12-22 13:47:56 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
u8::BYTES
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Transmutable for u16
|
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= u16::BYTES);
|
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_u16)
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
// Return the Endianess conversion.
|
|
|
|
handle_endianess_to_bytes!(self, endianess, u16_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
u16::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for u32
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= u32::BYTES);
|
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_u32)
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, u32_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
u32::BYTES
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for u64
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= u64::BYTES);
|
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_u64)
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, u64_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
u64::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for usize
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= usize::BYTES);
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_usize)
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, usize_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
usize::BYTES
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for i8
|
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
#[allow(unused_variables)]
|
2017-02-15 17:51:13 -05:00
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2015-12-30 17:06:48 -05:00
|
|
|
{
|
2016-01-05 17:46:31 -05:00
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= i8::BYTES);
|
|
|
|
|
|
|
|
buffer[0] as i8
|
2015-12-30 17:06:48 -05:00
|
|
|
}
|
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
#[allow(unused_variables)]
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
vec![*self as u8]
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
i8::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for i16
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= i16::BYTES);
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_i16)
|
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, i16_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
i16::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for i32
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= i32::BYTES);
|
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_i32)
|
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, i32_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
i32::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2015-12-30 17:06:48 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for i64
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= i64::BYTES);
|
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_i64)
|
|
|
|
}
|
2016-01-02 14:54:03 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, i64_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
i64::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2016-01-02 14:54:03 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for isize
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= isize::BYTES);
|
2016-01-02 14:54:03 -05:00
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_isize)
|
|
|
|
}
|
2016-01-02 14:54:03 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, isize_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
isize::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for f32
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
2017-02-15 17:51:13 -05:00
|
|
|
assert!(buffer.len() >= f32::BYTES);
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_f32)
|
|
|
|
}
|
2016-01-02 14:54:03 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
handle_endianess_to_bytes!(self, endianess, f32_to_bytes)
|
|
|
|
}
|
2016-04-14 13:33:07 -04:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
f32::BYTES
|
2016-01-05 17:46:31 -05:00
|
|
|
}
|
2017-02-15 17:51:13 -05:00
|
|
|
}
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
impl Transmutable for f64
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-05 17:46:31 -05:00
|
|
|
{
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
2017-02-15 17:51:13 -05:00
|
|
|
assert!(buffer.len() >= f64::BYTES);
|
2016-01-05 17:46:31 -05:00
|
|
|
|
2016-01-06 23:37:18 -05:00
|
|
|
// Convert the given bytes to this type and return it.
|
2016-01-05 17:46:31 -05:00
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_f64)
|
|
|
|
}
|
2016-04-14 18:08:50 -04:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2017-02-15 17:51:13 -05:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
|
|
|
handle_endianess_to_bytes!(self, endianess, f64_to_bytes)
|
|
|
|
}
|
|
|
|
|
2016-04-14 18:08:50 -04:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
f64::BYTES
|
|
|
|
}
|
2016-01-02 14:54:03 -05:00
|
|
|
}
|
2016-01-05 23:42:08 -05:00
|
|
|
|
2016-04-13 23:57:40 -04:00
|
|
|
impl Transmutable for String
|
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
|
|
|
{
|
|
|
|
// Convert the given bytes to this type and return it.
|
|
|
|
handle_endianess_from_bytes!(buffer, endianess, bytes_to_string)
|
|
|
|
}
|
2016-12-21 04:22:31 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-04-13 23:57:40 -04:00
|
|
|
{
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
|
|
|
// We are not using the macro because *String is a str.
|
|
|
|
match endianess
|
|
|
|
{
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Big =>
|
2016-04-13 23:57:40 -04:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
BigEndian::string_to_bytes(self.clone())
|
2016-04-13 23:57:40 -04:00
|
|
|
}
|
|
|
|
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Little =>
|
2016-04-13 23:57:40 -04:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
LittleEndian::string_to_bytes(self.clone())
|
2016-04-13 23:57:40 -04:00
|
|
|
}
|
|
|
|
|
2016-04-14 15:08:31 -04:00
|
|
|
Endianess::Platform =>
|
2016-04-13 23:57:40 -04:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
PlatformEndian::string_to_bytes(self.clone())
|
2016-04-13 23:57:40 -04:00
|
|
|
}
|
2016-06-17 04:34:36 -04:00
|
|
|
|
|
|
|
Endianess::Network =>
|
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
NetworkEndian::string_to_bytes(self.clone())
|
2016-12-22 13:47:56 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-14 18:08:50 -04:00
|
|
|
fn determine_byte_size(&self) -> usize
|
2016-04-13 23:57:40 -04:00
|
|
|
{
|
2016-04-14 18:08:50 -04:00
|
|
|
get_byte_size_of_string(self)
|
2016-04-13 23:57:40 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-24 13:23:56 -04:00
|
|
|
#[cfg(feature="convert_sigils")]
|
2017-11-23 00:02:24 -05:00
|
|
|
impl<T> Transmutable for DynamicArraytor2<T> where T: Number + ByteSized + Transmutable
|
2016-01-06 23:37:18 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-12-21 04:22:31 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut vec: DynamicArraytor2<T>;
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
2017-11-23 00:02:24 -05:00
|
|
|
// represent a DynamicArraytor2.
|
|
|
|
vec = DynamicArraytor2::<T>::zero();
|
2016-12-21 04:22:31 -05:00
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * vec.get_size() as usize;
|
|
|
|
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= num_bytes);
|
|
|
|
|
|
|
|
// Convert the given bytes to this type and return it.
|
|
|
|
vec.x = T::from_endian_bytes(&buffer[0..byte_size],
|
|
|
|
endianess);
|
|
|
|
vec.y = T::from_endian_bytes(&buffer[byte_size..num_bytes],
|
|
|
|
endianess);
|
|
|
|
vec
|
|
|
|
}
|
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-12-21 04:22:31 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut buffer: DynamicArray<u8>;
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
2017-11-23 00:02:24 -05:00
|
|
|
// represent a DynamicArraytor2.
|
2016-12-21 04:22:31 -05:00
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * self.get_size() as usize;
|
|
|
|
|
|
|
|
// Make sure that there is enough space to store
|
|
|
|
// the bytes from this type.
|
2017-11-23 00:02:24 -05:00
|
|
|
buffer = DynamicArray::with_capacity(num_bytes);
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2016-12-22 13:47:56 -05:00
|
|
|
buffer.append(&mut self.x.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.y.as_endian_bytes(endianess));
|
2016-04-14 13:33:07 -04:00
|
|
|
|
|
|
|
// Return the byte buffer.
|
|
|
|
buffer
|
2016-01-07 05:10:50 -05:00
|
|
|
}
|
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
2016-12-21 04:22:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
T::get_byte_size() * self.get_size() as usize
|
|
|
|
}
|
|
|
|
}
|
2016-12-21 04:22:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
#[cfg(feature="convert_sigils")]
|
2017-11-23 00:02:24 -05:00
|
|
|
impl<T> Transmutable for DynamicArraytor3<T> where T: Number + ByteSized + Transmutable
|
2017-02-15 17:51:13 -05:00
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-07 05:10:50 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut vec: DynamicArraytor3<T>;
|
2016-01-07 05:10:50 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
2017-11-23 00:02:24 -05:00
|
|
|
// represent a DynamicArraytor3.
|
|
|
|
vec = DynamicArraytor3::<T>::zero();
|
2016-01-07 05:10:50 -05:00
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * vec.get_size() as usize;
|
|
|
|
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= num_bytes);
|
|
|
|
|
|
|
|
// Convert the given bytes to this type and return it.
|
2016-12-21 04:22:31 -05:00
|
|
|
vec.x = T::from_endian_bytes(&buffer[0..byte_size],
|
|
|
|
endianess);
|
|
|
|
vec.y = T::from_endian_bytes(&buffer[byte_size..(byte_size*2)],
|
|
|
|
endianess);
|
|
|
|
vec.z = T::from_endian_bytes(&buffer[(byte_size*2)..num_bytes],
|
|
|
|
endianess);
|
2016-01-07 05:10:50 -05:00
|
|
|
vec
|
|
|
|
}
|
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-04-14 18:08:50 -04:00
|
|
|
{
|
2016-12-22 13:47:56 -05:00
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut buffer: DynamicArray<u8>;
|
2016-12-22 13:47:56 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
2017-11-23 00:02:24 -05:00
|
|
|
// represent a DynamicArraytor3.
|
2016-12-22 13:47:56 -05:00
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * self.get_size() as usize;
|
|
|
|
|
|
|
|
// Make sure that there is enough space to store
|
|
|
|
// the bytes from this type.
|
2017-11-23 00:02:24 -05:00
|
|
|
buffer = DynamicArray::with_capacity(num_bytes);
|
2016-12-22 13:47:56 -05:00
|
|
|
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
|
|
|
buffer.append(&mut self.x.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.y.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.z.as_endian_bytes(endianess));
|
|
|
|
|
|
|
|
// Return the byte buffer.
|
|
|
|
buffer
|
2016-04-14 18:08:50 -04:00
|
|
|
}
|
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
2016-12-21 04:22:31 -05:00
|
|
|
{
|
2017-02-15 17:51:13 -05:00
|
|
|
T::get_byte_size() * self.get_size() as usize
|
|
|
|
}
|
|
|
|
}
|
2016-12-21 04:22:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
#[cfg(feature="convert_sigils")]
|
2017-11-23 00:02:24 -05:00
|
|
|
impl<T> Transmutable for DynamicArraytor4<T> where T: Number + ByteSized + Transmutable
|
2017-02-15 17:51:13 -05:00
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-07 05:10:50 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut vec: DynamicArraytor4<T>;
|
2016-01-07 05:10:50 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
2017-11-23 00:02:24 -05:00
|
|
|
// represent a DynamicArraytor4.
|
|
|
|
vec = DynamicArraytor4::<T>::zero();
|
2016-01-07 05:10:50 -05:00
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * vec.get_size() as usize;
|
|
|
|
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= num_bytes);
|
|
|
|
|
|
|
|
// Convert the given bytes to this type and return it.
|
2016-12-21 04:22:31 -05:00
|
|
|
vec.x = T::from_endian_bytes(&buffer[0..byte_size],
|
|
|
|
endianess);
|
|
|
|
vec.y = T::from_endian_bytes(&buffer[byte_size..(byte_size*2)],
|
|
|
|
endianess);
|
|
|
|
vec.z = T::from_endian_bytes(&buffer[(byte_size*2)..(byte_size*3)],
|
|
|
|
endianess);
|
|
|
|
vec.w = T::from_endian_bytes(&buffer[(byte_size*3)..num_bytes],
|
|
|
|
endianess);
|
2016-01-07 05:10:50 -05:00
|
|
|
vec
|
|
|
|
}
|
2016-01-07 05:51:53 -05:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-12-21 04:22:31 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut buffer: DynamicArray<u8>;
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
2017-11-23 00:02:24 -05:00
|
|
|
// represent a DynamicArraytor4.
|
2016-12-21 04:22:31 -05:00
|
|
|
byte_size = T::get_byte_size();
|
2017-02-15 17:51:13 -05:00
|
|
|
num_bytes = byte_size * self.get_size() as usize;
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Make sure that there is enough space to store
|
|
|
|
// the bytes from this type.
|
2017-11-23 00:02:24 -05:00
|
|
|
buffer = DynamicArray::with_capacity(num_bytes);
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Convert this to bytes and add it to the buffer.
|
2017-02-15 17:51:13 -05:00
|
|
|
buffer.append(&mut self.x.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.y.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.z.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.w.as_endian_bytes(endianess));
|
2016-04-14 13:33:07 -04:00
|
|
|
|
|
|
|
// Return the byte buffer.
|
|
|
|
buffer
|
2016-01-07 05:51:53 -05:00
|
|
|
}
|
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
T::get_byte_size() * self.get_size() as usize
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(feature="convert_sigils")]
|
|
|
|
impl<T> Transmutable for Quaternion<T>
|
|
|
|
where T: Real + ByteSized + Transmutable
|
|
|
|
{
|
|
|
|
fn from_endian_bytes(buffer: &[u8], endianess: Endianess) -> Self
|
2016-01-07 05:51:53 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
|
|
|
let mut quat: Quaternion<T>;
|
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
|
|
|
// represent a Quaternion.
|
|
|
|
quat = Quaternion::<T>::zero();
|
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * 4usize;
|
|
|
|
|
|
|
|
// Make sure that there is enough data to read
|
|
|
|
// the bytes for this type.
|
|
|
|
assert!(buffer.len() >= num_bytes);
|
|
|
|
|
|
|
|
// Convert the given bytes to this type and return it.
|
2017-02-15 17:51:13 -05:00
|
|
|
quat.scalar = T::from_endian_bytes(&buffer[0..byte_size], endianess);
|
2016-01-07 05:51:53 -05:00
|
|
|
quat.vector =
|
2017-11-23 00:02:24 -05:00
|
|
|
DynamicArraytor3::<T>::from_endian_bytes(&buffer[byte_size..num_bytes],
|
2017-02-15 17:51:13 -05:00
|
|
|
endianess);
|
2016-01-07 05:51:53 -05:00
|
|
|
quat
|
|
|
|
}
|
2016-04-14 18:08:50 -04:00
|
|
|
|
2017-11-23 00:02:24 -05:00
|
|
|
fn as_endian_bytes(&self, endianess: Endianess) -> DynamicArray<u8>
|
2016-12-21 04:22:31 -05:00
|
|
|
{
|
|
|
|
let byte_size: usize;
|
|
|
|
let num_bytes: usize;
|
2017-11-23 00:02:24 -05:00
|
|
|
let mut buffer: DynamicArray<u8>;
|
2016-12-21 04:22:31 -05:00
|
|
|
|
|
|
|
// Determine the number of bytes requires to
|
|
|
|
// represent a Quaternion.
|
|
|
|
byte_size = T::get_byte_size();
|
|
|
|
num_bytes = byte_size * 4usize;
|
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
// Make sure that there is enough space to store
|
|
|
|
// the bytes from this type.
|
2017-11-23 00:02:24 -05:00
|
|
|
buffer = DynamicArray::with_capacity(num_bytes);
|
2016-12-21 04:22:31 -05:00
|
|
|
|
2017-02-15 17:51:13 -05:00
|
|
|
// Convert this to bytes and add it to the buffer.
|
|
|
|
buffer.append(&mut self.scalar.as_endian_bytes(endianess));
|
|
|
|
buffer.append(&mut self.vector.as_endian_bytes(endianess));
|
|
|
|
|
|
|
|
// Return the byte buffer.
|
|
|
|
buffer
|
2016-12-21 04:22:31 -05:00
|
|
|
}
|
|
|
|
|
2016-04-14 18:08:50 -04:00
|
|
|
fn determine_byte_size(&self) -> usize
|
|
|
|
{
|
|
|
|
T::get_byte_size() * 4usize
|
|
|
|
}
|
2016-01-07 05:51:53 -05:00
|
|
|
}
|