pub struct ZiPatchReader<R> { /* private fields */ }Expand description
Iterator over the Chunks in a ZiPatch stream.
ZiPatchReader wraps any std::io::Read source and yields one
Chunk per call to Iterator::next. It validates the 12-byte file
magic on construction, then reads chunks sequentially until the EOF_
terminator is encountered or an error occurs.
§Stream contract
- Magic — the first 12 bytes must be
\x91ZIPATCH\r\n\x1a\n. Any mismatch returnsZiPatchError::InvalidMagicfromZiPatchReader::new. - Framing — every chunk is a length-prefixed frame:
[body_len: u32 BE] [tag: 4 B] [body: body_len B] [crc32: u32 BE]. - CRC32 — computed over
tag ++ body. Verification is enabled by default; useZiPatchReader::skip_checksum_verificationto disable it. - Termination — the
EOF_chunk is consumed internally and causes the iterator to returnNone. CallZiPatchReader::is_completeafter iteration to distinguish a clean end from a truncated stream. - Fused — once
Noneis returned (either fromEOF_or an error), subsequent calls tonextalso returnNone. The iterator implementsstd::iter::FusedIterator.
§Errors
Each call to Iterator::next returns Some(Err(e)) on parse failure,
then None on all future calls. Possible errors include:
ZiPatchError::TruncatedPatch— stream ended beforeEOF_.ZiPatchError::OversizedChunk— a declared chunk body exceeds 512 MiB.ZiPatchError::ChecksumMismatch— CRC32 verification failed.ZiPatchError::UnknownChunkTag— unrecognised 4-byte tag.ZiPatchError::Io— underlying I/O failure.
§Example
Build a minimal in-memory patch (magic + ADIR + EOF_) and iterate it:
use std::io::Cursor;
use zipatch_rs::{Chunk, ZiPatchReader};
// Helper: wrap tag + body into a correctly framed chunk with CRC32.
fn make_chunk(tag: &[u8; 4], body: &[u8]) -> Vec<u8> {
let mut crc_input = Vec::new();
crc_input.extend_from_slice(tag);
crc_input.extend_from_slice(body);
let crc = crc32fast::hash(&crc_input);
let mut out = Vec::new();
out.extend_from_slice(&(body.len() as u32).to_be_bytes());
out.extend_from_slice(tag);
out.extend_from_slice(body);
out.extend_from_slice(&crc.to_be_bytes());
out
}
// 12-byte ZiPatch magic.
let magic: [u8; 12] = [0x91, 0x5A, 0x49, 0x50, 0x41, 0x54, 0x43, 0x48, 0x0D, 0x0A, 0x1A, 0x0A];
// ADIR body: u32 BE name_len (7) + b"created".
let mut adir_body = Vec::new();
adir_body.extend_from_slice(&7u32.to_be_bytes());
adir_body.extend_from_slice(b"created");
let mut patch = Vec::new();
patch.extend_from_slice(&magic);
patch.extend_from_slice(&make_chunk(b"ADIR", &adir_body));
patch.extend_from_slice(&make_chunk(b"EOF_", &[]));
let chunks: Vec<_> = ZiPatchReader::new(Cursor::new(patch))
.unwrap()
.collect::<Result<_, _>>()
.unwrap();
assert_eq!(chunks.len(), 1);
assert!(matches!(chunks[0], Chunk::AddDirectory(_)));Implementations§
Source§impl<R: Read> ZiPatchReader<R>
impl<R: Read> ZiPatchReader<R>
Sourcepub fn new(reader: R) -> Result<Self>
pub fn new(reader: R) -> Result<Self>
Wrap reader and validate the leading 12-byte ZiPatch magic.
Consumes exactly 12 bytes from reader. The magic is the byte sequence
0x91 0x5A 0x49 0x50 0x41 0x54 0x43 0x48 0x0D 0x0A 0x1A 0x0A
(i.e. \x91ZIPATCH\r\n\x1a\n).
The reader is wrapped in a std::io::BufReader internally, so the
many small typed reads the chunk parser issues (4-byte size, 4-byte
tag, 5-byte SQPK prefix, …) coalesce into a small number of syscalls.
Callers do not need to pre-wrap a raw std::fs::File or other
unbuffered source.
CRC32 verification is enabled by default. Call
ZiPatchReader::skip_checksum_verification before iterating to
disable it.
§Errors
ZiPatchError::InvalidMagic— the first 12 bytes do not match the expected magic.ZiPatchError::Io— an I/O error occurred while reading the magic.
Sourcepub fn with_patch_name(self, name: impl Into<String>) -> Self
pub fn with_patch_name(self, name: impl Into<String>) -> Self
Attach a human-readable identifier to this patch stream.
The identifier is stamped onto every
SequentialCheckpoint the apply
driver emits so a future
resume_apply_to call can
detect a checkpoint that was persisted for a different patch and
refuse to resume from it.
Typical value is the patch filename (e.g. "H2017.07.11.0000.0000a.patch").
No interpretation is performed — the string is compared verbatim.
Sourcepub fn patch_name(&self) -> Option<&str>
pub fn patch_name(&self) -> Option<&str>
Returns the caller-supplied patch identifier, if any.
Set by Self::with_patch_name; None otherwise.
Sourcepub fn verify_checksums(self) -> Self
pub fn verify_checksums(self) -> Self
Enable per-chunk CRC32 verification (the default).
This is the default state after ZiPatchReader::new. Calling this
method after construction is only necessary if
ZiPatchReader::skip_checksum_verification was previously called.
Sourcepub fn skip_checksum_verification(self) -> Self
pub fn skip_checksum_verification(self) -> Self
Disable per-chunk CRC32 verification.
Useful when the source has already been verified out-of-band (e.g. a download hash was checked before the file was opened), or when processing known-good test data where the overhead is unnecessary.
Sourcepub fn is_complete(&self) -> bool
pub fn is_complete(&self) -> bool
Returns true if iteration reached the EOF_ terminator cleanly.
A false return after next() yields None indicates the stream was
truncated — the download or file copy was incomplete. In that case the
iterator stopped because of a ZiPatchError::TruncatedPatch error,
not because the patch finished normally.
Sourcepub fn bytes_read(&self) -> u64
pub fn bytes_read(&self) -> u64
Returns the running total of bytes consumed from the patch stream.
Starts at 12 after ZiPatchReader::new (the magic header has been
read) and increases monotonically by the size of each chunk’s wire
frame after each successful Iterator::next call. Includes the
EOF_ terminator’s frame.
On parse error, the counter is not advanced past the failing chunk — it reflects the byte offset at the start of that chunk’s length prefix, not the broken position somewhere inside its frame. Use this offset together with the surfaced error to point a user at where the patch became unreadable.
This is the same counter that the
apply_to driver attaches to
ChunkEvent::bytes_read when firing
progress events. Useful for the bytes_applied / total_patch_size
ratio in a progress bar.
Sourcepub fn last_tag(&self) -> Option<[u8; 4]>
pub fn last_tag(&self) -> Option<[u8; 4]>
Returns the 4-byte ASCII tag of the most recently yielded chunk.
None before the first successful Iterator::next call and after
the EOF_ terminator has been consumed (or an error has been
surfaced). Used by apply_to to
populate ChunkEvent::kind.
Sourcepub fn current_chunk_body_offset(&self) -> Option<u64>
pub fn current_chunk_body_offset(&self) -> Option<u64>
Returns the absolute patch-file offset of the body of the most recently yielded chunk.
The chunk body begins immediately after the 8-byte
[body_len: u32 BE, tag: [u8; 4]] frame header, so the value points at
the first byte of the body — for SQPK chunks that is the start of
[inner_size: i32 BE, sub_cmd: u8, …]; for the other chunk types it
is the start of the variant-specific body.
Index builders use this to compute absolute patch-file offsets for
SqpkAddData::data, SqpkFile block payloads, and SqpkHeader::header_data
without re-walking the stream.
None before the first chunk is successfully yielded. A parse failure
leaves the previously-set value untouched (the offset returned by this
method always points at a chunk that was successfully parsed).
Source§impl ZiPatchReader<BufReader<File>>
impl ZiPatchReader<BufReader<File>>
Sourcepub fn from_path(path: impl AsRef<Path>) -> Result<Self>
pub fn from_path(path: impl AsRef<Path>) -> Result<Self>
Open the file at path, wrap it in a std::io::BufReader, and
validate the ZiPatch magic.
This is a convenience constructor equivalent to:
let reader = ZiPatchReader::new(BufReader::new(File::open("patch.patch").unwrap())).unwrap();§Errors
ZiPatchError::Io— the file could not be opened.ZiPatchError::InvalidMagic— the file does not start with theZiPatchmagic bytes.
Source§impl<R: Read> ZiPatchReader<R>
impl<R: Read> ZiPatchReader<R>
Sourcepub fn apply_to(self, ctx: &mut ApplyContext) -> Result<()>
pub fn apply_to(self, ctx: &mut ApplyContext) -> Result<()>
Iterate every chunk in the patch stream and apply each one to ctx.
This is the primary high-level entry point for applying a patch. It
drives the ZiPatchReader iterator to completion, calling
Apply::apply on each yielded Chunk in stream order.
Chunks must be applied in order — the ZiPatch format is a
sequential log and later chunks may depend on filesystem state produced
by earlier ones (e.g. a directory created by an ADIR chunk that a
subsequent SQPK AddFile writes into).
§Errors
Stops at the first parse or apply error and returns it immediately. Any filesystem changes already applied by earlier chunks are not rolled back — the format does not provide transactional semantics.
Possible error variants:
ZiPatchError::Io— underlying I/O failure (read or write).ZiPatchError::InvalidMagic— caught at construction, not here.ZiPatchError::UnknownChunkTag— an unrecognised 4-byte tag was encountered.ZiPatchError::ChecksumMismatch— a chunk’s CRC32 did not match.ZiPatchError::TruncatedPatch— the stream ended beforeEOF_.ZiPatchError::NegativeFileOffset— aSqpkFilechunk carried a negative offset.ZiPatchError::Decompress— a compressed block could not be inflated.ZiPatchError::UnsupportedPlatform— aSqpkTargetInfochunk declared aplatform_idoutside0/1/2, and a subsequent SQPK data chunk requestedSqPack.dat/.indexpath resolution.ZiPatchError::Cancelled— an installedApplyObserverrequested cancellation.
§Panics
Never panics under normal operation. The internal
ZiPatchReader::last_tag is unwrapped after a successful
Iterator::next — this is an internal invariant of the iterator
(every Some(Ok(_)) updates the tag) and would only fail on a bug
in this crate.
§Example
use std::fs::File;
use zipatch_rs::{ApplyContext, ZiPatchReader};
let mut ctx = ApplyContext::new("/opt/ffxiv/game");
ZiPatchReader::new(File::open("update.patch").unwrap())
.unwrap()
.apply_to(&mut ctx)
.unwrap();Source§impl<R: Read + Seek> ZiPatchReader<R>
impl<R: Read + Seek> ZiPatchReader<R>
Sourcepub fn resume_apply_to(
self,
ctx: &mut ApplyContext,
from: Option<&SequentialCheckpoint>,
) -> Result<SequentialCheckpoint>
pub fn resume_apply_to( self, ctx: &mut ApplyContext, from: Option<&SequentialCheckpoint>, ) -> Result<SequentialCheckpoint>
Resume a previously interrupted apply from a SequentialCheckpoint.
When from is None, behaves identically to
Self::apply_to except for the return type: a successful run
returns the final SequentialCheckpoint (with
next_chunk_index equal to the total number of chunks consumed,
including the EOF_ terminator-driven loop exit).
When from is Some, the driver fast-forwards the parser past
from.next_chunk_index chunks without applying them, then resumes
the apply loop. If from.in_flight is also Some, the next chunk
(which must be the in-flight SqpkFile::AddFile) is resumed
mid-stream: the target file’s existing partial content is preserved
and the chunk’s remaining blocks are streamed in starting at
in_flight.block_idx.
§Stale-checkpoint detection
If from.patch_name does not match the value supplied via
Self::with_patch_name, or from.patch_size does not match the
total byte length of the underlying reader, the driver emits a
warn! and starts a clean apply from chunk 0 — the same precedent
as the stale-manifest path in indexed apply. The returned
checkpoint in that case carries the new run’s identity.
§ignore_missing and chunk-N safety
The apply loop never re-applies a chunk whose effects already
landed: chunk-boundary checkpoints are recorded after the
chunk’s apply call has returned, so next_chunk_index = N means
chunks [0, N) are confirmed done. There is therefore no need to
flip ApplyContext::ignore_missing just for the resume boundary
— a DeleteFile or DeleteDirectory at chunk N is still a
first attempt and follows the caller’s pre-existing flag setting.
§In-flight AddFile safety check
When resuming an in-flight AddFile, the driver stats the target
file. If the file is missing, or its on-disk length is less than
the checkpoint’s bytes_into_target (e.g. the partial file was
truncated, deleted, or replaced since the crash), the in-flight
state is discarded with a warn! and the chunk is re-applied
from block 0. This is
the only failure mode where a from.in_flight is silently
ignored; a target-path or file-offset mismatch on the resumed
chunk produces the same behaviour.
§Completion checkpoints
A successful run returns a final checkpoint whose
next_chunk_index is one past the last chunk in the patch — i.e.
the index the apply loop would read next if there were more
chunks. Replaying that final checkpoint through this method
returns ZiPatchError::TruncatedPatch: the fast-forward will
run out of chunks before reaching next_chunk_index. Consumers
should detect “patch fully applied” from the Ok(_) return of
the first call (or whatever marker their persistence layer
records alongside the checkpoint) rather than by passing the
completion checkpoint back here.
§Errors
Same vocabulary as Self::apply_to, plus
ZiPatchError::SchemaVersionMismatch when from.schema_version
does not equal apply::SequentialCheckpoint::CURRENT_SCHEMA_VERSION.
The driver refuses to interpret a checkpoint whose layout this
build cannot represent.
§Panics
Never panics under normal operation. Internal invariants are the
same as Self::apply_to.
Trait Implementations§
Source§impl<R: Debug> Debug for ZiPatchReader<R>
impl<R: Debug> Debug for ZiPatchReader<R>
Source§impl<R: Read> Iterator for ZiPatchReader<R>
impl<R: Read> Iterator for ZiPatchReader<R>
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values. Read more1.0.0 (const: unstable) · Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
1.0.0 (const: unstable) · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 (const: unstable) · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.0.0 (const: unstable) · 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 more1.28.0 (const: unstable) · Source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 (const: unstable) · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 (const: unstable) · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse)separator between items
of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse)separator
between items of the original iterator. Read more1.0.0 (const: unstable) · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.21.0 (const: unstable) · Source§fn for_each<F>(self, f: F)
fn for_each<F>(self, f: F)
1.0.0 (const: unstable) · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 (const: unstable) · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 (const: unstable) · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 (const: unstable) · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 (const: unstable) · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 (const: unstable) · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 (const: unstable) · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n elements. Read more1.0.0 (const: unstable) · Source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 (const: unstable) · Source§fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
1.0.0 (const: unstable) · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1.29.0 (const: unstable) · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows)f for each contiguous window of size N over
self and returns an iterator over the outputs of f. Like slice::windows(),
the windows during mapping overlap as well. Read more1.0.0 (const: unstable) · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 (const: unstable) · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read more1.0.0 (const: unstable) · Source§fn collect<B>(self) -> B
fn collect<B>(self) -> B
Source§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into)1.0.0 (const: unstable) · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned)true precede all those that return false. Read more1.27.0 (const: unstable) · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 (const: unstable) · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 (const: unstable) · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 (const: unstable) · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce)1.0.0 (const: unstable) · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 (const: unstable) · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 (const: unstable) · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 (const: unstable) · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find)1.0.0 (const: unstable) · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 (const: unstable) · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 (const: unstable) · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 (const: unstable) · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 (const: unstable) · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 (const: unstable) · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 (const: unstable) · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 (const: unstable) · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 (const: unstable) · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks)N elements of the iterator at a time. Read more1.11.0 (const: unstable) · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read more1.5.0 (const: unstable) · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd elements of
this Iterator with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by)1.5.0 (const: unstable) · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator are lexicographically
less than those of another. Read more1.5.0 (const: unstable) · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator are lexicographically
less or equal to those of another. Read more1.5.0 (const: unstable) · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator are lexicographically
greater than those of another. Read more1.5.0 (const: unstable) · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator are lexicographically
greater than or equal to those of another. Read more