rust/hwphysics/src/data.rs
changeset 15390 0f2fd8d12734
parent 15389 445138f388d4
child 15392 24a9afbf33c6
equal deleted inserted replaced
15389:445138f388d4 15390:0f2fd8d12734
    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,