OrdMask
OrdMask is a library for efficient range-based set operations and membership checking. It represents a set of values as a collection of intervals and supports various set operations.
Features
- Efficient range membership checking
- Support for
union,intersection,minus,complement, andsymmetric_differenceoperations - Works with any type that implements
Ord,Clone, andWithMintraits - Zero-allocation operations where possible
- Optional
serdefeature for serialization/deserialization
Type Requirements
OrdMask<T> requires T to implement the WithMin trait, a trait for types that have a minimum value. The library provides implementations for all standard integer types:
use WithMin;
// Built-in implementations for:
// u8, u16, u32, u64, u128, usize
// i8, i16, i32, i64, i128, isize
assert_eq!;
assert_eq!;
To use custom types, implement WithMin manually:
use ;
;
assert!;
Construction
use ;
// [0, 10) and [20, MAX)
let mask = ordmask!;
assert!;
assert!;
assert!;
assert!;
assert!;
assert!;
// Create from `Vec<T>`
assert_eq!;
// Create from suspicious_points and a predicate
use BTreeSet;
assert_eq!;
// Create from suspicious_points_map
use BTreeMap;
let map = from;
assert_eq!;
// (MIN, 10)
let mask = ordmask!;
assert_eq!;
assert!;
assert!;
// [10, MAX)
let mask = ordmask!;
assert_eq!;
assert!;
assert!;
// [10, 20)
let mask = ordmask!;
assert_eq!;
assert!;
assert!;
assert!;
assert!;
// Universal
let mask = ordmask!;
assert_eq!;
assert!;
assert!;
// Empty
let mask = ordmask!;
assert_eq!;
assert!;
assert!;
Type Annotation
You can specify the type explicitly using the <T> syntax in the macro:
use ;
// Explicit type annotation with <T>
let mask = ordmask!; // Empty
let mask = ordmask!; // Universal
let mask = ordmask!; // [10, MAX)
let mask = ordmask!; // [10, 20)
let mask = ordmask!; // (MIN, 10)
Union
use ;
let a = ordmask!;
let b = ordmask!;
let c = ordmask!;
// &a | &b | &c: reference operators do not move (consume) the values
assert_eq!;
// a | b | c: non-reference operators move (consume) the values
assert_eq!;
Intersection
use ;
let a = ordmask!;
let b = ordmask!;
let c = ordmask!;
// &a & &b & &c: reference operators do not move (consume) the values
assert_eq!;
// a & b & c: non-reference operators move (consume) the values
assert_eq!;
Minus and Complement
use ;
let a = ordmask!;
let b = ordmask!;
let c = ordmask!;
// &a - &b - &c: reference operators do not move (consume) the values
assert_eq!;
// a - b - c: non-reference operators move (consume) the values
assert_eq!;
let a = ordmask!;
// !&a: reference operator and `a.complement()` do not move (consume) the value
assert_eq!;
// !a: non-reference operator and `a.to_complement()` move (consume) the value
assert_eq!;
Symmetric Difference
use ;
let a = ordmask!;
let b = ordmask!;
// &a ^ &b: reference operators do not move (consume) the values
assert_eq!;
// a ^ b: non-reference operators move (consume) the values
assert_eq!;