1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
use crate::float::FloatRepr; /// A policy for handling floating point types in a [Key]. /// /// Currently there are two important `FloatPolicy` types: [RejectFloatPolicy] /// and [OrderedFloat]. The former will emit errors instead of allowing floats /// to be serialized and the latter while serialize them and provide a total /// order which does not adhere to the IEEE standard. /// /// [Key]: crate::Key /// [RejectFloatPolicy]: crate::RejectFloatPolicy /// [OrderedFloat]: crate::OrderedFloat /// /// # Examples /// /// Example using a non-default float policy: /// /// ```rust /// use serde_hashkey::{Key, Float, to_key_with_ordered_float, OrderedFloat, OrderedFloatPolicy}; /// /// # fn main() -> Result<(), serde_hashkey::Error> { /// let a: Key<OrderedFloatPolicy> = to_key_with_ordered_float(&42.42f32)?; /// assert!(matches!(a, Key::Float(Float::F32(OrderedFloat(..))))); /// /// let b: Key<OrderedFloatPolicy> = to_key_with_ordered_float(&42.42f64)?; /// assert!(matches!(b, Key::Float(Float::F64(OrderedFloat(..))))); /// # Ok(()) } /// ``` pub trait FloatPolicy: self::private::Sealed { /// The type encapsulating a 32-bit float, or `f32`. type F32: FloatRepr<f32>; /// The type encapsulating a 64-bit float, or `f64`. type F64: FloatRepr<f64>; } // NB: we completely seal the FloatPolicy to prevent external implementations. mod private { pub trait Sealed {} impl<T> Sealed for T where T: super::FloatPolicy {} }