#[repr(C)]pub struct ExternalPtr<T: TypedExternal> {
sexp: SEXP,
cached_ptr: NonNull<RefCell<T>>,
root: Option<ProtectKey>,
_marker: PhantomData<T>,
}Expand description
An owned pointer stored in R’s external pointer SEXP.
This is conceptually similar to Box<T>, but with the following differences:
- Memory is freed by R’s GC via a registered finalizer (non-deterministic)
- The underlying SEXP is Copy, so aliasing must be manually prevented
- Type checking happens at runtime via
Any::downcast(RustTypeId)
§Thread Safety
ExternalPtr is Send to allow returning from worker thread functions.
However, concurrent access is not allowed - R’s runtime is single-threaded.
All R API calls are serialized through the main thread via with_r_thread.
§Reading the value
A handle has no Deref: borrow /
borrow_mut read the value, checking its RefCell
(see “Reentrant calls” in the module docs). A #[miniextendr]
function that needs only the value takes &T / &mut T instead, and the
generated wrapper borrows it for the call.
§Safety
The ExternalPtr assumes exclusive ownership of the underlying data. Cloning the raw SEXP without proper handling will lead to double-free.
§Examples
use miniextendr_api::externalptr::{ExternalPtr, TypedExternal};
struct MyData { value: f64 }
impl TypedExternal for MyData {
const TYPE_NAME: &'static str = "MyData";
const TYPE_NAME_CSTR: &'static [u8] = b"MyData\0";
const TYPE_ID_CSTR: &'static [u8] = b"my_crate::MyData\0";
}
let ptr = ExternalPtr::new(MyData { value: 3.14 });
assert_eq!(ptr.borrow().value, 3.14);Fields§
§sexp: SEXP§cached_ptr: NonNull<RefCell<T>>Cached address of the value’s RefCell, set once at construction time.
This avoids the R_ExternalPtrAddr FFI call on every borrow()/borrow_mut().
The pointer remains valid for the lifetime of the ExternalPtr because:
- R’s finalizer only runs after R garbage-collects the SEXP (which cannot
happen while a Rust
ExternalPtrvalue exists). R_ClearExternalPtris only called in methods that consume or finalize (into_raw,into_inner,release_any).
root: Option<ProtectKey>The ProtectPool key rooting this handle’s EXTPTRSXP, or None for
borrowed views.
Some(key) for owning handles built from a fresh value (new /
new_unchecked / from_raw / Clone / Default): the constructor
roots the EXTPTRSXP in the main-thread pool so it stays alive for the
whole Rust lifetime of the handle — including while it sits in a Vec
across other R allocations before being handed to R (#836). Drop /
into_raw / into_inner release the root via the key.
None for borrowed views of an SEXP R already owns (wrap_sexp* /
from_sexp* / same_object): no root is taken, so none is released. The
aliased object is kept alive by whatever R-side reference handed it to us
(a .Call argument frame, an owning sibling handle, …).
_marker: PhantomData<T>Implementations§
Source§impl<T: TypedExternal> ExternalPtr<T>
impl<T: TypedExternal> ExternalPtr<T>
Sourcefn from_owned_parts(
sexp: SEXP,
cached_ptr: NonNull<RefCell<T>>,
root: ProtectKey,
) -> Self
fn from_owned_parts( sexp: SEXP, cached_ptr: NonNull<RefCell<T>>, root: ProtectKey, ) -> Self
Build an owning handle rooted at root.
Pairs with the ProtectPool root that create_extptr_sexp /
create_extptr_sexp_unchecked take on the SEXP (and return as the
key). The root is released by Drop / into_raw / into_inner. Only
the four fresh-value constructors (new / new_unchecked / from_raw /
from_raw_unchecked) build through here.
Sourcefn from_borrowed_parts(sexp: SEXP, cached_ptr: NonNull<RefCell<T>>) -> Self
fn from_borrowed_parts(sexp: SEXP, cached_ptr: NonNull<RefCell<T>>) -> Self
Build a borrowed view (root = None) of an SEXP R already owns.
No GC root is taken and none is released — the aliased object is kept
alive by the R-side reference that handed it to us. Used by every
wrap_sexp* / from_sexp* / same_object path.
Sourcepub(crate) unsafe fn rooted(self) -> Self
pub(crate) unsafe fn rooted(self) -> Self
Root this handle’s EXTPTRSXP for as long as the handle lives, as the
fresh-value constructors do: for a pointer converted from a class
handle, whose .ptr reference R code can drop while Rust still holds
the pointer (a callback the call makes, or a handle Rust keeps).
§Safety
On R’s main thread, with no root taken yet.
Sourcefn release_root_if_owned(&self)
fn release_root_if_owned(&self)
Release the pool root iff this handle owns one.
Routed through with_r_thread because an owning ExternalPtr is
Send and may be dropped on the worker thread, while the pool lives on
R’s main thread. with_r_thread runs the closure inline when already on
the main thread (the common case), so this is a direct pool release
there and a thread hand-off only from the worker. ProtectKey is Copy
Send(twou32s), so it crosses the boundary by value.
Sourcefn erase(x: T) -> (NonNull<RefCell<T>>, *mut Box<dyn Any>)
fn erase(x: T) -> (NonNull<RefCell<T>>, *mut Box<dyn Any>)
Box x in its RefCell and erase that to the Box<Box<dyn Any>> R
stores, returning the cell’s address for cached_ptr as well.
Sourcepub fn new(x: T) -> Self
pub fn new(x: T) -> Self
Allocates memory on the heap and places x into it.
Internally stores a Box<Box<dyn Any>> — a thin pointer (fits in R’s
R_ExternalPtrAddr) pointing to a fat pointer (carries the Any vtable
for runtime type checking via downcast) to a RefCell<T>.
This function can be called from the two supported R contexts:
- If called from R’s main thread, creates the ExternalPtr directly
- If called from the worker thread (during
run_on_worker), automatically sends the R API calls to the main thread viawith_r_thread
§Panics
Panics if called from a non-main thread outside of a run_on_worker context.
Equivalent to Box::new.
Sourcepub unsafe fn new_unchecked(x: T) -> Self
pub unsafe fn new_unchecked(x: T) -> Self
Allocates memory on the heap and places x into it, without thread checks.
§Safety
Must be called from R’s main thread. Calling from another thread is undefined behavior (R APIs are not thread-safe).
Sourceunsafe fn create_extptr_sexp(any_raw: *mut Box<dyn Any>) -> (SEXP, ProtectKey)
unsafe fn create_extptr_sexp(any_raw: *mut Box<dyn Any>) -> (SEXP, ProtectKey)
Create an EXTPTRSXP from a *mut Box<dyn Any>. Must be called from main thread.
The any_raw is a thin pointer to a heap-allocated fat pointer (Box<dyn Any>).
R stores the thin pointer in R_ExternalPtrAddr. Returns the SEXP and the
ProtectPool key that roots it for the owning handle’s lifetime.
Sourceunsafe fn create_extptr_sexp_unchecked(
any_raw: *mut Box<dyn Any>,
) -> (SEXP, ProtectKey)
unsafe fn create_extptr_sexp_unchecked( any_raw: *mut Box<dyn Any>, ) -> (SEXP, ProtectKey)
Create an EXTPTRSXP from a *mut Box<dyn Any> without thread safety checks.
§Safety
Must be called from R’s main thread. No debug assertions for thread safety.
Returns the SEXP and the ProtectPool key that roots it.
Sourcepub fn collect_into_r_list<I>(items: I) -> SEXPwhere
I: IntoIterator<Item = T>,
pub fn collect_into_r_list<I>(items: I) -> SEXPwhere
I: IntoIterator<Item = T>,
Collect an iterator of values into a protected R list (VECSXP) holding
one fresh external pointer per item, rooting each via the destination
list instead of the ProtectPool.
This is the GC-safe, allocation-lean way to hand many Rust values to R at
once — e.g. converting a Vec<T> into an R list() of external pointers.
Each EXTPTRSXP is created and immediately stored into the
already-protected result list, so the list roots it the instant it
exists: there is no unprotected window between element allocations, and
no per-element pool traffic.
Contrast the naive items.map(ExternalPtr::new).collect::<Vec<_>>(),
which roots every handle in the process-wide pool (keeping the Vec
GC-safe while held — #836) only to release every root again when the Vec
drops, then still needs a second pass to copy the handles into a list.
Here the list is the root, so both the pool round-trip and the copy
pass are skipped. The whole batch also crosses to R’s main thread in a
single with_r_thread hop rather than one
per element.
The returned VECSXP is not protected: the caller must protect it or
return it to R immediately, exactly like any other freshly built SEXP
(e.g. an IntoR result).
Sourceunsafe fn build_extptr_list(allocations: Vec<Box<dyn Any>>) -> SEXP
unsafe fn build_extptr_list(allocations: Vec<Box<dyn Any>>) -> SEXP
Build a protected VECSXP of external pointers from already-erased boxes.
Allocates the result list, protects it, then creates one EXTPTRSXP per
entry directly into its slot — rooted by the protected list, no pool. The
type symbols are interned once and reused (they are never GC’d, so they
stay valid across the allocating loop). Returns the list unprotected.
§Safety
Must run on R’s main thread; each allocation must wrap a RefCell<T>.
Sourceunsafe fn make_extptr_into_slot(
any_raw: *mut Box<dyn Any>,
type_sym: SEXP,
type_id_sym: SEXP,
dest: SEXP,
idx: R_xlen_t,
)
unsafe fn make_extptr_into_slot( any_raw: *mut Box<dyn Any>, type_sym: SEXP, type_id_sym: SEXP, dest: SEXP, idx: R_xlen_t, )
Create an EXTPTRSXP for any_raw and store it into dest[idx].
Mirrors create_extptr_sexp_unchecked
but roots the new pointer via dest (which the caller keeps protected)
instead of the pool — the element is live the instant it lands in the
protected list, so a bulk build pays no pool insert/release per element.
§Safety
Must run on R’s main thread; any_raw must own a T; dest must be a
protected VECSXP with idx in bounds; type_sym / type_id_sym must
be the interned symbols for T.
Sourcepub fn new_uninit() -> ExternalPtr<MaybeUninit<T>> ⓘwhere
MaybeUninit<T>: TypedExternal,
pub fn new_uninit() -> ExternalPtr<MaybeUninit<T>> ⓘwhere
MaybeUninit<T>: TypedExternal,
Constructs a new ExternalPtr with uninitialized contents.
Equivalent to Box::new_uninit.
Sourcepub fn new_zeroed() -> ExternalPtr<MaybeUninit<T>> ⓘwhere
MaybeUninit<T>: TypedExternal,
pub fn new_zeroed() -> ExternalPtr<MaybeUninit<T>> ⓘwhere
MaybeUninit<T>: TypedExternal,
Constructs a new ExternalPtr with zeroed contents.
Equivalent to Box::new_zeroed.
Sourcepub unsafe fn from_raw(raw: *mut T) -> Self
pub unsafe fn from_raw(raw: *mut T) -> Self
Constructs an ExternalPtr from a raw pointer.
Moves the value out of the Box<T> allocation into the pointer’s own
RefCell<T> storage and frees that allocation, so the value’s address
changes: from_raw(into_raw(p)) round-trips the value, not the address.
§Safety
rawmust have been allocated viaBox::into_rawor equivalentrawmust not be null- Caller transfers ownership to the ExternalPtr
- Must be called from R’s main thread
Like Box::from_raw, except for the address.
Sourcepub unsafe fn from_raw_unchecked(raw: *mut T) -> Self
pub unsafe fn from_raw_unchecked(raw: *mut T) -> Self
Constructs an ExternalPtr from a raw pointer, without thread checks.
§Safety
rawmust have been allocated viaBox::into_rawor equivalentrawmust not be null- Caller transfers ownership to the ExternalPtr
- Must be called from R’s main thread (no debug assertions)
Sourcepub fn into_raw(this: Self) -> *mut T
pub fn into_raw(this: Self) -> *mut T
Consumes the ExternalPtr, returning a raw pointer.
The caller is responsible for the memory, and the finalizer is
effectively orphaned (will do nothing since we clear the pointer).
The R object is emptied: address, tag and protection list (each
Sidecar<T> slot is read back into its field as a pending value
first, so the values travel with the struct), so its accessors report
a null external pointer, not an object restored from a saved session.
The value moves out of the pointer’s RefCell<T> storage into a new
Box<T>, so its address changes. Like into_inner,
this raises the miniextendr_borrow_conflict error while a running call
holds the value.
Like Box::into_raw, except for the address.
Sourcepub fn into_non_null(this: Self) -> NonNull<T>
pub fn into_non_null(this: Self) -> NonNull<T>
Consumes the ExternalPtr, returning a NonNull pointer.
Equivalent to Box::into_non_null.
Sourcepub fn leak<'a>(this: Self) -> &'a mut Twhere
T: 'a,
pub fn leak<'a>(this: Self) -> &'a mut Twhere
T: 'a,
Consumes and leaks the ExternalPtr, returning a mutable reference.
The memory will never be freed (from Rust’s perspective; R’s GC finalizer is neutralized).
Equivalent to Box::leak.
Sourcepub fn into_inner(this: Self) -> T
pub fn into_inner(this: Self) -> T
Consumes the ExternalPtr, returning the wrapped value.
Uses Box<dyn Any>::downcast to recover the concrete
Box<RefCell<T>>, then moves the value out. The R object is emptied
like by into_raw: its accessors report a null
external pointer afterwards, and each Sidecar<T> slot is read back
into its field as a pending value, so wrapping the value again keeps
the values.
§Panics
With the miniextendr_borrow_conflict R error while a running call
(a generated method of the same object, further up the stack) holds the
value: the call’s borrow points into the storage this frees.
Equivalent to *boxed (deref move) or Box::into_inner.
Sourcepub fn borrow(&self) -> ExternalPtrRef<'_, T>
pub fn borrow(&self) -> ExternalPtrRef<'_, T>
Borrows the value, as the generated wrapper does for a &T argument:
until the returned view drops, a method of the same object that needs
it mutably, a &mut T argument holding it, or
borrow_mut through another handle raises the
error below instead. The view also carries the R object, for the
sidecar accessors.
§Panics
With the R error of class miniextendr_borrow_conflict while the value
is borrowed mutably, and for a type-erased ExternalPtr<()>, which has
no value of its own to borrow (downcast it first).
Sourcepub fn borrow_mut(&mut self) -> ExternalPtrMut<'_, T>
pub fn borrow_mut(&mut self) -> ExternalPtrMut<'_, T>
Borrows the value mutably, as the generated wrapper does for a
&mut T argument: until the returned view drops, any other borrow of
the value raises the error below.
§Panics
With the R error of class miniextendr_borrow_conflict while the value
is borrowed (by a running call holding it, or another handle’s
borrow), and for a type-erased ExternalPtr<()>.
Source#[doc(hidden)]pub unsafe fn as_ref_unchecked(&self) -> &T
#[doc(hidden)]pub unsafe fn as_ref_unchecked(&self) -> &T
The value, with no RefCell borrow: only the ALTREP data1 paths,
whose per-element callbacks read without one until #2103 measures the
checked read.
§Safety
Nothing may hold the value mutably while the reference lives.
Source#[doc(hidden)]pub unsafe fn as_mut_unchecked(&mut self) -> &mut T
#[doc(hidden)]pub unsafe fn as_mut_unchecked(&mut self) -> &mut T
The value mutably, with no RefCell borrow, like
as_ref_unchecked.
§Safety
Nothing else may hold the value while the reference lives.
Sourcefn value_cell(&self) -> &RefCell<T>
fn value_cell(&self) -> &RefCell<T>
The value’s RefCell, which a type-erased handle doesn’t point at.
Sourcepub fn as_mut_ptr(&mut self) -> *mut T
pub fn as_mut_ptr(&mut self) -> *mut T
Returns the raw mutable pointer without consuming the ExternalPtr.
Sourcepub fn ptr_eq(this: &Self, other: &Self) -> bool
pub fn ptr_eq(this: &Self, other: &Self) -> bool
Checks whether two ExternalPtrs refer to the same allocation (pointer identity).
This ignores the pointee values. Use this when you need alias detection;
prefer PartialEq/PartialOrd for value comparisons.
Sourcepub fn as_sexp(&self) -> SEXP
pub fn as_sexp(&self) -> SEXP
Returns the underlying SEXP.
§Warning
The returned SEXP must not be duplicated or the finalizer will double-free.
Sourcepub fn same_object(&self) -> Self
pub fn same_object(&self) -> Self
A second handle to the same R object: no value is copied and no R
object is allocated, and the handle takes no borrow until it is read.
Returning it from a #[miniextendr] function returns the same R
object, so R sees the identity it passed in.
#[miniextendr]
pub fn first_of(objs: Vec<ExternalPtr<MyType>>) -> ExternalPtr<MyType> {
objs[0].same_object()
}The new handle takes no GC root of its own: something else (the handle it was made from, or R) must keep the R object reachable while it is used.
Sourcepub unsafe fn tag_unchecked(&self) -> SEXP
pub unsafe fn tag_unchecked(&self) -> SEXP
Returns the tag SEXP (unchecked version).
Skips thread safety checks for performance-critical paths.
§Safety
Must be called from the R main thread. Only use in ALTREP callbacks or other contexts where you’re certain you’re on the main thread.
Sourcepub fn protected(&self) -> SEXP
pub fn protected(&self) -> SEXP
Returns the protected SEXP slot (user-protected objects).
This returns the user-protected object stored in the prot VECSXP, not the VECSXP itself.
Sourcepub unsafe fn protected_unchecked(&self) -> SEXP
pub unsafe fn protected_unchecked(&self) -> SEXP
Returns the protected SEXP slot (unchecked version).
Skips thread safety checks for performance-critical paths.
§Safety
Must be called from the R main thread. Only use in ALTREP callbacks or other contexts where you’re certain you’re on the main thread.
Sourcepub unsafe fn set_protected(&self, user_prot: SEXP) -> bool
pub unsafe fn set_protected(&self, user_prot: SEXP) -> bool
Sets the user-protected SEXP slot.
Use this to prevent R objects from being GC’d while this ExternalPtr exists. The type ID stored in prot slot 0 is preserved.
Returns false if the prot structure is malformed (should not happen
for ExternalPtrs created by this library).
§Safety
user_protmust be a valid SEXP or R_NilValue- Must be called from the R main thread
Sourcepub fn prot_raw(&self) -> SEXP
pub fn prot_raw(&self) -> SEXP
Returns the raw prot VECSXP (contains both type ID and user protected).
Prefer using protected() for user data and stored_type_id() for type info.
Sourcepub fn is_null(&self) -> bool
pub fn is_null(&self) -> bool
Checks if the internal pointer is null (already finalized or cleared).
Sourcepub unsafe fn wrap_sexp(sexp: SEXP) -> Option<Self>
pub unsafe fn wrap_sexp(sexp: SEXP) -> Option<Self>
Attempt to wrap a SEXP as an ExternalPtr with type checking.
Uses Any::downcast_ref for authoritative type checking (Rust TypeId).
Type-erased ExternalPtr<()> deliberately skips the concrete downcast.
Returns None if:
- The internal pointer is null
- The metadata does not identify ordinary miniextendr storage
- The stored
Box<dyn Any>does not contain aRefCell<T>
§Safety
sexpmust be a valid EXTPTRSXP; foreign pointers must not carry forged miniextendr metadata- The caller must ensure no other ExternalPtr owns this SEXP
Sourcepub unsafe fn wrap_sexp_unchecked(sexp: SEXP) -> Option<Self>
pub unsafe fn wrap_sexp_unchecked(sexp: SEXP) -> Option<Self>
Attempt to wrap a SEXP as an ExternalPtr (unchecked version).
Skips thread safety checks for performance-critical paths like ALTREP callbacks.
§Safety
sexpmust be a valid EXTPTRSXP; foreign pointers must not carry forged miniextendr metadata- The caller must ensure exclusive ownership
- Must be called from the R main thread (guaranteed in ALTREP callbacks)
Sourcepub unsafe fn wrap_sexp_with_error(
sexp: SEXP,
) -> Result<Self, TypeMismatchError>
pub unsafe fn wrap_sexp_with_error( sexp: SEXP, ) -> Result<Self, TypeMismatchError>
Attempt to wrap a SEXP as an ExternalPtr, returning an error with type info on mismatch.
This is used by the TryFromSexp trait implementation.
§Safety
Same as wrap_sexp.
Sourcepub unsafe fn from_sexp_unchecked(sexp: SEXP) -> Self
pub unsafe fn from_sexp_unchecked(sexp: SEXP) -> Self
Create an ExternalPtr from an SEXP without type checking.
§Safety
sexpmust be a valid EXTPTRSXP containing a*mut Box<dyn Any>wrapping aRefCell<T>- The caller must ensure exclusive ownership
Sourcepub fn stored_type_name(&self) -> Option<&'static str>
pub fn stored_type_name(&self) -> Option<&'static str>
Returns the type name stored in this ExternalPtr’s prot slot.
Returns None if the prot slot doesn’t contain a valid type symbol.
Source§impl ExternalPtr<()>
impl ExternalPtr<()>
Sourcepub unsafe fn from_sexp(sexp: SEXP) -> Self
pub unsafe fn from_sexp(sexp: SEXP) -> Self
Create a type-erased ExternalPtr from an EXTPTRSXP without checking the stored type.
§Safety
sexpmust be a valid EXTPTRSXP- Caller must ensure exclusive ownership semantics are upheld
Sourcepub fn is<T: TypedExternal>(&self) -> bool
pub fn is<T: TypedExternal>(&self) -> bool
Check whether the stored Box<dyn Any> contains a T.
Uses Any::is for authoritative runtime type checking.
Source#[doc(hidden)]pub fn downcast_cell<T: TypedExternal>(&self) -> Option<&RefCell<T>>
#[doc(hidden)]pub fn downcast_cell<T: TypedExternal>(&self) -> Option<&RefCell<T>>
The RefCell holding the stored value if it is a T.
Uses Any::downcast_ref for authoritative runtime type checking. This
is where every generated method receiver (inherent and trait-impl) gets
the struct: it borrows the cell for the call.
Sourcepub fn downcast_ref<T: TypedExternal>(&self) -> Option<ExternalPtrRef<'_, T>>
pub fn downcast_ref<T: TypedExternal>(&self) -> Option<ExternalPtrRef<'_, T>>
Borrow the stored value if it is a T, like ExternalPtr::borrow.
Uses Any::downcast_ref for authoritative runtime type checking.
§Panics
With the R error of class miniextendr_borrow_conflict while the value
is borrowed mutably.
Sourcepub fn downcast_mut<T: TypedExternal>(
&mut self,
) -> Option<ExternalPtrMut<'_, T>>
pub fn downcast_mut<T: TypedExternal>( &mut self, ) -> Option<ExternalPtrMut<'_, T>>
Borrow the stored value mutably if it is a T, like
ExternalPtr::borrow_mut.
§Panics
With the R error of class miniextendr_borrow_conflict while the value
is borrowed.
Source§impl ExternalPtr<()>
impl ExternalPtr<()>
Sourcepub fn is_consumed(&self) -> bool
pub fn is_consumed(&self) -> bool
Whether the slot holds the ConsumedSlot marker.
Sourcepub fn has_null_address(&self) -> bool
pub fn has_null_address(&self) -> bool
Whether the pointer has no address: restored from a saved session
(readRDS() / unserialize()), cleared by into_inner, or never
given one (R’s new("externalptr")).
Sourcepub fn take_for_consuming<T: TypedExternal>(&mut self) -> Option<T>
pub fn take_for_consuming<T: TypedExternal>(&mut self) -> Option<T>
Move the stored T out of the handle, leaving ConsumedSlot behind.
Returns None when the slot does not hold a T (wrong type, null, or
already consumed); the slot is untouched in that case. The outer
Box<Box<dyn Any>> cell stays allocated, so the finaliser and every
other accessor keep working on the marker. The value’s Sidecar<T>
slots stay in the pointer’s prot list across the method: a
self -> Self result that keeps the fields (Self { n, ..self })
keeps the values, one built afresh (Self::new(..)) replaces them at
the write-back. Runs on R’s main thread (the generated receiver
prelude). Raises the miniextendr_borrow_conflict error while a
running call holds the value.
Sourcepub fn restore_after_consuming<T: TypedExternal>(&mut self, value: T)
pub fn restore_after_consuming<T: TypedExternal>(&mut self, value: T)
Put a value back into a slot emptied by Self::take_for_consuming
(the write-back half of self -> Self). Replaces whatever the slot
holds; the TypedExternal tag in the prot slot is unchanged because
the type is the same. The pending values of the value’s
Sidecar<T> fields (what the method set with Sidecar::new) are
flushed into prot, on R’s main thread (a worker method’s
write-back runs on the worker, so the flush is routed through
with_r_thread); the other slots keep
their values. Raises the miniextendr_borrow_conflict error while a
running call holds the value the slot holds.
Source§impl<T: TypedExternal> ExternalPtr<MaybeUninit<T>>where
MaybeUninit<T>: TypedExternal,
impl<T: TypedExternal> ExternalPtr<MaybeUninit<T>>where
MaybeUninit<T>: TypedExternal,
Sourcepub fn assume_init(self) -> ExternalPtr<T> ⓘ
pub fn assume_init(self) -> ExternalPtr<T> ⓘ
Converts to ExternalPtr<T>.
§Safety
The value must have been initialized.
§Implementation Note
This method creates a new SEXP with T’s type information, leaving
the original MaybeUninit<T> SEXP as an orphaned empty shell in R’s heap.
This is necessary because the type ID stored in the prot slot must match
the actual type. The orphaned SEXP will be cleaned up by R’s GC eventually.
If you need to avoid this overhead, consider using ExternalPtr<T>::new
directly and initializing in place via as_mut.
Equivalent to Box::assume_init.
Sourcepub fn write(self, value: T) -> ExternalPtr<T> ⓘ
pub fn write(self, value: T) -> ExternalPtr<T> ⓘ
Writes a value and converts to initialized.
Creates a new SEXP with T’s type information (the original
MaybeUninit<T> SEXP becomes an orphaned shell, cleaned up by GC).
Trait Implementations§
Source§impl<T: TypedExternal + Clone> Clone for ExternalPtr<T>
impl<T: TypedExternal + Clone> Clone for ExternalPtr<T>
Source§fn clone(&self) -> Self
fn clone(&self) -> Self
Deep clones the inner value into a new ExternalPtr.
This creates a completely independent ExternalPtr with its own
heap allocation and finalizer. The Sidecar<T> slots are copied as
R objects (after flushing the source’s pending values), so the two
pointers share those values until one side writes a field: every
write replaces the slot, and R copies a shared value before modifying
it in place. For a type with Sidecar fields this runs on R’s main
thread only.
§Panics
With the R error of class miniextendr_borrow_conflict while the value
is borrowed mutably, like borrow.
Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Clones source’s value into this pointer’s value in place. The
Sidecar<T> slots are copied as R objects like in
clone, replacing this pointer’s slot values and its
pending values.
§Panics
With the R error of class miniextendr_borrow_conflict while
source’s value is borrowed mutably or this one’s is borrowed, which
includes cloning a pointer into itself.
Source§impl<T: TypedExternal + Debug> Debug for ExternalPtr<T>
Like RefCell’s: a value borrowed mutably prints as <borrowed>
instead of raising, and so does a type-erased ExternalPtr<()>, which has
no value of its own.
impl<T: TypedExternal + Debug> Debug for ExternalPtr<T>
Like RefCell’s: a value borrowed mutably prints as <borrowed>
instead of raising, and so does a type-erased ExternalPtr<()>, which has
no value of its own.
Source§impl<T: TypedExternal + Default> Default for ExternalPtr<T>
impl<T: TypedExternal + Default> Default for ExternalPtr<T>
Source§impl<T: TypedExternal + Display> Display for ExternalPtr<T>
Borrows the value, like ExternalPtr::borrow.
impl<T: TypedExternal + Display> Display for ExternalPtr<T>
Borrows the value, like ExternalPtr::borrow.
Source§impl<T: TypedExternal + DoubleEndedIterator> DoubleEndedIterator for ExternalPtr<T>
impl<T: TypedExternal + DoubleEndedIterator> DoubleEndedIterator for ExternalPtr<T>
Source§fn next_back(&mut self) -> Option<Self::Item>
fn next_back(&mut self) -> Option<Self::Item>
Source§fn nth_back(&mut self, n: usize) -> Option<Self::Item>
fn nth_back(&mut self, n: usize) -> Option<Self::Item>
nth element from the end of the iterator. Read moreSource§fn next_chunk_back<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk_back<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values in sequence. Read moreSource§fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.27.0 (const: unstable) · Source§fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
Iterator::try_fold(): it takes
elements starting from the back of the iterator. Read moreSource§impl<T: TypedExternal> Drop for ExternalPtr<T>
impl<T: TypedExternal> Drop for ExternalPtr<T>
Source§impl<T: TypedExternal + Eq> Eq for ExternalPtr<T>
impl<T: TypedExternal + Eq> Eq for ExternalPtr<T>
1.0.0 (const: unstable) · Source§#[doc(hidden)]fn assert_receiver_is_total_eq(&self)
#[doc(hidden)]fn assert_receiver_is_total_eq(&self)
implementation detail of #[derive(Eq)]
Source§#[doc(hidden)]fn assert_fields_are_eq(&self)
#[doc(hidden)]fn assert_fields_are_eq(&self)
derive_eq_internals)Source§impl<T: TypedExternal + ExactSizeIterator> ExactSizeIterator for ExternalPtr<T>
impl<T: TypedExternal + ExactSizeIterator> ExactSizeIterator for ExternalPtr<T>
Source§impl<T: TypedExternal> From<Box<T>> for ExternalPtr<T>
impl<T: TypedExternal> From<Box<T>> for ExternalPtr<T>
Source§impl<T: TypedExternal> From<T> for ExternalPtr<T>
impl<T: TypedExternal> From<T> for ExternalPtr<T>
impl<T: TypedExternal + FusedIterator> FusedIterator for ExternalPtr<T>
Source§impl<T: TypedExternal + Hash> Hash for ExternalPtr<T>
impl<T: TypedExternal + Hash> Hash for ExternalPtr<T>
Source§impl<T: TypedExternal> IntoR for ExternalPtr<T>
impl<T: TypedExternal> IntoR for ExternalPtr<T>
Source§impl<T: TypedExternal + Iterator> Iterator for ExternalPtr<T>
Each step borrows the value mutably, like ExternalPtr::borrow_mut.
impl<T: TypedExternal + Iterator> Iterator for ExternalPtr<T>
Each step borrows the value mutably, like ExternalPtr::borrow_mut.
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
nth element of the iterator. Read moreSource§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values. Read more1.0.0 (const: unstable) · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 (const: unstable) · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.28.0 (const: unstable) · Source§fn step_by(self, step: usize) -> StepBy<Self> ⓘwhere
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self> ⓘwhere
Self: Sized,
1.0.0 (const: unstable) · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> ⓘ
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> ⓘ
1.0.0 (const: unstable) · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter> ⓘwhere
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter> ⓘwhere
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self> ⓘ
fn intersperse(self, separator: Self::Item) -> Intersperse<Self> ⓘ
iter_intersperse)separator between items
of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G> ⓘ
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G> ⓘ
iter_intersperse)separator
between items of the original iterator. Read more1.0.0 (const: unstable) · Source§fn map<B, F>(self, f: F) -> Map<Self, F> ⓘ
fn map<B, F>(self, f: F) -> Map<Self, F> ⓘ
1.21.0 (const: unstable) · Source§fn for_each<F>(self, f: F)
fn for_each<F>(self, f: F)
1.0.0 (const: unstable) · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
1.0.0 (const: unstable) · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> ⓘ
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> ⓘ
1.0.0 (const: unstable) · Source§fn enumerate(self) -> Enumerate<Self> ⓘwhere
Self: Sized,
fn enumerate(self) -> Enumerate<Self> ⓘwhere
Self: Sized,
1.0.0 (const: unstable) · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> ⓘ
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> ⓘ
1.57.0 (const: unstable) · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P> ⓘ
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P> ⓘ
1.0.0 (const: unstable) · Source§fn skip(self, n: usize) -> Skip<Self> ⓘwhere
Self: Sized,
fn skip(self, n: usize) -> Skip<Self> ⓘwhere
Self: Sized,
n elements. Read more1.0.0 (const: unstable) · Source§fn take(self, n: usize) -> Take<Self> ⓘwhere
Self: Sized,
fn take(self, n: usize) -> Take<Self> ⓘwhere
Self: Sized,
n elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 (const: unstable) · Source§fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> ⓘ
fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> ⓘ
1.0.0 (const: unstable) · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> ⓘ
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> ⓘ
1.29.0 (const: unstable) · Source§fn flatten(self) -> Flatten<Self> ⓘ
fn flatten(self) -> Flatten<Self> ⓘ
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N> ⓘ
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N> ⓘ
iter_map_windows)f for each contiguous window of size N over
self and returns an iterator over the outputs of f. Like slice::windows(),
the windows during mapping overlap as well. Read more1.0.0 (const: unstable) · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F> ⓘ
fn inspect<F>(self, f: F) -> Inspect<Self, F> ⓘ
1.0.0 (const: unstable) · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read more1.0.0 (const: unstable) · Source§fn collect<B>(self) -> B
fn collect<B>(self) -> B
Source§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into)1.0.0 (const: unstable) · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
iter_partition_in_place)true precede all those that return false.
Returns the number of true elements found. Read moreSource§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned)true precede all those that return false. Read more1.27.0 (const: unstable) · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 (const: unstable) · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 (const: unstable) · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 (const: unstable) · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce)1.0.0 (const: unstable) · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 (const: unstable) · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 (const: unstable) · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 (const: unstable) · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find)1.0.0 (const: unstable) · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 (const: unstable) · Source§fn rposition<P>(&mut self, predicate: P) -> Option<usize>
fn rposition<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 (const: unstable) · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 (const: unstable) · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 (const: unstable) · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 (const: unstable) · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 (const: unstable) · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 (const: unstable) · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 (const: unstable) · Source§fn rev(self) -> Rev<Self> ⓘwhere
Self: Sized + DoubleEndedIterator,
fn rev(self) -> Rev<Self> ⓘwhere
Self: Sized + DoubleEndedIterator,
1.0.0 (const: unstable) · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 (const: unstable) · Source§fn copied<'a, T>(self) -> Copied<Self> ⓘ
fn copied<'a, T>(self) -> Copied<Self> ⓘ
1.0.0 (const: unstable) · Source§fn cycle(self) -> Cycle<Self> ⓘ
fn cycle(self) -> Cycle<Self> ⓘ
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N> ⓘwhere
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N> ⓘwhere
Self: Sized,
iter_array_chunks)N elements of the iterator at a time. Read more1.11.0 (const: unstable) · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read more1.5.0 (const: unstable) · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd elements of
this Iterator with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by)1.5.0 (const: unstable) · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator are lexicographically
less than those of another. Read more1.5.0 (const: unstable) · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator are lexicographically
less or equal to those of another. Read more1.5.0 (const: unstable) · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator are lexicographically
greater than those of another. Read more1.5.0 (const: unstable) · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator are lexicographically
greater than or equal to those of another. Read more1.82.0 (const: unstable) · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 (const: unstable) · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
Source§impl<T: TypedExternal + Ord> Ord for ExternalPtr<T>
impl<T: TypedExternal + Ord> Ord for ExternalPtr<T>
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
impl<T: TypedExternal> Owner for ExternalPtr<T>
Source§impl<T: TypedExternal + PartialEq> PartialEq for ExternalPtr<T>
Compares the values, borrowing both, like ExternalPtr::borrow.
impl<T: TypedExternal + PartialEq> PartialEq for ExternalPtr<T>
Compares the values, borrowing both, like ExternalPtr::borrow.
Source§impl<T: TypedExternal + PartialOrd> PartialOrd for ExternalPtr<T>
impl<T: TypedExternal + PartialOrd> PartialOrd for ExternalPtr<T>
Source§fn partial_cmp(&self, other: &Self) -> Option<Ordering>
fn partial_cmp(&self, other: &Self) -> Option<Ordering>
Source§#[doc(hidden)]fn __chaining_lt(&self, other: &Rhs) -> ControlFlow<bool>
#[doc(hidden)]fn __chaining_lt(&self, other: &Rhs) -> ControlFlow<bool>
partial_ord_chaining_methods)self == other, returns ControlFlow::Continue(()).
Otherwise, returns ControlFlow::Break(self < other). Read moreSource§#[doc(hidden)]fn __chaining_le(&self, other: &Rhs) -> ControlFlow<bool>
#[doc(hidden)]fn __chaining_le(&self, other: &Rhs) -> ControlFlow<bool>
partial_ord_chaining_methods)__chaining_lt, but for <= instead of <.Source§#[doc(hidden)]fn __chaining_gt(&self, other: &Rhs) -> ControlFlow<bool>
#[doc(hidden)]fn __chaining_gt(&self, other: &Rhs) -> ControlFlow<bool>
partial_ord_chaining_methods)__chaining_lt, but for > instead of <.Source§#[doc(hidden)]fn __chaining_ge(&self, other: &Rhs) -> ControlFlow<bool>
#[doc(hidden)]fn __chaining_ge(&self, other: &Rhs) -> ControlFlow<bool>
partial_ord_chaining_methods)__chaining_lt, but for >= instead of <.Source§impl<T: TypedExternal> Pointer for ExternalPtr<T>
impl<T: TypedExternal> Pointer for ExternalPtr<T>
impl<T: TypedExternal + Send> Send for ExternalPtr<T>
Source§impl<T: TypedExternal> SidecarOwner<T> for ExternalPtr<T>
impl<T: TypedExternal> SidecarOwner<T> for ExternalPtr<T>
Source§fn __mx_read(&self) -> SidecarRead<'_, T>
fn __mx_read(&self) -> SidecarRead<'_, T>
Saved
handle, the restored pointer alone.Source§impl<T: TypedExternal> SidecarOwnerMut<T> for ExternalPtr<T>
impl<T: TypedExternal> SidecarOwnerMut<T> for ExternalPtr<T>
Source§fn __mx_write(&mut self) -> ExternalPtrMut<'_, T>
fn __mx_write(&mut self) -> ExternalPtrMut<'_, T>
Source§impl<T: TypedExternal + Send> TryFromSexp for ExternalPtr<T>
Convert R EXTPTRSXP to ExternalPtr<T>.
impl<T: TypedExternal + Send> TryFromSexp for ExternalPtr<T>
Convert R EXTPTRSXP to ExternalPtr<T>.
This enables using ExternalPtr<T> as parameter types in #[miniextendr]
functions, for a body that keeps or consumes the handle; a body that only
reads the value takes &T.
§Example
#[derive(ExternalPtr)]
struct MyData { value: i32 }
#[miniextendr]
fn process(data: ExternalPtr<MyData>) -> i32 {
data.borrow().value
}Source§fn try_from_sexp(sexp: SEXP) -> Result<Self, Self::Error>
fn try_from_sexp(sexp: SEXP) -> Result<Self, Self::Error>
Source§unsafe fn try_from_sexp_unchecked(sexp: SEXP) -> Result<Self, Self::Error>
unsafe fn try_from_sexp_unchecked(sexp: SEXP) -> Result<Self, Self::Error>
Source§const NATIVE_BORROW: Option<NativeBorrow> = None
const NATIVE_BORROW: Option<NativeBorrow> = None
Source§const CHARACTER_ONLY: bool = false
const CHARACTER_ONLY: bool = false
NULL, is a character vector or a factor. Read moreSource§#[doc(hidden)]const __MX_EXPECTATION: Option<&'static str> = None
#[doc(hidden)]const __MX_EXPECTATION: Option<&'static str> = None
#[miniextendr] cannot tell from the type as written: the
<expected> of a failed conversion’s '<p>' must be <expected>: .... Read moreSource§#[doc(hidden)]unsafe fn __mx_try_from_rooted(root: Root<'_>) -> Result<Self, Self::Error>
#[doc(hidden)]unsafe fn __mx_try_from_rooted(root: Root<'_>) -> Result<Self, Self::Error>
Source§#[doc(hidden)]fn __mx_has_na(&self) -> bool
#[doc(hidden)]fn __mx_has_na(&self) -> bool
#[miniextendr(no_na)]
refuses after the conversion. Read moreSource§#[doc(hidden)]fn __mx_input_has_na(&self, input: SEXP) -> bool
#[doc(hidden)]fn __mx_input_has_na(&self, input: SEXP) -> bool
#[miniextendr(no_na)] refuses this converted argument, read
from input (the R value it converted from), when no R guard ran. Read moreSource§#[doc(hidden)]fn __mx_try_from_sexp_with_check(
sexp: SEXP,
check: &ElementCheck<'_>,
) -> Result<Self, SexpError>
#[doc(hidden)]fn __mx_try_from_sexp_with_check(
sexp: SEXP,
check: &ElementCheck<'_>,
) -> Result<Self, SexpError>
check, an element type’s
TryFromSexpElement::check_sexp,
on the R value that carries an element’s class (#1837). Read moreSource§#[doc(hidden)]unsafe fn __mx_try_from_sexp_unchecked_with_check(
sexp: SEXP,
check: &ElementCheck<'_>,
) -> Result<Self, SexpError>
#[doc(hidden)]unsafe fn __mx_try_from_sexp_unchecked_with_check(
sexp: SEXP,
check: &ElementCheck<'_>,
) -> Result<Self, SexpError>
Auto Trait Implementations§
impl<T> !RefUnwindSafe for ExternalPtr<T>
impl<T> !Sync for ExternalPtr<T>
impl<T> !UnwindSafe for ExternalPtr<T>
impl<T> Freeze for ExternalPtr<T>
impl<T> Unpin for ExternalPtr<T>
impl<T> UnsafeUnpin for ExternalPtr<T>
Blanket Implementations§
Source§impl<I> AltrepIteratorExt for Iwhere
I: Iterator,
impl<I> AltrepIteratorExt for Iwhere
I: Iterator,
Source§fn into_altrep_data(
self,
len: usize,
) -> <Self::Item as AltrepIteratorItem>::Data<Self>where
Self::Item: AltrepIteratorItem,
fn into_altrep_data(
self,
len: usize,
) -> <Self::Item as AltrepIteratorItem>::Data<Self>where
Self::Item: AltrepIteratorItem,
Source§fn into_altrep_data_exact(
self,
) -> <Self::Item as AltrepIteratorItem>::Data<Self>
fn into_altrep_data_exact( self, ) -> <Self::Item as AltrepIteratorItem>::Data<Self>
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ConsumingFallible for Twhere
T: Clone,
Source§impl<I> IntoIterator for Iwhere
I: Iterator,
impl<I> IntoIterator for Iwhere
I: Iterator,
Source§impl<I> OptionInner for I
impl<I> OptionInner for I
Source§const OPTION_NATIVE_BORROW: Option<NativeBorrow> = const OPTION_NATIVE_BORROW: Option<NativeBorrow> =
<Option<I> as TryFromSexp>::NATIVE_BORROW;
const OPTION_NATIVE_BORROW: Option<NativeBorrow> = const OPTION_NATIVE_BORROW: Option<NativeBorrow> = <Option<I> as TryFromSexp>::NATIVE_BORROW;
<Option<Self> as TryFromSexp>::NATIVE_BORROW.Source§const OPTION_CHARACTER_ONLY: bool = const OPTION_CHARACTER_ONLY: bool =
<Option<I> as TryFromSexp>::CHARACTER_ONLY;
const OPTION_CHARACTER_ONLY: bool = const OPTION_CHARACTER_ONLY: bool = <Option<I> as TryFromSexp>::CHARACTER_ONLY;
<Option<Self> as TryFromSexp>::CHARACTER_ONLY.Source§impl<T> RDebug for Twhere
T: Debug,
impl<T> RDebug for Twhere
T: Debug,
Source§impl<T> RPartialOrd for Twhere
T: PartialOrd,
impl<T> RPartialOrd for Twhere
T: PartialOrd,
Source§fn r_partial_cmp(&self, other: &T) -> Option<i32>
fn r_partial_cmp(&self, other: &T) -> Option<i32>
Source§impl<T> SizeHint for Twhere
T: ?Sized,
impl<T> SizeHint for Twhere
T: ?Sized,
Source§default fn lower_bound(&self) -> usize
default fn lower_bound(&self) -> usize
core_io_internals)[u8; 12] could return any value between 0 and
12 inclusively as a correct implementation. Read moreSource§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 moreSource§impl<I> VecInner for I
impl<I> VecInner for I
Source§const VEC_NATIVE_BORROW: Option<NativeBorrow> = const VEC_NATIVE_BORROW: Option<NativeBorrow> =
<Vec<I> as TryFromSexp>::NATIVE_BORROW;
const VEC_NATIVE_BORROW: Option<NativeBorrow> = const VEC_NATIVE_BORROW: Option<NativeBorrow> = <Vec<I> as TryFromSexp>::NATIVE_BORROW;
<Vec<Self> as TryFromSexp>::NATIVE_BORROW.Source§const VEC_CHARACTER_ONLY: bool = const VEC_CHARACTER_ONLY: bool = <Vec<I> as TryFromSexp>::CHARACTER_ONLY;
const VEC_CHARACTER_ONLY: bool = const VEC_CHARACTER_ONLY: bool = <Vec<I> as TryFromSexp>::CHARACTER_ONLY;
<Vec<Self> as TryFromSexp>::CHARACTER_ONLY.Source§impl<I> VecOptionInner for I
impl<I> VecOptionInner for I
Source§const VEC_OPTION_NATIVE_BORROW: Option<NativeBorrow> = const VEC_OPTION_NATIVE_BORROW: Option<NativeBorrow> =
<Vec<Option<I>> as TryFromSexp>::NATIVE_BORROW;
const VEC_OPTION_NATIVE_BORROW: Option<NativeBorrow> = const VEC_OPTION_NATIVE_BORROW: Option<NativeBorrow> = <Vec<Option<I>> as TryFromSexp>::NATIVE_BORROW;
<Vec<Option<Self>> as TryFromSexp>::NATIVE_BORROW.Source§const VEC_OPTION_CHARACTER_ONLY: bool = const VEC_OPTION_CHARACTER_ONLY: bool =
<Vec<Option<I>> as TryFromSexp>::CHARACTER_ONLY;
const VEC_OPTION_CHARACTER_ONLY: bool = const VEC_OPTION_CHARACTER_ONLY: bool = <Vec<Option<I>> as TryFromSexp>::CHARACTER_ONLY;
<Vec<Option<Self>> as TryFromSexp>::CHARACTER_ONLY.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: 32 bytes