Skip to main content

ExternalPtr

Struct ExternalPtr 

Source
#[repr(C)]
pub struct ExternalPtr<T: TypedExternal> { sexp: SEXP, cached_ptr: NonNull<T>, _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 (Rust TypeId)

§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 ExternalPtr value exists).
  • R_ClearExternalPtr is only called in methods that consume or finalize (into_raw, into_inner, release_any).
§_marker: PhantomData<T>

Implementations§

Source§

impl<T: TypedExternal> ExternalPtr<T>

Source

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 via with_r_thread
§Panics

Panics if called from a non-main thread outside of a run_on_worker context.

Equivalent to Box::new.

Source

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).

Source

unsafe fn create_extptr_sexp(any_raw: *mut Box<dyn Any>) -> SEXP

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.

Source

unsafe fn create_extptr_sexp_unchecked(any_raw: *mut Box<dyn Any>) -> SEXP

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.

Source

pub fn new_uninit() -> ExternalPtr<MaybeUninit<T>>

Constructs a new ExternalPtr with uninitialized contents.

Equivalent to Box::new_uninit.

Source

pub fn new_zeroed() -> ExternalPtr<MaybeUninit<T>>

Constructs a new ExternalPtr with zeroed contents.

Equivalent to Box::new_zeroed.

Source

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
  • raw must have been allocated via Box::into_raw or equivalent
  • raw must not be null
  • Caller transfers ownership to the ExternalPtr
  • Must be called from R’s main thread

Equivalent to Box::from_raw.

Source

pub unsafe fn from_raw_unchecked(raw: *mut T) -> Self

Constructs an ExternalPtr from a raw pointer, without thread checks.

§Safety
  • raw must have been allocated via Box::into_raw or equivalent
  • raw must not be null
  • Caller transfers ownership to the ExternalPtr
  • Must be called from R’s main thread (no debug assertions)
Source

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.

Source

pub fn into_non_null(this: Self) -> NonNull<T>

Consumes the ExternalPtr, returning a NonNull pointer.

Equivalent to Box::into_non_null.

Source

pub fn leak<'a>(this: Self) -> &'a mut T
where 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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn as_ptr(&self) -> *const T

Returns the raw pointer without consuming the ExternalPtr.

Source

pub fn as_mut_ptr(&mut self) -> *mut T

Returns the raw mutable pointer without consuming the ExternalPtr.

Source

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.

Source

pub fn as_sexp(&self) -> SEXP

Returns the underlying SEXP.

§Warning

The returned SEXP must not be duplicated or the finalizer will double-free.

Source

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.

Source

pub fn tag(&self) -> SEXP

Returns the tag SEXP (type identifier symbol).

Source

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.

Source

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.

Source

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.

Source

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_prot must be a valid SEXP or R_NilValue
  • Must be called from the R main thread
Source

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.

Source

pub fn is_null(&self) -> bool

Checks if the internal pointer is null (already finalized or cleared).

Source

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 a T
§Safety
  • sexp must be a valid EXTPTRSXP created by this library
  • The caller must ensure no other ExternalPtr owns this SEXP
Source

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
  • sexp must 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)
Source

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.

Source

pub unsafe fn from_sexp_unchecked(sexp: SEXP) -> Self

Create an ExternalPtr from an SEXP without type checking.

§Safety
  • sexp must be a valid EXTPTRSXP containing a *mut Box<dyn Any> wrapping a value of type T
  • The caller must ensure exclusive ownership
Source

pub fn type_name() -> &'static str

Returns the type name for type T.

Source

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<()>

Source

pub unsafe fn from_sexp(sexp: SEXP) -> Self

Create a type-erased ExternalPtr from an EXTPTRSXP without checking the stored type.

§Safety
  • sexp must be a valid EXTPTRSXP
  • Caller must ensure exclusive ownership semantics are upheld
Source

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

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.

Source

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>>

Source

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.

Source

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>

Source§

fn as_mut(&mut self) -> &mut T

Converts this type into a mutable reference of the (usually inferred) input type.
Source§

impl<T: TypedExternal> AsRef<T> for ExternalPtr<T>

Source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<T: TypedExternal> Borrow<T> for ExternalPtr<T>

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T: TypedExternal> BorrowMut<T> for ExternalPtr<T>

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T: TypedExternal + Clone> Clone for ExternalPtr<T>

Source§

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.

Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: TypedExternal + Debug> Debug for ExternalPtr<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: TypedExternal + Default> Default for ExternalPtr<T>

Source§

fn default() -> Self

Creates an ExternalPtr containing the default value of T.

Source§

impl<T: TypedExternal> Deref for ExternalPtr<T>

Source§

type Target = T

The resulting type after dereferencing.
Source§

fn deref(&self) -> &T

Dereferences the value.
Source§

impl<T: TypedExternal> DerefMut for ExternalPtr<T>

Source§

fn deref_mut(&mut self) -> &mut T

Mutably dereferences the value.
Source§

impl<T: TypedExternal + Display> Display for ExternalPtr<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: TypedExternal + DoubleEndedIterator> DoubleEndedIterator for ExternalPtr<T>

Source§

fn next_back(&mut self) -> Option<Self::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where Self: Sized, F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl<T: TypedExternal> Drop for ExternalPtr<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T: TypedExternal + ExactSizeIterator> ExactSizeIterator for ExternalPtr<T>

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl<T: TypedExternal> From<Box<T>> for ExternalPtr<T>

Source§

fn from(boxed: Box<T>) -> Self

Converts to this type from the input type.
Source§

impl<T: TypedExternal> From<T> for ExternalPtr<T>

Source§

fn from(t: T) -> Self

Converts to this type from the input type.
Source§

