numeric-domains 0.1.0

Abstract domains for fixed-width numeric values
Documentation
use numeric_domains::{BitRange, RangeSet, Tnum, WrappedInterval};

fn main() {
    let wrapping = WrappedInterval::new(u64::MAX - 2, u64::MAX) + WrappedInterval::from_value(2);
    println!(
        "wrapping add: {:?}, {} values (ordinary unsigned hull: 2^64 values)",
        wrapping.bounds(),
        wrapping.cardinality()
    );

    let branches = RangeSet::<2>::from_range(10, 15).union(RangeSet::from_range(20, 30));
    println!(
        "two branch ranges: {:?}, {} values (single hull: 21 values)",
        branches.ranges(),
        branches.cardinality()
    );

    let even = Tnum::from_parts(0, u64::MAX - 1);
    let product = BitRange::<2>::new(RangeSet::from_range(8, 11), even);
    let represented: Vec<_> = (8..=11)
        .filter(|&value| product.contains_value(value))
        .collect();
    println!(
        "range [8,11] x even-known-bit fact: {:?} (range alone: 4 values)",
        represented
    );
}