1use std::fmt;
6
7#[cfg(feature = "use-serde")]
8use serde::{Serialize, Deserialize};
9
10use crate::err::AutoDiffError;
11
12#[cfg_attr(feature = "use-serde", derive(Serialize, Deserialize))]
14#[derive(Debug, PartialEq, Eq, Ord, PartialOrd, Copy, Clone)]
15pub struct GenKey {
16 id: usize,
17 gen: usize,
18}
19
20impl GenKey {
21 pub fn new(id: usize, gen: usize) -> GenKey {
22 GenKey { id, gen }
23 }
24}
25
26impl fmt::Display for GenKey {
27 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28 write!(f, "({}, {})", self.id, self.gen)
29 }
30}
31
32#[cfg_attr(feature = "use-serde", derive(Serialize, Deserialize))]
37#[derive(Clone)]
38pub struct GenIndex<T> {
39 data: Vec<T>,
40 generation: Vec<usize>,
41 available: Vec<usize>,
42}
43
44impl<T> GenIndex<T> {
45 pub fn new() -> GenIndex<T> {
47 GenIndex::<T> {
48 data: Vec::new(),
49 generation: Vec::new(),
50 available: Vec::new(),
51 }
52 }
53
54 pub fn clear(&mut self) {
56 self.data = Vec::new();
57 self.generation = Vec::new();
58 self.available = Vec::new();
59 }
60
61 pub fn contains(&self, index: &GenKey) -> bool {
65 index.id < self.generation.len() && self.generation[index.id] == index.gen
66 }
67
68 pub fn get(&self, index: &GenKey) -> Result<&T, AutoDiffError> {
70 if index.id < self.generation.len() && self.generation[index.id] == index.gen {
71 Ok(&self.data[index.id])
72 } else {
73 Err(AutoDiffError::new(&format!("GenIndex cannot find the item by key {:?}!", index)))
74 }
75 }
76
77 pub fn get_mut(&mut self, index: &GenKey) -> Option<&mut T> {
79 if index.id < self.generation.len() && self.generation[index.id] == index.gen {
80 Option::Some(&mut self.data[index.id])
81 } else {
82 Option::None
83 }
84 }
85
86 pub fn len(&self) -> usize {
88 self.data.len() - self.available.len()
89 }
90 pub fn is_empty(&self) -> bool {
91 self.len() == 0
92 }
93
94 pub fn insert(&mut self, val: T) -> GenKey {
96 let mut ret = GenKey::new(0, 0);
97 if self.available.is_empty() {
98 ret.id = self.data.len();
99 self.data.push(val);
100 self.generation.push(0);
101 ret.gen = 0;
102 } else {
103 ret.id = self.available.pop().expect("id in available");
104 self.data[ret.id] = val;
105 ret.gen = self.generation[ret.id];
106 }
107 ret
108 }
109
110 pub fn remove(&mut self, index: &GenKey) -> Result<(), AutoDiffError> {
112 if index.id < self.generation.len() && self.generation[index.id] == index.gen {
113 self.generation[index.id] += 1;
114 self.available.push(index.id);
115 Ok(())
116 } else {
117 Err(AutoDiffError::new(&format!("index is not valid! {}", index)))
118 }
119 }
120
121 pub fn replace(&mut self, index: &GenKey, val: T) -> Result<(), AutoDiffError> {
123 if index.id < self.data.len() && self.generation[index.id] == index.gen {
124 self.data[index.id] = val;
125 Ok(())
126 } else {
127 Err(AutoDiffError::new(&format!("index is not valid! {}", index)))
128 }
129 }
130
131 pub fn iter_key(&self) -> GenIndexIter<T> {
132 GenIndexIter::<T>::new(self)
133 }
134}
135
136
137pub struct GenIndexIter<'a, T> {
138 index: usize,
139 gen_index_ref: &'a GenIndex<T>,
140}
141impl<'a, T> GenIndexIter<'a, T> {
142 pub fn new(index_ref: &GenIndex<T>) -> GenIndexIter<T> {
143 GenIndexIter {
144 index: 0,
145 gen_index_ref: index_ref,
146 }
147 }
148}
149impl<'a, T> Iterator for GenIndexIter<'a, T> {
150 type Item = GenKey;
151
152 fn next(&mut self) -> Option<GenKey> { let ret: GenKey;
154 if self.gen_index_ref.data.is_empty() {
155 return None;
156 }
157 if self.gen_index_ref.data.len() == self.index {
158 None
159 } else {
160 if self.gen_index_ref.available.is_empty() {
161 ret = GenKey::new(self.index,
162 self.gen_index_ref.generation[self.index]);
163 } else {
164 loop {
165 if self.gen_index_ref.data.len() == self.index {
166 return None;
167 }
168 if self.gen_index_ref.available.contains(&self.index) {
169 self.index += 1;
170 } else {
171 ret = GenKey::new(self.index,
172 self.gen_index_ref.generation[self.index]);
173 break;
174 }
175 }
176 }
177
178 self.index += 1;
179 Some(ret)
180 }
181 }
182}
183
184impl<T> Default for GenIndex<T> {
185 fn default() -> Self {
186 Self::new()
187 }
188}
189
190impl<T: PartialEq> PartialEq for GenIndex<T> {
191 fn eq(&self, other: &Self) -> bool {
192 if self.len() != other.len() {
193 false
194 } else {
195 for (self_key, other_key) in
196 self.iter_key().zip(other.iter_key()) {
197 if ! self.get(&self_key).expect("GenIndex bad").eq(
198 other.get(&other_key).expect("GenIndex bad")) {
199 return false;
200 }
201 }
202 true
203 }
204 }
205}
206
207impl<T: Eq> Eq for GenIndex<T> {}
208
209impl<T: fmt::Debug> fmt::Debug for GenIndex<T> {
210 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
211 writeln!(f, "generation: {:?}", self.generation)?;
212 writeln!(f, "available: {:?}", self.available)?;
213 writeln!(f, "data: {:?}", self.data)
214 }
215}
216
217
218
219#[cfg(test)]
220mod tests {
221 use super::*;
222
223 #[test]
224 fn genindex_new_add_del() {
225 let mut g = GenIndex::<f32>::new();
226 assert_eq!(g.len(), 0);
227 let index1 = g.insert(1.);
228 assert_eq!(g.len(), 1);
229 assert_eq!(g.remove(&index1).expect(""), ());
230
231 let index2 = g.insert(2.);
232 let index3 = g.insert(3.);
233 assert_eq!(g.len(), 2);
234 assert_eq!(*g.get(&index2).expect(""), 2.);
235 assert_eq!(*g.get(&index3).expect(""), 3.);
236
237 g.clear();
238 }
239
240 #[test]
241 fn test_gen_index() {
242 #[derive(Debug, Copy, Clone)]
243 struct A {
244 v: u32,
245 }
246 let mut a = GenIndex::<A>::new();
247
248 let index1 = a.insert(A { v: 10 });
249 assert_eq!(index1, GenKey::new(0, 0));
250 let index2 = a.insert(A { v: 20 });
251 assert_eq!(index2, GenKey::new(1, 0));
252
253 let tv1 = a.get(&index1).unwrap().v;
254 assert_eq!(tv1, 10);
255 let tv2 = a.get(&index2).unwrap().v;
256 assert_eq!(tv2, 20);
257 let a2 = a.remove(&index2);
261 let tv_none = a.get(&index2);
262 assert_eq!(a2.expect(""), ());
264
265 let index3 = a.insert(A { v: 30 });
266 assert_eq!(index3, GenKey::new(1, 1));
267 }
268
269 #[test]
270 fn iter() {
271 #[derive(Debug, Copy, Clone)]
272 struct A {
273 v: u32,
274 }
275 let mut a = GenIndex::<A>::new();
276
277 let index1 = a.insert(A { v: 10 });
278 let index2 = a.insert(A { v: 20 });
279 let index3 = a.insert(A { v: 30 });
280
281 let keys: Vec<GenKey> = a.iter_key().collect();
282 assert_eq!(keys, vec![GenKey::new(0, 0), GenKey::new(1, 0), GenKey::new(2, 0)]);
283
284 a.remove(&index2).expect("");
285 let keys: Vec<GenKey> = a.iter_key().collect();
286 assert_eq!(keys, vec![GenKey::new(0, 0), GenKey::new(2, 0)]);
287
288 a.remove(&index3).expect("");
289 let keys: Vec<GenKey> = a.iter_key().collect();
290 assert_eq!(keys, vec![GenKey::new(0, 0)]);
291
292 a.remove(&index1).expect("");
293 let keys: Vec<GenKey> = a.iter_key().collect();
294 assert_eq!(keys, vec![]);
295 }
296}