@@ -36,34 +36,47 @@ pub enum SignFormat {
36
36
SignAll
37
37
}
38
38
39
- pub trait NumStrConv {
40
- static pure fn has_NaN( ) -> bool ;
41
- static pure fn has_inf( ) -> bool ;
42
- static pure fn has_neg_inf( ) -> bool ;
43
- static pure fn has_neg_zero( ) -> bool ;
39
+ #[ inline( always) ]
40
+ pure fn is_NaN < T : Eq > ( num : & T ) -> bool {
41
+ * num != * num
42
+ }
43
+
44
+ #[ inline( always) ]
45
+ pure fn is_inf < T : Eq +NumStrConv > ( num : & T ) -> bool {
46
+ match NumStrConv :: inf ( ) {
47
+ None => false ,
48
+ Some ( n) => * num == n
49
+ }
50
+ }
51
+
52
+ #[ inline( always) ]
53
+ pure fn is_neg_inf < T : Eq +NumStrConv > ( num : & T ) -> bool {
54
+ match NumStrConv :: neg_inf ( ) {
55
+ None => false ,
56
+ Some ( n) => * num == n
57
+ }
58
+ }
59
+
60
+ #[ inline( always) ]
61
+ pure fn is_neg_zero < T : Eq +One +Zero +NumStrConv +Div < T , T > > ( num : & T ) -> bool {
62
+ let _0: T = Zero :: zero ( ) ;
63
+ let _1: T = One :: one ( ) ;
64
+
65
+ * num == _0 && is_neg_inf ( & ( _1 / * num) )
66
+ }
44
67
68
+ pub trait NumStrConv {
45
69
static pure fn NaN ( ) -> Option <Self >;
46
70
static pure fn inf( ) -> Option <Self >;
47
71
static pure fn neg_inf( ) -> Option <Self >;
48
72
static pure fn neg_zero( ) -> Option <Self >;
49
73
50
- pure fn is_NaN ( & self ) -> bool ;
51
- pure fn is_inf ( & self ) -> bool ;
52
- pure fn is_neg_inf ( & self ) -> bool ;
53
- pure fn is_neg_zero ( & self ) -> bool ;
54
-
55
74
pure fn round_to_zero ( & self ) -> Self ;
56
75
pure fn fractional_part ( & self ) -> Self ;
57
-
58
76
}
59
77
60
78
macro_rules! impl_NumStrConv_Floating ( ( $t: ty) => (
61
79
impl NumStrConv for $t {
62
- #[ inline( always) ] static pure fn has_NaN( ) -> bool { true }
63
- #[ inline( always) ] static pure fn has_inf( ) -> bool { true }
64
- #[ inline( always) ] static pure fn has_neg_inf( ) -> bool { true }
65
- #[ inline( always) ] static pure fn has_neg_zero( ) -> bool { true }
66
-
67
80
#[ inline( always) ]
68
81
static pure fn NaN ( ) -> Option <$t> { Some ( 0.0 / 0.0 ) }
69
82
#[ inline( always) ]
@@ -73,27 +86,10 @@ macro_rules! impl_NumStrConv_Floating (($t:ty) => (
73
86
#[ inline( always) ]
74
87
static pure fn neg_zero( ) -> Option <$t> { Some ( -0.0 ) }
75
88
76
- #[ inline( always) ] pure fn is_NaN( & self ) -> bool { * self != * self }
77
-
78
- #[ inline( always) ]
79
- pure fn is_inf( & self ) -> bool {
80
- * self == NumStrConv :: inf( ) . unwrap( )
81
- }
82
-
83
- #[ inline( always) ]
84
- pure fn is_neg_inf( & self ) -> bool {
85
- * self == NumStrConv :: neg_inf( ) . unwrap( )
86
- }
87
-
88
- #[ inline( always) ]
89
- pure fn is_neg_zero( & self ) -> bool {
90
- * self == 0.0 && ( 1.0 / * self ) . is_neg_inf( )
91
- }
92
-
93
89
#[ inline( always) ]
94
90
pure fn round_to_zero( & self ) -> $t {
95
91
( if * self < 0.0 { f64 :: ceil( * self as f64 ) }
96
- else { f64 :: floor( * self as f64 ) }
92
+ else { f64 :: floor( * self as f64 ) }
97
93
) as $t
98
94
}
99
95
@@ -106,21 +102,11 @@ macro_rules! impl_NumStrConv_Floating (($t:ty) => (
106
102
107
103
macro_rules! impl_NumStrConv_Integer ( ( $t: ty) => (
108
104
impl NumStrConv for $t {
109
- #[ inline( always) ] static pure fn has_NaN( ) -> bool { false }
110
- #[ inline( always) ] static pure fn has_inf( ) -> bool { false }
111
- #[ inline( always) ] static pure fn has_neg_inf( ) -> bool { false }
112
- #[ inline( always) ] static pure fn has_neg_zero( ) -> bool { false }
113
-
114
105
#[ inline( always) ] static pure fn NaN ( ) -> Option <$t> { None }
115
106
#[ inline( always) ] static pure fn inf( ) -> Option <$t> { None }
116
107
#[ inline( always) ] static pure fn neg_inf( ) -> Option <$t> { None }
117
108
#[ inline( always) ] static pure fn neg_zero( ) -> Option <$t> { None }
118
109
119
- #[ inline( always) ] pure fn is_NaN( & self ) -> bool { false }
120
- #[ inline( always) ] pure fn is_inf( & self ) -> bool { false }
121
- #[ inline( always) ] pure fn is_neg_inf( & self ) -> bool { false }
122
- #[ inline( always) ] pure fn is_neg_zero( & self ) -> bool { false }
123
-
124
110
#[ inline( always) ] pure fn round_to_zero( & self ) -> $t { * self }
125
111
#[ inline( always) ] pure fn fractional_part( & self ) -> $t { 0 }
126
112
}
@@ -190,25 +176,23 @@ pub pure fn to_str_bytes_common<T:NumCast+Zero+One+Eq+Ord+NumStrConv+Copy+
190
176
let _0: T = Zero :: zero ( ) ;
191
177
let _1: T = One :: one ( ) ;
192
178
193
- if NumStrConv :: has_NaN :: < T > ( ) && num . is_NaN ( ) {
179
+ if is_NaN ( num ) {
194
180
return ( str:: to_bytes ( "NaN" ) , true ) ;
195
181
}
196
- if NumStrConv :: has_inf :: < T > ( ) && num . is_inf ( ) {
182
+ else if is_inf ( num ) {
197
183
return match sign {
198
184
SignAll => ( str:: to_bytes ( "+inf" ) , true ) ,
199
185
_ => ( str:: to_bytes ( "inf" ) , true )
200
186
}
201
187
}
202
- if NumStrConv :: has_neg_inf :: < T > ( ) && num . is_neg_inf ( ) {
188
+ else if is_neg_inf ( num ) {
203
189
return match sign {
204
190
SignNone => ( str:: to_bytes ( "inf" ) , true ) ,
205
191
_ => ( str:: to_bytes ( "-inf" ) , true ) ,
206
192
}
207
193
}
208
194
209
- let neg = * num < _0 || ( negative_zero
210
- && NumStrConv :: has_neg_zero :: < T > ( )
211
- && num. is_neg_zero ( ) ) ;
195
+ let neg = * num < _0 || ( negative_zero && is_neg_zero ( num) ) ;
212
196
let mut buf: ~[ u8 ] = ~[ ] ;
213
197
let radix_gen: T = cast ( radix as int ) ;
214
198
0 commit comments