11 fn len() -> usize; |
11 fn len() -> usize; |
12 fn get_types(dest: &mut Vec<TypeId>); |
12 fn get_types(dest: &mut Vec<TypeId>); |
13 unsafe fn iter<F: FnMut(Self)>(slices: &[*mut u8], count: usize, mut f: F); |
13 unsafe fn iter<F: FnMut(Self)>(slices: &[*mut u8], count: usize, mut f: F); |
14 } |
14 } |
15 |
15 |
16 macro_rules! type_typle_impl { |
16 macro_rules! type_tuple_impl { |
17 ($($n: literal: $t: ident),*) => { |
17 ($($n: literal: $t: ident),+) => { |
18 impl<$($t: 'static),*> TypeTuple for ($(&$t),*,) { |
18 impl<$($t: 'static),+> TypeTuple for ($(&$t),+,) { |
19 fn len() -> usize { |
19 fn len() -> usize { |
20 [$({TypeId::of::<$t>(); 1}),*].iter().sum() |
20 [$({TypeId::of::<$t>(); 1}),+].iter().sum() |
21 } |
21 } |
22 |
22 |
23 fn get_types(types: &mut Vec<TypeId>) { |
23 fn get_types(types: &mut Vec<TypeId>) { |
24 $(types.push(TypeId::of::<$t>()));* |
24 $(types.push(TypeId::of::<$t>()));+ |
25 } |
25 } |
26 |
26 |
27 unsafe fn iter<F: FnMut(Self)>(slices: &[*mut u8], count: usize, mut f: F) |
27 unsafe fn iter<F: FnMut(Self)>(slices: &[*mut u8], count: usize, mut f: F) |
28 { |
28 { |
29 for i in 0..count { |
29 for i in 0..count { |
30 unsafe { |
30 unsafe { |
31 f(($(&*(*slices.get_unchecked($n) as *mut $t).add(i)),*,)); |
31 f(($(&*(*slices.get_unchecked($n) as *mut $t).add(i)),+,)); |
32 } |
32 } |
33 } |
33 } |
34 } |
34 } |
35 } |
35 } |
36 |
36 |
37 impl<$($t: 'static),*> TypeTuple for ($(&mut $t),*,) { |
37 impl<$($t: 'static),+> TypeTuple for ($(&mut $t),+,) { |
38 fn len() -> usize { |
38 fn len() -> usize { |
39 [$({TypeId::of::<$t>(); 1}),*].iter().sum() |
39 [$({TypeId::of::<$t>(); 1}),+].iter().sum() |
40 } |
40 } |
41 |
41 |
42 fn get_types(types: &mut Vec<TypeId>) { |
42 fn get_types(types: &mut Vec<TypeId>) { |
43 $(types.push(TypeId::of::<$t>()));* |
43 $(types.push(TypeId::of::<$t>()));+ |
44 } |
44 } |
45 |
45 |
46 unsafe fn iter<F: FnMut(Self)>(slices: &[*mut u8], count: usize, mut f: F) |
46 unsafe fn iter<F: FnMut(Self)>(slices: &[*mut u8], count: usize, mut f: F) |
47 { |
47 { |
48 for i in 0..count { |
48 for i in 0..count { |
49 unsafe { |
49 unsafe { |
50 f(($(&mut *(*slices.get_unchecked($n) as *mut $t).add(i)),*,)); |
50 f(($(&mut *(*slices.get_unchecked($n) as *mut $t).add(i)),+,)); |
51 } |
51 } |
52 } |
52 } |
53 } |
53 } |
54 } |
54 } |
55 } |
55 } |
56 } |
56 } |
57 |
57 |
58 type_typle_impl!(0: A); |
58 type_tuple_impl!(0: A); |
59 type_typle_impl!(0: A, 1: B); |
59 type_tuple_impl!(0: A, 1: B); |
60 type_typle_impl!(0: A, 1: B, 2: C); |
60 type_tuple_impl!(0: A, 1: B, 2: C); |
61 type_typle_impl!(0: A, 1: B, 2: C, 3: D); |
61 type_tuple_impl!(0: A, 1: B, 2: C, 3: D); |
62 type_typle_impl!(0: A, 1: B, 2: C, 3: D, 4: E); |
62 type_tuple_impl!(0: A, 1: B, 2: C, 3: D, 4: E); |
63 |
63 |
64 const BLOCK_SIZE: usize = 32768; |
64 const BLOCK_SIZE: usize = 32768; |
65 |
65 |
66 struct DataBlock { |
66 struct DataBlock { |
67 max_elements: u16, |
67 max_elements: u16, |