num_valid/functions/
neg_assign.rs

1#![deny(rustdoc::broken_intra_doc_links)]
2
3use duplicate::duplicate_item;
4use num::Complex;
5
6//-------------------------------------------------------------
7/// Compound negation and assignment.
8pub trait NegAssign {
9    /// Performs the negation.
10    fn neg_assign(&mut self);
11}
12
13#[duplicate_item(
14    T;
15    [f64];
16    [Complex<f64>];
17)]
18/// Compound negation and assignment.
19impl NegAssign for T {
20    /// Performs the negation of `self`.
21    fn neg_assign(&mut self) {
22        *self = -*self;
23    }
24}
25
26//-------------------------------------------------------------
27
28//-------------------------------------------------------------
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use num::Complex;
33
34    mod native64 {
35        use super::*;
36
37        #[test]
38        fn test_neg_assign_f64() {
39            let mut value = 1.0_f64;
40            value.neg_assign();
41            let expected_value = -1.0_f64;
42            assert_eq!(value, expected_value);
43
44            let mut value = -2.0_f64;
45            value.neg_assign();
46            let expected_value = 2.0_f64;
47            assert_eq!(value, expected_value);
48        }
49
50        #[test]
51        fn test_neg_assign_complex_f64() {
52            let mut value = Complex::new(1.0, -2.0);
53            value.neg_assign();
54            let expected_value = Complex::new(-1.0, 2.0);
55            assert_eq!(value, expected_value);
56
57            let mut value = Complex::new(-3.0, 4.0);
58            value.neg_assign();
59            let expected_value = Complex::new(3.0, -4.0);
60            assert_eq!(value, expected_value);
61        }
62    }
63
64    #[cfg(feature = "rug")]
65    mod rug53 {
66        use super::*;
67        use crate::kernels::rug::{ComplexRugStrictFinite, RealRugStrictFinite};
68        use rug::Float;
69        use try_create::New;
70
71        const PRECISION: u32 = 53;
72
73        #[test]
74        fn test_neg_assign_real_rug() {
75            let mut value = RealRugStrictFinite::<PRECISION>::new(Float::with_val(PRECISION, 1.0));
76            value.neg_assign();
77            let expected_value =
78                RealRugStrictFinite::<PRECISION>::new(Float::with_val(PRECISION, -1.0));
79            assert_eq!(value, expected_value);
80
81            let mut value = RealRugStrictFinite::<PRECISION>::new(Float::with_val(PRECISION, -2.0));
82            value.neg_assign();
83            let expected_value =
84                RealRugStrictFinite::<PRECISION>::new(Float::with_val(PRECISION, 2.0));
85            assert_eq!(value, expected_value);
86        }
87
88        #[test]
89        fn test_neg_assign_complex_rug() {
90            let mut value = ComplexRugStrictFinite::<PRECISION>::new(rug::Complex::with_val(
91                PRECISION,
92                (
93                    Float::with_val(PRECISION, 1.0),
94                    Float::with_val(PRECISION, -2.0),
95                ),
96            ));
97            value.neg_assign();
98            let expected_value = ComplexRugStrictFinite::<PRECISION>::new(rug::Complex::with_val(
99                PRECISION,
100                (
101                    Float::with_val(PRECISION, -1.0),
102                    Float::with_val(PRECISION, 2.0),
103                ),
104            ));
105            assert_eq!(value, expected_value);
106
107            let mut value = ComplexRugStrictFinite::<PRECISION>::new(rug::Complex::with_val(
108                PRECISION,
109                (
110                    Float::with_val(PRECISION, -3.0),
111                    Float::with_val(PRECISION, 4.0),
112                ),
113            ));
114            value.neg_assign();
115            let expected_value = ComplexRugStrictFinite::<PRECISION>::new(rug::Complex::with_val(
116                PRECISION,
117                (
118                    Float::with_val(PRECISION, 3.0),
119                    Float::with_val(PRECISION, -4.0),
120                ),
121            ));
122            assert_eq!(value, expected_value);
123        }
124    }
125}
126//-------------------------------------------------------------