From 84c51f5b164939eec95c15d511f72c60af7783be Mon Sep 17 00:00:00 2001 From: _cry64 Date: Sun, 29 Mar 2026 00:01:59 +1000 Subject: [PATCH] add SliceExt --- nixide/src/stdext/mod.rs | 2 ++ nixide/src/stdext/slice.rs | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 nixide/src/stdext/slice.rs diff --git a/nixide/src/stdext/mod.rs b/nixide/src/stdext/mod.rs index e4c5bd6..cdf4416 100644 --- a/nixide/src/stdext/mod.rs +++ b/nixide/src/stdext/mod.rs @@ -1,3 +1,5 @@ mod cchar_ptr; +mod slice; pub(crate) use cchar_ptr::{AsCPtr, CCharPtrExt}; +pub(crate) use slice::SliceExt; diff --git a/nixide/src/stdext/slice.rs b/nixide/src/stdext/slice.rs new file mode 100644 index 0000000..d9bc198 --- /dev/null +++ b/nixide/src/stdext/slice.rs @@ -0,0 +1,43 @@ +use std::iter; +use std::ptr::null_mut; + +use crate::util::wrappers::AsInnerPtr; + +pub trait SliceExt { + #[allow(unused)] + fn as_c_array(&self) -> *mut *mut S; + + #[allow(unused)] + fn into_c_array(self) -> *mut *mut S; +} + +impl SliceExt for &[&T] +where + T: AsInnerPtr, +{ + fn as_c_array(&self) -> *mut *mut S { + let mut ptrs: Vec<*mut S> = self + .into_iter() + .map(|x| unsafe { x.as_ptr() }) + .chain(iter::once(null_mut())) + .collect(); + + let ptr = ptrs.as_mut_ptr(); + std::mem::forget(ptrs); + + ptr + } + + fn into_c_array(self) -> *mut *mut S { + let mut ptrs: Vec<*mut S> = self + .into_iter() + .map(|x| unsafe { x.as_ptr() }) + .chain(iter::once(null_mut())) + .collect(); + + let ptr = ptrs.as_mut_ptr(); + std::mem::forget(ptrs); + + ptr + } +}