[−][src]Struct subtle::CtOption
The CtOption<T>
type represents an optional value similar to the
Option<T>
type but is intended for
use in constant time APIs.
Any given CtOption<T>
is either Some
or None
, but unlike
Option<T>
these variants are not exposed. The
is_some()
method is used to determine if
the value is Some
, and unwrap_or()
and
unwrap_or_else()
methods are
provided to access the underlying value. The value can also be
obtained with unwrap()
but this will panic
if it is None
.
Functions that are intended to be constant time may not produce
valid results for all inputs, such as square root and inversion
operations in finite field arithmetic. Returning an Option<T>
from these functions makes it difficult for the caller to reason
about the result in constant time, and returning an incorrect
value burdens the caller and increases the chance of bugs.
Methods
impl<T> CtOption<T>
[src]
pub fn new(value: T, is_some: Choice) -> CtOption<T>
[src]
This method is used to construct a new CtOption<T>
and takes
a value of type T
, and a Choice
that determines whether
the optional value should be Some
or not. If is_some
is
false, the value will still be stored but its value is never
exposed.
pub fn unwrap(self) -> T
[src]
This returns the underlying value but panics if it
is not Some
.
pub fn unwrap_or(self, def: T) -> T where
T: ConditionallySelectable,
[src]
T: ConditionallySelectable,
This returns the underlying value if it is Some
or the provided value otherwise.
pub fn unwrap_or_else<F>(self, f: F) -> T where
T: ConditionallySelectable,
F: FnOnce() -> T,
[src]
T: ConditionallySelectable,
F: FnOnce() -> T,
This returns the underlying value if it is Some
or the value produced by the provided closure otherwise.
pub fn is_some(&self) -> Choice
[src]
Returns a true Choice
if this value is Some
.
pub fn is_none(&self) -> Choice
[src]
Returns a true Choice
if this value is None
.
pub fn map<U, F>(self, f: F) -> CtOption<U> where
T: Default + ConditionallySelectable,
F: FnOnce(T) -> U,
[src]
T: Default + ConditionallySelectable,
F: FnOnce(T) -> U,
Returns a None
value if the option is None
, otherwise
returns a CtOption
enclosing the value of the provided closure.
The closure is given the enclosed value or, if the option is
None
, it is provided a dummy value computed using
Default::default()
.
This operates in constant time, because the provided closure is always called.
pub fn and_then<U, F>(self, f: F) -> CtOption<U> where
T: Default + ConditionallySelectable,
F: FnOnce(T) -> CtOption<U>,
[src]
T: Default + ConditionallySelectable,
F: FnOnce(T) -> CtOption<U>,
Returns a None
value if the option is None
, otherwise
returns the result of the provided closure. The closure is
given the enclosed value or, if the option is None
, it
is provided a dummy value computed using Default::default()
.
This operates in constant time, because the provided closure is always called.
pub fn or_else<F>(self, f: F) -> CtOption<T> where
T: ConditionallySelectable,
F: FnOnce() -> CtOption<T>,
[src]
T: ConditionallySelectable,
F: FnOnce() -> CtOption<T>,
Returns self
if it contains a value, and otherwise returns the result of
calling f
. The provided function f
is always called.
Trait Implementations
impl<T: Clone> Clone for CtOption<T>
[src]
impl<T: ConditionallySelectable> ConditionallySelectable for CtOption<T>
[src]
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
[src]
fn conditional_assign(&mut self, other: &Self, choice: Choice)
[src]
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
[src]
impl<T: ConstantTimeEq> ConstantTimeEq for CtOption<T>
[src]
fn ct_eq(&self, rhs: &CtOption<T>) -> Choice
[src]
Two CtOption<T>
s are equal if they are both Some
and
their values are equal, or both None
.
impl<T: Copy> Copy for CtOption<T>
[src]
impl<T: Debug> Debug for CtOption<T>
[src]
Auto Trait Implementations
impl<T> RefUnwindSafe for CtOption<T> where
T: RefUnwindSafe,
T: RefUnwindSafe,
impl<T> Send for CtOption<T> where
T: Send,
T: Send,
impl<T> Sync for CtOption<T> where
T: Sync,
T: Sync,
impl<T> Unpin for CtOption<T> where
T: Unpin,
T: Unpin,
impl<T> UnwindSafe for CtOption<T> where
T: UnwindSafe,
T: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = !
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,