@@ -2173,6 +2173,77 @@ mod impl_speedy {
2173
2173
}
2174
2174
}
2175
2175
2176
+ #[ cfg( feature = "borsh" ) ]
2177
+ mod impl_borsh {
2178
+ extern crate borsh;
2179
+ use super :: { NotNan , OrderedFloat } ;
2180
+ use num_traits:: float:: FloatCore ;
2181
+
2182
+ impl < T > borsh:: BorshSerialize for OrderedFloat < T >
2183
+ where
2184
+ T : borsh:: BorshSerialize ,
2185
+ {
2186
+ #[ inline]
2187
+ fn serialize < W : borsh:: io:: Write > ( & self , writer : & mut W ) -> borsh:: io:: Result < ( ) > {
2188
+ <T as borsh:: BorshSerialize >:: serialize ( & self . 0 , writer)
2189
+ }
2190
+ }
2191
+
2192
+ impl < T > borsh:: BorshDeserialize for OrderedFloat < T >
2193
+ where
2194
+ T : borsh:: BorshDeserialize ,
2195
+ {
2196
+ #[ inline]
2197
+ fn deserialize_reader < R : borsh:: io:: Read > ( reader : & mut R ) -> borsh:: io:: Result < Self > {
2198
+ <T as borsh:: BorshDeserialize >:: deserialize_reader ( reader) . map ( Self )
2199
+ }
2200
+ }
2201
+
2202
+ impl < T > borsh:: BorshSerialize for NotNan < T >
2203
+ where
2204
+ T : borsh:: BorshSerialize ,
2205
+ {
2206
+ #[ inline]
2207
+ fn serialize < W : borsh:: io:: Write > ( & self , writer : & mut W ) -> borsh:: io:: Result < ( ) > {
2208
+ <T as borsh:: BorshSerialize >:: serialize ( & self . 0 , writer)
2209
+ }
2210
+ }
2211
+
2212
+ impl < T > borsh:: BorshDeserialize for NotNan < T >
2213
+ where
2214
+ T : FloatCore + borsh:: BorshDeserialize ,
2215
+ {
2216
+ #[ inline]
2217
+ fn deserialize_reader < R : borsh:: io:: Read > ( reader : & mut R ) -> borsh:: io:: Result < Self > {
2218
+ let float = <T as borsh:: BorshDeserialize >:: deserialize_reader ( reader) ?;
2219
+ NotNan :: new ( float) . map_err ( |_| {
2220
+ borsh:: io:: Error :: new (
2221
+ borsh:: io:: ErrorKind :: InvalidData ,
2222
+ "expected a non-NaN float" ,
2223
+ )
2224
+ } )
2225
+ }
2226
+ }
2227
+
2228
+ #[ test]
2229
+ fn test_ordered_float ( ) {
2230
+ let float = crate :: OrderedFloat ( 1.0f64 ) ;
2231
+ let buffer = borsh:: to_vec ( & float) . expect ( "failed to serialize value" ) ;
2232
+ let deser_float: crate :: OrderedFloat < f64 > =
2233
+ borsh:: from_slice ( & buffer) . expect ( "failed to deserialize value" ) ;
2234
+ assert_eq ! ( deser_float, float) ;
2235
+ }
2236
+
2237
+ #[ test]
2238
+ fn test_not_nan ( ) {
2239
+ let float = crate :: NotNan ( 1.0f64 ) ;
2240
+ let buffer = borsh:: to_vec ( & float) . expect ( "failed to serialize value" ) ;
2241
+ let deser_float: crate :: NotNan < f64 > =
2242
+ borsh:: from_slice ( & buffer) . expect ( "failed to deserialize value" ) ;
2243
+ assert_eq ! ( deser_float, float) ;
2244
+ }
2245
+ }
2246
+
2176
2247
#[ cfg( all( feature = "std" , feature = "schemars" ) ) ]
2177
2248
mod impl_schemars {
2178
2249
extern crate schemars;
0 commit comments