@@ -14,6 +14,8 @@ use core::hash::{Hash, Hasher};
14
14
use core:: fmt;
15
15
use core:: mem;
16
16
use core:: hint:: unreachable_unchecked;
17
+ use core:: str:: FromStr ;
18
+
17
19
use num_traits:: { Bounded , Float , FromPrimitive , Num , NumCast , One , Signed , ToPrimitive ,
18
20
Zero } ;
19
21
@@ -166,6 +168,23 @@ impl<T: Float> Bounded for OrderedFloat<T> {
166
168
}
167
169
}
168
170
171
+ impl < T : Float + FromStr > FromStr for OrderedFloat < T > {
172
+ type Err = T :: Err ;
173
+
174
+ /// Convert a &str to `OrderedFloat`. Returns an error if the string fails to parse.
175
+ ///
176
+ /// ```
177
+ /// use ordered_float::OrderedFloat;
178
+ ///
179
+ /// assert!("-10".parse::<OrderedFloat<f32>>().is_ok());
180
+ /// assert!("abc".parse::<OrderedFloat<f32>>().is_err());
181
+ /// assert!("NaN".parse::<OrderedFloat<f32>>().is_ok());
182
+ /// ```
183
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
184
+ T :: from_str ( s) . map ( OrderedFloat )
185
+ }
186
+ }
187
+
169
188
/// A wrapper around Floats providing an implementation of Ord and Hash.
170
189
///
171
190
/// A NaN value cannot be stored in this type.
@@ -614,6 +633,26 @@ impl<T: Float> Bounded for NotNan<T> {
614
633
}
615
634
}
616
635
636
+ impl < T : Float + FromStr > FromStr for NotNan < T > {
637
+ type Err = ParseNotNanError < T :: Err > ;
638
+
639
+ /// Convert a &str to `NotNan`. Returns an error if the string fails to parse,
640
+ /// or if the resulting value is NaN
641
+ ///
642
+ /// ```
643
+ /// use ordered_float::NotNan;
644
+ ///
645
+ /// assert!("-10".parse::<NotNan<f32>>().is_ok());
646
+ /// assert!("abc".parse::<NotNan<f32>>().is_err());
647
+ /// assert!("NaN".parse::<NotNan<f32>>().is_err());
648
+ /// ```
649
+ fn from_str ( src : & str ) -> Result < Self , Self :: Err > {
650
+ src. parse ( )
651
+ . map_err ( ParseNotNanError :: ParseFloatError )
652
+ . and_then ( |f| NotNan :: new ( f) . map_err ( |_| ParseNotNanError :: IsNaN ) )
653
+ }
654
+ }
655
+
617
656
impl < T : Float + FromPrimitive > FromPrimitive for NotNan < T > {
618
657
fn from_i64 ( n : i64 ) -> Option < Self > { T :: from_i64 ( n) . and_then ( |n| NotNan :: new ( n) . ok ( ) ) }
619
658
fn from_u64 ( n : u64 ) -> Option < Self > { T :: from_u64 ( n) . and_then ( |n| NotNan :: new ( n) . ok ( ) ) }
0 commit comments