Skip to content

Commit 3cd48d2

Browse files
committed
glib: Only use a single temporary Vec for [T]::to_glib_none()
In case of shared, boxed and object types the value itself is already kept alive via the stash and we only need a temporary `Vec` to be able to append the terminating `NULL` pointer.
1 parent 3a1118b commit 3cd48d2

File tree

3 files changed

+27
-33
lines changed

3 files changed

+27
-33
lines changed

glib/src/boxed.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,30 +87,28 @@ macro_rules! glib_boxed_wrapper {
8787

8888
#[doc(hidden)]
8989
impl<'a $(, $($generic $(: $bound $(+ $bound2)*)?),+)?> $crate::translate::ToGlibContainerFromSlice<'a, *mut *const $ffi_name> for $name $(<$($generic),+>)? {
90-
type Storage = (Vec<$crate::translate::Stash<'a, *const $ffi_name, Self>>, Option<Vec<*const $ffi_name>>);
90+
type Storage = (std::marker::PhantomData<&'a [Self]>, Option<Vec<*const $ffi_name>>);
9191

9292
fn to_glib_none_from_slice(t: &'a [Self]) -> (*mut *const $ffi_name, Self::Storage) {
93-
let v: Vec<_> = t.iter().map(|s| $crate::translate::ToGlibPtr::to_glib_none(s)).collect();
94-
let mut v_ptr: Vec<_> = v.iter().map(|s| s.0).collect();
95-
v_ptr.push(std::ptr::null_mut() as *const $ffi_name);
93+
let mut v_ptr = Vec::with_capacity(t.len() + 1);
94+
v_ptr.extend(t.iter().map(|t| t.as_ptr() as *const $ffi_name));
95+
v_ptr.push(std::ptr::null());
9696

97-
(v_ptr.as_ptr() as *mut *const $ffi_name, (v, Some(v_ptr)))
97+
(v_ptr.as_ptr() as *mut *const $ffi_name, (std::marker::PhantomData, Some(v_ptr)))
9898
}
9999

100100
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *const $ffi_name, Self::Storage) {
101-
let v: Vec<_> = t.iter().map(|s| $crate::translate::ToGlibPtr::to_glib_none(s)).collect();
102-
103101
let v_ptr = unsafe {
104102
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
105103

106-
for (i, s) in v.iter().enumerate() {
107-
std::ptr::write(v_ptr.add(i), s.0);
104+
for (i, t) in t.iter().enumerate() {
105+
std::ptr::write(v_ptr.add(i), t.as_ptr());
108106
}
109107

110108
v_ptr
111109
};
112110

113-
(v_ptr, (v, None))
111+
(v_ptr, (std::marker::PhantomData, None))
114112
}
115113

116114
fn to_glib_full_from_slice(t: &[Self]) -> *mut *const $ffi_name {
@@ -128,7 +126,7 @@ macro_rules! glib_boxed_wrapper {
128126

129127
#[doc(hidden)]
130128
impl<'a $(, $($generic $(: $bound $(+ $bound2)*)?),+)?> $crate::translate::ToGlibContainerFromSlice<'a, *const *const $ffi_name> for $name $(<$($generic),+>)? {
131-
type Storage = (Vec<$crate::translate::Stash<'a, *const $ffi_name, Self>>, Option<Vec<*const $ffi_name>>);
129+
type Storage = (std::marker::PhantomData<&'a [Self]>, Option<Vec<*const $ffi_name>>);
132130

133131
fn to_glib_none_from_slice(t: &'a [Self]) -> (*const *const $ffi_name, Self::Storage) {
134132
let (ptr, stash) = $crate::translate::ToGlibContainerFromSlice::<'a, *mut *const $ffi_name>::to_glib_none_from_slice(t);

glib/src/object.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -967,30 +967,28 @@ macro_rules! glib_object_wrapper {
967967

968968
#[doc(hidden)]
969969
impl<'a $(, $($generic $(: $bound $(+ $bound2)*)?),+)?> $crate::translate::ToGlibContainerFromSlice<'a, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
970-
type Storage = (Vec<$crate::translate::Stash<'a, *mut $ffi_name, Self>>, Option<Vec<*mut $ffi_name>>);
970+
type Storage = (std::marker::PhantomData<&'a [Self]>, Option<Vec<*mut $ffi_name>>);
971971

972972
fn to_glib_none_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
973-
let v: Vec<_> = t.iter().map(|s| $crate::translate::ToGlibPtr::to_glib_none(s)).collect();
974-
let mut v_ptr: Vec<_> = v.iter().map(|s| s.0).collect();
975-
v_ptr.push(std::ptr::null_mut() as *mut $ffi_name);
973+
let mut v_ptr = Vec::with_capacity(t.len() + 1);
974+
v_ptr.extend(t.iter().map(|t| <Self as $crate::ObjectType>::as_ptr(t)));
975+
v_ptr.push(std::ptr::null_mut());
976976

977-
(v_ptr.as_ptr() as *mut *mut $ffi_name, (v, Some(v_ptr)))
977+
(v_ptr.as_ptr() as *mut *mut $ffi_name, (std::marker::PhantomData, Some(v_ptr)))
978978
}
979979

980980
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
981-
let v: Vec<_> = t.iter().map(|s| $crate::translate::ToGlibPtr::to_glib_none(s)).collect();
982-
983981
let v_ptr = unsafe {
984982
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
985983

986-
for (i, s) in v.iter().enumerate() {
987-
std::ptr::write(v_ptr.add(i), s.0);
984+
for (i, t) in t.iter().enumerate() {
985+
std::ptr::write(v_ptr.add(i), <Self as $crate::ObjectType>::as_ptr(t));
988986
}
989987

990988
v_ptr
991989
};
992990

993-
(v_ptr, (v, None))
991+
(v_ptr, (std::marker::PhantomData, None))
994992
}
995993

996994
fn to_glib_full_from_slice(t: &[Self]) -> *mut *mut $ffi_name {
@@ -1008,7 +1006,7 @@ macro_rules! glib_object_wrapper {
10081006

10091007
#[doc(hidden)]
10101008
impl<'a $(, $($generic $(: $bound $(+ $bound2)*)?),+)?> $crate::translate::ToGlibContainerFromSlice<'a, *const *mut $ffi_name> for $name $(<$($generic),+>)? {
1011-
type Storage = (Vec<$crate::translate::Stash<'a, *mut $ffi_name, Self>>, Option<Vec<*mut $ffi_name>>);
1009+
type Storage = (std::marker::PhantomData<&'a [Self]>, Option<Vec<*mut $ffi_name>>);
10121010

10131011
fn to_glib_none_from_slice(t: &'a [Self]) -> (*const *mut $ffi_name, Self::Storage) {
10141012
let (ptr, stash) = $crate::translate::ToGlibContainerFromSlice::<'a, *mut *mut $ffi_name>::to_glib_none_from_slice(t);

glib/src/shared.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -104,30 +104,28 @@ macro_rules! glib_shared_wrapper {
104104

105105
#[doc(hidden)]
106106
impl<'a $(, $($generic $(: $bound $(+ $bound2)*)?),+)?> $crate::translate::ToGlibContainerFromSlice<'a, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
107-
type Storage = (Vec<$crate::translate::Stash<'a, *mut $ffi_name, Self>>, Option<Vec<*mut $ffi_name>>);
107+
type Storage = (std::marker::PhantomData<&'a [Self]>, Option<Vec<*mut $ffi_name>>);
108108

109109
fn to_glib_none_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
110-
let v: Vec<_> = t.iter().map(|s| $crate::translate::ToGlibPtr::to_glib_none(s)).collect();
111-
let mut v_ptr: Vec<_> = v.iter().map(|s| s.0).collect();
112-
v_ptr.push(std::ptr::null_mut() as *mut $ffi_name);
110+
let mut v_ptr = Vec::with_capacity(t.len() + 1);
111+
v_ptr.extend(t.iter().map(|t| t.as_ptr()));
112+
v_ptr.push(std::ptr::null_mut());
113113

114-
(v_ptr.as_ptr() as *mut *mut $ffi_name, (v, Some(v_ptr)))
114+
(v_ptr.as_ptr() as *mut *mut $ffi_name, (std::marker::PhantomData, Some(v_ptr)))
115115
}
116116

117117
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
118-
let v: Vec<_> = t.iter().map(|s| $crate::translate::ToGlibPtr::to_glib_none(s)).collect();
119-
120118
let v_ptr = unsafe {
121119
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
122120

123-
for (i, s) in v.iter().enumerate() {
124-
std::ptr::write(v_ptr.add(i), s.0);
121+
for (i, t) in t.iter().enumerate() {
122+
std::ptr::write(v_ptr.add(i), t.as_ptr());
125123
}
126124

127125
v_ptr
128126
};
129127

130-
(v_ptr, (v, None))
128+
(v_ptr, (std::marker::PhantomData, None))
131129
}
132130

133131
fn to_glib_full_from_slice(t: &[Self]) -> *mut *mut $ffi_name {
@@ -145,7 +143,7 @@ macro_rules! glib_shared_wrapper {
145143

146144
#[doc(hidden)]
147145
impl<'a $(, $($generic $(: $bound $(+ $bound2)*)?),+)?> $crate::translate::ToGlibContainerFromSlice<'a, *const *mut $ffi_name> for $name $(<$($generic),+>)? {
148-
type Storage = (Vec<$crate::translate::Stash<'a, *mut $ffi_name, Self>>, Option<Vec<*mut $ffi_name>>);
146+
type Storage = (std::marker::PhantomData<&'a [Self]>, Option<Vec<*mut $ffi_name>>);
149147

150148
fn to_glib_none_from_slice(t: &'a [Self]) -> (*const *mut $ffi_name, Self::Storage) {
151149
let (ptr, stash) = $crate::translate::ToGlibContainerFromSlice::<'a, *mut *mut $ffi_name>::to_glib_none_from_slice(t);

0 commit comments

Comments
 (0)