From 75740926cf07d5238971a18464f193e327117ae5 Mon Sep 17 00:00:00 2001 From: Christian Howe Date: Mon, 2 Jan 2017 21:23:55 -0500 Subject: [PATCH] Add CFArray get_values and get_all_values --- core-foundation-sys/src/array.rs | 4 ++-- core-foundation/src/array.rs | 40 +++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core-foundation-sys/src/array.rs b/core-foundation-sys/src/array.rs index d85f0b7..2574eca 100644 --- a/core-foundation-sys/src/array.rs +++ b/core-foundation-sys/src/array.rs @@ -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; diff --git a/core-foundation/src/array.rs b/core-foundation/src/array.rs index cb9016d..3859b0a 100644 --- a/core-foundation/src/array.rs +++ b/core-foundation/src/array.rs @@ -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;