Skip to main content

StreamChunker

Struct StreamChunker 

Source
pub struct StreamChunker<R> { /* private fields */ }
Expand description

Streaming iterator that yields content-defined chunks from a reader.

StreamChunker is the primary interface for applying FastCDC to data streams in a memory-efficient manner. It reads data incrementally from any Read source and applies content-defined chunking to produce variable-sized chunks suitable for compression, deduplication, and storage.

§Design Goals

  • Streaming: Process arbitrarily large files without loading entire contents
  • Zero-copy (internal): Minimize data copying within the chunker
  • Bounded memory: Fixed buffer size regardless of input size
  • Deterministic: Same input always produces identical chunk boundaries
  • Iterator-based: Idiomatic Rust API that composes with other iterators

§Buffering Strategy

The chunker maintains a fixed-size internal buffer to handle the mismatch between read boundaries (determined by the OS/filesystem) and chunk boundaries (determined by content):

  • Buffer size: 2 * max_chunk_size (default: ~128 KB)
  • Refill trigger: When available data < max_chunk_size
  • Shift threshold: When cursor advances beyond buffer midpoint
  • EOF handling: Flushes remaining data as final chunk

§Buffer Management Example

Initial state (empty buffer):
[__________________________________|__________________________________]
 0                                 cursor                          2*z

