use std::ops::{Add, Sub};
#[cfg(feature = "arbitrary")]
use arbitrary::Arbitrary;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Hash)]
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub enum LayeredBoundsState {
#[default]
NoLayers,
FirstLayer,
SecondLayer,
BothLayers,
}
impl LayeredBoundsState {
#[must_use]
pub fn is_first_layer_active(&self) -> bool {
matches!(self, Self::FirstLayer | Self::BothLayers)
}
#[must_use]
pub fn is_second_layer_active(&self) -> bool {
matches!(self, Self::SecondLayer | Self::BothLayers)
}
}
impl Add for LayeredBoundsState {
type Output = Self;
fn add(self, rhs: Self) -> Self::Output {
match (self, rhs) {
(Self::NoLayers, other) => other,
(Self::FirstLayer, Self::NoLayers | Self::FirstLayer) => Self::FirstLayer,
(Self::SecondLayer, Self::NoLayers | Self::SecondLayer) => Self::SecondLayer,
(Self::FirstLayer, Self::SecondLayer | Self::BothLayers)
| (Self::SecondLayer, Self::FirstLayer | Self::BothLayers)
| (Self::BothLayers, _) => Self::BothLayers,
}
}
}
impl Sub for LayeredBoundsState {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
match (self, rhs) {
(_, Self::BothLayers)
| (Self::NoLayers | Self::FirstLayer, Self::FirstLayer)
| (Self::NoLayers | Self::SecondLayer, Self::SecondLayer) => Self::NoLayers,
(Self::FirstLayer | Self::BothLayers, Self::SecondLayer) => Self::FirstLayer,
(Self::SecondLayer | Self::BothLayers, Self::FirstLayer) => Self::SecondLayer,
(og, Self::NoLayers) => og,
}
}
}