@@ -25,9 +25,10 @@ use std::fmt;
25
25
#[ cfg( test) ]
26
26
use std:: hash;
27
27
use std:: ops:: { Add , Div , Mul , Neg , Sub , Rem } ;
28
+ use std:: iter:: { Sum , Product } ;
28
29
use std:: str:: FromStr ;
29
30
30
- use traits:: { Zero , One , Num , Float } ;
31
+ use traits:: { Zero , One , Num , NumAssign , Float } ;
31
32
32
33
// FIXME #1284: handle complex NaN & infinity etc. This
33
34
// probably doesn't map to C's _Complex correctly.
@@ -1046,6 +1047,46 @@ impl<T: Num + Clone> Num for Complex<T> {
1046
1047
}
1047
1048
}
1048
1049
1050
+ impl < T : Clone + NumAssign > Sum for Complex < T > {
1051
+ fn sum < I > ( iter : I ) -> Self where I : Iterator < Item = Self > {
1052
+ let mut s = Self :: zero ( ) ;
1053
+ for c in iter {
1054
+ s += c;
1055
+ }
1056
+ s
1057
+ }
1058
+ }
1059
+
1060
+ impl < ' a , T : ' a + Clone + NumAssign > Sum < & ' a Complex < T > > for Complex < T > {
1061
+ fn sum < I > ( iter : I ) -> Self where I : Iterator < Item = & ' a Complex < T > > {
1062
+ let mut s = Self :: zero ( ) ;
1063
+ for c in iter {
1064
+ s += c;
1065
+ }
1066
+ s
1067
+ }
1068
+ }
1069
+
1070
+ impl < T : Clone + NumAssign > Product for Complex < T > {
1071
+ fn product < I > ( iter : I ) -> Self where I : Iterator < Item = Self > {
1072
+ let mut s = Self :: one ( ) ;
1073
+ for c in iter {
1074
+ s *= c;
1075
+ }
1076
+ s
1077
+ }
1078
+ }
1079
+
1080
+ impl < ' a , T : ' a + Clone + NumAssign > Product < & ' a Complex < T > > for Complex < T > {
1081
+ fn product < I > ( iter : I ) -> Self where I : Iterator < Item = & ' a Complex < T > > {
1082
+ let mut s = Self :: one ( ) ;
1083
+ for c in iter {
1084
+ s *= c;
1085
+ }
1086
+ s
1087
+ }
1088
+ }
1089
+
1049
1090
#[ cfg( feature = "serde" ) ]
1050
1091
impl < T > serde:: Serialize for Complex < T >
1051
1092
where T : serde:: Serialize
0 commit comments