decaf377/ark_curve/element/
affine.rs1use core::hash::Hash;
2
3use crate::ark_curve::element::EdwardsAffine;
4use ark_std::fmt::{Display, Formatter, Result as FmtResult};
5use ark_std::Zero;
6
7use zeroize::Zeroize;
8
9use crate::Element;
10
11#[derive(Copy, Clone)]
12pub struct AffinePoint {
13 pub(crate) inner: EdwardsAffine,
14}
15
16impl Hash for AffinePoint {
17 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
18 self.inner.hash(state);
19 }
20}
21
22impl Default for AffinePoint {
23 fn default() -> Self {
24 Element::default().into()
25 }
26}
27
28impl core::iter::Sum<AffinePoint> for Element {
29 fn sum<I: Iterator<Item = AffinePoint>>(iter: I) -> Self {
30 iter.fold(Self::zero(), core::ops::Add::add)
31 }
32}
33
34impl<'a> core::iter::Sum<&'a AffinePoint> for Element {
35 fn sum<I: Iterator<Item = &'a AffinePoint>>(iter: I) -> Self {
36 iter.fold(Self::zero(), core::ops::Add::add)
37 }
38}
39
40impl PartialEq for AffinePoint {
41 fn eq(&self, other: &AffinePoint) -> bool {
42 self.inner.x * other.inner.y == self.inner.y * other.inner.x
44 }
45}
46
47impl Eq for AffinePoint {}
48
49impl core::fmt::Debug for AffinePoint {
50 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
51 let element: Element = self.into();
52 f.write_fmt(format_args!(
53 "decaf377::AffinePoint({})",
54 hex::encode(&element.vartime_compress().0[..])
55 ))
56 }
57}
58
59impl Display for AffinePoint {
60 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
61 let element: Element = self.into();
62 write!(
63 f,
64 "decaf377::AffinePoint({})",
65 hex::encode(&element.vartime_compress().0[..])
66 )
67 }
68}
69
70impl Zeroize for AffinePoint {
71 fn zeroize(&mut self) {
72 self.inner.zeroize()
73 }
74}