#![no_std]
pub use hybrid_array;
#[doc(hidden)]
pub use hybrid_array::Array;
use hybrid_array::ArraySize;
use hybrid_array::AssocArraySize;
#[doc(hidden)]
pub use hybrid_array::sizes;
#[cfg(doc)]
use hybrid_array::typenum;
pub mod bytes;
pub mod chunks;
mod macros;
pub fn array_from_core<T, const N: usize>(
array: [T; N],
) -> Array<T, <[T; N] as AssocArraySize>::Size>
where
[T; N]: AssocArraySize,
<[T; N] as AssocArraySize>::Size: ArraySize<ArrayType<T> = [T; N]>,
{
Array(array)
}
pub fn array_to_core<T, const N: usize>(array: Array<T, <[T; N] as AssocArraySize>::Size>) -> [T; N]
where
[T; N]: AssocArraySize,
<[T; N] as AssocArraySize>::Size: ArraySize<ArrayType<T> = [T; N]>,
{
array.0
}
#[cfg(test)]
mod test {
use hybrid_array::sizes::U0;
use hybrid_array::sizes::U1;
use hybrid_array::sizes::U2;
use hybrid_array::sizes::U3;
use hybrid_array::sizes::U4;
use hybrid_array::sizes::U10;
use super::*;
#[test]
fn test_split_array_manual() {
let data = [
0, 42, 0x0, 0x0, 0x12, 0x34, 0, b'a', b'b', b'c', ];
let data = Array::<_, U10>(data);
let (foo, rest) = data.split::<U2>();
assert_eq!(u16::from_be_bytes(foo.0), 42);
let (bar, rest) = rest.split::<U4>();
assert_eq!(u32::from_be_bytes(bar.0), 0x1234);
let (_pad, rest) = rest.split::<U1>();
let (alpha, rest) = rest.split::<U3>();
assert_eq!(alpha.0, *b"abc");
let _rest: Array<_, U0> = rest;
}
#[test]
fn test_split_array() {
let data = [
0, 42, 0x0, 0x0, 0x12, 0x34, 0, b'a', b'b', b'c', ];
split_array! {
let split [
foo,
bar,
_pad: array U1,
alpha: array U3,
] = Array::<_, U10>(data);
}
assert_eq!(u16::from_be_bytes(array_to_core(foo)), 42);
assert_eq!(u32::from_be_bytes(array_to_core(bar)), 0x1234);
assert_eq!(alpha.0, *b"abc");
}
#[test]
fn test_split_core_array() {
let data = [
0, 42, 0x0, 0x0, 0x12, 0x34, 0, b'a', b'b', b'c', ];
split_core_array! {
let split [
foo,
bar,
_pad: [u8;1],
alpha,
] = data;
}
assert_eq!(u16::from_be_bytes(foo), 42);
assert_eq!(u32::from_be_bytes(bar), 0x1234);
assert_eq!(alpha, *b"abc");
}
#[test]
fn test_merge_array() {
let foo = Array::<_, U2>(u16::to_be_bytes(42));
let bar = Array::<_, U4>(u32::to_be_bytes(0x1234));
let padding = Array::<_, U1>([0]);
let alpha = Array::<_, U3>(*b"abc");
let data = merge_array!([foo, bar, padding, alpha]);
assert_eq!(
data,
Array([
0, 42, 0x0, 0x0, 0x12, 0x34, 0, b'a', b'b', b'c', ])
);
}
#[test]
fn test_merge_core_array() {
let foo = u16::to_be_bytes(42);
let bar = u32::to_be_bytes(0x1234);
let padding = [0];
let alpha = *b"abc";
let data = merge_core_array!([foo, bar, padding, alpha]);
assert_eq!(
data,
[
0, 42, 0x0, 0x0, 0x12, 0x34, 0, b'a', b'b', b'c', ]
);
}
#[test]
fn test_split_emtpy_array() {
let data: Array<u8, U0> = Array([]);
split_array! {
let split [ ] = data;
}
}
#[test]
fn test_split_emtpy_core_array() {
let data: [u8; 0] = [];
split_core_array! {
let split [ ] = data;
}
}
}