Skip to content

Commit f520f35

Browse files
committed
glib: add TryFromGlib traits for Container
C containers can be NULL, which is represented by None in Rust. This commit: * adds container specific `TryFromGlib` traits which return an Option, * implements them for the existing containers, * base the container specific `FromGlib` implementations off the `TryFromGlib` implementations.
1 parent 4c20593 commit f520f35

File tree

7 files changed

+1159
-279
lines changed

7 files changed

+1159
-279
lines changed

glib/src/boxed.rs

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,13 @@ macro_rules! glib_boxed_wrapper {
253253
}
254254

255255
#[doc(hidden)]
256-
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
257-
unsafe fn from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
258-
if num == 0 || ptr.is_null() {
259-
return Vec::new();
256+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::TryFromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
257+
unsafe fn try_from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
258+
if ptr.is_null() {
259+
return None;
260+
}
261+
if num == 0 {
262+
return Some(Vec::new());
260263
}
261264

262265
let mut res = Vec::<Self>::with_capacity(num);
@@ -265,44 +268,78 @@ macro_rules! glib_boxed_wrapper {
265268
::std::ptr::write(res_ptr.add(i), $crate::translate::from_glib_none(std::ptr::read(ptr.add(i))));
266269
}
267270
res.set_len(num);
268-
res
271+
Some(res)
269272
}
270273

271-
unsafe fn from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
272-
let res = $crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, num);
274+
unsafe fn try_from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
275+
let res = $crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num)?;
273276
$crate::ffi::g_free(ptr as *mut _);
274-
res
277+
Some(res)
275278
}
276279

277-
unsafe fn from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
278-
if num == 0 || ptr.is_null() {
280+
unsafe fn try_from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
281+
if ptr.is_null() {
282+
return None;
283+
}
284+
if num == 0 {
279285
$crate::ffi::g_free(ptr as *mut _);
280-
return Vec::new();
286+
return Some(Vec::new());
281287
}
282288

283289
let mut res = Vec::with_capacity(num);
284290
let res_ptr = res.as_mut_ptr();
285291
::std::ptr::copy_nonoverlapping(ptr as *mut Self, res_ptr, num);
286292
res.set_len(num);
287293
$crate::ffi::g_free(ptr as *mut _);
288-
res
294+
Some(res)
295+
}
296+
}
297+
298+
#[doc(hidden)]
299+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
300+
unsafe fn from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
301+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num).unwrap_or_default()
302+
}
303+
304+
unsafe fn from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
305+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, num).unwrap_or_default()
306+
}
307+
308+
unsafe fn from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
309+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, num).unwrap_or_default()
310+
}
311+
}
312+
313+
#[doc(hidden)]
314+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::TryFromGlibPtrArrayContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
315+
unsafe fn try_from_glib_none_as_vec(ptr: *mut *mut $ffi_name) -> Option<Vec<Self>> {
316+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr)?)
317+
}
318+
319+
unsafe fn try_from_glib_container_as_vec(ptr: *mut *mut $ffi_name) -> Option<Vec<Self>> {
320+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr)?)
321+
}
322+
323+
unsafe fn try_from_glib_full_as_vec(ptr: *mut *mut $ffi_name) -> Option<Vec<Self>> {
324+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr)?)
289325
}
290326
}
291327

292328
#[doc(hidden)]
293329
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibPtrArrayContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
294330
unsafe fn from_glib_none_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
295-
$crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
331+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
296332
}
297333

298334
unsafe fn from_glib_container_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
299-
$crate::translate::FromGlibContainerAsVec::from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
335+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
300336
}
301337

