Trait Step
trait Step: Clone + PartialOrd + Sized
Objects that have a notion of successor and predecessor operations.
The successor operation moves towards values that compare greater. The predecessor operation moves towards values that compare lesser.
Required Methods
fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>)Returns the bounds on the number of successor steps required to get from
starttoendlike [Iterator::size_hint()][Iterator::size_hint()].Returns
(usize::MAX, None)if the number of steps would overflowusize, or is infinite.Invariants
For any
a,b, andn:steps_between(&a, &b) == (n, Some(n))if and only ifStep::forward_checked(&a, n) == Some(b)steps_between(&a, &b) == (n, Some(n))if and only ifStep::backward_checked(&b, n) == Some(a)steps_between(&a, &b) == (n, Some(n))only ifa <= b- Corollary:
steps_between(&a, &b) == (0, Some(0))if and only ifa == b
- Corollary:
steps_between(&a, &b) == (0, None)ifa > b
fn forward_checked(start: Self, count: usize) -> Option<Self>Returns the value that would be obtained by taking the successor of
selfcounttimes.If this would overflow the range of values supported by
Self, returnsNone.Invariants
For any
a,n, andm:Step::forward_checked(a, n).and_then(|x| Step::forward_checked(x, m)) == Step::forward_checked(a, m).and_then(|x| Step::forward_checked(x, n))Step::forward_checked(a, n).and_then(|x| Step::forward_checked(x, m)) == try { Step::forward_checked(a, n.checked_add(m)) }
For any
aandn:Step::forward_checked(a, n) == (0..n).try_fold(a, |x, _| Step::forward_checked(&x, 1))- Corollary:
Step::forward_checked(a, 0) == Some(a)
- Corollary:
fn backward_checked(start: Self, count: usize) -> Option<Self>Returns the value that would be obtained by taking the predecessor of
selfcounttimes.If this would overflow the range of values supported by
Self, returnsNone.Invariants
For any
a,n, andm:Step::backward_checked(a, n).and_then(|x| Step::backward_checked(x, m)) == n.checked_add(m).and_then(|x| Step::backward_checked(a, x))Step::backward_checked(a, n).and_then(|x| Step::backward_checked(x, m)) == try { Step::backward_checked(a, n.checked_add(m)?) }
For any
aandn:Step::backward_checked(a, n) == (0..n).try_fold(a, |x, _| Step::backward_checked(x, 1))- Corollary:
Step::backward_checked(a, 0) == Some(a)
- Corollary:
Provided Methods
fn forward(start: Self, count: usize) -> SelfReturns the value that would be obtained by taking the successor of
selfcounttimes.If this would overflow the range of values supported by
Self, this function is allowed to panic, wrap, or saturate. The suggested behavior is to panic when debug assertions are enabled, and to wrap or saturate otherwise.Unsafe code should not rely on the correctness of behavior after overflow.
Invariants
For any
a,n, andm, where no overflow occurs:Step::forward(Step::forward(a, n), m) == Step::forward(a, n + m)
For any
aandn, where no overflow occurs:Step::forward_checked(a, n) == Some(Step::forward(a, n))Step::forward(a, n) == (0..n).fold(a, |x, _| Step::forward(x, 1))- Corollary:
Step::forward(a, 0) == a
- Corollary:
Step::forward(a, n) >= aStep::backward(Step::forward(a, n), n) == a
unsafe fn forward_unchecked(start: Self, count: usize) -> SelfReturns the value that would be obtained by taking the successor of
selfcounttimes.Safety
It is undefined behavior for this operation to overflow the range of values supported by
Self. If you cannot guarantee that this will not overflow, useforwardorforward_checkedinstead.Invariants
For any
a:- if there exists
bsuch thatb > a, it is safe to callStep::forward_unchecked(a, 1) - if there exists
b,nsuch thatsteps_between(&a, &b) == Some(n), it is safe to callStep::forward_unchecked(a, m)for anym <= n.- Corollary:
Step::forward_unchecked(a, 0)is always safe.
- Corollary:
For any
aandn, where no overflow occurs:Step::forward_unchecked(a, n)is equivalent toStep::forward(a, n)
- if there exists
fn backward(start: Self, count: usize) -> SelfReturns the value that would be obtained by taking the predecessor of
selfcounttimes.If this would overflow the range of values supported by
Self, this function is allowed to panic, wrap, or saturate. The suggested behavior is to panic when debug assertions are enabled, and to wrap or saturate otherwise.Unsafe code should not rely on the correctness of behavior after overflow.
Invariants
For any
a,n, andm, where no overflow occurs:Step::backward(Step::backward(a, n), m) == Step::backward(a, n + m)
For any
aandn, where no overflow occurs:Step::backward_checked(a, n) == Some(Step::backward(a, n))Step::backward(a, n) == (0..n).fold(a, |x, _| Step::backward(x, 1))- Corollary:
Step::backward(a, 0) == a
- Corollary:
Step::backward(a, n) <= aStep::forward(Step::backward(a, n), n) == a
unsafe fn backward_unchecked(start: Self, count: usize) -> SelfReturns the value that would be obtained by taking the predecessor of
selfcounttimes.Safety
It is undefined behavior for this operation to overflow the range of values supported by
Self. If you cannot guarantee that this will not overflow, usebackwardorbackward_checkedinstead.Invariants
For any
a:- if there exists
bsuch thatb < a, it is safe to callStep::backward_unchecked(a, 1) - if there exists
b,nsuch thatsteps_between(&b, &a) == (n, Some(n)), it is safe to callStep::backward_unchecked(a, m)for anym <= n.- Corollary:
Step::backward_unchecked(a, 0)is always safe.
- Corollary:
For any
aandn, where no overflow occurs:Step::backward_unchecked(a, n)is equivalent toStep::backward(a, n)
- if there exists
Implementors
impl Step for i16impl Step for usizeimpl Step for u8impl Step for Ipv6Addrimpl Step for i32impl Step for u128impl Step for charimpl Step for u16impl Step for i64impl Step for u32impl Step for isizeimpl Step for Ipv4Addrimpl Step for i8impl Step for u64impl Step for Charimpl Step for i128