Skip to content

Commit

Permalink
[Rust] Remove unnecessary abstraction (#1225)
Browse files Browse the repository at this point in the history
chore: remove uncessary abstraction
  • Loading branch information
theweipeng authored Dec 10, 2023
1 parent 738a29f commit a275c68
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 148 deletions.
4 changes: 1 addition & 3 deletions rust/fury-derive/src/fury_row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ pub fn derive_row(ast: &syn::DeriveInput) -> TokenStream {

quote! {
let mut callback_info = struct_writer.write_start(#index);
<#ty as fury::__derive::Row<'a>>::write(&v.#ident, struct_writer.borrow_writer());
<#ty as fury::__derive::Row<'a>>::write(&v.#ident, struct_writer.get_writer());
struct_writer.write_end(callback_info);
}
});
Expand All @@ -44,7 +44,6 @@ pub fn derive_row(ast: &syn::DeriveInput) -> TokenStream {

quote! {
pub fn #getter_name(&self) -> <#ty as fury::__derive::Row<'a>>::ReadResult {
use fury::__derive::RowViewer;
let bytes = self.struct_data.get_field_bytes(#index);
<#ty as fury::__derive::Row<'a>>::cast(bytes)
}
Expand All @@ -70,7 +69,6 @@ pub fn derive_row(ast: &syn::DeriveInput) -> TokenStream {
type ReadResult = #getter<'a>;

fn write(v: &Self, writer: &mut fury::__derive::Writer) {
use fury::__derive::RowWriter;
let mut struct_writer = fury::__derive::StructWriter::new(#num_fields, writer);
#(#write_exprs);*;
}
Expand Down
2 changes: 1 addition & 1 deletion rust/fury/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ pub use serializer::to_buffer;
pub mod __derive {
pub use crate::buffer::{Reader, Writer};
pub use crate::deserializer::{Deserialize, DeserializerState};
pub use crate::row::{Row, RowViewer, RowWriter, StructViewer, StructWriter};
pub use crate::row::{Row, StructViewer, StructWriter};
pub use crate::serializer::{Serialize, SerializerState};
pub use crate::types::{compute_struct_hash, FieldType, FuryMeta, SIZE_OF_REF_AND_TYPE};
pub use crate::Error;
Expand Down
4 changes: 2 additions & 2 deletions rust/fury/src/row/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ mod reader;
mod row;
mod writer;

pub use reader::{from_row, ArrayViewer, RowViewer, StructViewer};
pub use reader::{from_row, ArrayViewer, StructViewer};
pub use row::Row;
pub use writer::{to_row, ArrayWriter, RowWriter, StructWriter};
pub use writer::{to_row, ArrayWriter, StructWriter};
85 changes: 30 additions & 55 deletions rust/fury/src/row/reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,97 +15,90 @@
use super::{bit_util::calculate_bitmap_width_in_bytes, row::Row};
use byteorder::{ByteOrder, LittleEndian};

pub trait RowViewer<'r> {
fn row(&self) -> &'r [u8];

fn get_field_offset(&self, idx: usize) -> usize;
struct FieldAccessorHelper<'a> {
row: &'a [u8],
get_field_offset: Box<dyn Fn(usize) -> usize>,
}

impl<'a> FieldAccessorHelper<'a> {
fn get_offset_size(&self, idx: usize) -> (u32, u32) {
let row = self.row();
let field_offset = self.get_field_offset(idx);
let row = self.row;
let field_offset = (self.get_field_offset)(idx);
let offset = LittleEndian::read_u32(&row[field_offset..field_offset + 4]);
let size = LittleEndian::read_u32(&row[field_offset + 4..field_offset + 8]);
(offset, size)
}

fn get_field_bytes(&self, idx: usize) -> &'r [u8] {
let row = self.row();
pub fn new(row: &[u8], get_field_offset: Box<dyn Fn(usize) -> usize>) -> FieldAccessorHelper {
FieldAccessorHelper {
row,
get_field_offset,
}
}

pub fn get_field_bytes(&self, idx: usize) -> &'a [u8] {
let row = self.row;
let (offset, size) = self.get_offset_size(idx);
&row[(offset as usize)..(offset + size) as usize]
}
}

#[derive(Clone, Copy)]
pub struct StructViewer<'r> {
bit_map_width_in_bytes: usize,
row: &'r [u8],
field_accessor_helper: FieldAccessorHelper<'r>,
}

impl<'r> StructViewer<'r> {
pub fn new(row: &'r [u8], num_fields: usize) -> StructViewer<'r> {
let bit_map_width_in_bytes = calculate_bitmap_width_in_bytes(num_fields);
StructViewer {
row,
bit_map_width_in_bytes,
field_accessor_helper: FieldAccessorHelper::new(
row,
Box::new(move |idx: usize| bit_map_width_in_bytes + idx * 8),
),
}
}
}

impl<'r> RowViewer<'r> for StructViewer<'r> {
fn get_field_offset(&self, idx: usize) -> usize {
self.bit_map_width_in_bytes + idx * 8
}

fn row(&self) -> &'r [u8] {
self.row
pub fn get_field_bytes(&self, idx: usize) -> &'r [u8] {
self.field_accessor_helper.get_field_bytes(idx)
}
}

#[derive(Clone, Copy)]
pub struct ArrayViewer<'r> {
bit_map_width_in_bytes: usize,
row: &'r [u8],
num_elements: usize,
field_accessor_helper: FieldAccessorHelper<'r>,
}

impl<'r> ArrayViewer<'r> {
pub fn new(row: &'r [u8]) -> ArrayViewer<'r> {
let num_elements = LittleEndian::read_u64(&row[0..8]) as usize;
let bit_map_width_in_bytes = calculate_bitmap_width_in_bytes(num_elements);
ArrayViewer {
row,
bit_map_width_in_bytes,
num_elements,
field_accessor_helper: FieldAccessorHelper::new(
row,
Box::new(move |idx: usize| 8 + bit_map_width_in_bytes + idx * 8),
),
}
}

pub fn num_elements(&self) -> usize {
self.num_elements
}
}

impl<'r> RowViewer<'r> for ArrayViewer<'r> {
fn get_field_offset(&self, idx: usize) -> usize {
8 + self.bit_map_width_in_bytes + idx * 8
}

fn row(&self) -> &'r [u8] {
self.row
pub fn get_field_bytes(&self, idx: usize) -> &'r [u8] {
self.field_accessor_helper.get_field_bytes(idx)
}
}

