Add CFArray get_values and get_all_values

This commit is contained in:
Christian Howe
2017-01-02 21:23:55 -05:00
parent eb50e52d46
commit 75740926cf
2 changed files with 36 additions and 8 deletions
+2 -2
View File
@@ -9,7 +9,7 @@
use libc::c_void;
use base::{CFIndex, CFAllocatorRef, CFTypeID};
use base::{CFRange, CFIndex, CFAllocatorRef, CFTypeID};
/// FIXME(pcwalton): This is wrong.
pub type CFArrayRetainCallBack = *const u8;
@@ -54,7 +54,7 @@ extern {
// CFArrayGetCountOfValue
// CFArrayGetFirstIndexOfValue
// CFArrayGetLastIndexOfValue
// CFArrayGetValues
pub fn CFArrayGetValues(theArray: CFArrayRef, range: CFRange, values: *mut *const c_void);
pub fn CFArrayGetValueAtIndex(theArray: CFArrayRef, idx: CFIndex) -> *const c_void;
// CFArrayApplyFunction
pub fn CFArrayGetTypeID() -> CFTypeID;
+34 -6
View File
@@ -15,7 +15,7 @@ use core_foundation_sys::base::{CFTypeRef, kCFAllocatorDefault};
use libc::c_void;
use std::mem;
use base::{CFIndexConvertible, TCFType};
use base::{CFIndexConvertible, TCFType, CFRange};
/// A heterogeneous immutable array.
pub struct CFArray(CFArrayRef);
@@ -89,6 +89,22 @@ impl CFArray {
CFArrayGetValueAtIndex(self.0, index)
}
}
pub fn get_values(&self, range: CFRange) -> Vec<*const c_void> {
let mut vec = Vec::with_capacity(range.length as usize);
unsafe {
CFArrayGetValues(self.0, range, vec.as_mut_ptr());
vec.set_len(range.length as usize);
vec
}
}
pub fn get_all_values(&self) -> Vec<*const c_void> {
self.get_values(CFRange {
location: 0,
length: self.len()
})
}
}
impl<'a> IntoIterator for &'a CFArray {
@@ -104,14 +120,26 @@ impl<'a> IntoIterator for &'a CFArray {
fn should_box_and_unbox() {
use number::{CFNumber, number};
let n1 = number(1);
let n2 = number(2);
let n3 = number(3);
let n4 = number(4);
let n5 = number(5);
let arr = CFArray::from_CFTypes(&[
number(1).as_CFType(),
number(2).as_CFType(),
number(3).as_CFType(),
number(4).as_CFType(),
number(5).as_CFType(),
n1.as_CFType(),
n2.as_CFType(),
n3.as_CFType(),
n4.as_CFType(),
n5.as_CFType(),
]);
assert!(arr.get_all_values() == &[n1.as_CFTypeRef(),
n2.as_CFTypeRef(),
n3.as_CFTypeRef(),
n4.as_CFTypeRef(),
n5.as_CFTypeRef()]);
unsafe {
let mut sum = 0;