Skip to content

Commit 0cf2d20

Browse files
committed
Add a macro to make range construction easier
Closes #25.
1 parent 920d7d5 commit 0cf2d20

File tree

1 file changed

+47
-24
lines changed

1 file changed

+47
-24
lines changed

types/range.rs

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,39 @@ extern mod extra;
55
use std::cmp;
66
use extra::time::Timespec;
77

8+
macro_rules! range(
9+
(empty) => (Range::empty());
10+
('(', ')') => (Range::new(None, None));
11+
('(', $h:expr ')') => (
12+
Range::new(None, Some(RangeBound::new($h, Exclusive)))
13+
);
14+
('(', $h:expr ']') => (
15+
Range::new(None, Some(RangeBound::new($h, Inclusive)))
16+
);
17+
('(' $l:expr, ')') => (
18+
Range::new(Some(RangeBound::new($l, Exclusive)), None)
19+
);
20+
('[' $l:expr, ')') => (
21+
Range::new(Some(RangeBound::new($l, Inclusive)), None)
22+
);
23+
('(' $l:expr, $h:expr ')') => (
24+
Range::new(Some(RangeBound::new($l, Exclusive)),
25+
Some(RangeBound::new($h, Exclusive)))
26+
);
27+
('(' $l:expr, $h:expr ']') => (
28+
Range::new(Some(RangeBound::new($l, Exclusive)),
29+
Some(RangeBound::new($h, Inclusive)))
30+
);
31+
('[' $l:expr, $h:expr ')') => (
32+
Range::new(Some(RangeBound::new($l, Inclusive)),
33+
Some(RangeBound::new($h, Exclusive)))
34+
);
35+
('[' $l:expr, $h:expr ']') => (
36+
Range::new(Some(RangeBound::new($l, Inclusive)),
37+
Some(RangeBound::new($h, Inclusive)))
38+
)
39+
)
40+
841
/// A trait that normalizes a range bound for a type
942
pub trait Normalizable {
1043
/// Given a range bound, returns the normalized version of that bound. For
@@ -375,38 +408,31 @@ mod test {
375408

376409
#[test]
377410
fn test_range_empty() {
378-
assert!(Range::new(Some(RangeBound::new(9i32, Exclusive)),
379-
Some(RangeBound::new(10i32, Exclusive))).is_empty());
380-
assert!(Range::new(Some(RangeBound::new(10i32, Inclusive)),
381-
Some(RangeBound::new(10i32, Exclusive))).is_empty());
382-
assert!(Range::new(Some(RangeBound::new(10i32, Exclusive)),
383-
Some(RangeBound::new(10i32, Inclusive))).is_empty());
384-
assert!(Range::new(Some(RangeBound::new(10i32, Inclusive)),
385-
Some(RangeBound::new(9i32, Inclusive))).is_empty());
411+
assert!((range!('(' 9i32, 10i32 ')')).is_empty());
412+
assert!((range!('[' 10i32, 10i32 ')')).is_empty());
413+
assert!((range!('(' 10i32, 10i32 ']')).is_empty());
414+
assert!((range!('[' 10i32, 9i32 ']')).is_empty());
386415
}
387416

388417
#[test]
389418
fn test_intersection() {
390-
let r1 = Range::new(Some(RangeBound::new(10i32, Inclusive)),
391-
Some(RangeBound::new(15i32, Exclusive)));
392-
let r2 = Range::new(Some(RangeBound::new(20i32, Exclusive)),
393-
Some(RangeBound::new(25i32, Inclusive)));
419+
let r1 = range!('[' 10i32, 15i32 ')');
420+
let r2 = range!('(' 20i32, 25i32 ']');
394421
assert!(r1.intersect(&r2).is_empty());
395422
assert!(r2.intersect(&r1).is_empty());
396-
assert_eq!(r1, r1.intersect(&Range::new(None, None)));
397-
assert_eq!(r1, Range::new(None, None).intersect(&r1));
423+
assert_eq!(r1, r1.intersect(&range!('(', ')')));
424+
assert_eq!(r1, (range!('(', ')')).intersect(&r1));
398425

399-
let r2 = Range::new(Some(RangeBound::new(10i32, Exclusive)), None);
426+
let r2 = range!('(' 10i32, ')');
400427
let exp = Range::new(r2.lower().clone(), r1.upper().clone());
401428
assert_eq!(exp, r1.intersect(&r2));
402429
assert_eq!(exp, r2.intersect(&r1));
403430

404-
let r2 = Range::new(None, Some(RangeBound::new(15i32, Inclusive)));
431+
let r2 = range!('(', 15i32 ']');
405432
assert_eq!(r1, r1.intersect(&r2));
406433
assert_eq!(r1, r2.intersect(&r1));
407434

408-
let r2 = Range::new(Some(RangeBound::new(11i32, Inclusive)),
409-
Some(RangeBound::new(14i32, Exclusive)));
435+
let r2 = range!('[' 11i32, 14i32 ')');
410436
assert_eq!(r2, r1.intersect(&r2));
411437
assert_eq!(r2, r2.intersect(&r1));
412438
}
@@ -415,17 +441,14 @@ mod test {
415441
fn test_contains_range() {
416442
assert!(Range::<i32>::empty().contains_range(&Range::empty()));
417443

418-
let r1 = Range::new(Some(RangeBound::new(10i32, Inclusive)),
419-
Some(RangeBound::new(15i32, Exclusive)));
444+
let r1 = range!('[' 10i32, 15i32 ')');
420445
assert!(r1.contains_range(&r1));
421446

422-
let r2 = Range::new(Some(RangeBound::new(10i32, Exclusive)),
423-
None);
447+
let r2 = range!('(' 10i32, ')');
424448
assert!(!r1.contains_range(&r2));
425449
assert!(!r2.contains_range(&r1));
426450

427-
let r2 = Range::new(None,
428-
Some(RangeBound::new(15i32, Inclusive)));
451+
let r2 = range!('(', 15i32 ']');
429452
assert!(!r1.contains_range(&r2));
430453
assert!(r2.contains_range(&r1));
431454
}

0 commit comments

Comments
 (0)