mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 16:44:06 +02:00
use unchecked reads to group bounds checks where possible
This commit is contained in:
parent
a6e9b59ece
commit
88c9c21d74
1 changed files with 18 additions and 1 deletions
|
|
@ -209,6 +209,12 @@ fn derive_bitread_trait(
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let extra_param_call = if extra_param.is_some() {
|
||||||
|
Some(quote!(input_size))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
let size_method_name = Ident::new(
|
let size_method_name = Ident::new(
|
||||||
if extra_param.is_some() {
|
if extra_param.is_some() {
|
||||||
"bit_size_sized"
|
"bit_size_sized"
|
||||||
|
|
@ -221,8 +227,19 @@ fn derive_bitread_trait(
|
||||||
let expanded = quote! {
|
let expanded = quote! {
|
||||||
impl #impl_generics #trait_def for #name #ty_generics #where_clause {
|
impl #impl_generics #trait_def for #name #ty_generics #where_clause {
|
||||||
fn read(stream: &mut ::bitstream_reader::BitStream<#endianness_ident>#extra_param) -> ::bitstream_reader::Result<Self> {
|
fn read(stream: &mut ::bitstream_reader::BitStream<#endianness_ident>#extra_param) -> ::bitstream_reader::Result<Self> {
|
||||||
|
// if the read has a predicable size, we can do the bounds check in one go
|
||||||
|
match <Self as #trait_def>::#size_method_name(#extra_param_call) {
|
||||||
|
Some(size) => {
|
||||||
|
stream.check_read(size)?;
|
||||||
|
unsafe {
|
||||||
|
<Self as #trait_def>::read_unchecked(stream, #extra_param_call)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => {
|
||||||
#parsed
|
#parsed
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsafe fn read_unchecked(stream: &mut ::bitstream_reader::BitStream<#endianness_ident>#extra_param) -> ::bitstream_reader::Result<Self> {
|
unsafe fn read_unchecked(stream: &mut ::bitstream_reader::BitStream<#endianness_ident>#extra_param) -> ::bitstream_reader::Result<Self> {
|
||||||
#parsed_unchecked
|
#parsed_unchecked
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue