1 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT 2 // file at the top-level directory of this distribution. 3 // 4 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or 5 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license 6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your 7 // option. This file may not be copied, modified, or distributed 8 // except according to those terms. 9 10 //! A Boolean type. 11 12 pub use core_foundation_sys::number::{CFBooleanRef, CFBooleanGetTypeID, kCFBooleanTrue, kCFBooleanFalse}; 13 14 use base::TCFType; 15 16 17 declare_TCFType!{ 18 /// A Boolean type. 19 /// 20 /// FIXME(pcwalton): Should be a newtype struct, but that fails due to a Rust compiler bug. 21 CFBoolean, CFBooleanRef 22 } 23 impl_TCFType!(CFBoolean, CFBooleanRef, CFBooleanGetTypeID); 24 impl_CFTypeDescription!(CFBoolean); 25 26 impl CFBoolean { true_value() -> CFBoolean27 pub fn true_value() -> CFBoolean { 28 unsafe { 29 TCFType::wrap_under_get_rule(kCFBooleanTrue) 30 } 31 } 32 false_value() -> CFBoolean33 pub fn false_value() -> CFBoolean { 34 unsafe { 35 TCFType::wrap_under_get_rule(kCFBooleanFalse) 36 } 37 } 38 } 39 40 impl From<bool> for CFBoolean { from(value: bool) -> CFBoolean41 fn from(value: bool) -> CFBoolean { 42 if value { 43 CFBoolean::true_value() 44 } else { 45 CFBoolean::false_value() 46 } 47 } 48 } 49 50 impl From<CFBoolean> for bool { from(value: CFBoolean) -> bool51 fn from(value: CFBoolean) -> bool { 52 value.0 == unsafe { kCFBooleanTrue } 53 } 54 } 55 56 #[cfg(test)] 57 mod tests { 58 use super::*; 59 60 #[test] to_and_from_bool()61 fn to_and_from_bool() { 62 let b_false = CFBoolean::from(false); 63 let b_true = CFBoolean::from(true); 64 assert_ne!(b_false, b_true); 65 assert_eq!(b_false, CFBoolean::false_value()); 66 assert_eq!(b_true, CFBoolean::true_value()); 67 assert!(!bool::from(b_false)); 68 assert!(bool::from(b_true)); 69 } 70 } 71