File tree Expand file tree Collapse file tree 6 files changed +126
-0
lines changed Expand file tree Collapse file tree 6 files changed +126
-0
lines changed Original file line number Diff line number Diff line change @@ -306,6 +306,33 @@ pub extern {
306
306
fn floorf32 ( val : f32 ) -> f32 ;
307
307
}
308
308
309
+ impl f32 : num:: Round {
310
+ #[ inline( always) ]
311
+ pure fn round ( & self , mode : num:: RoundMode ) -> f32 {
312
+ match mode {
313
+ num:: RoundDown => floor ( * self ) ,
314
+ num:: RoundUp => ceil ( * self ) ,
315
+ num:: RoundToZero if is_negative ( * self ) => ceil ( * self ) ,
316
+ num:: RoundToZero => floor ( * self ) ,
317
+ num:: RoundFromZero if is_negative ( * self ) => floor ( * self ) ,
318
+ num:: RoundFromZero => ceil ( * self )
319
+ }
320
+ }
321
+
322
+ #[ inline( always) ]
323
+ pure fn floor ( & self ) -> f32 { floor ( * self ) }
324
+ #[ inline( always) ]
325
+ pure fn ceil ( & self ) -> f32 { ceil ( * self ) }
326
+ #[ inline( always) ]
327
+ pure fn fract ( & self ) -> f32 {
328
+ if is_negative ( * self ) {
329
+ ( * self ) - ceil ( * self )
330
+ } else {
331
+ ( * self ) - floor ( * self )
332
+ }
333
+ }
334
+ }
335
+
309
336
//
310
337
// Local Variables:
311
338
// mode: rust
Original file line number Diff line number Diff line change @@ -330,6 +330,33 @@ pub extern {
330
330
fn floorf64 ( val : f64 ) -> f64 ;
331
331
}
332
332
333
+ impl f64 : num:: Round {
334
+ #[ inline( always) ]
335
+ pure fn round ( & self , mode : num:: RoundMode ) -> f64 {
336
+ match mode {
337
+ num:: RoundDown => floor ( * self ) ,
338
+ num:: RoundUp => ceil ( * self ) ,
339
+ num:: RoundToZero if is_negative ( * self ) => ceil ( * self ) ,
340
+ num:: RoundToZero => floor ( * self ) ,
341
+ num:: RoundFromZero if is_negative ( * self ) => floor ( * self ) ,
342
+ num:: RoundFromZero => ceil ( * self )
343
+ }
344
+ }
345
+
346
+ #[ inline( always) ]
347
+ pure fn floor ( & self ) -> f64 { floor ( * self ) }
348
+ #[ inline( always) ]
349
+ pure fn ceil ( & self ) -> f64 { ceil ( * self ) }
350
+ #[ inline( always) ]
351
+ pure fn fract ( & self ) -> f64 {
352
+ if is_negative ( * self ) {
353
+ ( * self ) - ceil ( * self )
354
+ } else {
355
+ ( * self ) - floor ( * self )
356
+ }
357
+ }
358
+ }
359
+
333
360
//
334
361
// Local Variables:
335
362
// mode: rust
Original file line number Diff line number Diff line change @@ -488,6 +488,39 @@ impl float: num::One {
488
488
static pure fn one( ) -> float { 1 . 0 }
489
489
}
490
490
491
+ impl float: num:: Round {
492
+ #[ inline( always) ]
493
+ pure fn round ( & self , mode : num:: RoundMode ) -> float {
494
+ match mode {
495
+ num:: RoundDown
496
+ => f64:: floor ( * self as f64 ) as float ,
497
+ num:: RoundUp
498
+ => f64:: ceil ( * self as f64 ) as float ,
499
+ num:: RoundToZero if is_negative ( * self )
500
+ => f64:: ceil ( * self as f64 ) as float ,
501
+ num:: RoundToZero
502
+ => f64:: floor ( * self as f64 ) as float ,
503
+ num:: RoundFromZero if is_negative ( * self )
504
+ => f64:: floor ( * self as f64 ) as float ,
505
+ num:: RoundFromZero
506
+ => f64:: ceil ( * self as f64 ) as float
507
+ }
508
+ }
509
+
510
+ #[ inline( always) ]
511
+ pure fn floor ( & self ) -> float { f64:: floor ( * self as f64 ) as float }
512
+ #[ inline( always) ]
513
+ pure fn ceil ( & self ) -> float { f64:: ceil ( * self as f64 ) as float }
514
+ #[ inline( always) ]
515
+ pure fn fract ( & self ) -> float {
516
+ if is_negative ( * self ) {
517
+ ( * self ) - ( f64:: ceil ( * self as f64 ) as float )
518
+ } else {
519
+ ( * self ) - ( f64:: floor ( * self as f64 ) as float )
520
+ }
521
+ }
522
+ }
523
+
491
524
#[ test]
492
525
pub fn test_from_str ( ) {
493
526
assert from_str ( ~"3 ") == Some ( 3. ) ;
Original file line number Diff line number Diff line change @@ -200,6 +200,18 @@ impl T: num::One {
200
200
static pure fn one() -> T { 1 }
201
201
}
202
202
203
+ impl T: num::Round {
204
+ #[inline(always)]
205
+ pure fn round(&self, _: num::RoundMode) -> T { *self }
206
+
207
+ #[inline(always)]
208
+ pure fn floor(&self) -> T { *self }
209
+ #[inline(always)]
210
+ pure fn ceil(&self) -> T { *self }
211
+ #[inline(always)]
212
+ pure fn fract(&self) -> T { 0 }
213
+ }
214
+
203
215
/**
204
216
* Parse a buffer of bytes
205
217
*
Original file line number Diff line number Diff line change @@ -35,3 +35,18 @@ pub trait Zero {
35
35
pub trait One {
36
36
static pure fn one( ) -> Self ;
37
37
}
38
+
39
+ pub trait Round {
40
+ pure fn round ( & self , mode : RoundMode ) -> self ;
41
+
42
+ pure fn floor ( & self ) -> self ;
43
+ pure fn ceil ( & self ) -> self ;
44
+ pure fn fract ( & self ) -> self ;
45
+ }
46
+
47
+ pub enum RoundMode {
48
+ RoundDown ,
49
+ RoundUp ,
50
+ RoundToZero ,
51
+ RoundFromZero
52
+ }
Original file line number Diff line number Diff line change @@ -160,6 +160,18 @@ impl T: num::One {
160
160
static pure fn one() -> T { 1 }
161
161
}
162
162
163
+ impl T: num::Round {
164
+ #[inline(always)]
165
+ pure fn round(&self, _: num::RoundMode) -> T { *self }
166
+
167
+ #[inline(always)]
168
+ pure fn floor(&self) -> T { *self }
169
+ #[inline(always)]
170
+ pure fn ceil(&self) -> T { *self }
171
+ #[inline(always)]
172
+ pure fn fract(&self) -> T { 0 }
173
+ }
174
+
163
175
/**
164
176
* Parse a buffer of bytes
165
177
*
You can’t perform that action at this time.
0 commit comments