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,
23 RelativeOverlay(u8),
25}
26
27impl Default for Layer {
28 fn default() -> Self {
29 Layer::Relative(0)
30 }
31}
32
33impl From<i16> for Layer {
34 fn from(value: i16) -> Self {
35 Layer::Relative(value)
36 }
37}
38
39#[derive(Default, Clone, Debug, PartialEq)]
40pub struct Layers(FxHashMap<i16, FxHashSet<NodeId>>);
41
42impl Layers {
43 pub fn insert_node_in_layer(&mut self, node_id: NodeId, layer_n: i16) {
45 let layer = self.0.entry(layer_n).or_default();
46 layer.insert(node_id);
47 }
48
49 pub fn remove_node_from_layer(&mut self, node_id: &NodeId, layer_n: i16) {
51 let layer = self.0.get_mut(&layer_n);
52 if let Some(layer) = layer {
53 layer.remove(node_id);
54
55 if layer.is_empty() {
56 self.0.remove(&layer_n);
57 }
58 }
59 }
60}
61
62impl Deref for Layers {
63 type Target = FxHashMap<i16, FxHashSet<NodeId>>;
64
65 fn deref(&self) -> &Self::Target {
66 &self.0
67 }
68}
69
70impl DerefMut for Layers {
71 fn deref_mut(&mut self) -> &mut Self::Target {
72 &mut self.0
73 }
74}