After reading (filled to cursor):
[##################################|__________________________________]
 0                                 cursor=filled                   2*z

After consuming one chunk (cursor advances):
[################XXXXXXXXXXXXXXXXXX|__________________________________]
 0              consumed          cursor                           2*z
                (next chunk)       filled

After shift (move unconsumed data to start):
[XXXXXXXXXXXXXXXXXX________________|__________________________________]
 0                cursor           filled                          2*z
 (new position)

§Chunk Boundary Guarantees

The chunker guarantees that:

  1. Minimum size: Every chunk (except possibly the last) is ≥ min_size
  2. Maximum size: Every chunk is ≤ max_size (strictly enforced)
  3. Determinism: Given the same input and parameters, chunk boundaries are identical
  4. Completeness: All input bytes appear in exactly one chunk (no gaps, no overlaps)

§Performance Considerations

  • Memory allocation: Each chunk is copied to an owned Vec<u8>. For zero-allocation iteration, consider using StreamChunkerSlice (if available) or process chunks in-place within the iterator.
  • I/O pattern: Reads in large blocks (up to max_chunk_size) to minimize syscalls. Works efficiently with buffered readers but not required.
  • CPU cost: Gear hash computation is the bottleneck (~500 MB/s). Consider parallel chunking of independent streams if throughput is critical.

§Examples

§Basic Usage

use hexz_core::algo::dedup::cdc::StreamChunker;
use hexz_core::algo::dedup::dcam::DedupeParams;
use std::fs::File;

let file = File::open("data.bin")?;
let params = DedupeParams::default();
let chunker = StreamChunker::new(file, params);

for chunk_result in chunker {
    let chunk = chunk_result?;
    println!("Chunk: {} bytes", chunk.len());
}

§With Compression Pipeline

use hexz_core::algo::dedup::cdc::StreamChunker;
use hexz_core::algo::dedup::dcam::DedupeParams;
use std::fs::File;
use std::collections::HashMap;

let file = File::open("memory.raw")?;
let params = DedupeParams::default();
let chunker = StreamChunker::new(file, params);

let mut dedup_map: HashMap<u64, usize> = HashMap::new();
let mut unique_chunks = Vec::new();

for chunk_result in chunker {
    let chunk = chunk_result?;
    let hash = crc32fast::hash(&chunk) as u64;

    if !dedup_map.contains_key(&hash) {
        let chunk_id = unique_chunks.len();
        dedup_map.insert(hash, chunk_id);
        // Compress and store chunk
        unique_chunks.push(chunk);
    }
}

println!("Stored {} unique chunks", unique_chunks.len());

§Custom Parameters

use hexz_core::algo::dedup::cdc::StreamChunker;
use hexz_core::algo::dedup::dcam::DedupeParams;
use std::fs::File;

let file = File::open("disk.raw")?;

// Custom parameters: larger chunks for better compression ratio
let mut params = DedupeParams::default();
params.f = 15; // 32KB average (was 16KB)
params.m = 8192; // 8KB minimum (was 2KB)
params.z = 131072; // 128KB maximum (was 64KB)

let chunker = StreamChunker::new(file, params);

let chunk_sizes: Vec<usize> = chunker
    .map(|res| res.map(|chunk| chunk.len()))
    .collect::<Result<_, _>>()?;

let avg_size: usize = chunk_sizes.iter().sum::<usize>() / chunk_sizes.len();
println!("Average chunk size: {} bytes", avg_size);

Implementations§

Source§

impl<R: Read> StreamChunker<R>

Source

pub fn new(reader: R, params: DedupeParams) -> Self

Creates a new streaming chunker with the specified deduplication parameters.

This constructor initializes the chunker’s internal buffer and extracts the relevant FastCDC parameters. The chunker is ready to begin iteration immediately after construction; no separate initialization step is required.

§Parameters
  • reader: Data source implementing Read. This can be:

    • File for reading from disk
    • Cursor<Vec<u8>> for in-memory data
    • BufReader<File> for buffered I/O (redundant but not harmful)
    • Any other Read implementation (network streams, pipes, etc.)
  • params: FastCDC parameters controlling chunk size distribution. Key fields:

    • params.f: Fingerprint bits (average chunk size = 2^f)
    • params.m: Minimum chunk size in bytes
    • params.z: Maximum chunk size in bytes
    • params.w: Rolling hash window size (informational, not used here)
§Returns

A new StreamChunker ready to yield chunks via iteration. The chunker takes ownership of the reader and will consume it as iteration proceeds.

§Memory Allocation

Allocates a buffer of 2 * params.z bytes (or 2 MB, whichever is larger). This is a one-time allocation that persists for the entire stream:

  • Default settings (z=64KB): ~128 KB per chunker
  • Large chunks (z=128KB): ~256 KB per chunker
  • Small chunks (z=16KB): ~2 MB per chunker (due to 2MB minimum)

The 2MB minimum prevents excessive refill operations for small chunk sizes.

§Panics

May panic if memory allocation fails (extremely rare on modern systems with virtual memory, but possible in constrained environments). For default parameters this allocates ~128 KB, well within typical stack/heap limits.

§Performance Notes
  • No I/O in constructor: Data reading is deferred until first next() call
  • Deterministic: Given the same input and parameters, produces identical chunks
  • Thread-safe (if R is): The chunker itself has no shared state
§Examples
§Default Parameters
use hexz_core::algo::dedup::cdc::StreamChunker;
use hexz_core::algo::dedup::dcam::DedupeParams;
use std::fs::File;

let file = File::open("data.bin")?;
let chunker = StreamChunker::new(file, DedupeParams::default());
// Chunker is ready to iterate
§Custom Parameters
use hexz_core::algo::dedup::cdc::StreamChunker;
use hexz_core::algo::dedup::dcam::DedupeParams;
use std::fs::File;

let file = File::open("disk.raw")?;
let params = DedupeParams {
    f: 15,       // 32KB average
    m: 4096,     // 4KB minimum
    z: 131072,   // 128KB maximum
    w: 48,       // Window size (not used by StreamChunker)
    v: 16,       // Metadata overhead (not used by StreamChunker)
};
let chunker = StreamChunker::new(file, params);

Trait Implementations§

Source§

impl<R: Read> Iterator for StreamChunker<R>

Source§

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

Yields the next content-defined chunk.

This is the core iterator method that drives the chunking process. Each call performs the following operations:

§Algorithm
  1. Check for data: If buffer is empty and EOF not reached, refill
  2. Handle EOF: If no data available after refill, return None
  3. Determine available window: Compute bytes available for chunking
  4. Apply FastCDC:
    • If available < min_size: Return all available bytes (last chunk)
    • Else: Run FastCDC on window [cursor..min(cursor+max_size, filled)]
  5. Extract chunk: Copy chunk bytes to new Vec<u8>, advance cursor
  6. Return: Yield Some(Ok(chunk))
§FastCDC Integration

The method delegates to the fastcdc crate’s FastCDC::new() constructor, which implements the normalized chunking algorithm. The returned chunk length respects all size constraints:

  • No chunk < min_size (except final chunk)
  • No chunk > max_size (strictly enforced)
  • Average chunk size ≈ avg_size = 2^f
§Chunk Length Determination

The algorithm chooses chunk length as follows:

ConditionAction
available < min_sizeReturn all available bytes
FastCDC finds cut pointUse FastCDC-determined length
available >= max_size && no cut pointForce cut at max_size
EOF reached && no cut pointReturn all remaining bytes
Buffer full && no cut pointForce cut at max_size
OtherReturn all available bytes
§Returns
  • Some(Ok(chunk)) - Next chunk successfully extracted and copied
  • Some(Err(e)) - I/O error occurred during refill
  • None - Stream exhausted (no more data available)
§Errors

Returns Some(Err(e)) if the underlying reader encounters an I/O error during refill. After an error, the iterator should be considered invalid (further calls may panic or return inconsistent results).

Common error causes:

  • File read errors (permissions, disk errors)
  • Network errors (timeouts, connection reset)
  • Interrupted system calls (usually auto-retried)
§Chunk Size Guarantees

The returned chunks satisfy these constraints:

  • Minimum: ≥ min_size (except possibly the last chunk)
  • Maximum: ≤ max_size (always enforced, never violated)
  • Average: ≈ avg_size = 2^f (statistical expectation)
  • Last chunk: May be smaller than min_size if EOF reached
§Memory Allocation

Each chunk is copied to a new Vec<u8>. For zero-copy iteration within the buffer lifetime, consider modifying the API to return slices with appropriate lifetimes (future enhancement).

§Examples
use hexz_core::algo::dedup::cdc::StreamChunker;
use hexz_core::algo::dedup::dcam::DedupeParams;
use std::fs::File;

let file = File::open("data.bin")?;
let mut chunker = StreamChunker::new(file, DedupeParams::default());

// First chunk
if let Some(Ok(chunk)) = chunker.next() {
    println!("First chunk: {} bytes", chunk.len());
}

// Iterate remaining chunks
for chunk_result in chunker {
    let chunk = chunk_result?;
    // Process chunk...
}
§Performance Characteristics
  • Amortized time: O(chunk_size) per chunk (dominated by copying)
  • Space: O(chunk_size) allocation per chunk yielded
  • Throughput: ~500 MB/s on modern CPUs (bottlenecked by Gear hash)
Source§

type Item = Result<Vec<u8>, Error>

The type of the elements being iterated over.
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 size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. 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.0.0 · Source§

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

Returns the nth element of the iterator. 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 adjacent 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 adjacent 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 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 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 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
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

Auto Trait Implementations§

§

impl<R> Freeze for StreamChunker<R>
where R: Freeze,

§

impl<R> RefUnwindSafe for StreamChunker<R>
where R: RefUnwindSafe,

§

impl<R> Send for StreamChunker<R>
where R: Send,

§

impl<R> Sync for StreamChunker<R>
where R: Sync,

§

impl<R> Unpin for StreamChunker<R>
where R: Unpin,

§

impl<R> UnsafeUnpin for StreamChunker<R>
where R: UnsafeUnpin,

§

impl<R> UnwindSafe for StreamChunker<R>
where R: UnwindSafe,

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
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<I> IteratorRandom for I
where I: Iterator,

Source§

fn choose<R>(self, rng: &mut R) -> Option<Self::Item>
where R: Rng + ?Sized,

Choose one element at random from the iterator. Read more
Source§

fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item>
where R: Rng + ?Sized,

Choose one element at random from the iterator. Read more
Source§

fn choose_multiple_fill<R>(self, rng: &mut R, buf: &mut [Self::Item]) -> usize
where R: Rng + ?Sized,

Collects values at random from the iterator into a supplied buffer until that buffer is filled. Read more
Source§

fn choose_multiple<R>(self, rng: &mut R, amount: usize) -> Vec<Self::Item>
where R: Rng + ?Sized,

Collects amount values at random from the iterator into a vector. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more