@@ -559,71 +559,63 @@ fn raw_double_bits<F: Float>(f: &F) -> u64 {
559559 ( man & MAN_MASK ) | ( ( exp_u64 << 52 ) & EXP_MASK ) | ( ( sign_u64 << 63 ) & SIGN_MASK )
560560}
561561
562- #[ cfg( feature = "rustc-serialize" ) ]
563- mod impl_rustc {
564- extern crate rustc_serialize;
565- use self :: rustc_serialize:: { Encodable , Encoder , Decodable , Decoder } ;
566- use super :: { OrderedFloat , NotNaN } ;
567- use std:: error:: Error ;
568- use num_traits:: Float ;
569-
570- impl < T : Float + Encodable > Encodable for OrderedFloat < T > {
571- fn encode < S : Encoder > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
572- self . 0 . encode ( s)
573- }
574- }
575-
576- impl < T : Float + Decodable > Decodable for OrderedFloat < T > {
577- fn decode < D : Decoder > ( d : & mut D ) -> Result < Self , D :: Error > {
578- T :: decode ( d) . map ( OrderedFloat )
579- }
580- }
581-
582- impl < T : Float + Encodable > Encodable for NotNaN < T > {
583- fn encode < S : Encoder > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
584- self . 0 . encode ( s)
585- }
586- }
587-
588- impl < T : Float + Decodable > Decodable for NotNaN < T > {
589- fn decode < D : Decoder > ( d : & mut D ) -> Result < Self , D :: Error > {
590- T :: decode ( d) . and_then ( |v| NotNaN :: new ( v) . map_err ( |e| d. error ( e. description ( ) ) ) )
591- }
592- }
593- }
594-
595562#[ cfg( feature = "serde" ) ]
596563mod impl_serde {
597564 extern crate serde;
598565 use self :: serde:: { Serialize , Serializer , Deserialize , Deserializer } ;
599- use self :: serde:: de:: Error ;
566+ use self :: serde:: de:: { Error , Unexpected } ;
600567 use super :: { OrderedFloat , NotNaN } ;
601568 use num_traits:: Float ;
569+ use std:: f64;
570+
571+ #[ cfg( test) ]
572+ extern crate serde_test;
573+ #[ cfg( test) ]
574+ use self :: serde_test:: { Token , assert_tokens, assert_de_tokens_error} ;
602575
603576 impl < T : Float + Serialize > Serialize for OrderedFloat < T > {
604- fn serialize < S : Serializer > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
577+ fn serialize < S : Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
605578 self . 0 . serialize ( s)
606579 }
607580 }
608581
609- impl < T : Float + Deserialize > Deserialize for OrderedFloat < T > {
610- fn deserialize < D : Deserializer > ( d : & mut D ) -> Result < Self , D :: Error > {
582+ impl < ' de , T : Float + Deserialize < ' de > > Deserialize < ' de > for OrderedFloat < T > {
583+ fn deserialize < D : Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
611584 T :: deserialize ( d) . map ( OrderedFloat )
612585 }
613586 }
614587
615588 impl < T : Float + Serialize > Serialize for NotNaN < T > {
616- fn serialize < S : Serializer > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
589+ fn serialize < S : Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
617590 self . 0 . serialize ( s)
618591 }
619592 }
620593
621- impl < T : Float + Deserialize > Deserialize for NotNaN < T > {
622- fn deserialize < D : Deserializer > ( d : & mut D ) -> Result < Self , D :: Error > {
623- T :: deserialize ( d) . and_then ( |v| {
624- NotNaN :: new ( v )
625- . map_err ( |_| < D :: Error as Error > :: invalid_value ( "value cannot be NaN" ) )
594+ impl < ' de , T : Float + Deserialize < ' de > > Deserialize < ' de > for NotNaN < T > {
595+ fn deserialize < D : Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
596+ let float = T :: deserialize ( d) ? ;
597+ NotNaN :: new ( float ) . map_err ( |_| {
598+ Error :: invalid_value ( Unexpected :: Float ( f64 :: NAN ) , & "float (but not NaN)" )
626599 } )
627600 }
628601 }
602+
603+ #[ test]
604+ fn test_ordered_float ( ) {
605+ let float = OrderedFloat ( 1.0f64 ) ;
606+ assert_tokens ( & float, & [ Token :: F64 ( 1.0 ) ] ) ;
607+ }
608+
609+ #[ test]
610+ fn test_not_nan ( ) {
611+ let float = NotNaN ( 1.0f64 ) ;
612+ assert_tokens ( & float, & [ Token :: F64 ( 1.0 ) ] ) ;
613+ }
614+
615+ #[ test]
616+ fn test_fail_on_nan ( ) {
617+ assert_de_tokens_error :: < NotNaN < f64 > > (
618+ & [ Token :: F64 ( f64:: NAN ) ] ,
619+ "invalid value: floating point `NaN`, expected float (but not NaN)" ) ;
620+ }
629621}
0 commit comments