group: Sum + for<'a> Sum<&'a Self> bounds for Group

This commit is contained in:
Jack Grigg 2020-05-14 20:30:22 +12:00
parent 5397d73e0b
commit e3d84280b9
3 changed files with 28 additions and 0 deletions

View File

@ -4,6 +4,7 @@ use pairing::{Engine, PairingCurveAffine};
use rand_core::RngCore; use rand_core::RngCore;
use std::fmt; use std::fmt;
use std::iter::Sum;
use std::num::Wrapping; use std::num::Wrapping;
use std::ops::{Add, AddAssign, BitAnd, Mul, MulAssign, Neg, Shr, Sub, SubAssign}; use std::ops::{Add, AddAssign, BitAnd, Mul, MulAssign, Neg, Shr, Sub, SubAssign};
use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption};
@ -47,6 +48,18 @@ impl ConditionallySelectable for Fr {
} }
} }
impl Sum for Fr {
fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
iter.fold(Self::zero(), ::std::ops::Add::add)
}
}
impl<'r> Sum<&'r Fr> for Fr {
fn sum<I: Iterator<Item = &'r Fr>>(iter: I) -> Self {
iter.fold(Self::zero(), ::std::ops::Add::add)
}
}
impl Neg for Fr { impl Neg for Fr {
type Output = Self; type Output = Self;

View File

@ -5,6 +5,7 @@ use ff::{Field, PrimeField};
use rand::RngCore; use rand::RngCore;
use std::error::Error; use std::error::Error;
use std::fmt; use std::fmt;
use std::iter::Sum;
use std::ops::{Add, AddAssign, Neg, Sub, SubAssign}; use std::ops::{Add, AddAssign, Neg, Sub, SubAssign};
pub mod tests; pub mod tests;
@ -38,6 +39,8 @@ pub trait Group:
+ Send + Send
+ Sync + Sync
+ 'static + 'static
+ Sum
+ for<'a> Sum<&'a Self>
+ Neg<Output = Self> + Neg<Output = Self>
+ GroupOps + GroupOps
+ GroupOpsOwned + GroupOpsOwned

View File

@ -205,6 +205,18 @@ macro_rules! curve_impl {
} }
} }
impl ::std::iter::Sum for $projective {
fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
iter.fold(Self::identity(), ::std::ops::Add::add)
}
}
impl<'r> ::std::iter::Sum<&'r $projective> for $projective {
fn sum<I: Iterator<Item = &'r $projective>>(iter: I) -> Self {
iter.fold(Self::identity(), ::std::ops::Add::add)
}
}
impl ::std::ops::Neg for $projective { impl ::std::ops::Neg for $projective {
type Output = Self; type Output = Self;