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