[meta] Introduce the num_set! macro to create NumSet as vec! does;

This commit is contained in:
Benjamin Bouvier
2019-03-29 11:45:15 +01:00
parent d1bb93294e
commit 3e7543df79

View File

@@ -236,6 +236,12 @@ type RangeBound = u16;
type Range = ops::Range<RangeBound>; type Range = ops::Range<RangeBound>;
type NumSet = BTreeSet<RangeBound>; type NumSet = BTreeSet<RangeBound>;
macro_rules! num_set {
($($expr:expr),*) => {
NumSet::from_iter(vec![$($expr),*])
};
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TypeSet { pub struct TypeSet {
pub lanes: NumSet, pub lanes: NumSet,
@@ -288,7 +294,7 @@ impl TypeSet {
/// Return a TypeSet describing the image of self across lane_of. /// Return a TypeSet describing the image of self across lane_of.
fn lane_of(&self) -> TypeSet { fn lane_of(&self) -> TypeSet {
let mut copy = self.clone(); let mut copy = self.clone();
copy.lanes = NumSet::from_iter(vec![1]); copy.lanes = num_set![1];
copy.bitvecs = NumSet::new(); copy.bitvecs = NumSet::new();
copy copy
} }
@@ -299,7 +305,7 @@ impl TypeSet {
copy.ints = NumSet::new(); copy.ints = NumSet::new();
copy.floats = NumSet::new(); copy.floats = NumSet::new();
copy.bitvecs = NumSet::new(); copy.bitvecs = NumSet::new();
if (&self.lanes - &NumSet::from_iter(vec![1])).len() > 0 { if (&self.lanes - &num_set![1]).len() > 0 {
copy.bools = &self.ints | &self.floats; copy.bools = &self.ints | &self.floats;
copy.bools = &copy.bools | &self.bools; copy.bools = &copy.bools | &self.bools;
} }
@@ -376,7 +382,7 @@ impl TypeSet {
let all_scalars = &(&self.ints | &self.floats) | &self.bools; let all_scalars = &(&self.ints | &self.floats) | &self.bools;
let mut copy = self.clone(); let mut copy = self.clone();
copy.lanes = NumSet::from_iter(vec![1]); copy.lanes = num_set![1];
copy.ints = NumSet::new(); copy.ints = NumSet::new();
copy.bools = NumSet::new(); copy.bools = NumSet::new();
copy.floats = NumSet::new(); copy.floats = NumSet::new();
@@ -617,12 +623,9 @@ fn test_typevar_builder() {
let typevar = TypeVarBuilder::new("test", "scalar integers") let typevar = TypeVarBuilder::new("test", "scalar integers")
.ints(Interval::All) .ints(Interval::All)
.finish(); .finish();
assert_eq!(typevar.type_set.lanes, NumSet::from_iter(vec![1])); assert_eq!(typevar.type_set.lanes, num_set![1]);
assert!(typevar.type_set.floats.is_empty()); assert!(typevar.type_set.floats.is_empty());
assert_eq!( assert_eq!(typevar.type_set.ints, num_set![8, 16, 32, 64]);
typevar.type_set.ints,
NumSet::from_iter(vec![8, 16, 32, 64])
);
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
assert!(typevar.type_set.specials.is_empty()); assert!(typevar.type_set.specials.is_empty());
@@ -630,21 +633,18 @@ fn test_typevar_builder() {
let typevar = TypeVarBuilder::new("test", "scalar bools") let typevar = TypeVarBuilder::new("test", "scalar bools")
.bools(Interval::All) .bools(Interval::All)
.finish(); .finish();
assert_eq!(typevar.type_set.lanes, NumSet::from_iter(vec![1])); assert_eq!(typevar.type_set.lanes, num_set![1]);
assert!(typevar.type_set.floats.is_empty()); assert!(typevar.type_set.floats.is_empty());
assert!(typevar.type_set.ints.is_empty()); assert!(typevar.type_set.ints.is_empty());
assert_eq!( assert_eq!(typevar.type_set.bools, num_set![1, 8, 16, 32, 64]);
typevar.type_set.bools,
NumSet::from_iter(vec![1, 8, 16, 32, 64])
);
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
assert!(typevar.type_set.specials.is_empty()); assert!(typevar.type_set.specials.is_empty());
let typevar = TypeVarBuilder::new("test", "scalar floats") let typevar = TypeVarBuilder::new("test", "scalar floats")
.floats(Interval::All) .floats(Interval::All)
.finish(); .finish();
assert_eq!(typevar.type_set.lanes, NumSet::from_iter(vec![1])); assert_eq!(typevar.type_set.lanes, num_set![1]);
assert_eq!(typevar.type_set.floats, NumSet::from_iter(vec![32, 64])); assert_eq!(typevar.type_set.floats, num_set![32, 64]);
assert!(typevar.type_set.ints.is_empty()); assert!(typevar.type_set.ints.is_empty());
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
@@ -657,9 +657,9 @@ fn test_typevar_builder() {
.finish(); .finish();
assert_eq!( assert_eq!(
typevar.type_set.lanes, typevar.type_set.lanes,
NumSet::from_iter(vec![2, 4, 8, 16, 32, 64, 128, 256]) num_set![2, 4, 8, 16, 32, 64, 128, 256]
); );
assert_eq!(typevar.type_set.floats, NumSet::from_iter(vec![32, 64])); assert_eq!(typevar.type_set.floats, num_set![32, 64]);
assert!(typevar.type_set.ints.is_empty()); assert!(typevar.type_set.ints.is_empty());
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
@@ -672,9 +672,9 @@ fn test_typevar_builder() {
.finish(); .finish();
assert_eq!( assert_eq!(
typevar.type_set.lanes, typevar.type_set.lanes,
NumSet::from_iter(vec![1, 2, 4, 8, 16, 32, 64, 128, 256]) num_set![1, 2, 4, 8, 16, 32, 64, 128, 256]
); );
assert_eq!(typevar.type_set.floats, NumSet::from_iter(vec![32, 64])); assert_eq!(typevar.type_set.floats, num_set![32, 64]);
assert!(typevar.type_set.ints.is_empty()); assert!(typevar.type_set.ints.is_empty());
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
@@ -683,8 +683,8 @@ fn test_typevar_builder() {
let typevar = TypeVarBuilder::new("test", "range of ints") let typevar = TypeVarBuilder::new("test", "range of ints")
.ints(16..64) .ints(16..64)
.finish(); .finish();
assert_eq!(typevar.type_set.lanes, NumSet::from_iter(vec![1])); assert_eq!(typevar.type_set.lanes, num_set![1]);
assert_eq!(typevar.type_set.ints, NumSet::from_iter(vec![16, 32, 64])); assert_eq!(typevar.type_set.ints, num_set![16, 32, 64]);
assert!(typevar.type_set.floats.is_empty()); assert!(typevar.type_set.floats.is_empty());
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
@@ -716,12 +716,12 @@ fn test_singleton() {
let typevar = let typevar =
TypeVarBuilder::singleton(ValueType::Lane(LaneType::IntType(shared_types::Int::I32))); TypeVarBuilder::singleton(ValueType::Lane(LaneType::IntType(shared_types::Int::I32)));
assert_eq!(typevar.name, "i32"); assert_eq!(typevar.name, "i32");
assert_eq!(typevar.type_set.ints, NumSet::from_iter(vec![32])); assert_eq!(typevar.type_set.ints, num_set![32]);
assert!(typevar.type_set.floats.is_empty()); assert!(typevar.type_set.floats.is_empty());
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
assert!(typevar.type_set.specials.is_empty()); assert!(typevar.type_set.specials.is_empty());
assert_eq!(typevar.type_set.lanes, NumSet::from_iter(vec![1])); assert_eq!(typevar.type_set.lanes, num_set![1]);
// Test f32x4. // Test f32x4.
let typevar = TypeVarBuilder::singleton(ValueType::Vector(VectorType::new( let typevar = TypeVarBuilder::singleton(ValueType::Vector(VectorType::new(
@@ -730,8 +730,8 @@ fn test_singleton() {
))); )));
assert_eq!(typevar.name, "f32x4"); assert_eq!(typevar.name, "f32x4");
assert!(typevar.type_set.ints.is_empty()); assert!(typevar.type_set.ints.is_empty());
assert_eq!(typevar.type_set.floats, NumSet::from_iter(vec![32])); assert_eq!(typevar.type_set.floats, num_set![32]);
assert_eq!(typevar.type_set.lanes, NumSet::from_iter(vec![4])); assert_eq!(typevar.type_set.lanes, num_set![4]);
assert!(typevar.type_set.bools.is_empty()); assert!(typevar.type_set.bools.is_empty());
assert!(typevar.type_set.bitvecs.is_empty()); assert!(typevar.type_set.bitvecs.is_empty());
assert!(typevar.type_set.specials.is_empty()); assert!(typevar.type_set.specials.is_empty());