@@ -5,6 +5,39 @@ extern mod extra;
5
5
use std:: cmp;
6
6
use extra:: time:: Timespec ;
7
7
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
+
8
41
/// A trait that normalizes a range bound for a type
9
42
pub trait Normalizable {
10
43
/// Given a range bound, returns the normalized version of that bound. For
@@ -375,38 +408,31 @@ mod test {
375
408
376
409
#[ test]
377
410
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( ) ) ;
386
415
}
387
416
388
417
#[ test]
389
418
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 ']' ) ;
394
421
assert ! ( r1. intersect( & r2) . is_empty( ) ) ;
395
422
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) ) ;
398
425
399
- let r2 = Range :: new ( Some ( RangeBound :: new ( 10i32 , Exclusive ) ) , None ) ;
426
+ let r2 = range ! ( '(' 10i32 , ')' ) ;
400
427
let exp = Range :: new ( r2. lower ( ) . clone ( ) , r1. upper ( ) . clone ( ) ) ;
401
428
assert_eq ! ( exp, r1. intersect( & r2) ) ;
402
429
assert_eq ! ( exp, r2. intersect( & r1) ) ;
403
430
404
- let r2 = Range :: new ( None , Some ( RangeBound :: new ( 15i32 , Inclusive ) ) ) ;
431
+ let r2 = range ! ( '(' , 15i32 ']' ) ;
405
432
assert_eq ! ( r1, r1. intersect( & r2) ) ;
406
433
assert_eq ! ( r1, r2. intersect( & r1) ) ;
407
434
408
- let r2 = Range :: new ( Some ( RangeBound :: new ( 11i32 , Inclusive ) ) ,
409
- Some ( RangeBound :: new ( 14i32 , Exclusive ) ) ) ;
435
+ let r2 = range ! ( '[' 11i32 , 14i32 ')' ) ;
410
436
assert_eq ! ( r2, r1. intersect( & r2) ) ;
411
437
assert_eq ! ( r2, r2. intersect( & r1) ) ;
412
438
}
@@ -415,17 +441,14 @@ mod test {
415
441
fn test_contains_range ( ) {
416
442
assert ! ( Range :: <i32 >:: empty( ) . contains_range( & Range :: empty( ) ) ) ;
417
443
418
- let r1 = Range :: new ( Some ( RangeBound :: new ( 10i32 , Inclusive ) ) ,
419
- Some ( RangeBound :: new ( 15i32 , Exclusive ) ) ) ;
444
+ let r1 = range ! ( '[' 10i32 , 15i32 ')' ) ;
420
445
assert ! ( r1. contains_range( & r1) ) ;
421
446
422
- let r2 = Range :: new ( Some ( RangeBound :: new ( 10i32 , Exclusive ) ) ,
423
- None ) ;
447
+ let r2 = range ! ( '(' 10i32 , ')' ) ;
424
448
assert ! ( !r1. contains_range( & r2) ) ;
425
449
assert ! ( !r2. contains_range( & r1) ) ;
426
450
427
- let r2 = Range :: new ( None ,
428
- Some ( RangeBound :: new ( 15i32 , Inclusive ) ) ) ;
451
+ let r2 = range ! ( '(' , 15i32 ']' ) ;
429
452
assert ! ( !r1. contains_range( & r2) ) ;
430
453
assert ! ( r2. contains_range( & r1) ) ;
431
454
}
0 commit comments