mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 16:44:06 +02:00
bit_size cleanup
This commit is contained in:
parent
10407f25a8
commit
0898cb6b5d
1 changed files with 29 additions and 26 deletions
|
|
@ -139,8 +139,8 @@ use proc_macro2::{Span, TokenStream};
|
||||||
use quote::{quote, quote_spanned};
|
use quote::{quote, quote_spanned};
|
||||||
use syn::spanned::Spanned;
|
use syn::spanned::Spanned;
|
||||||
use syn::{
|
use syn::{
|
||||||
parse_macro_input, parse_quote, parse_str, Attribute, Data, DeriveInput, Expr, Fields, Ident,
|
parse_macro_input, parse_quote, parse_str, Attribute, Data, DataStruct, DeriveInput, Expr,
|
||||||
Lit, LitStr, Path, Variant,
|
Fields, Ident, Lit, LitStr, Path, Variant,
|
||||||
};
|
};
|
||||||
use syn_util::get_attribute_value;
|
use syn_util::get_attribute_value;
|
||||||
|
|
||||||
|
|
@ -321,7 +321,7 @@ fn parse(data: &Data, struct_name: &Ident, attrs: &Vec<Attribute>) -> TokenStrea
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_field_size(attrs: &Vec<Attribute>, span: Span) -> Option<TokenStream> {
|
fn get_field_size(attrs: &[Attribute], span: Span) -> Option<TokenStream> {
|
||||||
get_attribute_value(attrs, &["size"])
|
get_attribute_value(attrs, &["size"])
|
||||||
.map(|size_lit| match size_lit {
|
.map(|size_lit| match size_lit {
|
||||||
Lit::Int(size) => {
|
Lit::Int(size) => {
|
||||||
|
|
@ -370,7 +370,7 @@ fn derive_bitsize_trait(
|
||||||
|
|
||||||
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
|
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
|
||||||
|
|
||||||
let sum = bit_size_sum(&input.data);
|
let sum = bit_size_sum(input.data);
|
||||||
|
|
||||||
let trait_def_str = format!("::bitstream_reader::{}", trait_name);
|
let trait_def_str = format!("::bitstream_reader::{}", trait_name);
|
||||||
let trait_def = parse_str::<Path>(&trait_def_str).unwrap();
|
let trait_def = parse_str::<Path>(&trait_def_str).unwrap();
|
||||||
|
|
@ -389,33 +389,36 @@ fn derive_bitsize_trait(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate an expression to sum up the heap size of each field.
|
// Generate an expression to sum up the heap size of each field.
|
||||||
fn bit_size_sum(data: &Data) -> TokenStream {
|
fn bit_size_sum(data: Data) -> TokenStream {
|
||||||
match *data {
|
match data {
|
||||||
Data::Struct(ref data) => match data.fields {
|
Data::Struct(DataStruct {
|
||||||
Fields::Named(ref fields) => {
|
fields: Fields::Named(fields),
|
||||||
let recurse = fields.named.iter().map(|f| {
|
..
|
||||||
let field_type = &f.ty;
|
}) => {
|
||||||
let size = get_field_size(&f.attrs, f.span());
|
let recurse = fields.named.into_iter().map(|f| {
|
||||||
match size {
|
let span = f.span();
|
||||||
Some(size) => {
|
let field_type = f.ty;
|
||||||
quote_spanned! {f.span()=>
|
match get_field_size(&f.attrs, span) {
|
||||||
::bitstream_reader::bit_size_of_sized::<#field_type>(#size)
|
Some(size) => {
|
||||||
}
|
quote_spanned! {span=>
|
||||||
|
::bitstream_reader::bit_size_of_sized::<#field_type>(#size)
|
||||||
}
|
}
|
||||||
None => {
|
}
|
||||||
quote_spanned! {f.span()=>
|
None => {
|
||||||
::bitstream_reader::bit_size_of::<#field_type>()
|
quote_spanned! {span=>
|
||||||
}
|
::bitstream_reader::bit_size_of::<#field_type>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
quote! {
|
|
||||||
0 #(+ #recurse)*
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
quote! {
|
||||||
|
0 #(+ #recurse)*
|
||||||
}
|
}
|
||||||
Fields::Unit => quote!(0),
|
}
|
||||||
_ => unimplemented!(),
|
Data::Struct(DataStruct {
|
||||||
},
|
fields: Fields::Unit,
|
||||||
|
..
|
||||||
|
}) => quote!(0),
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue