]>
Commit | Line | Data |
---|---|---|
9c376795 FG |
1 | #[derive(Debug)] |
2 | struct Child<T> { | |
3 | id: T, | |
4 | children: Vec<usize>, | |
5 | } | |
6 | ||
7 | impl<T> Child<T> { | |
8 | fn new(id: T) -> Self { | |
9 | Child { | |
10 | id, | |
11 | children: vec![], | |
12 | } | |
13 | } | |
14 | } | |
15 | ||
16 | #[derive(Debug)] | |
17 | pub(crate) struct ChildGraph<T>(Vec<Child<T>>); | |
18 | ||
19 | impl<T> ChildGraph<T> | |
20 | where | |
21 | T: Sized + PartialEq + Clone, | |
22 | { | |
23 | pub(crate) fn with_capacity(s: usize) -> Self { | |
24 | ChildGraph(Vec::with_capacity(s)) | |
25 | } | |
26 | ||
27 | pub(crate) fn insert(&mut self, req: T) -> usize { | |
28 | self.0.iter().position(|e| e.id == req).unwrap_or_else(|| { | |
29 | let idx = self.0.len(); | |
30 | self.0.push(Child::new(req)); | |
31 | idx | |
32 | }) | |
33 | } | |
34 | ||
35 | pub(crate) fn insert_child(&mut self, parent: usize, child: T) -> usize { | |
36 | let c_idx = self.0.len(); | |
37 | self.0.push(Child::new(child)); | |
38 | self.0[parent].children.push(c_idx); | |
39 | c_idx | |
40 | } | |
41 | ||
42 | pub(crate) fn iter(&self) -> impl Iterator<Item = &T> { | |
43 | self.0.iter().map(|r| &r.id) | |
44 | } | |
45 | ||
46 | pub(crate) fn contains(&self, req: &T) -> bool { | |
47 | self.0.iter().any(|r| r.id == *req) | |
48 | } | |
49 | } |