use std::marker::PhantomData;
pub trait ActiveSet {
const MASK: u32;
fn name() -> &'static str;
}
pub struct All;
impl ActiveSet for All {
const MASK: u32 = 0xFFFFFFFF;
fn name() -> &'static str {
"All"
}
}
pub struct Even;
impl ActiveSet for Even {
const MASK: u32 = 0x55555555;
fn name() -> &'static str {
"Even"
}
}
pub struct Odd;
impl ActiveSet for Odd {
const MASK: u32 = 0xAAAAAAAA;
fn name() -> &'static str {
"Odd"
}
}
pub struct LowHalf;
impl ActiveSet for LowHalf {
const MASK: u32 = 0x0000FFFF;
fn name() -> &'static str {
"LowHalf"
}
}
pub struct HighHalf;
impl ActiveSet for HighHalf {
const MASK: u32 = 0xFFFF0000;
fn name() -> &'static str {
"HighHalf"
}
}
pub struct EvenLow;
impl ActiveSet for EvenLow {
const MASK: u32 = Even::MASK & LowHalf::MASK; fn name() -> &'static str {
"EvenLow"
}
}
pub struct EvenHigh;
impl ActiveSet for EvenHigh {
const MASK: u32 = Even::MASK & HighHalf::MASK; fn name() -> &'static str {
"EvenHigh"
}
}
pub struct OddLow;
impl ActiveSet for OddLow {
const MASK: u32 = Odd::MASK & LowHalf::MASK; fn name() -> &'static str {
"OddLow"
}
}
pub struct OddHigh;
impl ActiveSet for OddHigh {
const MASK: u32 = Odd::MASK & HighHalf::MASK; fn name() -> &'static str {
"OddHigh"
}
}
pub trait ComplementWithin<S2: ActiveSet, Parent: ActiveSet>: ActiveSet {}
impl ComplementWithin<Odd, All> for Even {}
impl ComplementWithin<Even, All> for Odd {}
impl ComplementWithin<HighHalf, All> for LowHalf {}
impl ComplementWithin<LowHalf, All> for HighHalf {}
impl ComplementWithin<EvenHigh, Even> for EvenLow {}
impl ComplementWithin<EvenLow, Even> for EvenHigh {}
impl ComplementWithin<OddHigh, Odd> for OddLow {}
impl ComplementWithin<OddLow, Odd> for OddHigh {}
impl ComplementWithin<OddLow, LowHalf> for EvenLow {}
impl ComplementWithin<EvenLow, LowHalf> for OddLow {}
impl ComplementWithin<OddHigh, HighHalf> for EvenHigh {}
impl ComplementWithin<EvenHigh, HighHalf> for OddHigh {}
#[derive(Debug)]
pub struct Warp<S: ActiveSet> {
_marker: PhantomData<S>,
}
impl<S: ActiveSet> Warp<S> {
pub fn new() -> Self {
Warp {
_marker: PhantomData,
}
}
pub fn active_set_name(&self) -> &'static str {
S::name()
}
pub fn active_mask(&self) -> u32 {
S::MASK
}
pub fn population(&self) -> u32 {
S::MASK.count_ones()
}
}
impl<S: ActiveSet> Default for Warp<S> {
fn default() -> Self {
Self::new()
}
}
pub trait CanDiverge<TrueBranch: ActiveSet, FalseBranch: ActiveSet>: ActiveSet + Sized {
fn diverge(warp: Warp<Self>) -> (Warp<TrueBranch>, Warp<FalseBranch>);
}
impl CanDiverge<Even, Odd> for All {
fn diverge(_warp: Warp<Self>) -> (Warp<Even>, Warp<Odd>) {
(Warp::new(), Warp::new())
}
}
impl CanDiverge<LowHalf, HighHalf> for All {
fn diverge(_warp: Warp<Self>) -> (Warp<LowHalf>, Warp<HighHalf>) {
(Warp::new(), Warp::new())
}
}
impl CanDiverge<EvenLow, EvenHigh> for Even {
fn diverge(_warp: Warp<Self>) -> (Warp<EvenLow>, Warp<EvenHigh>) {
(Warp::new(), Warp::new())
}
}
impl CanDiverge<OddLow, OddHigh> for Odd {
fn diverge(_warp: Warp<Self>) -> (Warp<OddLow>, Warp<OddHigh>) {
(Warp::new(), Warp::new())
}
}
impl CanDiverge<EvenLow, OddLow> for LowHalf {
fn diverge(_warp: Warp<Self>) -> (Warp<EvenLow>, Warp<OddLow>) {
(Warp::new(), Warp::new())
}
}
impl CanDiverge<EvenHigh, OddHigh> for HighHalf {
fn diverge(_warp: Warp<Self>) -> (Warp<EvenHigh>, Warp<OddHigh>) {
(Warp::new(), Warp::new())
}
}
pub fn merge<S1, S2, P>(_left: Warp<S1>, _right: Warp<S2>) -> Warp<P>
where
S1: ComplementWithin<S2, P>,
S2: ActiveSet,
P: ActiveSet,
{
Warp::new()
}
pub mod merge_ordering {
use super::*;
pub fn tree_merge_even_odd(
even_low: Warp<EvenLow>,
even_high: Warp<EvenHigh>,
odd_low: Warp<OddLow>,
odd_high: Warp<OddHigh>,
) -> Warp<All> {
let even: Warp<Even> = merge(even_low, even_high);
let odd: Warp<Odd> = merge(odd_low, odd_high);
merge(even, odd)
}
pub fn tree_merge_low_high(
even_low: Warp<EvenLow>,
even_high: Warp<EvenHigh>,
odd_low: Warp<OddLow>,
odd_high: Warp<OddHigh>,
) -> Warp<All> {
let low: Warp<LowHalf> = merge(even_low, odd_low);
let high: Warp<HighHalf> = merge(even_high, odd_high);
merge(low, high)
}
}
pub mod _invalid_merge_rejected {}
pub mod path_independence {
use super::*;
pub fn via_even() -> Warp<EvenLow> {
let all: Warp<All> = Warp::new();
let (even, _odd): (Warp<Even>, Warp<Odd>) = All::diverge(all);
let (even_low, _even_high): (Warp<EvenLow>, Warp<EvenHigh>) = Even::diverge(even);
even_low
}
pub fn via_low() -> Warp<EvenLow> {
let all: Warp<All> = Warp::new();
let (low, _high): (Warp<LowHalf>, Warp<HighHalf>) = All::diverge(all);
let (even_low, _odd_low): (Warp<EvenLow>, Warp<OddLow>) = LowHalf::diverge(low);
even_low
}
}
pub mod lattice {
#[cfg(test)]
mod tests {
use crate::research::nested_diverge::*;
#[test]
fn verify_lattice() {
assert_eq!(Even::MASK & LowHalf::MASK, EvenLow::MASK);
assert_eq!(Even::MASK & HighHalf::MASK, EvenHigh::MASK);
assert_eq!(EvenLow::MASK | EvenHigh::MASK, Even::MASK);
assert_eq!(EvenLow::MASK | OddLow::MASK, LowHalf::MASK);
assert_eq!(
EvenLow::MASK | EvenHigh::MASK | OddLow::MASK | OddHigh::MASK,
All::MASK
);
}
}
}
pub mod depth_3 {
use super::*;
pub struct VeryLow; impl ActiveSet for VeryLow {
const MASK: u32 = 0x000000FF;
fn name() -> &'static str {
"VeryLow"
}
}
pub struct MidLow; impl ActiveSet for MidLow {
const MASK: u32 = 0x0000FF00;
fn name() -> &'static str {
"MidLow"
}
}
pub struct EvenVeryLow;
impl ActiveSet for EvenVeryLow {
const MASK: u32 = Even::MASK & VeryLow::MASK; fn name() -> &'static str {
"EvenVeryLow"
}
}
pub struct EvenMidLow;
impl ActiveSet for EvenMidLow {
const MASK: u32 = Even::MASK & MidLow::MASK; fn name() -> &'static str {
"EvenMidLow"
}
}
impl ComplementWithin<EvenMidLow, EvenLow> for EvenVeryLow {}
impl ComplementWithin<EvenVeryLow, EvenLow> for EvenMidLow {}
impl CanDiverge<EvenVeryLow, EvenMidLow> for EvenLow {
fn diverge(_warp: Warp<Self>) -> (Warp<EvenVeryLow>, Warp<EvenMidLow>) {
(Warp::new(), Warp::new())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_depth_3_diverge() {
let all: Warp<All> = Warp::new();
let (even, _odd) = All::diverge(all);
let (even_low, _even_high) = Even::diverge(even);
let (even_very_low, even_mid_low) = EvenLow::diverge(even_low);
assert_eq!(even_very_low.population(), 4); assert_eq!(even_mid_low.population(), 4); }
#[test]
fn test_depth_3_merge() {
let even_very_low: Warp<EvenVeryLow> = Warp::new();
let even_mid_low: Warp<EvenMidLow> = Warp::new();
let even_low: Warp<EvenLow> = merge(even_very_low, even_mid_low);
assert_eq!(even_low.population(), 8);
}
}
}
#[cfg(test)]
mod tests {
use super::merge_ordering::*;
use super::*;
#[test]
fn test_mask_values() {
assert_eq!(All::MASK, 0xFFFFFFFF);
assert_eq!(Even::MASK, 0x55555555);
assert_eq!(Odd::MASK, 0xAAAAAAAA);
assert_eq!(LowHalf::MASK, 0x0000FFFF);
assert_eq!(HighHalf::MASK, 0xFFFF0000);
assert_eq!(EvenLow::MASK, 0x00005555);
assert_eq!(EvenHigh::MASK, 0x55550000);
assert_eq!(OddLow::MASK, 0x0000AAAA);
assert_eq!(OddHigh::MASK, 0xAAAA0000);
}
#[test]
fn test_population_counts() {
assert_eq!(Warp::<All>::new().population(), 32);
assert_eq!(Warp::<Even>::new().population(), 16);
assert_eq!(Warp::<Odd>::new().population(), 16);
assert_eq!(Warp::<EvenLow>::new().population(), 8);
assert_eq!(Warp::<EvenHigh>::new().population(), 8);
}
#[test]
fn test_basic_diverge_merge() {
let all: Warp<All> = Warp::new();
let (even, odd): (Warp<Even>, Warp<Odd>) = All::diverge(all);
assert_eq!(even.population(), 16);
assert_eq!(odd.population(), 16);
let reunited: Warp<All> = merge(even, odd);
assert_eq!(reunited.population(), 32);
}
#[test]
fn test_nested_diverge() {
let all: Warp<All> = Warp::new();
let (even, odd) = All::diverge(all);
let (even_low, even_high) = Even::diverge(even);
let (odd_low, odd_high) = Odd::diverge(odd);
assert_eq!(even_low.population(), 8);
assert_eq!(even_high.population(), 8);
assert_eq!(odd_low.population(), 8);
assert_eq!(odd_high.population(), 8);
}
#[test]
fn test_merge_ordering_equivalence() {
let _even_low: Warp<EvenLow> = Warp::new();
let _even_high: Warp<EvenHigh> = Warp::new();
let _odd_low: Warp<OddLow> = Warp::new();
let _odd_high: Warp<OddHigh> = Warp::new();
let result1 = tree_merge_even_odd(Warp::new(), Warp::new(), Warp::new(), Warp::new());
let result2 = tree_merge_low_high(Warp::new(), Warp::new(), Warp::new(), Warp::new());
assert_eq!(result1.population(), 32);
assert_eq!(result2.population(), 32);
}
#[test]
fn test_union_properties() {
assert_eq!(EvenLow::MASK | EvenHigh::MASK, Even::MASK);
assert_eq!(EvenLow::MASK | OddLow::MASK, LowHalf::MASK);
let all_four = EvenLow::MASK | EvenHigh::MASK | OddLow::MASK | OddHigh::MASK;
assert_eq!(all_four, All::MASK);
}
#[test]
fn test_disjoint_properties() {
assert_eq!(EvenLow::MASK & EvenHigh::MASK, 0);
assert_eq!(EvenLow::MASK & OddLow::MASK, 0);
assert_eq!(EvenLow::MASK & OddHigh::MASK, 0);
assert_eq!(EvenHigh::MASK & OddLow::MASK, 0);
assert_eq!(EvenHigh::MASK & OddHigh::MASK, 0);
assert_eq!(OddLow::MASK & OddHigh::MASK, 0);
}
}