Skip to main content

hpx_browser/css_cascade/
layers.rs

1pub type LayerId = u32;
2
3pub struct LayerOrder {
4    name_to_id: std::collections::HashMap<String, LayerId>,
5    order: Vec<LayerId>,
6    next_id: LayerId,
7}
8
9impl LayerOrder {
10    pub fn new() -> Self {
11        Self {
12            name_to_id: std::collections::HashMap::new(),
13            order: Vec::new(),
14            next_id: 1,
15        }
16    }
17
18    pub fn register(&mut self, name: &str) -> LayerId {
19        if let Some(&id) = self.name_to_id.get(name) {
20            return id;
21        }
22        let id = self.next_id;
23        self.next_id += 1;
24        self.name_to_id.insert(name.to_string(), id);
25        self.order.push(id);
26        id
27    }
28
29    pub fn get(&self, name: &str) -> Option<LayerId> {
30        self.name_to_id.get(name).copied()
31    }
32
33    pub fn compare(&self, a: LayerId, b: LayerId) -> std::cmp::Ordering {
34        let a_pos = self.order.iter().position(|&id| id == a);
35        let b_pos = self.order.iter().position(|&id| id == b);
36        a_pos.cmp(&b_pos)
37    }
38}
39
40impl Default for LayerOrder {
41    fn default() -> Self {
42        Self::new()
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use std::cmp::Ordering;
49
50    use super::*;
51
52    #[test]
53    fn layer_ordering() {
54        let mut layers = LayerOrder::new();
55        let base = layers.register("base");
56        let components = layers.register("components");
57        assert_eq!(layers.compare(base, components), Ordering::Less);
58    }
59}