302338
unsafe fn from_glib_full_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
303-
$crate::translate::FromGlibContainerAsVec::from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
339+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
304340
}
305341
}
342+
306343
#[doc(hidden)]
307344
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::IntoGlibPtr<*mut $ffi_name> for $name $(<$($generic),+>)? {
308345
#[inline]

glib/src/boxed_inline.rs

Lines changed: 84 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -431,25 +431,13 @@ macro_rules! glib_boxed_inline_wrapper {
431431
}
432432

433433
#[doc(hidden)]
434-
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut $ffi_name> for $name $(<$($generic),+>)? {
435-
unsafe fn from_glib_none_num_as_vec(ptr: *mut $ffi_name, num: usize) -> Vec<Self> {
436-
$crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr as *const _, num)
437-
}
438-
439-
unsafe fn from_glib_container_num_as_vec(ptr: *mut $ffi_name, num: usize) -> Vec<Self> {
440-
$crate::translate::FromGlibContainerAsVec::from_glib_container_num_as_vec(ptr as *const _, num)
441-
}
442-
443-
unsafe fn from_glib_full_num_as_vec(ptr: *mut $ffi_name, num: usize) -> Vec<Self> {
444-
$crate::translate::FromGlibContainerAsVec::from_glib_full_num_as_vec(ptr as *const _, num)
445-
}
446-
}
447-
448-
#[doc(hidden)]
449-
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *const $ffi_name> for $name $(<$($generic),+>)? {
450-
unsafe fn from_glib_none_num_as_vec(ptr: *const $ffi_name, num: usize) -> Vec<Self> {
451-
if num == 0 || ptr.is_null() {
452-
return Vec::new();
434+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::TryFromGlibContainerAsVec<*mut $ffi_name, *const $ffi_name> for $name $(<$($generic),+>)? {
435+
unsafe fn try_from_glib_none_num_as_vec(ptr: *const $ffi_name, num: usize) -> Option<Vec<Self>> {
436+
if ptr.is_null() {
437+
return None;
438+
}
439+
if num == 0 {
440+
return Some(Vec::new());
453441
}
454442

455443
let mut res = Vec::<Self>::with_capacity(num);
@@ -458,35 +446,71 @@ macro_rules! glib_boxed_inline_wrapper {
458446
::std::ptr::write(res_ptr.add(i), $crate::translate::from_glib_none(ptr.add(i)));
459447
}
460448
res.set_len(num);
461-
res
449+
Some(res)
462450
}
463451

464-
unsafe fn from_glib_container_num_as_vec(ptr: *const $ffi_name, num: usize) -> Vec<Self> {
465-
let res = $crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, num);
452+
unsafe fn try_from_glib_container_num_as_vec(ptr: *const $ffi_name, num: usize) -> Option<Vec<Self>> {
453+
let res = $crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num)?;
466454
$crate::ffi::g_free(ptr as *mut _);
467-
res
455+
Some(res)
468456
}
469457

470-
unsafe fn from_glib_full_num_as_vec(ptr: *const $ffi_name, num: usize) -> Vec<Self> {
471-
if num == 0 || ptr.is_null() {
458+
unsafe fn try_from_glib_full_num_as_vec(ptr: *const $ffi_name, num: usize) -> Option<Vec<Self>> {
459+
if ptr.is_null() {
460+
return None;
461+
}
462+
if num == 0 {
472463
$crate::ffi::g_free(ptr as *mut _);
473-
return Vec::new();
464+
return Some(Vec::new());
474465
}
475466

476467
let mut res = Vec::with_capacity(num);
477468
let res_ptr = res.as_mut_ptr();
478469
::std::ptr::copy_nonoverlapping(ptr as *mut Self, res_ptr, num);
479470
res.set_len(num);
480471
$crate::ffi::g_free(ptr as *mut _);
481-
res
472+
Some(res)
482473
}
483474
}
484475

485476
#[doc(hidden)]
486-
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
487-
unsafe fn from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
488-
if num == 0 || ptr.is_null() {
489-
return Vec::new();
477+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut $ffi_name> for $name $(<$($generic),+>)? {
478+
unsafe fn from_glib_none_num_as_vec(ptr: *mut $ffi_name, num: usize) -> Vec<Self> {
479+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr as *const _, num).unwrap_or_default()
480+
}
481+
482+
unsafe fn from_glib_container_num_as_vec(ptr: *mut $ffi_name, num: usize) -> Vec<Self> {
483+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr as *const _, num).unwrap_or_default()
484+
}
485+
486+
unsafe fn from_glib_full_num_as_vec(ptr: *mut $ffi_name, num: usize) -> Vec<Self> {
487+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr as *const _, num).unwrap_or_default()
488+
}
489+
}
490+
491+
#[doc(hidden)]
492+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *const $ffi_name> for $name $(<$($generic),+>)? {
493+
unsafe fn from_glib_none_num_as_vec(ptr: *const $ffi_name, num: usize) -> Vec<Self> {
494+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num).unwrap_or_default()
495+
}
496+
497+
unsafe fn from_glib_container_num_as_vec(ptr: *const $ffi_name, num: usize) -> Vec<Self> {
498+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, num).unwrap_or_default()
499+
}
500+
501+
unsafe fn from_glib_full_num_as_vec(ptr: *const $ffi_name, num: usize) -> Vec<Self> {
502+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, num).unwrap_or_default()
503+
}
504+
}
505+
506+
#[doc(hidden)]
507+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::TryFromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
508+
unsafe fn try_from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
509+
if ptr.is_null() {
510+
return None;
511+
}
512+
if num == 0 {
513+
return Some(Vec::new());
490514
}
491515

492516
let mut res = Vec::<Self>::with_capacity(num);
@@ -495,19 +519,22 @@ macro_rules! glib_boxed_inline_wrapper {
495519
::std::ptr::write(res_ptr.add(i), $crate::translate::from_glib_none(::std::ptr::read(ptr.add(i))));
496520
}
497521
res.set_len(num);
498-
res
522+
Some(res)
499523
}
500524

501-
unsafe fn from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
502-
let res = $crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, num);
525+
unsafe fn try_from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
526+
let res = $crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num)?;
503527
$crate::ffi::g_free(ptr as *mut _);
504-
res
528+
Some(res)
505529
}
506530

507-
unsafe fn from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
508-
if num == 0 || ptr.is_null() {
531+
unsafe fn try_from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
532+
if ptr.is_null() {
533+
return None;
534+
}
535+
if num == 0 {
509536
$crate::ffi::g_free(ptr as *mut _);
510-
return Vec::new();
537+
return Some(Vec::new());
511538
}
512539

513540
let mut res = Vec::<Self>::with_capacity(num);
@@ -517,22 +544,37 @@ macro_rules! glib_boxed_inline_wrapper {
517544
}
518545
res.set_len(num);
519546
$crate::ffi::g_free(ptr as *mut _);
520-
res
547+
Some(res)
548+
}
549+
}
550+
551+
#[doc(hidden)]
552+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
553+
unsafe fn from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
554+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num).unwrap_or_default()
555+
}
556+
557+
unsafe fn from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
558+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, num).unwrap_or_default()
559+
}
560+
561+
unsafe fn from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
562+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, num).unwrap_or_default()
521563
}
522564
}
523565

524566
#[doc(hidden)]
525567
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibPtrArrayContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
526568
unsafe fn from_glib_none_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
527-
$crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
569+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
528570
}
529571

530572
unsafe fn from_glib_container_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
531-
$crate::translate::FromGlibContainerAsVec::from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
573+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
532574
}
533575

534576
unsafe fn from_glib_full_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
535-
$crate::translate::FromGlibContainerAsVec::from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
577+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
536578
}
537579
}
538580
#[doc(hidden)]

0 commit comments

Comments
 (0)