-
Notifications
You must be signed in to change notification settings - Fork 481
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement public-facing ops traits on all combos of &T/T
The public-facing types with arithmetic operations are: - `Scalar`s - `ExtendedPoint`s - `RistrettoPoint`s For these types we define operators with all combinations of borrowed and non-borrowed inputs, to avoid forcing API consumers to write extra ampersands. Since all of the operations involved with these types are expensive relative to the cost of an unnecessary copy, this isn't a big deal. The `MontgomeryPoint` struct isn't included in the above because it's only useful for scalar multiplication. This commit is based on work by @UnlawfulMonad.
- Loading branch information
1 parent
ed7345f
commit 52d600d
Showing
6 changed files
with
195 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
// -*- mode: rust; -*- | ||
// | ||
// This file is part of curve25519-dalek. | ||
// Copyright (c) 2016-2017 Isis Lovecruft, Henry de Valence | ||
// See LICENSE for licensing information. | ||
// | ||
// Authors: | ||
// - Isis Agora Lovecruft <[email protected]> | ||
// - Henry de Valence <[email protected]> | ||
|
||
//! Internal macros. | ||
/// Define borrow and non-borrow variants of `Add`. | ||
macro_rules! define_add_variants { | ||
(LHS = $lhs:ty, RHS = $rhs:ty, Output = $out:ty) => { | ||
impl<'b> Add<&'b $rhs> for $lhs { | ||
type Output = $out; | ||
fn add(self, rhs: &'b $rhs) -> $out { | ||
&self + rhs | ||
} | ||
} | ||
|
||
impl<'a> Add<$rhs> for &'a $lhs { | ||
type Output = $out; | ||
fn add(self, rhs: $rhs) -> $out { | ||
self + &rhs | ||
} | ||
} | ||
|
||
impl Add<$rhs> for $lhs { | ||
type Output = $out; | ||
fn add(self, rhs: $rhs) -> $out { | ||
&self + &rhs | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Define non-borrow variants of `AddAssign`. | ||
macro_rules! define_add_assign_variants { | ||
(LHS = $lhs:ty, RHS = $rhs:ty) => { | ||
impl AddAssign<$rhs> for $lhs { | ||
fn add_assign(&mut self, rhs: $rhs) { | ||
*self += &rhs; | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Define borrow and non-borrow variants of `Sub`. | ||
macro_rules! define_sub_variants { | ||
(LHS = $lhs:ty, RHS = $rhs:ty, Output = $out:ty) => { | ||
impl<'b> Sub<&'b $rhs> for $lhs { | ||
type Output = $out; | ||
fn sub(self, rhs: &'b $rhs) -> $out { | ||
&self - rhs | ||
} | ||
} | ||
|
||
impl<'a> Sub<$rhs> for &'a $lhs { | ||
type Output = $out; | ||
fn sub(self, rhs: $rhs) -> $out { | ||
self - &rhs | ||
} | ||
} | ||
|
||
impl Sub<$rhs> for $lhs { | ||
type Output = $out; | ||
fn sub(self, rhs: $rhs) -> $out { | ||
&self - &rhs | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Define non-borrow variants of `SubAssign`. | ||
macro_rules! define_sub_assign_variants { | ||
(LHS = $lhs:ty, RHS = $rhs:ty) => { | ||
impl SubAssign<$rhs> for $lhs { | ||
fn sub_assign(&mut self, rhs: $rhs) { | ||
*self -= &rhs; | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Define borrow and non-borrow variants of `Mul`. | ||
macro_rules! define_mul_variants { | ||
(LHS = $lhs:ty, RHS = $rhs:ty, Output = $out:ty) => { | ||
impl<'b> Mul<&'b $rhs> for $lhs { | ||
type Output = $out; | ||
fn mul(self, rhs: &'b $rhs) -> $out { | ||
&self * rhs | ||
} | ||
} | ||
|
||
impl<'a> Mul<$rhs> for &'a $lhs { | ||
type Output = $out; | ||
fn mul(self, rhs: $rhs) -> $out { | ||
self * &rhs | ||
} | ||
} | ||
|
||
impl Mul<$rhs> for $lhs { | ||
type Output = $out; | ||
fn mul(self, rhs: $rhs) -> $out { | ||
&self * &rhs | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Define non-borrow variants of `MulAssign`. | ||
macro_rules! define_mul_assign_variants { | ||
(LHS = $lhs:ty, RHS = $rhs:ty) => { | ||
impl MulAssign<$rhs> for $lhs { | ||
fn mul_assign(&mut self, rhs: $rhs) { | ||
*self *= &rhs; | ||
} | ||
} | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters