@@ -14,6 +14,8 @@ use core::hash::{Hash, Hasher};
1414use core:: fmt;
1515use core:: mem;
1616use core:: hint:: unreachable_unchecked;
17+ use core:: str:: FromStr ;
18+
1719use num_traits:: { Bounded , Float , FromPrimitive , Num , NumCast , One , Signed , ToPrimitive ,
1820 Zero } ;
1921
@@ -166,6 +168,23 @@ impl<T: Float> Bounded for OrderedFloat<T> {
166168 }
167169}
168170
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+
169188/// A wrapper around Floats providing an implementation of Ord and Hash.
170189///
171190/// A NaN value cannot be stored in this type.
@@ -614,6 +633,26 @@ impl<T: Float> Bounded for NotNan<T> {
614633 }
615634}
616635
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+
617656impl < T : Float + FromPrimitive > FromPrimitive for NotNan < T > {
618657 fn from_i64 ( n : i64 ) -> Option < Self > { T :: from_i64 ( n) . and_then ( |n| NotNan :: new ( n) . ok ( ) ) }
619658 fn from_u64 ( n : u64 ) -> Option < Self > { T :: from_u64 ( n) . and_then ( |n| NotNan :: new ( n) . ok ( ) ) }
0 commit comments