hpx_browser/css_cascade/
layers.rs1pub 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}