pub struct ListBuilder<'a> {
list: SEXP,
_scope: &'a ProtectScope,
}Expand description
Builder for constructing lists with efficient protection management.
ListBuilder holds a reference to a ProtectScope, allowing multiple
elements to be inserted without repeatedly protecting/unprotecting each one.
This is more efficient than using List::set_elt in a loop.
§Example
unsafe fn build_list(n: isize) -> SEXP {
let scope = ProtectScope::new();
let builder = ListBuilder::new(&scope, n);
for i in 0..n {
// Allocations inside the loop are protected by the scope
let child = scope.alloc_real(10).into_raw();
builder.set(i, child);
}
builder.into_sexp()
}Fields§
§list: SEXP§_scope: &'a ProtectScopeImplementations§
Source§impl<'a> ListBuilder<'a>
impl<'a> ListBuilder<'a>
Sourcepub unsafe fn new(scope: &'a ProtectScope, len: usize) -> Self
pub unsafe fn new(scope: &'a ProtectScope, len: usize) -> Self
Create a new list builder with the given length.
The list is allocated and protected using the provided scope.
§Safety
Must be called from the R main thread.
Sourcepub unsafe fn from_protected(scope: &'a ProtectScope, list: SEXP) -> Self
pub unsafe fn from_protected(scope: &'a ProtectScope, list: SEXP) -> Self
Create a builder wrapping an existing protected list.
§Safety
- Must be called from the R main thread
listmust be a valid, protected VECSXP
Sourcepub unsafe fn set(&self, idx: isize, child: SEXP)
pub unsafe fn set(&self, idx: isize, child: SEXP)
Set an element at the given index.
The child should be protected by the same scope (or a parent scope).
Use scope.protect_raw(...) before calling this method.
§Safety
childmust be a valid SEXPchildshould be protected (typically via the same scope)
Sourcepub unsafe fn set_protected(&self, idx: isize, child: SEXP)
pub unsafe fn set_protected(&self, idx: isize, child: SEXP)
Set an element, protecting the child within the builder’s scope.
This is a convenience method that protects the child and then inserts it.
§Safety
childmust be a valid SEXP
Auto Trait Implementations§
impl<'a> Freeze for ListBuilder<'a>
impl<'a> !RefUnwindSafe for ListBuilder<'a>
impl<'a> !Send for ListBuilder<'a>
impl<'a> !Sync for ListBuilder<'a>
impl<'a> Unpin for ListBuilder<'a>
impl<'a> UnsafeUnpin for ListBuilder<'a>
impl<'a> !UnwindSafe for ListBuilder<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> SizeEq<MaybeUninit<T>> for T
impl<T> SizeEq<MaybeUninit<T>> for T
type CastFrom = CastSizedExact
Source§impl<T> SizedTypeProperties for T
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)]const SIZE: usize = _
#[doc(hidden)]const SIZE: usize = _
sized_type_properties)Source§#[doc(hidden)]const ALIGN: usize = _
#[doc(hidden)]const ALIGN: usize = _
sized_type_properties)Source§#[doc(hidden)]const ALIGNMENT: Alignment = _
#[doc(hidden)]const ALIGNMENT: Alignment = _
ptr_alignment_type)Source§#[doc(hidden)]const IS_ZST: bool = _
#[doc(hidden)]const IS_ZST: bool = _
sized_type_properties)Source§#[doc(hidden)]const LAYOUT: Layout = _
#[doc(hidden)]const LAYOUT: Layout = _
sized_type_properties)Source§#[doc(hidden)]const MAX_SLICE_LEN: usize = _
#[doc(hidden)]const MAX_SLICE_LEN: usize = _
sized_type_properties)[Self]. Read moreimpl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> InvariantsEq<ManuallyDrop<T>> for Twhere
T: ?Sized,
impl<T> InvariantsEq<T> for Twhere
T: ?Sized,
impl<T> InvariantsEq<Unalign<T>> for T
impl<T> InvariantsEq<Wrapping<T>> for T
impl<Src, Dst, A, SV, DV, R> MutationCompatible<Src, A, SV, DV, (BecauseRead, R)> for Dst
impl<Src, Dst, A, SV, DV> MutationCompatible<Src, A, SV, DV, BecauseInvariantsEq> for Dstwhere
A: Aliasing,
SV: Validity,
DV: Validity,
Src: TransmuteFrom<Dst, DV, SV> + ?Sized,
Dst: TransmuteFrom<Src, SV, DV> + InvariantsEq<Src> + ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<Cell<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<ManuallyDrop<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<ReadOnly<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<Src, Dst> TransmuteFrom<Src, Initialized, Initialized> for Dst
impl<Src, Dst, V> TransmuteFrom<Src, V, Uninit> for Dst
impl<Src, Dst> TransmuteFrom<Src, Valid, Initialized> for Dst
impl<T> TransmuteFrom<Unalign<T>, Valid, Valid> for T
impl<T> TransmuteFrom<UnsafeCell<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<Wrapping<T>, Valid, Valid> for T
impl<Src, Dst, A, SV, DV, C, R> TransmuteFromPtr<Src, A, SV, DV, C, R> for Dstwhere
A: Aliasing,
SV: Validity,
DV: Validity,
C: CastExact<Src, Dst>,
Dst: TransmuteFrom<Src, SV, DV> + TryTransmuteFromPtr<Src, A, SV, DV, C, R> + ?Sized,
Src: ?Sized,
impl<Src, Dst, SV, DV, A, C, R> TryTransmuteFromPtr<Src, A, SV, DV, C, (BecauseMutationCompatible, R)> for Dstwhere
A: Aliasing,
SV: Validity,
DV: Validity,
Src: TransmuteFrom<Dst, DV, SV> + ?Sized,
Dst: MutationCompatible<Src, A, SV, DV, R> + ?Sized,
C: CastExact<Src, Dst>,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 16 bytes