Skip to content

Instantly share code, notes, and snippets.

@tera3939
Created May 19, 2017 04:23
Show Gist options
  • Save tera3939/2b339bfa4dae717e8d52668670753577 to your computer and use it in GitHub Desktop.
Save tera3939/2b339bfa4dae717e8d52668670753577 to your computer and use it in GitHub Desktop.
迷走のはて
// 構造体の初期化をマクロでウェイッってしたかった
#[derive(Debug)]
enum DataSize {
DWard,
Ward,
Byte
}
fn hoge(data: &[u8], offset: usize, data_size: DataSize) -> (&[u8], usize) {
match data_size {
DataSize::DWard => {
let a = &data[offset..offset+4];
(a, offset+4)
},
DataSize::Ward => {
let a = &data[offset..offset+2];
(a, offset+2)
},
DataSize::Byte => {
let a = &data[offset..offset+1];
(a, offset+1)
}
}
}
macro_rules! init_array {
{ $( $array_key:ident: [$array_ty:ty; $array_size: expr] = $data:expr ),* } => {{
}}
}
macro_rules! init_struct {
{ $data:expr, $name:ident { $( $key:ident: $size:ty ),* }} => {{
let offset = 0;
$(
let (v, offset) = match mem::size_of::<$size>() {
1 => {
let (s, o) = hoge($data, offset, DataSize::Byte);
(s[0], o)
},
2 => {
let (s, o) = hoge($data, offset, DataSize::Ward);
(convert_u16(s).unwrap(), o)
},
4 => {
let (s, o) = hoge($data, offset, DataSize::DWard);
(convert_u32(s).unwrap(), o)
},
_ => panic!("this size is not impled")
};
let $key = v;
)*
$name {$($key:$key),*}
}}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment