Skip to content

Commit 4caa410

Browse files
committed
glib: Add zero-copy conversion from PtrSlice to Slice and back
1 parent 450c249 commit 4caa410

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

glib/src/collections/ptr_slice.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,33 @@ impl<T: TransparentPtrType> IntoGlibPtr<*mut <T as GlibPtrDefault>::GlibType> fo
10471047
}
10481048
}
10491049

1050+
impl<T: TransparentPtrType> From<super::Slice<T>> for PtrSlice<T> {
1051+
fn from(value: super::Slice<T>) -> Self {
1052+
let len = value.len();
1053+
let capacity = value.capacity();
1054+
unsafe {
1055+
let ptr = value.into_raw();
1056+
let mut s = PtrSlice::<T> {
1057+
ptr: ptr::NonNull::new_unchecked(ptr),
1058+
len,
1059+
capacity,
1060+
};
1061+
1062+
// Reserve space for the `NULL`-terminator if needed
1063+
if len == capacity {
1064+
s.reserve(0);
1065+
}
1066+
1067+
ptr::write(
1068+
s.ptr.as_ptr().add(s.len()),
1069+
Ptr::from(ptr::null_mut::<<T as GlibPtrDefault>::GlibType>()),
1070+
);
1071+
1072+
s
1073+
}
1074+
}
1075+
}
1076+
10501077
// rustdoc-stripper-ignore-next
10511078
/// A trait to accept both <code>&[T]</code> or <code>PtrSlice<T></code> as an argument.
10521079
pub trait IntoPtrSlice<T: TransparentPtrType> {

glib/src/collections/slice.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,21 @@ impl<T: TransparentType + 'static> IntoGlibPtr<*mut T::GlibType> for Slice<T> {
876876
}
877877
}
878878

879+
impl<T: TransparentPtrType> From<super::PtrSlice<T>> for Slice<T> {
880+
fn from(value: super::PtrSlice<T>) -> Self {
881+
let len = value.len();
882+
let capacity = value.capacity();
883+
unsafe {
884+
let ptr = value.into_raw();
885+
Slice::<T> {
886+
ptr: ptr::NonNull::new_unchecked(ptr),
887+
len,
888+
capacity,
889+
}
890+
}
891+
}
892+
}
893+
879894
#[cfg(test)]
880895
mod test {
881896
use super::*;

0 commit comments

Comments
 (0)