@@ -127,22 +127,12 @@ impl<S: BoundSided, T: Ord> RangeBound<S, T> {
127127 }
128128}
129129
130- /// The relation of a value to a range
131- #[ deriving( Eq ) ]
132- pub enum RangeComparison {
133- /// The value lies above the range
134- Above ,
135- /// The value lies within the range
136- Within ,
137- /// The value lies below the range
138- Below
139- }
140-
141130/// Represents a range of values.
142131#[ deriving( Eq , Clone ) ]
143- pub struct Range < T > {
144- priv lower : Option < RangeBound < LowerBound , T > > ,
145- priv upper : Option < RangeBound < UpperBound , T > > ,
132+ pub enum Range < T > {
133+ priv Empty ,
134+ priv Normal ( Option < RangeBound < LowerBound , T > > ,
135+ Option < RangeBound < UpperBound , T > > )
146136}
147137
148138impl < T : Ord +Normalizable > Range < T > {
@@ -160,39 +150,47 @@ impl<T: Ord+Normalizable> Range<T> {
160150 _ => { }
161151 }
162152
163- Range { lower : lower, upper : upper }
153+ Normal ( lower, upper)
154+ }
155+
156+ /// Creates a new empty range.
157+ pub fn empty ( ) -> Range < T > {
158+ Empty
159+ }
160+
161+ /// Determines if this range is the empty range.
162+ pub fn is_empty ( & self ) -> bool {
163+ match * self {
164+ Empty => true ,
165+ Normal ( * ) => false
166+ }
164167 }
165168
166169 /// Returns the lower bound if it exists.
167170 pub fn lower < ' a > ( & ' a self ) -> & ' a Option < RangeBound < LowerBound , T > > {
168- & self . lower
171+ match * self {
172+ Empty => & None ,
173+ Normal ( ref lower, _) => lower
174+ }
169175 }
170176
171177 /// Returns the upper bound if it exists.
172178 pub fn upper < ' a > ( & ' a self ) -> & ' a Option < RangeBound < UpperBound , T > > {
173- & self . upper
174- }
175-
176- /// Compares a value to this range.
177- pub fn cmp ( & self , value : & T ) -> RangeComparison {
178- let lower = do self . lower . as_ref ( ) . map_default ( true ) |b| {
179- b. in_bounds ( value)
180- } ;
181- let upper = do self . upper . as_ref ( ) . map_default ( true ) |b| {
182- b. in_bounds ( value)
183- } ;
184-
185- match ( lower, upper) {
186- ( true , false ) => Above ,
187- ( true , true ) => Within ,
188- ( false , true ) => Below ,
189- _ => unreachable ! ( )
179+ match * self {
180+ Empty => & None ,
181+ Normal ( _, ref upper) => upper
190182 }
191183 }
192184
193185 /// Determines if a value lies within this range.
194186 pub fn contains ( & self , value : & T ) -> bool {
195- self . cmp ( value) == Within
187+ match * self {
188+ Empty => false ,
189+ Normal ( ref lower, ref upper) => {
190+ lower. as_ref ( ) . map_default ( true , |b| { b. in_bounds ( value) } ) &&
191+ upper. as_ref ( ) . map_default ( true , |b| { b. in_bounds ( value) } )
192+ }
193+ }
196194 }
197195}
198196
@@ -263,37 +261,37 @@ mod test {
263261 }
264262
265263 #[ test]
266- fn test_range_cmp ( ) {
264+ fn test_range_contains ( ) {
267265 let r = Range :: new ( Some ( RangeBound :: new ( 1i32 , Inclusive ) ) ,
268266 Some ( RangeBound :: new ( 3i32 , Inclusive ) ) ) ;
269- assert_eq ! ( Above , r . cmp ( & 4 ) ) ;
270- assert_eq ! ( Within , r . cmp ( & 3 ) ) ;
271- assert_eq ! ( Within , r . cmp ( & 2 ) ) ;
272- assert_eq ! ( Within , r . cmp ( & 1 ) ) ;
273- assert_eq ! ( Below , r . cmp ( & 0 ) ) ;
267+ assert ! ( !r . contains ( & 4 ) ) ;
268+ assert ! ( r . contains ( & 3 ) ) ;
269+ assert ! ( r . contains ( & 2 ) ) ;
270+ assert ! ( r . contains ( & 1 ) ) ;
271+ assert ! ( !r . contains ( & 0 ) ) ;
274272
275273 let r = Range :: new ( Some ( RangeBound :: new ( 1i32 , Exclusive ) ) ,
276274 Some ( RangeBound :: new ( 3i32 , Exclusive ) ) ) ;
277- assert_eq ! ( Above , r . cmp ( & 4 ) ) ;
278- assert_eq ! ( Above , r . cmp ( & 3 ) ) ;
279- assert_eq ! ( Within , r . cmp ( & 2 ) ) ;
280- assert_eq ! ( Below , r . cmp ( & 1 ) ) ;
281- assert_eq ! ( Below , r . cmp ( & 0 ) ) ;
275+ assert ! ( !r . contains ( & 4 ) ) ;
276+ assert ! ( !r . contains ( & 3 ) ) ;
277+ assert ! ( r . contains ( & 2 ) ) ;
278+ assert ! ( !r . contains ( & 1 ) ) ;
279+ assert ! ( !r . contains ( & 0 ) ) ;
282280
283281 let r = Range :: new ( None , Some ( RangeBound :: new ( 3i32 , Inclusive ) ) ) ;
284- assert_eq ! ( Above , r . cmp ( & 4 ) ) ;
285- assert_eq ! ( Within , r . cmp ( & 2 ) ) ;
286- assert_eq ! ( Within , r . cmp ( & Bounded :: min_value( ) ) ) ;
282+ assert ! ( !r . contains ( & 4 ) ) ;
283+ assert ! ( r . contains ( & 2 ) ) ;
284+ assert ! ( r . contains ( & Bounded :: min_value( ) ) ) ;
287285
288286 let r = Range :: new ( Some ( RangeBound :: new ( 1i32 , Inclusive ) ) , None ) ;
289- assert_eq ! ( Within , r . cmp ( & Bounded :: max_value( ) ) ) ;
290- assert_eq ! ( Within , r . cmp ( & 4 ) ) ;
291- assert_eq ! ( Below , r . cmp ( & 0 ) ) ;
287+ assert ! ( r . contains ( & Bounded :: max_value( ) ) ) ;
288+ assert ! ( r . contains ( & 4 ) ) ;
289+ assert ! ( !r . contains ( & 0 ) ) ;
292290
293291 let r = Range :: new ( None , None ) ;
294- assert_eq ! ( Within , r . cmp ( & Bounded :: max_value( ) ) ) ;
295- assert_eq ! ( Within , r . cmp ( & 0i32 ) ) ;
296- assert_eq ! ( Within , r . cmp ( & Bounded :: min_value( ) ) ) ;
292+ assert ! ( r . contains ( & Bounded :: max_value( ) ) ) ;
293+ assert ! ( r . contains ( & 0i32 ) ) ;
294+ assert ! ( r . contains ( & Bounded :: min_value( ) ) ) ;
297295 }
298296
299297 #[ test]
0 commit comments