Skip to content
This repository has been archived by the owner on Feb 18, 2024. It is now read-only.

Simplified IPC code. #277

Merged
merged 1 commit into from
Aug 12, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions src/io/ipc/read/read_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,19 @@ use crate::{bitmap::Bitmap, buffer::MutableBuffer, types::NativeType};
use super::super::compression;
use super::super::gen;

fn read_big_endian<T: NativeType, R: Read + Seek>(
fn read_swapped<T: NativeType, R: Read + Seek>(
reader: &mut R,
bytes: usize,
length: usize,
buffer: &mut MutableBuffer<T>,
is_little_endian: bool,
) -> Result<()> {
// slow case where we must reverse bits
let mut slice = vec![0u8; bytes];
let mut slice = vec![0u8; length * std::mem::size_of::<T>()];
reader.read_exact(&mut slice)?;

let chunks = slice.chunks_exact(std::mem::size_of::<T>());
if !is_little_endian {
let chunks = slice.chunks_exact(std::mem::size_of::<T>());
// machine is little endian, file is big endian
buffer
.as_mut_slice()
.iter_mut()
Expand All @@ -35,17 +36,20 @@ fn read_big_endian<T: NativeType, R: Read + Seek>(
Result::Ok(())
})
.unwrap();
} else {
// machine is big endian, file is little endian
todo!("reading little endian files from big endian machines not yet implemented.")
}
Ok(())
}

fn read_uncompressed_buffer<T: NativeType, R: Read + Seek>(
reader: &mut R,
buffer_length: usize,
bytes: usize,
length: usize,
is_little_endian: bool,
) -> Result<MutableBuffer<T>> {
let bytes = length * std::mem::size_of::<T>();
if bytes > buffer_length {
return Err(ArrowError::Ipc(
format!("The slots of the array times the physical size must \
Expand All @@ -68,11 +72,14 @@ fn read_uncompressed_buffer<T: NativeType, R: Read + Seek>(
// fast case where we can just copy the contents as is
unsafe {
// transmute T to bytes.
let slice = std::slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, bytes);
let slice = std::slice::from_raw_parts_mut(
buffer.as_mut_ptr() as *mut u8,
length * std::mem::size_of::<T>(),
);
reader.read_exact(slice)?;
}
} else {
read_big_endian(reader, bytes, &mut buffer, is_little_endian)?;
read_swapped(reader, length, &mut buffer, is_little_endian)?;
}
Ok(buffer)
}
Expand Down Expand Up @@ -144,18 +151,13 @@ pub fn read_buffer<T: NativeType, R: Read + Seek>(

let buffer_length = buf.length() as usize;

let bytes = length * std::mem::size_of::<T>();

if let Some(compression) = compression {
Ok(
read_compressed_buffer(reader, buffer_length, length, is_little_endian, compression)?
.into(),
)
} else {
Ok(
read_uncompressed_buffer(reader, buffer_length, bytes, length, is_little_endian)?
.into(),
)
Ok(read_uncompressed_buffer(reader, buffer_length, length, is_little_endian)?.into())
}
}

Expand Down