Skip to main content

IterStringData

Struct IterStringData 

Source
pub struct IterStringData<I>
where I: Iterator<Item = String>,
{ state: IterState<I, String>, }
Expand description

Iterator-backed string vector.

Wraps an iterator producing String values and exposes it as an ALTREP character vector.

§Performance Warning

Unlike other Iter*Data types, accessing ANY element forces full materialization of the entire iterator. This is because R’s AltStringData::elt() returns a borrowed &str, which requires stable storage. The internal RefCell cannot provide the required lifetime, so all strings must be materialized upfront.

This means:

  • elt(0) on a million-element iterator will generate ALL million strings
  • There is no lazy evaluation benefit for string iterators
  • Memory usage equals the full vector regardless of access patterns

For truly lazy string ALTREP, consider implementing a custom type that stores strings in a way that allows borrowing without full materialization (e.g., arena allocation or caching generated strings incrementally).

§Example

use miniextendr_api::altrep_data::IterStringData;

let iter = (0..5).map(|x| format!("item_{}", x));
let data = IterStringData::from_iter(iter, 5);
// First access to ANY element will materialize all 5 strings

Fields§

§state: IterState<I, String>

Implementations§

Source§

impl<I> IterStringData<I>
where I: Iterator<Item = String>,

Source

pub fn from_iter(iter: I, len: usize) -> Self

Create from an iterator with explicit length.

Source§

impl<I> IterStringData<I>
where I: ExactSizeIterator<Item = String>,

Source

pub fn from_exact_iter(iter: I) -> Self

Create from an ExactSizeIterator (length auto-detected).

Trait Implementations§

Source§

impl<I: Iterator<Item = String> + 'static> AltString for IterStringData<I>

Source§

fn elt(x: SEXP, i: R_xlen_t) -> SEXP

Get string element at index. Returns CHARSXP. This is REQUIRED for ALTSTRING - there is no default.
Source§

const HAS_SET_ELT: bool = false

Set to true to register set_elt.
Source§

fn set_elt(_x: SEXP, _i: R_xlen_t, _v: SEXP)

Set element (for mutable strings).
Source§

const HAS_IS_SORTED: bool = false

Set to true to register is_sorted.
Source§

fn is_sorted(_x: SEXP) -> i32

Sortedness hint.
Source§

const HAS_NO_NA: bool = false

Set to true to register no_na.
Source§

fn no_na(_x: SEXP) -> i32

NA-free hint.
Source§

impl<I> AltStringData for IterStringData<I>
where I: Iterator<Item = String>,

Source§

fn elt(&self, i: usize) -> Option<&str>

Get the string element at index i. Read more
Source§

fn is_sorted(&self) -> Option<Sortedness>

Optional: sortedness hint.
Source§

fn no_na(&self) -> Option<bool>

Optional: does this vector contain any NA values?
Source§

impl<I: Iterator<Item = String> + 'static> AltVec for IterStringData<I>

Source§

const HAS_DATAPTR: bool = false

Set to true to register dataptr.
Source§

fn dataptr(_x: SEXP, _writable: bool) -> *mut c_void

Get raw data pointer.
Source§

const HAS_DATAPTR_OR_NULL: bool = false

Set to true to register dataptr_or_null.
Source§

fn dataptr_or_null(_x: SEXP) -> *const c_void

Get data pointer without forcing materialization.
Source§

const HAS_EXTRACT_SUBSET: bool = false

Set to true to register extract_subset.
Source§

fn extract_subset(_x: SEXP, _indx: SEXP, _call: SEXP) -> SEXP

Optimized subsetting.
Source§

impl<I: Iterator<Item = String> + 'static> Altrep for IterStringData<I>

Source§

const GUARD: AltrepGuard = crate::altrep_traits::AltrepGuard::RUnwind

The guard mode for all ALTREP trampolines on this type. Read more
Source§

fn length(x: SEXP) -> R_xlen_t

