/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ //! The `Finite` struct. use core::nonzero::Zeroable; use num::Float; use std::ops::Deref; /// Encapsulates the IDL restricted float type. #[derive(JSTraceable, Clone, Eq, PartialEq)] pub struct Finite(T); unsafe impl Zeroable for Finite {} impl Finite { /// Create a new `Finite` safely. pub fn new(value: T) -> Option> { if value.is_finite() { Some(Finite(value)) } else { None } } /// Create a new `Finite`. #[inline] pub fn wrap(value: T) -> Finite { assert!(value.is_finite(), "Finite doesn't encapsulate unrestricted value."); Finite(value) } } impl Deref for Finite { type Target = T; fn deref(&self) -> &T { let &Finite(ref value) = self; value } }