#[derive(Clone, Copy)]
pub struct MapViewer<'r> {
key_row: &'r [u8],
value_row: &'r [u8],
row: &'r [u8],
}

impl<'r> MapViewer<'r> {
pub fn new(row: &'r [u8]) -> MapViewer<'r> {
let key_byte_size = LittleEndian::read_u64(&row[0..8]) as usize;
MapViewer {
row,
value_row: &row[key_byte_size + 8..row.len()],
key_row: &row[8..key_byte_size + 8],
}
Expand All @@ -120,24 +113,6 @@ impl<'r> MapViewer<'r> {
}
}

impl<'r> RowViewer<'r> for MapViewer<'r> {
fn get_offset_size(&self, _idx: usize) -> (u32, u32) {
panic!("unreachable code")
}

fn get_field_bytes(&self, _idx: usize) -> &'r [u8] {
panic!("unreachable code")
}

fn get_field_offset(&self, _idx: usize) -> usize {
panic!("unreachable code")
}

fn row(&self) -> &'r [u8] {
self.row
}
}

pub fn from_row<'a, T: Row<'a>>(row: &'a [u8]) -> T::ReadResult {
T::cast(row)
}
14 changes: 7 additions & 7 deletions rust/fury/src/row/row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ use std::collections::BTreeMap;
use std::marker::PhantomData;

use super::{
reader::{ArrayViewer, MapViewer, RowViewer},
writer::{ArrayWriter, MapWriter, RowWriter},
reader::{ArrayViewer, MapViewer},
writer::{ArrayWriter, MapWriter},
};

pub trait Row<'a> {
Expand Down Expand Up @@ -157,7 +157,7 @@ impl<'a, T: Row<'a>> Row<'a> for Vec<T> {
let mut array_writer = ArrayWriter::new(v.len(), writer);
v.iter().enumerate().for_each(|(idx, item)| {
let callback_info = array_writer.write_start(idx);
<T as Row>::write(item, array_writer.borrow_writer());
<T as Row>::write(item, array_writer.get_writer());
array_writer.write_end(callback_info);
});
}
Expand Down Expand Up @@ -217,19 +217,19 @@ impl<'a, T1: Row<'a> + Ord, T2: Row<'a> + Ord> Row<'a> for BTreeMap<T1, T2> {
let mut map_writter = MapWriter::new(writer);
{
let callback_info = map_writter.write_start(0);
let mut array_writer = ArrayWriter::new(v.len(), map_writter.borrow_writer());
let mut array_writer = ArrayWriter::new(v.len(), map_writter.get_writer());
v.keys().enumerate().for_each(|(idx, item)| {
let callback_info = array_writer.write_start(idx);
<T1 as Row>::write(item, array_writer.borrow_writer());
<T1 as Row>::write(item, array_writer.get_writer());
array_writer.write_end(callback_info);
});
map_writter.write_end(callback_info);
}
{
let mut array_writer = ArrayWriter::new(v.len(), map_writter.borrow_writer());
let mut array_writer = ArrayWriter::new(v.len(), map_writter.get_writer());
v.values().enumerate().for_each(|(idx, item)| {
let callback_info = array_writer.write_start(idx);
<T2 as Row>::write(item, array_writer.borrow_writer());
<T2 as Row>::write(item, array_writer.get_writer());
array_writer.write_end(callback_info);
});
}
Expand Down
Loading

0 comments on commit a275c68

Please sign in to comment.