num_valid/functions/
neg_assign.rs1#![deny(rustdoc::broken_intra_doc_links)]
2
3use duplicate::duplicate_item;
4use num::Complex;
5
6pub trait NegAssign {
9 fn neg_assign(&mut self);
11}
12
13#[duplicate_item(
14 T;
15 [f64];
16 [Complex<f64>];
17)]
18impl NegAssign for T {
20 fn neg_assign(&mut self) {
22 *self = -*self;
23 }
24}
25
26#[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