Returns the length of the ALTREP vector. This is REQUIRED - R cannot determine vector length without it.
Source§

const HAS_SERIALIZED_STATE: bool = false

Set to true to register serialized_state.
Source§

fn serialized_state(_x: SEXP) -> SEXP

Return serialization state.
Source§

const HAS_UNSERIALIZE: bool = false

Set to true to register unserialize.
Source§

fn unserialize(_class: SEXP, _state: SEXP) -> SEXP

Reconstruct ALTREP from serialized state.
Source§

const HAS_UNSERIALIZE_EX: bool = false

Set to true to register unserialize_ex.
Source§

fn unserialize_ex( _class: SEXP, _state: SEXP, _attr: SEXP, _objf: i32, _levs: i32, ) -> SEXP

Extended unserialization with attributes.
Source§

const HAS_DUPLICATE: bool = false

Set to true to register duplicate.
Source§

fn duplicate(_x: SEXP, _deep: bool) -> SEXP

Duplicate the ALTREP object.
Source§

const HAS_DUPLICATE_EX: bool = false

Set to true to register duplicate_ex.
Source§

fn duplicate_ex(_x: SEXP, _deep: bool) -> SEXP

Extended duplication.
Source§

const HAS_COERCE: bool = false

Set to true to register coerce.
Source§

fn coerce(_x: SEXP, _to_type: SEXPTYPE) -> SEXP

Coerce to another type.
Source§

const HAS_INSPECT: bool = false

Set to true to register inspect.
Source§

fn inspect( _x: SEXP, _pre: i32, _deep: i32, _pvec: i32, _inspect_subtree: Option<unsafe extern "C-unwind" fn(SEXP, i32, i32, i32)>, ) -> bool

Custom inspection for .Internal(inspect()).
Source§

impl<I> AltrepLen for IterStringData<I>
where I: Iterator<Item = String>,

Source§

fn len(&self) -> usize

Returns the length of this ALTREP vector.
Source§

fn is_empty(&self) -> bool

Returns true if the vector is empty.
Source§

impl<I: Iterator<Item = String> + 'static> InferBase for IterStringData<I>

Source§

const BASE: RBase = crate::altrep::RBase::String

The inferred R base type.
Source§

unsafe fn make_class( class_name: *const i8, pkg_name: *const i8, ) -> R_altrep_class_t

Create the ALTREP class handle. Read more
Source§

unsafe fn install_methods(cls: R_altrep_class_t)

Install ALTREP methods on the class. Read more
Source§

impl<I: Iterator<Item = String> + 'static> TypedExternal for IterStringData<I>

Source§

const TYPE_NAME: &'static str = "IterStringData"

The type name as a static string (for debugging and display)
Source§

const TYPE_NAME_CSTR: &'static [u8] = b"IterStringData\0"

The type name as a null-terminated C string (for R tag display)
Source§

const TYPE_ID_CSTR: &'static [u8] = b"miniextendr_api::altrep::IterStringData\0"

Namespaced type ID as a null-terminated C string (for type checking). Read more

Auto Trait Implementations§

§

impl<I> !Freeze for IterStringData<I>

§

impl<I> !RefUnwindSafe for IterStringData<I>

§

impl<I> Send for IterStringData<I>
where I: Send,

§

impl<I> !Sync for IterStringData<I>

§

impl<I> Unpin for IterStringData<I>
where I: Unpin,

§

impl<I> UnsafeUnpin for IterStringData<I>
where I: UnsafeUnpin,

§

impl<I> UnwindSafe for IterStringData<I>
where I: UnwindSafe,

Blanket Implementations§

Source§

impl<T> AltrepExtract for T
where T: TypedExternal,

Source§

unsafe fn altrep_extract_ref(x: SEXP) -> &'static T

Extract a shared reference from the ALTREP data1 slot. Read more
Source§

unsafe fn altrep_extract_mut(x: SEXP) -> &'static mut T

Extract a mutable reference from the ALTREP data1 slot. Read more
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> 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<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.