use super::link::OverlayLink;
use crate::build::builder::GraphNode;
use crate::core::overlay::IntOverlayOptions;
use alloc::vec::Vec;
pub struct OverlayGraph<'a> {
pub(crate) options: IntOverlayOptions,
pub(crate) nodes: &'a [OverlayNode],
pub(crate) links: &'a [OverlayLink],
}
#[derive(Debug)]
pub(crate) enum OverlayNode {
Bridge([usize; 2]),
Cross(Vec<usize>),
}
impl GraphNode for OverlayNode {
#[inline]
fn with_indices(indices: &[usize]) -> Self {
if indices.len() == 2 {
Self::Bridge([indices[0], indices[1]])
} else {
Self::Cross(indices.to_vec())
}
}
}
impl OverlayGraph<'_> {
pub fn validate(&self) {
for node in self.nodes.iter() {
if let OverlayNode::Cross(indices) = node {
debug_assert!(indices.len() > 1, "indices: {}", indices.len());
debug_assert!(self.nodes.len() <= self.links.len(), "nodes is more then links");
}
}
}
}