@@ -559,71 +559,63 @@ fn raw_double_bits<F: Float>(f: &F) -> u64 {
559
559
( man & MAN_MASK ) | ( ( exp_u64 << 52 ) & EXP_MASK ) | ( ( sign_u64 << 63 ) & SIGN_MASK )
560
560
}
561
561
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
-
595
562
#[ cfg( feature = "serde" ) ]
596
563
mod impl_serde {
597
564
extern crate serde;
598
565
use self :: serde:: { Serialize , Serializer , Deserialize , Deserializer } ;
599
- use self :: serde:: de:: Error ;
566
+ use self :: serde:: de:: { Error , Unexpected } ;
600
567
use super :: { OrderedFloat , NotNaN } ;
601
568
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} ;
602
575
603
576
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 > {
605
578
self . 0 . serialize ( s)
606
579
}
607
580
}
608
581
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 > {
611
584
T :: deserialize ( d) . map ( OrderedFloat )
612
585
}
613
586
}
614
587
615
588
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 > {
617
590
self . 0 . serialize ( s)
618
591
}
619
592
}
620
593
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)" )
626
599
} )
627
600
}
628
601
}
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
+ }
629
621
}
0 commit comments