1use sys::{self, VALUE, T_FLOAT, T_FIXNUM, T_BIGNUM};
2use super::{FromRuby, CheckResult, CheckedValue, ToRuby, ToRubyResult};
3
4impl FromRuby for f64 {
5 type Checked = CheckedValue<f64>;
6
7 fn from_ruby(value: VALUE) -> CheckResult<CheckedValue<f64>> {
8 if unsafe { sys::RB_TYPE_P(value, T_FLOAT) || sys::RB_TYPE_P(value, T_FIXNUM) || sys::RB_TYPE_P(value, T_BIGNUM) } {
9 Ok(unsafe { CheckedValue::new(value) })
10 } else {
11 type_error!(value, "a 64-bit float")
12 }
13 }
14
15 fn from_checked(checked: CheckedValue<f64>) -> f64 {
16 unsafe { sys::NUM2F64(checked.to_value()) }
17 }
18}
19
20impl ToRuby for f64 {
21 fn to_ruby(self) -> ToRubyResult {
22 Ok(unsafe { sys::F642NUM(self) })
23 }
24}