7 releases
0.1.6 | Mar 21, 2021 |
---|---|
0.1.5 | Mar 21, 2021 |
#1798 in Data structures
14KB
97 lines
FlagSet
HashSet
only implements the normal set. HashSet
can not represent its complementary set when the complementary set is an infinite set.
FlagSet
implemented as a tuple of a HashSet
and a bool
value. When the bool
value is true, FlagSet
represents the HashSet
. When the bool
value is true, FlagSet
represents the the complementary set of HashSet
.
As with the HashSet
type, a FlagSet
requires that the elements implement the Eq
and Hash
traits. In addition to operations of FlagSet
, the elements also implement the Clone
trait.
FlagSet
also defines five kinds of operations of sets based on Binary Operations
.
A ∪B -> A + B
A ∩ B -> A & B
A - B -> A - B
A Xor B -> A ^ B
CuA -> !A
Examples
use std::collections::HashSet;
use flag_set::FlagSet;
let a: HashSet<_> = vec![1, 2, 3].into_iter().collect();
let b: HashSet<_> = vec![2, 3, 4].into_iter().collect();
let flag_ap = FlagSet(a.clone(), true);
let flag_an = FlagSet(a.clone(), false);
let flag_bp = FlagSet(b.clone(), true);
let flag_bn = FlagSet(b.clone(), false);
// 用new方法创建实例
// use new method create an instance
assert_eq!(flag_bn, FlagSet::new(vec![2, 3, 4], false));
// 测试并
// test union
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], true), flag_ap.clone() + flag_bp.clone());
assert_eq!(FlagSet::new(vec![4], false), flag_ap.clone() + flag_bn.clone());
assert_eq!(FlagSet::new(vec![1], false), flag_an.clone() + flag_bp.clone());
assert_eq!(FlagSet::new(vec![2, 3], false), flag_an.clone() + flag_bn.clone());
// 测试交
// test intersection
assert_eq!(FlagSet::new(vec![2, 3], true), flag_ap.clone() & flag_bp.clone());
assert_eq!(FlagSet::new(vec![1], true), flag_ap.clone() & flag_bn.clone());
assert_eq!(FlagSet::new(vec![4], true), flag_an.clone() & flag_bp.clone());
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], false), flag_an.clone() & flag_bn.clone());
// 测试减
// test substraction
assert_eq!(FlagSet::new(vec![1], true), flag_ap.clone() - flag_bp.clone());
assert_eq!(FlagSet::new(vec![2, 3], true), flag_ap.clone() - flag_bn.clone());
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], false), flag_an.clone() - flag_bp.clone());
assert_eq!(FlagSet::new(vec![4], true), flag_an.clone() - flag_bn.clone());
// 测试否
// test not
assert_eq!(FlagSet(a.clone(), true), !flag_an.clone());
// 测试对称差
// test symmetric difference
assert_eq!(FlagSet::new(vec![1, 4], true), flag_ap.clone() ^ flag_bp.clone());