1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#![macro_use]
#[macro_export]
macro_rules! call_numeric_buffer_fn {
($fn:ident ::<_,$($params:ident),*>( $data:expr, $($args:expr),* ) or $err:block ) => {
{
let buf = $data;
match buf.type_id() {
x if x == ::std::any::TypeId::of::<u8>() => $fn::<u8,$($params),*> (buf, $($args),*),
x if x == ::std::any::TypeId::of::<i8>() => $fn::<i8,$($params),*> (buf, $($args),*),
x if x == ::std::any::TypeId::of::<u16>() => $fn::<u16,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<i16>() => $fn::<i16,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<u32>() => $fn::<u32,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<i32>() => $fn::<i32,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<u64>() => $fn::<u64,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<i64>() => $fn::<i64,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<f32>() => $fn::<f32,$($params),*>(buf, $($args),*),
x if x == ::std::any::TypeId::of::<f64>() => $fn::<f64,$($params),*>(buf, $($args),*),
_ => $err,
}
}
};
($fn:ident ::<_>( $($args:expr),* ) or $err:block ) => {
call_numeric_buffer_fn!($fn ::<_,>( $($args),* ) or $err )
};
($fn:ident ::<_,$($params:ident),*>( $data:expr ) or $err:block ) => {
call_numeric_buffer_fn!($fn ::<_,$($params),*>( $data, ) or $err )
};
($data:ident . $fn:ident ::<_,$($params:ident),*>( $($args:expr),* ) or $err:block ) => {
{
let buf = $data;
match buf.type_id() {
x if x == ::std::any::TypeId::of::<u8>() => buf.$fn::<u8,$($params),*> ($($args),*),
x if x == ::std::any::TypeId::of::<i8>() => buf.$fn::<i8,$($params),*> ($($args),*),
x if x == ::std::any::TypeId::of::<u16>() => buf.$fn::<u16,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<i16>() => buf.$fn::<i16,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<u32>() => buf.$fn::<u32,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<i32>() => buf.$fn::<i32,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<u64>() => buf.$fn::<u64,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<i64>() => buf.$fn::<i64,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<f32>() => buf.$fn::<f32,$($params),*>($($args),*),
x if x == ::std::any::TypeId::of::<f64>() => buf.$fn::<f64,$($params),*>($($args),*),
_ => $err,
}
}
};
($data:ident . $fn:ident ::<_>( $($args:expr),* ) or $err:block ) => {
call_numeric_buffer_fn!($data . $fn ::<_,>( $($args),* ) or $err )
};
}