Skip to content

Commit 9f337a5

Browse files
committed
auto merge of #5869 : bjz/rust/master, r=graydon
This restores the trait that was lost in 216e85f. `Num` will eventually be broken up into a more fine-grained trait hierarchy in the future once a design can be agreed upon. To contribute to the discussion about the future of Rust's numeric traits, please see issue #4819 and the [wiki page](https://github.com/mozilla/rust/wiki/Bikeshed-Numeric-Traits). I have also switched to [implementing NumCast using macros](brendanzab@353ce87). This removes a significant number of lines of code.
2 parents e2d5ceb + 0615fdd commit 9f337a5

23 files changed

+166
-991
lines changed

src/libcore/core.rc

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub use vec::{OwnedVector, OwnedCopyableVector};
9999
pub use iter::{BaseIter, ExtendedIter, EqIter, CopyableIter};
100100
pub use iter::{CopyableOrderedIter, CopyableNonstrictIter, Times};
101101

102-
pub use num::NumCast;
102+
pub use num::{Num, NumCast};
103103
pub use ptr::Ptr;
104104
pub use to_str::ToStr;
105105
pub use clone::Clone;

src/libcore/num/f32.rs

-82
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
1313
use cmath;
1414
use libc::{c_float, c_int};
15-
use num::NumCast;
1615
use num::strconv;
1716
use num;
1817
use option::Option;
@@ -287,30 +286,6 @@ impl num::One for f32 {
287286
fn one() -> f32 { 1.0 }
288287
}
289288

290-
impl NumCast for f32 {
291-
/**
292-
* Cast `n` to an `f32`
293-
*/
294-
#[inline(always)]
295-
fn from<N:NumCast>(n: N) -> f32 { n.to_f32() }
296-
297-
#[inline(always)] fn to_u8(&self) -> u8 { *self as u8 }
298-
#[inline(always)] fn to_u16(&self) -> u16 { *self as u16 }
299-
#[inline(always)] fn to_u32(&self) -> u32 { *self as u32 }
300-
#[inline(always)] fn to_u64(&self) -> u64 { *self as u64 }
301-
#[inline(always)] fn to_uint(&self) -> uint { *self as uint }
302-
303-
#[inline(always)] fn to_i8(&self) -> i8 { *self as i8 }
304-
#[inline(always)] fn to_i16(&self) -> i16 { *self as i16 }
305-
#[inline(always)] fn to_i32(&self) -> i32 { *self as i32 }
306-
#[inline(always)] fn to_i64(&self) -> i64 { *self as i64 }
307-
#[inline(always)] fn to_int(&self) -> int { *self as int }
308-
309-
#[inline(always)] fn to_f32(&self) -> f32 { *self }
310-
#[inline(always)] fn to_f64(&self) -> f64 { *self as f64 }
311-
#[inline(always)] fn to_float(&self) -> float { *self as float }
312-
}
313-
314289
#[cfg(notest)]
315290
impl ops::Add<f32,f32> for f32 {
316291
fn add(&self, other: &f32) -> f32 { *self + *other }
@@ -580,63 +555,6 @@ impl num::FromStrRadix for f32 {
580555
}
581556
}
582557

