quantized_density_fields/qdf/
state.rs1use std::fmt::Debug;
2
3pub trait State: Sized + Clone + Default + Send + Sync + Debug {
28 fn subdivide(&self, subdivisions: usize) -> Vec<Self>;
33 fn merge(states: &[Self]) -> Self;
38 fn super_state_at_level(&self, dimensions: usize, level: usize) -> Self {
44 let states = std::iter::repeat(self.clone())
45 .take((dimensions + 1)
46 .pow(level as u32))
47 .collect::<Vec<Self>>();
48 Self::merge(&states)
49 }
50}
51
52impl State for i8 {
53 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
54 ::std::iter::repeat(self / subdivisions as Self)
55 .take(subdivisions)
56 .collect()
57 }
58 fn merge(states: &[Self]) -> Self {
59 states.iter().sum()
60 }
61}
62impl State for i16 {
63 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
64 ::std::iter::repeat(self / subdivisions as Self)
65 .take(subdivisions)
66 .collect()
67 }
68 fn merge(states: &[Self]) -> Self {
69 states.iter().sum()
70 }
71}
72impl State for i32 {
73 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
74 ::std::iter::repeat(self / subdivisions as Self)
75 .take(subdivisions)
76 .collect()
77 }
78 fn merge(states: &[Self]) -> Self {
79 states.iter().sum()
80 }
81}
82impl State for i64 {
83 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
84 ::std::iter::repeat(self / subdivisions as Self)
85 .take(subdivisions)
86 .collect()
87 }
88 fn merge(states: &[Self]) -> Self {
89 states.iter().sum()
90 }
91}
92impl State for u8 {
93 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
94 ::std::iter::repeat(self / subdivisions as Self)
95 .take(subdivisions)
96 .collect()
97 }
98 fn merge(states: &[Self]) -> Self {
99 states.iter().sum()
100 }
101}
102impl State for u16 {
103 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
104 ::std::iter::repeat(self / subdivisions as Self)
105 .take(subdivisions)
106 .collect()
107 }
108 fn merge(states: &[Self]) -> Self {
109 states.iter().sum()
110 }
111}
112impl State for u32 {
113 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
114 ::std::iter::repeat(self / subdivisions as Self)
115 .take(subdivisions)
116 .collect()
117 }
118 fn merge(states: &[Self]) -> Self {
119 states.iter().sum()
120 }
121}
122impl State for u64 {
123 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
124 ::std::iter::repeat(self / subdivisions as Self)
125 .take(subdivisions)
126 .collect()
127 }
128 fn merge(states: &[Self]) -> Self {
129 states.iter().sum()
130 }
131}
132impl State for f32 {
133 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
134 ::std::iter::repeat(self / subdivisions as Self)
135 .take(subdivisions)
136 .collect()
137 }
138 fn merge(states: &[Self]) -> Self {
139 states.iter().sum()
140 }
141}
142impl State for f64 {
143 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
144 ::std::iter::repeat(self / subdivisions as Self)
145 .take(subdivisions)
146 .collect()
147 }
148 fn merge(states: &[Self]) -> Self {
149 states.iter().sum()
150 }
151}
152impl State for isize {
153 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
154 ::std::iter::repeat(self / subdivisions as Self)
155 .take(subdivisions)
156 .collect()
157 }
158 fn merge(states: &[Self]) -> Self {
159 states.iter().sum()
160 }
161}
162impl State for usize {
163 fn subdivide(&self, subdivisions: usize) -> Vec<Self> {
164 ::std::iter::repeat(self / subdivisions as Self)
165 .take(subdivisions)
166 .collect()
167 }
168 fn merge(states: &[Self]) -> Self {
169 states.iter().sum()
170 }
171}