#[repr(C)]pub struct ExternalPtr<T: TypedExternal> {
sexp: SEXP,
cached_ptr: NonNull<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.
§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.as_ref().unwrap().value, 3.14);Fields§
§sexp: SEXP§cached_ptr: NonNull<T>Cached data pointer, set once at construction time.
This avoids the R_ExternalPtrAddr FFI call on every as_ref()/as_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* / reborrow): 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<T>,
root: ProtectKey,
) -> Self
fn from_owned_parts( sexp: SEXP, cached_ptr: NonNull<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<T>) -> Self
fn from_borrowed_parts(sexp: SEXP, cached_ptr: NonNull<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* / reborrow path.
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.
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).
This function can be called from any thread:
- 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(raws: &[*mut Box<dyn Any>]) -> SEXP
unsafe fn build_extptr_list(raws: &[*mut 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 raw must be a live Box<Box<dyn Any>>
wrapping a T, with ownership transferred to the new external pointer.
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.
Re-wraps the *mut T in Box<dyn Any> for the new storage format.
§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
Equivalent to Box::from_raw.
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).
Equivalent to Box::into_raw.
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<T>,
then moves the value out.
Equivalent to *boxed (deref move) or Box::into_inner.
Sourcepub fn pin(x: T) -> Pin<Self>where
T: Unpin,
pub fn pin(x: T) -> Pin<Self>where
T: Unpin,
Constructs a new Pin<ExternalPtr<T>>.
Equivalent to Box::pin.
§Note
Unlike Box::pin, this requires T: Unpin because ExternalPtr
implements DerefMut unconditionally. For !Unpin types, use
ExternalPtr::new and manage pinning guarantees manually.
Sourcepub fn pin_unchecked(x: T) -> Pin<Self>
pub fn pin_unchecked(x: T) -> Pin<Self>
Constructs a new Pin<ExternalPtr<T>> without requiring Unpin.
§Safety
The caller must ensure that the pinning invariants are upheld:
- The data will not be moved out of the
ExternalPtr - The data will not be accessed mutably in ways that would move it
Since ExternalPtr implements DerefMut, using this with !Unpin
types requires careful handling to avoid moving the inner value.
Sourcepub fn into_pin(this: Self) -> Pin<Self>where
T: Unpin,
pub fn into_pin(this: Self) -> Pin<Self>where
T: Unpin,
Converts a ExternalPtr<T> into a Pin<ExternalPtr<T>>.
Equivalent to Box::into_pin.
Sourcepub fn as_ref(&self) -> Option<&T>
pub fn as_ref(&self) -> Option<&T>
Returns a reference to the underlying value.
Uses the cached pointer set at construction time, avoiding the
R_ExternalPtrAddr FFI call on every access.
Sourcepub fn as_mut(&mut self) -> Option<&mut T>
pub fn as_mut(&mut self) -> Option<&mut T>
Returns a mutable reference to the underlying value.
Uses the cached pointer set at construction time, avoiding the
R_ExternalPtrAddr FFI call on every access.
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 or as_ref() 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 reborrow(&self) -> Self
pub fn reborrow(&self) -> Self
Create a lightweight alias of this ExternalPtr sharing the same R object.
The returned ExternalPtr points to the same underlying EXTPTRSXP.
No data is copied and no new R object is allocated – both the original
and the alias refer to the same R-level external pointer.
This is the correct way to return “self” from a method that takes
self: &ExternalPtr<Self>, preserving R object identity:
#[miniextendr(env)]
impl MyType {
pub fn identity(self: &ExternalPtr<Self>) -> ExternalPtr<Self> {
self.reborrow()
}
}§Safety note
The caller must not use the original and the alias to create overlapping
mutable references (as_mut). In typical use (returning from a method),
the borrow of the original ends when the method returns, so this is safe.
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).
Falls back to R symbol comparison for type-erased ExternalPtr<()>.
Returns None if:
- The internal pointer is null
- The stored
Box<dyn Any>does not contain aT
§Safety
sexpmust be a valid EXTPTRSXP created by this library- 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 created by this library- 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 a value of typeT- 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.
Sourcepub fn downcast_ref<T: TypedExternal>(&self) -> Option<&T>
pub fn downcast_ref<T: TypedExternal>(&self) -> Option<&T>
Downcast to an immutable reference of the stored type if it matches T.
Uses Any::downcast_ref for authoritative runtime type checking.
Sourcepub fn downcast_mut<T: TypedExternal>(&mut self) -> Option<&mut T>
pub fn downcast_mut<T: TypedExternal>(&mut self) -> Option<&mut T>
Downcast to a mutable reference of the stored type if it matches T.
Uses Any::downcast_mut for authoritative runtime type checking.
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> AsMut<T> for ExternalPtr<T>
impl<T: TypedExternal> AsMut<T> for ExternalPtr<T>
Source§impl<T: TypedExternal> AsRef<T> for ExternalPtr<T>
impl<T: TypedExternal> AsRef<T> for ExternalPtr<T>
Source§impl<T: TypedExternal> Borrow<T> for ExternalPtr<T>
impl<T: TypedExternal> Borrow<T> for ExternalPtr<T>
Source§impl<T: TypedExternal> BorrowMut<T> for ExternalPtr<T>
impl<T: TypedExternal> BorrowMut<T> for ExternalPtr<T>
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T: TypedExternal + Clone> Clone for ExternalPtr<T>
impl<T: TypedExternal + Clone> Clone for ExternalPtr<T>
Source§impl<T: TypedExternal + Debug> Debug for ExternalPtr<T>
impl<T: TypedExternal + Debug> Debug for ExternalPtr<T>
Source§impl<T: TypedExternal + Default> Default for ExternalPtr<T>
impl<T: TypedExternal + Default> Default for ExternalPtr<T>
Source§impl<T: TypedExternal> Deref for ExternalPtr<T>
impl<T: TypedExternal> Deref for ExternalPtr<T>
Source§impl<T: TypedExternal> DerefMut for ExternalPtr<T>
impl<T: TypedExternal> DerefMut for ExternalPtr<T>
Source§impl<T: TypedExternal + Display> Display for ExternalPtr<T>
impl<T: TypedExternal + Display> Display for ExternalPtr<T>
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§type Error = Infallible
type Error = Infallible
Source§fn try_into_sexp(self) -> Result<SEXP, Self::Error>
fn try_into_sexp(self) -> Result<SEXP, Self::Error>
Source§impl<T: TypedExternal + Iterator> Iterator for ExternalPtr<T>
impl<T: TypedExternal + Iterator> Iterator for ExternalPtr<T>
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 skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
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,
Source§impl<T: TypedExternal + PartialEq> PartialEq for ExternalPtr<T>
impl<T: TypedExternal + PartialEq> PartialEq for ExternalPtr<T>
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 + 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.
§Example
#[derive(ExternalPtr)]
struct MyData { value: i32 }
#[miniextendr]
fn process(data: ExternalPtr<MyData>) -> i32 {
data.value
}Auto Trait Implementations§
impl<T> !Sync for ExternalPtr<T>
impl<T> Freeze for ExternalPtr<T>
impl<T> RefUnwindSafe for ExternalPtr<T>where
T: RefUnwindSafe,
impl<T> Unpin for ExternalPtr<T>where
T: Unpin,
impl<T> UnsafeUnpin for ExternalPtr<T>
impl<T> UnwindSafe for ExternalPtr<T>where
T: RefUnwindSafe + UnwindSafe,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<I> IntoIterator for Iwhere
I: Iterator,
impl<I> IntoIterator for Iwhere
I: Iterator,
Source§impl<T> RDisplay for Twhere
T: Display,
impl<T> RDisplay for Twhere
T: Display,
Source§fn as_r_string(&self) -> String
fn as_r_string(&self) -> String
Source§impl<T> RPartialOrd for Twhere
T: PartialOrd,
impl<T> RPartialOrd for Twhere
T: PartialOrd,
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 moreLayout§
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