583-
#[test]
584-
pub fn test_num() {
585-
let ten: f32 = num::cast(10);
586-
let two: f32 = num::cast(2);
587-
588-
assert!((ten.add(&two) == num::cast(12)));
589-
assert!((ten.sub(&two) == num::cast(8)));
590-
assert!((ten.mul(&two) == num::cast(20)));
591-
assert!((ten.div(&two) == num::cast(5)));
592-
assert!((ten.modulo(&two) == num::cast(0)));
593-
}
594-
595-
#[test]
596-
fn test_numcast() {
597-
assert!((20u == 20f32.to_uint()));
598-
assert!((20u8 == 20f32.to_u8()));
599-
assert!((20u16 == 20f32.to_u16()));
600-
assert!((20u32 == 20f32.to_u32()));
601-
assert!((20u64 == 20f32.to_u64()));
602-
assert!((20i == 20f32.to_int()));
603-
assert!((20i8 == 20f32.to_i8()));
604-
assert!((20i16 == 20f32.to_i16()));
605-
assert!((20i32 == 20f32.to_i32()));
606-
assert!((20i64 == 20f32.to_i64()));
607-
assert!((20f == 20f32.to_float()));
608-
assert!((20f32 == 20f32.to_f32()));
609-
assert!((20f64 == 20f32.to_f64()));
610-
611-
assert!((20f32 == NumCast::from(20u)));
612-
assert!((20f32 == NumCast::from(20u8)));
613-
assert!((20f32 == NumCast::from(20u16)));
614-
assert!((20f32 == NumCast::from(20u32)));
615-
assert!((20f32 == NumCast::from(20u64)));
616-
assert!((20f32 == NumCast::from(20i)));
617-
assert!((20f32 == NumCast::from(20i8)));
618-
assert!((20f32 == NumCast::from(20i16)));
619-
assert!((20f32 == NumCast::from(20i32)));
620-
assert!((20f32 == NumCast::from(20i64)));
621-
assert!((20f32 == NumCast::from(20f)));
622-
assert!((20f32 == NumCast::from(20f32)));
623-
assert!((20f32 == NumCast::from(20f64)));
624-
625-
assert!((20f32 == num::cast(20u)));
626-
assert!((20f32 == num::cast(20u8)));
627-
assert!((20f32 == num::cast(20u16)));
628-
assert!((20f32 == num::cast(20u32)));
629-
assert!((20f32 == num::cast(20u64)));
630-
assert!((20f32 == num::cast(20i)));
631-
assert!((20f32 == num::cast(20i8)));
632-
assert!((20f32 == num::cast(20i16)));
633-
assert!((20f32 == num::cast(20i32)));
634-
assert!((20f32 == num::cast(20i64)));
635-
assert!((20f32 == num::cast(20f)));
636-
assert!((20f32 == num::cast(20f32)));
637-
assert!((20f32 == num::cast(20f64)));
638-
}
639-
640558
//
641559
// Local Variables:
642560
// mode: rust

src/libcore/num/f64.rs

-82
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
1313
use cmath;
1414
use libc::{c_double, c_int};
15-
use num::NumCast;
1615
use num::strconv;
1716
use num;
1817
use option::Option;
@@ -299,30 +298,6 @@ impl cmp::Ord for f64 {
299298
fn gt(&self, other: &f64) -> bool { (*self) > (*other) }
300299
}
301300

302-
impl NumCast for f64 {
303-
/**
304-
* Cast `n` to an `f64`
305-
*/
306-
#[inline(always)]
307-
fn from<N:NumCast>(n: N) -> f64 { n.to_f64() }
308-
309-
#[inline(always)] fn to_u8(&self) -> u8 { *self as u8 }
310-
#[inline(always)] fn to_u16(&self) -> u16 { *self as u16 }
311-
#[inline(always)] fn to_u32(&self) -> u32 { *self as u32 }
312-
#[inline(always)] fn to_u64(&self) -> u64 { *self as u64 }
313-
#[inline(always)] fn to_uint(&self) -> uint { *self as uint }
314-
315-
#[inline(always)] fn to_i8(&self) -> i8 { *self as i8 }
316-
#[inline(always)] fn to_i16(&self) -> i16 { *self as i16 }
317-
#[inline(always)] fn to_i32(&self) -> i32 { *self as i32 }
318-
#[inline(always)] fn to_i64(&self) -> i64 { *self as i64 }
319-
#[inline(always)] fn to_int(&self) -> int { *self as int }
320-
321-
#[inline(always)] fn to_f32(&self) -> f32 { *self as f32 }
322-
#[inline(always)] fn to_f64(&self) -> f64 { *self }
323-
#[inline(always)] fn to_float(&self) -> float { *self as float }
324-
}
325-
326301
impl num::Zero for f64 {
327302
#[inline(always)]
328303
fn zero() -> f64 { 0.0 }
@@ -602,63 +577,6 @@ impl num::FromStrRadix for f64 {
602577
}
603578
}
604579

