From 50080741366050ed31d1c43272806bc61ef37d9e Mon Sep 17 00:00:00 2001 From: Kenneth Loeffler Date: Mon, 19 Jun 2023 12:13:04 -0700 Subject: [PATCH] Fix write_interleaved_bytes so that it actually writes interleaved (#287) write_interleaved_bytes fails right now because it's just writing the bytes in their original sequence (see the results [here](https://github.com/rojo-rbx/rbx-dom/actions/runs/5296791237/jobs/9588138111))! This PR aims to close #286 by tweaking write_interleaved_bytes' implementation to interleave the bytes as it should. --- rbx_binary/src/core.rs | 14 ++--- rbx_binary/src/tests/core_read_write.rs | 69 +++++++++++++++++++++++++ rbx_binary/src/tests/mod.rs | 1 + 3 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 rbx_binary/src/tests/core_read_write.rs diff --git a/rbx_binary/src/core.rs b/rbx_binary/src/core.rs index 5fbd2ca2..530e6206 100644 --- a/rbx_binary/src/core.rs +++ b/rbx_binary/src/core.rs @@ -117,7 +117,7 @@ pub trait RbxReadExt: Read { } fn read_interleaved_i32_array(&mut self, output: &mut [i32]) -> io::Result<()> { - let mut buffer = vec![0; output.len() * mem::size_of::()]; + let mut buffer = vec![0; mem::size_of_val(output)]; self.read_exact(&mut buffer)?; for i in 0..output.len() { @@ -133,7 +133,7 @@ pub trait RbxReadExt: Read { } fn read_interleaved_u32_array(&mut self, output: &mut [u32]) -> io::Result<()> { - let mut buffer = vec![0; output.len() * mem::size_of::()]; + let mut buffer = vec![0; mem::size_of_val(output)]; self.read_exact(&mut buffer)?; for i in 0..output.len() { @@ -151,7 +151,7 @@ pub trait RbxReadExt: Read { } fn read_interleaved_f32_array(&mut self, output: &mut [f32]) -> io::Result<()> { - let mut buf = vec![0; output.len() * mem::size_of::()]; + let mut buf = vec![0; mem::size_of_val(output)]; self.read_exact(&mut buf)?; for i in 0..output.len() { @@ -179,7 +179,7 @@ pub trait RbxReadExt: Read { } fn read_interleaved_i64_array(&mut self, output: &mut [i64]) -> io::Result<()> { - let mut buf = vec![0; output.len() * mem::size_of::()]; + let mut buf = vec![0; mem::size_of_val(output)]; self.read_exact(&mut buf)?; for i in 0..output.len() { @@ -269,9 +269,9 @@ pub trait RbxWriteExt: Write { fn write_interleaved_bytes(&mut self, values: &[[u8; N]]) -> io::Result<()> { let len = values.len(); let mut blob = vec![0; len * N]; - for (x, bytes) in values.iter().enumerate() { - for (y, byte) in bytes.iter().enumerate() { - blob[y + x * N] = *byte; + for (i, bytes) in values.iter().enumerate() { + for (j, byte) in bytes.iter().enumerate() { + blob[i + len * j] = *byte; } } self.write_all(&blob)?; diff --git a/rbx_binary/src/tests/core_read_write.rs b/rbx_binary/src/tests/core_read_write.rs new file mode 100644 index 00000000..b17edb95 --- /dev/null +++ b/rbx_binary/src/tests/core_read_write.rs @@ -0,0 +1,69 @@ +use crate::core::{RbxReadExt, RbxWriteExt}; + +#[test] +fn read_interleaved_bytes() { + #[rustfmt::skip] + let mut input: &[u8] = &[ + 0, 0, 0, + 1, 1, 1, + 2, 2, 2, + 3, 3, 3, + 4, 4, 4, + 5, 5, 5, + 6, 6, 6, + 7, 7, 7, + 8, 8, 8, + 9, 9, 9, + 10, 10, 10, + 11, 11, 11, + 12, 12, 12, + 13, 13, 13, + 14, 14, 14, + 15, 15, 15, + ]; + + let expected = &[ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + ]; + + let mut result = vec![[0; 16]; expected.len()]; + input.read_interleaved_bytes::<16>(&mut result).unwrap(); + + assert_eq!(result, expected) +} + +#[test] +fn write_interleaved_bytes() { + let input: &[[u8; 16]] = &[ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + ]; + + #[rustfmt::skip] + let expected = &[ + 0, 0, 0, + 1, 1, 1, + 2, 2, 2, + 3, 3, 3, + 4, 4, 4, + 5, 5, 5, + 6, 6, 6, + 7, 7, 7, + 8, 8, 8, + 9, 9, 9, + 10, 10, 10, + 11, 11, 11, + 12, 12, 12, + 13, 13, 13, + 14, 14, 14, + 15, 15, 15, + ]; + + let mut result = Vec::new(); + result.write_interleaved_bytes::<16>(input).unwrap(); + + assert_eq!(result, expected) +} diff --git a/rbx_binary/src/tests/mod.rs b/rbx_binary/src/tests/mod.rs index 19200700..573e8252 100644 --- a/rbx_binary/src/tests/mod.rs +++ b/rbx_binary/src/tests/mod.rs @@ -1,3 +1,4 @@ +mod core_read_write; mod models; mod places; mod serializer;