generic_ec/non_zero/
definition.rs

1use core::ops::Deref;
2
3use zeroize::Zeroize;
4
5/// Non zero [Point](crate::Point) or [Scalar](crate::Scalar)
6#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Zeroize, Debug)]
7#[cfg_attr(
8    feature = "serde",
9    derive(serde::Serialize, serde::Deserialize),
10    serde(bound(
11        serialize = "T: From<NonZero<T>> + Clone + serde::Serialize",
12        deserialize = "NonZero<T>: TryFrom<T>, <NonZero<T> as TryFrom<T>>::Error: core::fmt::Display, T: serde::Deserialize<'de>",
13    )),
14    serde(into = "T", try_from = "T")
15)]
16#[cfg_attr(feature = "udigest", derive(udigest::Digestable))]
17pub struct NonZero<T>(T);
18
19impl<T> NonZero<T> {
20    /// Constructs `NonZero` without checking whether value is actually non zero
21    ///
22    /// Caller **must** guarantee that value is non zero. Caller **must** provide a comment
23    /// justifying a call and proving that value is non zero.
24    pub(crate) fn new_unchecked(v: T) -> Self {
25        Self(v)
26    }
27
28    /// Returns wrapped value
29    pub fn into_inner(self) -> T {
30        self.0
31    }
32}
33
34impl<T> AsRef<T> for NonZero<T> {
35    fn as_ref(&self) -> &T {
36        &self.0
37    }
38}
39
40impl<T> Deref for NonZero<T> {
41    type Target = T;
42    fn deref(&self) -> &Self::Target {
43        &self.0
44    }
45}