diff --git a/src/plain.rs b/src/plain.rs index 3552200..954c9fc 100644 --- a/src/plain.rs +++ b/src/plain.rs @@ -94,3 +94,21 @@ where S: Plain, { } + +// Must be same element type to avoid padding +unsafe impl Plain for (A,) {} +unsafe impl Plain for (A,A) {} +unsafe impl Plain for (A,A,A) {} +unsafe impl Plain for (A,A,A,A) {} +unsafe impl Plain for (A,A,A,A,A) {} +unsafe impl Plain for (A,A,A,A,A,A) {} +unsafe impl Plain for (A,A,A,A,A,A,A) {} +unsafe impl Plain for (A,A,A,A,A,A,A,A) {} + +macro_rules! impl_array { + ($($n:tt)+) => { + $(unsafe impl Plain for [A; $n] {})+ + } +} + +impl_array! {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 64 128 256 1024} diff --git a/src/tests.rs b/src/tests.rs index 4a31044..5bcf5d2 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -134,3 +134,13 @@ fn basic_function() { assert!(r7[0] == 0xaaaaaaaaaaaaaaaau64); assert!(r7[1] == 0xbbbbbbbbccccddeeu64 || r7[1] == 0xeeddccccbbbbbbbbu64); } + +#[test] +fn tuples_and_arrays() { + fn is_plain(_: T) {} + + is_plain((1u8,)); + is_plain((1u8, 2u8, 3u8)); + is_plain([0u8; 17]); + is_plain([0u8; 32]); +}