#[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(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).
_marker: PhantomData<T>Implementations§
Source§impl<T: TypedExternal> ExternalPtr<T>
impl<T: TypedExternal> ExternalPtr<T>
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
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.
Sourceunsafe fn create_extptr_sexp_unchecked(any_raw: *mut Box<dyn Any>) -> SEXP
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.
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 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 · 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 + 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>
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 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · 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 · 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 · 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 · 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 · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · 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 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · 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 · 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 · 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 · 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 · 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 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read moreSource§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 · 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 · 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 · 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 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · 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 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · 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 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn rposition<P>(&mut self, predicate: P) -> Option<usize>
fn rposition<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · 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 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · 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 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn rev(self) -> Rev<Self>where
Self: Sized + DoubleEndedIterator,
fn rev(self) -> Rev<Self>where
Self: Sized + DoubleEndedIterator,
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<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 · 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 · 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 · 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 · 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 · 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 · 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 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
Source§impl<T: TypedExternal + Ord> Ord for ExternalPtr<T>
impl<T: TypedExternal + Ord> Ord for ExternalPtr<T>
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§impl<T: TypedExternal> Pointer for ExternalPtr<T>
impl<T: TypedExternal> Pointer 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
}