pub struct Secret<P = BooleanGmw, Idx = DefaultIdx> { /* private fields */ }
Implementations§
source§impl<P, Idx: GateIdx> Secret<P, Idx>
impl<P, Idx: GateIdx> Secret<P, Idx>
sourcepub fn from_parts(circuit_id: CircuitId, output_of: GateId<Idx>) -> Self
pub fn from_parts(circuit_id: CircuitId, output_of: GateId<Idx>) -> Self
Create a Secret from raw parts. This method should not be needed in most cases. The user needs to ensure that the global CircuitBuilder has a circuit and gate with the corresponding id’s.
Examples found in repository?
crates/seec/examples/aes_cbc.rs (line 460)
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
fn aes128(
key: &[Secret<BooleanGmw, usize>],
chunk: &[Secret<BooleanGmw, usize>],
use_sc: bool,
) -> Vec<Secret<BooleanGmw, usize>> {
static AES_CIRC: Lazy<SharedCircuit<bool, BooleanGate, usize>> = Lazy::new(|| {
let aes_circ_str = include_str!("../test_resources/bristol-circuits/aes_128.bristol");
BaseCircuit::from_bristol(
seec::bristol::circuit(aes_circ_str).expect("parsing AES circuit failed"),
Load::SubCircuit,
)
.expect("converting AES circuit failed")
.into_shared()
});
let inp = [chunk, key].concat();
if use_sc {
let (output, circ_id) = CircuitBuilder::with_global(|builder| {
let circ_id = builder.push_circuit(AES_CIRC.clone());
(builder.connect_sub_circuit(&inp, circ_id), circ_id)
});
output.connect_to_main(circ_id)
} else {
CircuitBuilder::with_global(|builder| {
let inp = inp.into_iter().map(|sh| {
assert_eq!(0, sh.circuit_id());
sh.gate_id()
});
let out = builder
.get_main_circuit()
.lock()
.add_sub_circuit(&AES_CIRC.lock(), inp);
out.into_iter()
.map(|gate_id| Secret::from_parts(0, gate_id))
.collect()
})
}
}
source§impl<Idx: GateIdx> Secret<BooleanGmw, Idx>
impl<Idx: GateIdx> Secret<BooleanGmw, Idx>
sourcepub fn from_const(circuit_id: CircuitId, constant: bool) -> Self
pub fn from_const(circuit_id: CircuitId, constant: bool) -> Self
Note: Do not use while holding mutable borrow of self.circuit as it will panic!
Examples found in repository?
More examples
crates/seec/examples/privmail.rs (line 94)
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
fn priv_mail_search(
search_queries: &[SearchQueryKeywords],
modifier_chain_share: &str,
mails: &[Mail],
duplication_factor: usize,
) -> (BitVec<usize>, Vec<GateId>) {
debug!(%modifier_chain_share);
let (mut input, modifier_chain_input) = base64_string_to_input(modifier_chain_share, 1);
let modifier_chain_share_input: Vec<_> = modifier_chain_input.into_iter().flatten().collect();
// Decode and initialize the search keywords
let search_keywords: Vec<_> = search_queries
.iter()
.map(|search_query| {
debug!(keyword = %search_query.keyword_truncated);
let (query_input, shares) = base64_string_to_input(&search_query.keyword_truncated, 1);
input.extend_from_bitslice(&query_input);
shares
})
.collect();
assert!(modifier_chain_share_input.len() >= 2 * search_keywords.len() - 1);
// Decode and initialize the target text
let target_texts: Vec<_> = mails
.iter()
.map(|mail| {
debug!(target_text = %mail.secret_share_truncated_block);
let (mail_input, shares) =
base64_string_to_input(&mail.secret_share_truncated_block, duplication_factor);
input.extend_from_bitslice(&mail_input);
shares
})
.collect();
// Search with the keywords over the target texts
let mut search_results = Vec::with_capacity(target_texts.len());
for (j, keyword) in search_keywords.iter().enumerate() {
for (i, target_text) in target_texts.iter().enumerate() {
let mut search_result_per_mail = Secret::from_const(0, false);
if keyword.len() <= target_text.len() {
search_result_per_mail = create_search_circuit(keyword, target_text);
}
if j == 0 {
search_results.push(search_result_per_mail ^ &modifier_chain_share_input[0]);
} else {
search_results[i] = create_chaining_circuit(
&search_results[i],
&search_result_per_mail,
&modifier_chain_share_input[2 * j - 1],
&modifier_chain_share_input[2 * j],
);
}
}
}
let out_ids = search_results
.into_iter()
.map(Secret::into_output)
.collect();
(input, out_ids)
}
pub fn input(circuit_id: CircuitId) -> Self
pub fn sub_circuit_input(circuit_id: CircuitId, gate: BooleanGate) -> Self
pub fn sub_circuit_output(&self) -> Self
sourcepub fn output(&self) -> GateId<Idx>
pub fn output(&self) -> GateId<Idx>
Constructs a Gate::Output
in the circuit with this secret’s value
Examples found in repository?
crates/seec/examples/aes_cbc.rs (line 422)
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
fn aes_cbc_chunk(
key: &[Secret<BooleanGmw, usize>],
chunk: &[Secret<BooleanGmw, usize>],
chaining_state: &mut [Secret<BooleanGmw, usize>],
use_sc: bool,
) {
let inp: Vec<_> = chunk
.iter()
.zip(chaining_state.iter())
.map(|(d, c)| d.clone() ^ c)
.collect();
let output = aes128(key, &inp, use_sc);
chaining_state.clone_from_slice(&output);
for sh in output {
sh.output();
}
}
More examples
crates/seec/examples/sub_circuits.rs (line 38)
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
let input_shares = inputs(8);
let and_outputs = input_shares
.chunks_exact(4)
.fold(vec![], |mut acc, input_chunk| {
let output = and_sc(input_chunk);
acc.push(output);
acc
});
let or_out = or_sc(&and_outputs);
(or_out ^ false).output();
let circuit: Circuit<bool, BooleanGate, DefaultIdx> = CircuitBuilder::global_into_circuit();
let layer_iter = CircuitLayerIter::new(&circuit);
for layer in layer_iter {
dbg!(layer);
}
// let circuit = circuit.into_base_circuit();
// eprintln!("into base");
// circuit.save_dot("sub_circuits.dot").unwrap();
}
crates/seec/examples/simple.rs (line 46)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
fn build_circuit() {
// The `inputs` method is a convenience method to create n input gates for the circuit.
// It returns a Vec<Secret>. In the following, we use try_into() to convert it into
// an array to destructure it
let [a, b, c, d]: [_; 4] = inputs::<DefaultIdx>(4).try_into().unwrap();
// a,b,c,d are `Secret`s representing the output share of a gate. They support
// the standard std::ops traits like BitAnd and BitXor (and their Assign variants) which
// are used to implicitly build the circuit.
// Creates a new Xor gate with the input of a and b. The output is a new Secret
// representing the output of the new gate.
let xor = a ^ b;
// To use a Secret multiple times (connect to gate represented by it to multiple
// different ones), simply use a reference to it (only possibile on the rhs).
let and = c & &d;
// we can still use d but not c
let mut tmp = and ^ d;
// BitAnd and BitXor are also supported, as is Not. See the Secret documentation for
// all operations.
tmp &= !xor;
// `output()` consumes the Secret and creates a new Output gate with its output.
// It returns the gate_id of the Output gate (this is usually not needed).
let _out_gate_id = tmp.output();
}
crates/seec/examples/bristol.rs (line 132)
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
fn compile(compile_args: CompileArgs) -> Result<()> {
let load = match compile_args.simd {
Some(_) => Load::SubCircuit,
None => Load::Circuit,
};
let mut bc: BaseCircuit = BaseCircuit::load_bristol(&compile_args.circuit, load)
.expect("failed to load bristol circuit");
let mut circ = match compile_args.simd {
Some(size) => {
bc.set_simd_size(size);
let circ_input_size = bc.sub_circuit_input_count();
let inputs = inputs::<u32>(circ_input_size);
let bc = bc.into_shared();
let (output, circ_id) = CircuitBuilder::with_global(|builder| {
builder.get_main_circuit().lock().set_simd_size(size);
let circ_id = builder.push_circuit(bc);
let output = builder.connect_sub_circuit(&inputs, circ_id);
(output, circ_id)
});
let main = output.connect_to_main(circ_id);
main.iter().for_each(|s| {
s.output();
});
let circ = CircuitBuilder::global_into_circuit();
ExecutableCircuit::DynLayers(circ)
}
None => ExecutableCircuit::DynLayers(bc.into()),
};
if !compile_args.dyn_layers {
circ = circ.precompute_layers();
}
let out =
BufWriter::new(File::create(&compile_args.output).context("failed to create output file")?);
bincode::serialize_into(out, &circ).context("failed to serialize circuit")?;
Ok(())
}
pub fn into_output(self) -> GateId<Idx>
pub fn connect_to_main_circuit(self) -> Self
sourcepub fn gate_id(&self) -> GateId<Idx>
pub fn gate_id(&self) -> GateId<Idx>
Examples found in repository?
crates/seec/examples/aes_cbc.rs (line 453)
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
fn aes128(
key: &[Secret<BooleanGmw, usize>],
chunk: &[Secret<BooleanGmw, usize>],
use_sc: bool,
) -> Vec<Secret<BooleanGmw, usize>> {
static AES_CIRC: Lazy<SharedCircuit<bool, BooleanGate, usize>> = Lazy::new(|| {
let aes_circ_str = include_str!("../test_resources/bristol-circuits/aes_128.bristol");
BaseCircuit::from_bristol(
seec::bristol::circuit(aes_circ_str).expect("parsing AES circuit failed"),
Load::SubCircuit,
)
.expect("converting AES circuit failed")
.into_shared()
});
let inp = [chunk, key].concat();
if use_sc {
let (output, circ_id) = CircuitBuilder::with_global(|builder| {
let circ_id = builder.push_circuit(AES_CIRC.clone());
(builder.connect_sub_circuit(&inp, circ_id), circ_id)
});
output.connect_to_main(circ_id)
} else {
CircuitBuilder::with_global(|builder| {
let inp = inp.into_iter().map(|sh| {
assert_eq!(0, sh.circuit_id());
sh.gate_id()
});
let out = builder
.get_main_circuit()
.lock()
.add_sub_circuit(&AES_CIRC.lock(), inp);
out.into_iter()
.map(|gate_id| Secret::from_parts(0, gate_id))
.collect()
})
}
}
sourcepub fn circuit_id(&self) -> CircuitId
pub fn circuit_id(&self) -> CircuitId
Examples found in repository?
crates/seec/examples/aes_cbc.rs (line 452)
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
fn aes128(
key: &[Secret<BooleanGmw, usize>],
chunk: &[Secret<BooleanGmw, usize>],
use_sc: bool,
) -> Vec<Secret<BooleanGmw, usize>> {
static AES_CIRC: Lazy<SharedCircuit<bool, BooleanGate, usize>> = Lazy::new(|| {
let aes_circ_str = include_str!("../test_resources/bristol-circuits/aes_128.bristol");
BaseCircuit::from_bristol(
seec::bristol::circuit(aes_circ_str).expect("parsing AES circuit failed"),
Load::SubCircuit,
)
.expect("converting AES circuit failed")
.into_shared()
});
let inp = [chunk, key].concat();
if use_sc {
let (output, circ_id) = CircuitBuilder::with_global(|builder| {
let circ_id = builder.push_circuit(AES_CIRC.clone());
(builder.connect_sub_circuit(&inp, circ_id), circ_id)
});
output.connect_to_main(circ_id)
} else {
CircuitBuilder::with_global(|builder| {
let inp = inp.into_iter().map(|sh| {
assert_eq!(0, sh.circuit_id());
sh.gate_id()
});
let out = builder
.get_main_circuit()
.lock()
.add_sub_circuit(&AES_CIRC.lock(), inp);
out.into_iter()
.map(|gate_id| Secret::from_parts(0, gate_id))
.collect()
})
}
}
Trait Implementations§
source§impl<Idx: GateIdx, Rhs: Borrow<Self>> BitAndAssign<Rhs> for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx, Rhs: Borrow<Self>> BitAndAssign<Rhs> for Secret<BooleanGmw, Idx>
source§fn bitand_assign(&mut self, rhs: Rhs)
fn bitand_assign(&mut self, rhs: Rhs)
Performs the
&=
operation. Read moresource§impl<Idx: GateIdx> BitAndAssign<bool> for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx> BitAndAssign<bool> for Secret<BooleanGmw, Idx>
source§fn bitand_assign(&mut self, rhs: bool)
fn bitand_assign(&mut self, rhs: bool)
Performs the
&=
operation. Read moresource§impl<Idx: GateIdx, Rhs: Borrow<Self>> BitOrAssign<Rhs> for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx, Rhs: Borrow<Self>> BitOrAssign<Rhs> for Secret<BooleanGmw, Idx>
source§fn bitor_assign(&mut self, rhs: Rhs)
fn bitor_assign(&mut self, rhs: Rhs)
Performs the
|=
operation. Read moresource§impl<Idx: GateIdx> BitOrAssign<bool> for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx> BitOrAssign<bool> for Secret<BooleanGmw, Idx>
source§fn bitor_assign(&mut self, rhs: bool)
fn bitor_assign(&mut self, rhs: bool)
Performs the
|=
operation. Read moresource§impl<Idx: GateIdx, Rhs: Borrow<Self>> BitXorAssign<Rhs> for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx, Rhs: Borrow<Self>> BitXorAssign<Rhs> for Secret<BooleanGmw, Idx>
source§fn bitxor_assign(&mut self, rhs: Rhs)
fn bitxor_assign(&mut self, rhs: Rhs)
Performs the
^=
operation. Read moresource§impl<Idx: GateIdx> BitXorAssign<bool> for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx> BitXorAssign<bool> for Secret<BooleanGmw, Idx>
source§fn bitxor_assign(&mut self, rhs: bool)
fn bitxor_assign(&mut self, rhs: bool)
Performs the
^=
operation. Read moresource§impl<P, Idx: Ord> Ord for Secret<P, Idx>
impl<P, Idx: Ord> Ord for Secret<P, Idx>
source§impl<P, Idx: PartialEq> PartialEq for Secret<P, Idx>
impl<P, Idx: PartialEq> PartialEq for Secret<P, Idx>
source§impl<P, Idx: PartialOrd> PartialOrd for Secret<P, Idx>
impl<P, Idx: PartialOrd> PartialOrd for Secret<P, Idx>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self
and other
) and is used by the <=
operator. Read moresource§impl<Idx: GateIdx> SubCircuitOutput for Secret<BooleanGmw, Idx>
impl<Idx: GateIdx> SubCircuitOutput for Secret<BooleanGmw, Idx>
fn create_output_gates(self) -> Self
fn connect_to_main(self, circuit_id: CircuitId) -> Self
fn connect_simd_to_main( self, _circuit_id: CircuitId, _simd_size: usize ) -> Vec<Self>
impl<P, Idx: Eq> Eq for Secret<P, Idx>
Auto Trait Implementations§
impl<P, Idx> Freeze for Secret<P, Idx>where
Idx: Freeze,
impl<P, Idx> RefUnwindSafe for Secret<P, Idx>where
Idx: RefUnwindSafe,
P: RefUnwindSafe,
impl<P = BooleanGmw, Idx = u32> !Send for Secret<P, Idx>
impl<P = BooleanGmw, Idx = u32> !Sync for Secret<P, Idx>
impl<P, Idx> Unpin for Secret<P, Idx>
impl<P, Idx> UnwindSafe for Secret<P, Idx>where
Idx: UnwindSafe,
P: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> CloneAny for T
impl<T> CloneAny for T
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<T> Conv for T
impl<T> Conv for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Checks if this value is equivalent to the given key. Read more
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key
and return true
if they are equal.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
Formats each item in a sequence. Read more
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref()
only in debug builds, and is erased in release
builds.