pub trait ConditionallySelectable: Copy {
// Required method
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self;
// Provided methods
fn conditional_assign(&mut self, other: &Self, choice: Choice) { ... }
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice) { ... }
}
Expand description
A type which can be conditionally selected in constant time.
This trait also provides generic implementations of conditional assignment and conditional swaps.
Required Methods§
sourcefn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
Select a
or b
according to choice
.
§Returns
a
ifchoice == Choice(0)
;b
ifchoice == Choice(1)
.
This function should execute in constant time.
§Example
use subtle::ConditionallySelectable;
let x: u8 = 13;
let y: u8 = 42;
let z = u8::conditional_select(&x, &y, 0.into());
assert_eq!(z, x);
let z = u8::conditional_select(&x, &y, 1.into());
assert_eq!(z, y);
Provided Methods§
sourcefn conditional_assign(&mut self, other: &Self, choice: Choice)
fn conditional_assign(&mut self, other: &Self, choice: Choice)
Conditionally assign other
to self
, according to choice
.
This function should execute in constant time.
§Example
use subtle::ConditionallySelectable;
let mut x: u8 = 13;
let mut y: u8 = 42;
x.conditional_assign(&y, 0.into());
assert_eq!(x, 13);
x.conditional_assign(&y, 1.into());
assert_eq!(x, 42);
sourcefn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
Conditionally swap self
and other
if choice == 1
; otherwise,
reassign both unto themselves.
This function should execute in constant time.
§Example
use subtle::ConditionallySelectable;
let mut x: u8 = 13;
let mut y: u8 = 42;
u8::conditional_swap(&mut x, &mut y, 0.into());
assert_eq!(x, 13);
assert_eq!(y, 42);
u8::conditional_swap(&mut x, &mut y, 1.into());
assert_eq!(x, 42);
assert_eq!(y, 13);
Object Safety§
This trait is not object safe.
Implementations on Foreign Types§
source§impl ConditionallySelectable for Ordering
impl ConditionallySelectable for Ordering
Ordering
is #[repr(i8)]
where:
Less
=> -1Equal
=> 0Greater
=> 1
Given this, it’s possible to operate on orderings as if they’re integers, which allows leveraging conditional masking for predication.