crate::ix!();
pub trait CapabilityVariant: Clone + Eq + std::hash::Hash + Sized {
fn intrinsic_ratings(&self) -> &WarriorCapabilityIntrinsicDimensionRatings;
fn all_variants() -> &'static [Self];
}
#[macro_export]
macro_rules! impl_capability_variant {
( $($ty:ty),+ $(,)? ) => {
$(
impl CapabilityVariant for $ty {
fn intrinsic_ratings(&self) -> &WarriorCapabilityIntrinsicDimensionRatings {
use std::sync::OnceLock;
use strum::IntoEnumIterator;
static CACHE: OnceLock<
Vec<WarriorCapabilityIntrinsicDimensionRatings>
> = OnceLock::new();
let ratings = CACHE.get_or_init(|| {
<$ty as IntoEnumIterator>::iter()
.map(|v| v.intrinsic_dimension_ratings())
.collect::<Vec<_>>()
});
&ratings[*self as usize]
}
fn all_variants() -> &'static [Self] {
use std::sync::OnceLock;
use strum::IntoEnumIterator;
static VARS: OnceLock<Vec<$ty>> = OnceLock::new();
VARS.get_or_init(|| <$ty as IntoEnumIterator>::iter().collect())
}
}
)+
};
}
impl_capability_variant!{
WarriorApproachCapability,
WarriorBraveryCapability,
WarriorConflictMitigationCapability,
WarriorCyberDefenseCapability,
WarriorDefensiveMagicCapability,
WarriorEmbodimentCapability,
WarriorExplorationCapability,
WarriorIllusionaryMagicCapability,
WarriorLeadershipCapability,
WarriorMetaCapability,
WarriorOffensiveMagicCapability,
WarriorPhysicalCapability,
WarriorProtectiveCapability,
WarriorResilienceCapability,
WarriorResponsivenessCapability,
WarriorStrategicCapability,
WarriorTechAdaptationCapability,
WarriorThreatAdaptationCapability,
}