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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
use std::fmt::Debug; pub trait State: Sized + Clone + Default + Debug + Subdividable {} impl State for () {} impl State for bool {} impl State for i8 {} impl State for i16 {} impl State for i32 {} impl State for i64 {} impl State for u8 {} impl State for u16 {} impl State for u32 {} impl State for u64 {} impl State for f32 {} impl State for f64 {} impl State for isize {} impl State for usize {} pub trait Subdividable: Sized { fn subdivide(&self, subdivisions: usize) -> Self; fn merge(states: &[Self]) -> Self; } impl Subdividable for () { fn subdivide(&self, _: usize) -> Self { () } fn merge(_: &[Self]) -> Self { () } } impl Subdividable for bool { fn subdivide(&self, _: usize) -> Self { *self } fn merge(states: &[Self]) -> Self { states.iter().any(|v| *v) } } impl Subdividable for i8 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for i16 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for i32 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for i64 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for u8 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for u16 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for u32 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for u64 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for f32 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for f64 { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for isize { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } } impl Subdividable for usize { fn subdivide(&self, subdivisions: usize) -> Self { self / subdivisions as Self } fn merge(states: &[Self]) -> Self { states.iter().sum() } }