impl<T: TypedExternal + Hash> Hash for ExternalPtr<T>

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<T: TypedExternal> IntoR for ExternalPtr<T>

Source§

type Error = Infallible

The error type for fallible conversions. Read more
Source§

fn try_into_sexp(self) -> Result<SEXP, Self::Error>

Try to convert this value to an R SEXP. Read more
Source§

unsafe fn try_into_sexp_unchecked(self) -> Result<SEXP, Self::Error>

Try to convert to SEXP without thread safety checks. Read more
Source§

fn into_sexp(self) -> SEXP

Convert this value to an R SEXP, panicking on error. Read more
Source§

unsafe fn into_sexp_unchecked(self) -> SEXP
where Self: Sized,

Convert to SEXP without thread safety checks, panicking on error. Read more
Source§

impl<T: TypedExternal + Iterator> Iterator for ExternalPtr<T>

Source§

type Item = <T as Iterator>::Item

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( &mut self, ) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where Self: Sized,

Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where Self: Sized, U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where Self: Sized, U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where Self: Sized, Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where Self: Sized, G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator between items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where Self: Sized, F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where Self: Sized, F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where Self: Sized, F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where Self: Sized,

Creates an iterator which gives the current iteration count as well as the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where Self: Sized,

Creates an iterator which can use the peek and peek_mut methods to look at the next element of the iterator without consuming it. See their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where Self: Sized, P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where Self: Sized,

Creates an iterator that yields the first n elements, or fewer if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where Self: Sized, F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where Self: Sized, U: IntoIterator, F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where Self: Sized, Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where Self: Sized, F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function 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 more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where Self: Sized, F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where B: FromIterator<Self::Item>, Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where Self: Sized, Self::Item: Try, <Self::Item as Try>::Residual: Residual<B>, B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where E: Extend<Self::Item>, Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where Self: Sized, B: Default + Extend<Self::Item>, F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where T: 'a, Self: Sized + DoubleEndedIterator<Item = &'a mut T>, P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, such that all those that return true precede all those that return false. Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where Self: Sized, P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Output = B>,

An iterator method that applies a function as long as it returns successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where Self: Sized, F: FnMut(Self::Item) -> R, R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where Self: Sized, F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where Self: Sized, F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing operation. Read more
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
where Self: Sized, R: Try<Output = Self::Item>, <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where Self: Sized, F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where Self: Sized, F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where Self: Sized, F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns the first non-none result. Read more
Source§

fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where Self: Sized, R: Try<Output = bool>, <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where Self: Sized, P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where P: FnMut(Self::Item) -> bool, Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where Self: Sized, Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where Self: Sized, Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where B: Ord, Self: Sized, F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where B: Ord, Self: Sized, F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where FromA: Default + Extend<A>, FromB: Default + Extend<B>, Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where T: Copy + 'a, Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where T: Clone + 'a, Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where Self: Sized, S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where Self: Sized, P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where I: IntoIterator<Item = Self::Item>, Self::Item: Ord, Self: Sized,

Lexicographically compares the elements of this Iterator with those of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where Self: Sized, I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Lexicographically compares the 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 more
Source§

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>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialEq<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are equal to those of another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where Self: Sized, I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialEq<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are not equal to those of another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where Self: Sized, Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where Self: Sized, F: FnMut(Self::Item) -> K, K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction function. Read more
Source§

impl<T: TypedExternal + Ord> Ord for ExternalPtr<T>

Source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl<T: TypedExternal + PartialEq> PartialEq for ExternalPtr<T>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T: TypedExternal + PartialOrd> PartialOrd for ExternalPtr<T>

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl<T: TypedExternal> Pointer for ExternalPtr<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

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
}
Source§

type Error = SexpError

The error type returned when conversion fails.
Source§

fn try_from_sexp(sexp: SEXP) -> Result<Self, Self::Error>

Attempt to convert an R SEXP to this Rust type. Read more
Source§

unsafe fn try_from_sexp_unchecked(sexp: SEXP) -> Result<Self, Self::Error>

Convert from SEXP without thread safety checks. Read more
Source§

impl<T: TypedExternal + Eq> Eq for ExternalPtr<T>

Source§

impl<T: TypedExternal + FusedIterator> FusedIterator for ExternalPtr<T>

Source§

impl<T: TypedExternal + Send> Send for ExternalPtr<T>

Auto Trait Implementations§

§

impl<T> Freeze for ExternalPtr<T>

§

impl<T> RefUnwindSafe for ExternalPtr<T>
where T: RefUnwindSafe,

§

impl<T> !Sync for ExternalPtr<T>

§

impl<T> Unpin for ExternalPtr<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for ExternalPtr<T>

§

impl<T> UnwindSafe for ExternalPtr<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<I> IntoIterator for I
where I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> RClone for T
where T: Clone,

Source§

fn clone(&self) -> T

Create a deep copy of this value.
Source§

impl<T> RDebug for T
where T: Debug,

Source§

fn debug_str(&self) -> String

Get a compact debug string representation.
Source§

fn debug_str_pretty(&self) -> String

Get a pretty-printed debug string with indentation.
Source§

impl<T> RDefault for T
where T: Default,

Source§

fn default() -> T

Create a new instance with default values.
Source§

impl<T> RDisplay for T
where T: Display,

Source§

fn as_r_string(&self) -> String

Convert to a user-friendly string.
Source§

impl<T> RHash for T
where T: Hash,

Source§

fn hash(&self) -> i64

Compute a hash of this value.
Source§

impl<T> ROrd for T
where T: Ord,

Source§

fn cmp(&self, other: &T) -> i32

Compare with another value. Read more
Source§

impl<T> RPartialOrd for T
where T: PartialOrd,

Source§

fn partial_cmp(&self, other: &T) -> Option<i32>

Compare with another value, returning None if incomparable. Read more
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.