use crate::Rank;
#[derive(Clone, Copy, PartialEq, Eq)]
pub(crate) enum LinkState {
Broken,
Alive,
}
pub(crate) struct FaultState {
link_matrix: Vec<Vec<LinkState>>,
}
impl FaultState {
pub(crate) fn new(size: usize) -> Self {
Self {
link_matrix: vec![vec![LinkState::Alive; size]; size],
}
}
pub(crate) fn break_link(&mut self, rank1: Rank, rank2: Rank) {
self.sym_change_state(rank1, rank2, LinkState::Broken);
}
pub(crate) fn isolate(&mut self, rank: Rank) {
for other in 0..self.link_matrix.len() {
self.break_link(rank, other);
}
}
pub(crate) fn restore(&mut self, rank: Rank) {
for other in 0..self.link_matrix.len() {
self.restore_link(rank, other);
}
}
pub(crate) fn restore_link(&mut self, rank1: Rank, rank2: Rank) {
self.sym_change_state(rank1, rank2, LinkState::Alive);
}
pub(crate) fn is_link_broken(&self, rank1: Rank, rank2: Rank) -> bool {
self.link_matrix[rank1][rank2] == LinkState::Broken
}
fn sym_change_state(&mut self, rank1: Rank, rank2: Rank, state: LinkState) {
self.link_matrix[rank1][rank2] = state;
self.link_matrix[rank2][rank1] = state;
}
}