@@ -5,6 +5,39 @@ extern mod extra;
55use std:: cmp;
66use 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
942pub 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