1use std::ops::{
2 Deref,
3 DerefMut,
4};
5
6use rustc_hash::{
7 FxHashMap,
8 FxHashSet,
9};
10
11use crate::node_id::NodeId;
12
13#[derive(Clone, Copy, Debug, PartialEq)]
17pub enum Layer {
18 Relative(i16),
21 Overlay,
24 OverlayLevel(u8),
27}
28
29impl Default for Layer {
30 fn default() -> Self {
31 Layer::Relative(0)
32 }
33}
34
35impl From<i16> for Layer {
36 fn from(value: i16) -> Self {
37 Layer::Relative(value)
38 }
39}
40
41#[derive(Default, Clone, Debug, PartialEq)]
42pub struct Layers(FxHashMap<i16, FxHashSet<NodeId>>);
43
44impl Layers {
45 pub fn insert_node_in_layer(&mut self, node_id: NodeId, layer_n: i16) {
47 let layer = self.0.entry(layer_n).or_default();
48 layer.insert(node_id);
49 }
50
51 pub fn remove_node_from_layer(&mut self, node_id: &NodeId, layer_n: i16) {
53 let layer = self.0.get_mut(&layer_n);
54 if let Some(layer) = layer {
55 layer.remove(node_id);
56
57 if layer.is_empty() {
58 self.0.remove(&layer_n);
59 }
60 }
61 }
62}
63
64impl Deref for Layers {
65 type Target = FxHashMap<i16, FxHashSet<NodeId>>;
66
67 fn deref(&self) -> &Self::Target {
68 &self.0
69 }
70}
71
72impl DerefMut for Layers {
73 fn deref_mut(&mut self) -> &mut Self::Target {
74 &mut self.0
75 }
76}