1use ff::Field;
6use std::ops::BitXor;
7
8#[derive(Debug, PartialEq, Eq)]
10pub enum Sgn0Result {
11 NonNegative,
13 Negative,
15}
16
17impl BitXor for Sgn0Result {
18 type Output = Self;
19 fn bitxor(self, rhs: Self) -> Self {
20 if self == rhs {
21 Sgn0Result::NonNegative
22 } else {
23 Sgn0Result::Negative
24 }
25 }
26}
27
28pub trait Signum0: Field {
30 fn sgn0(&self) -> Sgn0Result;
32
33 fn negate_if(&mut self, sgn: Sgn0Result) {
35 if sgn == Sgn0Result::Negative {
36 self.negate();
37 }
38 }
39}
40
41#[test]
42#[allow(clippy::eq_op)]
43fn test_sgn0result_xor() {
44 assert_eq!(
45 Sgn0Result::Negative ^ Sgn0Result::Negative,
46 Sgn0Result::NonNegative
47 );
48 assert_eq!(
49 Sgn0Result::Negative ^ Sgn0Result::NonNegative,
50 Sgn0Result::Negative
51 );
52 assert_eq!(
53 Sgn0Result::NonNegative ^ Sgn0Result::Negative,
54 Sgn0Result::Negative
55 );
56 assert_eq!(
57 Sgn0Result::NonNegative ^ Sgn0Result::NonNegative,
58 Sgn0Result::NonNegative
59 );
60}