605-
#[test]
606-
pub fn test_num() {
607-
let ten: f64 = num::cast(10);
608-
let two: f64 = num::cast(2);
609-
610-
assert!((ten.add(&two) == num::cast(12)));
611-
assert!((ten.sub(&two) == num::cast(8)));
612-
assert!((ten.mul(&two) == num::cast(20)));
613-
assert!((ten.div(&two) == num::cast(5)));
614-
assert!((ten.modulo(&two) == num::cast(0)));
615-
}
616-
617-
#[test]
618-
fn test_numcast() {
619-
assert!((20u == 20f64.to_uint()));
620-
assert!((20u8 == 20f64.to_u8()));
621-
assert!((20u16 == 20f64.to_u16()));
622-
assert!((20u32 == 20f64.to_u32()));
623-
assert!((20u64 == 20f64.to_u64()));
624-
assert!((20i == 20f64.to_int()));
625-
assert!((20i8 == 20f64.to_i8()));
626-
assert!((20i16 == 20f64.to_i16()));
627-
assert!((20i32 == 20f64.to_i32()));
628-
assert!((20i64 == 20f64.to_i64()));
629-
assert!((20f == 20f64.to_float()));
630-
assert!((20f32 == 20f64.to_f32()));
631-
assert!((20f64 == 20f64.to_f64()));
632-
633-
assert!((20f64 == NumCast::from(20u)));
634-
assert!((20f64 == NumCast::from(20u8)));
635-
assert!((20f64 == NumCast::from(20u16)));
636-
assert!((20f64 == NumCast::from(20u32)));
637-
assert!((20f64 == NumCast::from(20u64)));
638-
assert!((20f64 == NumCast::from(20i)));
639-
assert!((20f64 == NumCast::from(20i8)));
640-
assert!((20f64 == NumCast::from(20i16)));
641-
assert!((20f64 == NumCast::from(20i32)));
642-
assert!((20f64 == NumCast::from(20i64)));
643-
assert!((20f64 == NumCast::from(20f)));
644-
assert!((20f64 == NumCast::from(20f32)));
645-
assert!((20f64 == NumCast::from(20f64)));
646-
647-
assert!((20f64 == num::cast(20u)));
648-
assert!((20f64 == num::cast(20u8)));
649-
assert!((20f64 == num::cast(20u16)));
650-
assert!((20f64 == num::cast(20u32)));
651-
assert!((20f64 == num::cast(20u64)));
652-
assert!((20f64 == num::cast(20i)));
653-
assert!((20f64 == num::cast(20i8)));
654-
assert!((20f64 == num::cast(20i16)));
655-
assert!((20f64 == num::cast(20i32)));
656-
assert!((20f64 == num::cast(20i64)));
657-
assert!((20f64 == num::cast(20f)));
658-
assert!((20f64 == num::cast(20f32)));
659-
assert!((20f64 == num::cast(20f64)));
660-
}
661-
662580
//
663581
// Local Variables:
664582
// mode: rust

src/libcore/num/float.rs

-82
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
// PORT this must match in width according to architecture
2222

2323
use f64;
24-
use num::NumCast;
2524
use num::strconv;
2625
use num;
2726
use option::Option;
@@ -417,30 +416,6 @@ impl num::One for float {
417416
fn one() -> float { 1.0 }
418417
}
419418
420-
impl NumCast for float {
421-
/**
422-
* Cast `n` to a `float`
423-
*/
424-
#[inline(always)]
425-
fn from<N:NumCast>(n: N) -> float { n.to_float() }
426-
427-
#[inline(always)] fn to_u8(&self) -> u8 { *self as u8 }
428-
#[inline(always)] fn to_u16(&self) -> u16 { *self as u16 }
429-
#[inline(always)] fn to_u32(&self) -> u32 { *self as u32 }
430-
#[inline(always)] fn to_u64(&self) -> u64 { *self as u64 }
431-
#[inline(always)] fn to_uint(&self) -> uint { *self as uint }
432-
433-
#[inline(always)] fn to_i8(&self) -> i8 { *self as i8 }
434-
#[inline(always)] fn to_i16(&self) -> i16 { *self as i16 }
435-
#[inline(always)] fn to_i32(&self) -> i32 { *self as i32 }
436-
#[inline(always)] fn to_i64(&self) -> i64 { *self as i64 }
437-
#[inline(always)] fn to_int(&self) -> int { *self as int }
438-
439-
#[inline(always)] fn to_f32(&self) -> f32 { *self as f32 }
440-
#[inline(always)] fn to_f64(&self) -> f64 { *self as f64 }
441-
#[inline(always)] fn to_float(&self) -> float { *self }
442-
}
443-
444419
impl num::Round for float {
445420
#[inline(always)]
446421
fn round(&self, mode: num::RoundMode) -> float {
@@ -688,63 +663,6 @@ pub fn test_round() {
688663
assert!(round(-3.5) == -4.0);
689664
}
690665

691-
#[test]
692-
pub fn test_num() {
693-
let ten: float = num::cast(10);
694-
let two: float = num::cast(2);
695-
696-
assert!((ten.add(&two) == num::cast(12)));
697-
assert!((ten.sub(&two) == num::cast(8)));
698-
assert!((ten.mul(&two) == num::cast(20)));
699-
assert!((ten.div(&two) == num::cast(5)));
700-
assert!((ten.modulo(&two) == num::cast(0)));
701-
}
702-
703-
#[test]
704-
fn test_numcast() {
705-
assert!((20u == 20f.to_uint()));
706-
assert!((20u8 == 20f.to_u8()));
707-
assert!((20u16 == 20f.to_u16()));
708-
assert!((20u32 == 20f.to_u32()));
709-
assert!((20u64 == 20f.to_u64()));
710-
assert!((20i == 20f.to_int()));
711-
assert!((20i8 == 20f.to_i8()));
712-
assert!((20i16 == 20f.to_i16()));
713-
assert!((20i32 == 20f.to_i32()));
714-
assert!((20i64 == 20f.to_i64()));
715-
assert!((20f == 20f.to_float()));
716-
assert!((20f32 == 20f.to_f32()));
717-
assert!((20f64 == 20f.to_f64()));
718-
719-
assert!((20f == NumCast::from(20u)));
720-
assert!((20f == NumCast::from(20u8)));
721-
assert!((20f == NumCast::from(20u16)));
722-
assert!((20f == NumCast::from(20u32)));
723-
assert!((20f == NumCast::from(20u64)));
724-
assert!((20f == NumCast::from(20i)));
725-
assert!((20f == NumCast::from(20i8)));
726-
assert!((20f == NumCast::from(20i16)));
727-
assert!((20f == NumCast::from(20i32)));
728-
assert!((20f == NumCast::from(20i64)));
729-
assert!((20f == NumCast::from(20f)));
730-
assert!((20f == NumCast::from(20f32)));
731-
assert!((20f == NumCast::from(20f64)));
732-
733-
assert!((20f == num::cast(20u)));
734-
assert!((20f == num::cast(20u8)));
735-
assert!((20f == num::cast(20u16)));
736-
assert!((20f == num::cast(20u32)));
737-
assert!((20f == num::cast(20u64)));
738-
assert!((20f == num::cast(20i)));
739-
assert!((20f == num::cast(20i8)));
740-
assert!((20f == num::cast(20i16)));
741-
assert!((20f == num::cast(20i32)));
742-
assert!((20f == num::cast(20i64)));
743-
assert!((20f == num::cast(20f)));
744-
assert!((20f == num::cast(20f32)));
745-
assert!((20f == num::cast(20f64)));
746-
}
747-
748666

749667
//
750668
// Local Variables:

src/libcore/num/int-template.rs

-12
Original file line numberDiff line numberDiff line change
@@ -397,18 +397,6 @@ fn test_int_from_str_overflow() {
397397
assert!((i64::from_str(~"-9223372036854775809").is_none()));
398398
}
399399
400-
#[test]
401-
pub fn test_num() {
402-
let ten: T = num::cast(10);
403-
let two: T = num::cast(2);
404-
405-
assert!((ten.add(&two) == num::cast(12)));
406-
assert!((ten.sub(&two) == num::cast(8)));
407-
assert!((ten.mul(&two) == num::cast(20)));
408-
assert!((ten.div(&two) == num::cast(5)));
409-
assert!((ten.modulo(&two) == num::cast(0)));
410-
}
411-
412400
#[test]
413401
pub fn test_ranges() {
414402
let mut l = ~[];

0 commit comments

Comments
 (0)