num_valid/functions/
neg_assign.rs

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