Struct JubjubAffine
pub struct JubjubAffine { /* private fields */ }Expand description
This represents a Jubjub point in the affine (u, v)
coordinates.
Implementations§
§impl JubjubAffine
impl JubjubAffine
pub const fn identity() -> JubjubAffine
pub const fn identity() -> JubjubAffine
Constructs the neutral element (0, 1).
pub fn is_identity(&self) -> Choice
pub fn is_identity(&self) -> Choice
Determines if this point is the identity.
pub fn mul_by_cofactor(&self) -> JubjubExtended
pub fn mul_by_cofactor(&self) -> JubjubExtended
Multiplies this point by the cofactor, producing an
ExtendedPoint
pub fn is_small_order(&self) -> Choice
pub fn is_small_order(&self) -> Choice
Determines if this point is of small order.
pub fn is_torsion_free(&self) -> Choice
pub fn is_torsion_free(&self) -> Choice
Determines if this point is torsion free and so is in the prime order subgroup.
pub fn is_prime_order(&self) -> Choice
pub fn is_prime_order(&self) -> Choice
Determines if this point is prime order, or in other words that
the smallest scalar multiplied by this point that produces the
identity is r. This is equivalent to checking that the point
is both torsion free and not the identity.
pub fn from_bytes(b: [u8; 32]) -> CtOption<JubjubAffine>
pub fn from_bytes(b: [u8; 32]) -> CtOption<JubjubAffine>
Attempts to interpret a byte representation of an affine point, failing if the element is not on the curve or non-canonical.
pub fn from_bytes_pre_zip216_compatibility(
b: [u8; 32],
) -> CtOption<JubjubAffine>
pub fn from_bytes_pre_zip216_compatibility( b: [u8; 32], ) -> CtOption<JubjubAffine>
Attempts to interpret a byte representation of an affine point, failing if the element is not on the curve.
Most non-canonical encodings will also cause a failure. However, this API preserves (for use in consensus-critical protocols) a bug in the parsing code that caused two non-canonical encodings to be silently accepted:
- (0, 1), which is the identity;
- (0, -1), which is a point of order two.
Each of these has a single non-canonical encoding in which the value of the sign bit is 1.
See ZIP 216 for a more detailed description of the bug, as well as its fix.
pub fn batch_from_bytes(
items: impl Iterator<Item = [u8; 32]>,
) -> Vec<CtOption<JubjubAffine>>
pub fn batch_from_bytes( items: impl Iterator<Item = [u8; 32]>, ) -> Vec<CtOption<JubjubAffine>>
Attempts to interpret a batch of byte representations of affine points.
Returns None for each element if it is not on the curve, or is non-canonical according to ZIP 216.
pub const fn to_extended(&self) -> JubjubExtended
pub const fn to_extended(&self) -> JubjubExtended
Returns an ExtendedPoint for use in arithmetic operations.
pub fn to_niels(&self) -> JubjubAffineNiels
pub fn to_niels(&self) -> JubjubAffineNiels
Performs a pre-processing step that produces an AffineNielsPoint
for use in multiple additions.
pub fn from_raw_unchecked(u: Fq, v: Fq) -> JubjubAffine
pub fn from_raw_unchecked(u: Fq, v: Fq) -> JubjubAffine
Constructs an AffinePoint given u and v without checking
that the point is on the curve.
Trait Implementations§
§impl<'b> Add<&'b JubjubAffine> for &JubjubAffine
impl<'b> Add<&'b JubjubAffine> for &JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, other: &'b JubjubAffine) -> JubjubExtended
fn add(self, other: &'b JubjubAffine) -> JubjubExtended
+ operation. Read more§impl<'b> Add<&'b JubjubAffine> for &JubjubExtended
impl<'b> Add<&'b JubjubAffine> for &JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, other: &'b JubjubAffine) -> JubjubExtended
fn add(self, other: &'b JubjubAffine) -> JubjubExtended
+ operation. Read more§impl<'b> Add<&'b JubjubAffine> for JubjubAffine
impl<'b> Add<&'b JubjubAffine> for JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, rhs: &'b JubjubAffine) -> JubjubExtended
fn add(self, rhs: &'b JubjubAffine) -> JubjubExtended
+ operation. Read more§impl<'b> Add<&'b JubjubAffine> for JubjubExtended
impl<'b> Add<&'b JubjubAffine> for JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, rhs: &'b JubjubAffine) -> JubjubExtended
fn add(self, rhs: &'b JubjubAffine) -> JubjubExtended
+ operation. Read more§impl<'a> Add<JubjubAffine> for &'a JubjubAffine
impl<'a> Add<JubjubAffine> for &'a JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, rhs: JubjubAffine) -> JubjubExtended
fn add(self, rhs: JubjubAffine) -> JubjubExtended
+ operation. Read more§impl<'a> Add<JubjubAffine> for &'a JubjubExtended
impl<'a> Add<JubjubAffine> for &'a JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, rhs: JubjubAffine) -> JubjubExtended
fn add(self, rhs: JubjubAffine) -> JubjubExtended
+ operation. Read more§impl Add<JubjubAffine> for JubjubExtended
impl Add<JubjubAffine> for JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, rhs: JubjubAffine) -> JubjubExtended
fn add(self, rhs: JubjubAffine) -> JubjubExtended
+ operation. Read more§impl Add for JubjubAffine
impl Add for JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
+ operator.§fn add(self, rhs: JubjubAffine) -> JubjubExtended
fn add(self, rhs: JubjubAffine) -> JubjubExtended
+ operation. Read more§impl<'b> AddAssign<&'b JubjubAffine> for JubjubExtended
impl<'b> AddAssign<&'b JubjubAffine> for JubjubExtended
§fn add_assign(&mut self, rhs: &'b JubjubAffine)
fn add_assign(&mut self, rhs: &'b JubjubAffine)
+= operation. Read more§impl AddAssign<JubjubAffine> for JubjubExtended
impl AddAssign<JubjubAffine> for JubjubExtended
§fn add_assign(&mut self, rhs: JubjubAffine)
fn add_assign(&mut self, rhs: JubjubAffine)
+= operation. Read more§impl Clone for JubjubAffine
impl Clone for JubjubAffine
§fn clone(&self) -> JubjubAffine
fn clone(&self) -> JubjubAffine
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl CofactorCurveAffine for JubjubAffine
impl CofactorCurveAffine for JubjubAffine
type Scalar = Fr
type Curve = JubjubExtended
§fn identity() -> JubjubAffine
fn identity() -> JubjubAffine
§fn generator() -> JubjubAffine
fn generator() -> JubjubAffine
§fn is_identity(&self) -> Choice
fn is_identity(&self) -> Choice
§fn to_curve(&self) -> <JubjubAffine as CofactorCurveAffine>::Curve
fn to_curve(&self) -> <JubjubAffine as CofactorCurveAffine>::Curve
§impl ConditionallySelectable for JubjubAffine
impl ConditionallySelectable for JubjubAffine
§fn conditional_select(
a: &JubjubAffine,
b: &JubjubAffine,
choice: Choice,
) -> JubjubAffine
fn conditional_select( a: &JubjubAffine, b: &JubjubAffine, choice: Choice, ) -> JubjubAffine
Source§fn conditional_assign(&mut self, other: &Self, choice: Choice)
fn conditional_assign(&mut self, other: &Self, choice: Choice)
Source§fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
self and other if choice == 1; otherwise,
reassign both unto themselves. Read more§impl ConstantTimeEq for JubjubAffine
impl ConstantTimeEq for JubjubAffine
§impl Debug for JubjubAffine
impl Debug for JubjubAffine
§impl Default for JubjubAffine
impl Default for JubjubAffine
§fn default() -> JubjubAffine
fn default() -> JubjubAffine
Returns the identity.
§impl Display for JubjubAffine
impl Display for JubjubAffine
§impl<'a> From<&'a JubjubExtended> for JubjubAffine
impl<'a> From<&'a JubjubExtended> for JubjubAffine
§fn from(extended: &'a JubjubExtended) -> JubjubAffine
fn from(extended: &'a JubjubExtended) -> JubjubAffine
Constructs an affine point from an extended point
using the map (U, V, Z, T1, T2) => (U/Z, V/Z)
as Z is always nonzero. This requires a field inversion
and so it is recommended to perform these in a batch
using [batch_normalize] instead.
§impl From<JubjubAffine> for JubjubExtended
impl From<JubjubAffine> for JubjubExtended
§fn from(affine: JubjubAffine) -> JubjubExtended
fn from(affine: JubjubAffine) -> JubjubExtended
Constructs an extended point (with Z = 1) from
an affine point using the map (u, v) => (u, v, 1, u, v).
§impl From<JubjubExtended> for JubjubAffine
impl From<JubjubExtended> for JubjubAffine
§fn from(extended: JubjubExtended) -> JubjubAffine
fn from(extended: JubjubExtended) -> JubjubAffine
§impl GroupEncoding for JubjubAffine
impl GroupEncoding for JubjubAffine
§fn from_bytes(
bytes: &<JubjubAffine as GroupEncoding>::Repr,
) -> CtOption<JubjubAffine>
fn from_bytes( bytes: &<JubjubAffine as GroupEncoding>::Repr, ) -> CtOption<JubjubAffine>
§fn from_bytes_unchecked(
bytes: &<JubjubAffine as GroupEncoding>::Repr,
) -> CtOption<JubjubAffine>
fn from_bytes_unchecked( bytes: &<JubjubAffine as GroupEncoding>::Repr, ) -> CtOption<JubjubAffine>
§fn to_bytes(&self) -> <JubjubAffine as GroupEncoding>::Repr
fn to_bytes(&self) -> <JubjubAffine as GroupEncoding>::Repr
§impl<'b> Mul<&'b Fr> for &JubjubAffine
impl<'b> Mul<&'b Fr> for &JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
* operator.§fn mul(self, other: &'b Fr) -> JubjubExtended
fn mul(self, other: &'b Fr) -> JubjubExtended
* operation. Read more§impl<'b> Mul<&'b Fr> for JubjubAffine
impl<'b> Mul<&'b Fr> for JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
* operator.§fn mul(self, rhs: &'b Fr) -> JubjubExtended
fn mul(self, rhs: &'b Fr) -> JubjubExtended
* operation. Read more§impl<'a> Mul<Fr> for &'a JubjubAffine
impl<'a> Mul<Fr> for &'a JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
* operator.§fn mul(self, rhs: Fr) -> JubjubExtended
fn mul(self, rhs: Fr) -> JubjubExtended
* operation. Read more§impl Mul<Fr> for JubjubAffine
impl Mul<Fr> for JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
* operator.§fn mul(self, rhs: Fr) -> JubjubExtended
fn mul(self, rhs: Fr) -> JubjubExtended
* operation. Read more§impl Neg for JubjubAffine
impl Neg for JubjubAffine
§fn neg(self) -> JubjubAffine
fn neg(self) -> JubjubAffine
This computes the negation of a point P = (u, v)
as -P = (-u, v).
§type Output = JubjubAffine
type Output = JubjubAffine
- operator.§impl PartialEq for JubjubAffine
impl PartialEq for JubjubAffine
§impl<'b> Sub<&'b JubjubAffine> for &JubjubAffine
impl<'b> Sub<&'b JubjubAffine> for &JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, other: &'b JubjubAffine) -> JubjubExtended
fn sub(self, other: &'b JubjubAffine) -> JubjubExtended
- operation. Read more§impl<'b> Sub<&'b JubjubAffine> for &JubjubExtended
impl<'b> Sub<&'b JubjubAffine> for &JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, other: &'b JubjubAffine) -> JubjubExtended
fn sub(self, other: &'b JubjubAffine) -> JubjubExtended
- operation. Read more§impl<'b> Sub<&'b JubjubAffine> for JubjubAffine
impl<'b> Sub<&'b JubjubAffine> for JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, rhs: &'b JubjubAffine) -> JubjubExtended
fn sub(self, rhs: &'b JubjubAffine) -> JubjubExtended
- operation. Read more§impl<'b> Sub<&'b JubjubAffine> for JubjubExtended
impl<'b> Sub<&'b JubjubAffine> for JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, rhs: &'b JubjubAffine) -> JubjubExtended
fn sub(self, rhs: &'b JubjubAffine) -> JubjubExtended
- operation. Read more§impl<'a> Sub<JubjubAffine> for &'a JubjubAffine
impl<'a> Sub<JubjubAffine> for &'a JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, rhs: JubjubAffine) -> JubjubExtended
fn sub(self, rhs: JubjubAffine) -> JubjubExtended
- operation. Read more§impl<'a> Sub<JubjubAffine> for &'a JubjubExtended
impl<'a> Sub<JubjubAffine> for &'a JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, rhs: JubjubAffine) -> JubjubExtended
fn sub(self, rhs: JubjubAffine) -> JubjubExtended
- operation. Read more§impl Sub<JubjubAffine> for JubjubExtended
impl Sub<JubjubAffine> for JubjubExtended
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, rhs: JubjubAffine) -> JubjubExtended
fn sub(self, rhs: JubjubAffine) -> JubjubExtended
- operation. Read more§impl Sub for JubjubAffine
impl Sub for JubjubAffine
§type Output = JubjubExtended
type Output = JubjubExtended
- operator.§fn sub(self, rhs: JubjubAffine) -> JubjubExtended
fn sub(self, rhs: JubjubAffine) -> JubjubExtended
- operation. Read more§impl<'b> SubAssign<&'b JubjubAffine> for JubjubExtended
impl<'b> SubAssign<&'b JubjubAffine> for JubjubExtended
§fn sub_assign(&mut self, rhs: &'b JubjubAffine)
fn sub_assign(&mut self, rhs: &'b JubjubAffine)
-= operation. Read more§impl SubAssign<JubjubAffine> for JubjubExtended
impl SubAssign<JubjubAffine> for JubjubExtended
§fn sub_assign(&mut self, rhs: JubjubAffine)
fn sub_assign(&mut self, rhs: JubjubAffine)
-= operation. Read moreimpl Copy for JubjubAffine
impl Eq for JubjubAffine
Auto Trait Implementations§
impl Freeze for JubjubAffine
impl RefUnwindSafe for JubjubAffine
impl Send for JubjubAffine
impl Sync for JubjubAffine
impl Unpin for JubjubAffine
impl UnwindSafe for JubjubAffine
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§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,
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,
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,
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,
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,
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,
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,
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,
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,
§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>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§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,
§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,
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,
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
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
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
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
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
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
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
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
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
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
.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
.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
.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
.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
.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
.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
.tap_deref() only in debug builds, and is erased in release
builds.