more_itertools/combining/
dotproduct.rs1#[macro_export]
4macro_rules! dotproduct {
5 ($type0:ty, $iter0:expr, $iter1:expr, $init:expr) => {
6 {
7 let mut map_iter = map2($iter0, $iter1, |x, y| {
8 let ret = <$type0>::overflowing_mul(*x, *y);
9 if ret.1 {
10 return Err(error::any_error(error::Kind::OverflowError, "multiple overflow.".to_string()));
11 } else {
12 return Ok(ret.0);
13 }
14 });
15 let sum_iter = sum!($type0, map_iter, $init);
16 sum_iter
17 }
18 };
19}
20
21#[cfg(test)]
22mod tests {
23 use crate::error;
24 use crate::itertools::sum::sum;
25 use crate::itertools::map::map2;
26 use crate::utils::generate_okok_iterator;
27
28 #[test]
29 fn test1() {
30 let iter_0 = generate_okok_iterator(vec![10i64,10]);
31 let iter_1 = generate_okok_iterator(vec![20i64,20]);
32 let ret = dotproduct!(i64, iter_0, iter_1, 0i64);
33 assert_eq!(Ok(400i64), ret);
34
35
36 let iter_0 = generate_okok_iterator(vec![10i64,10]);
37 let iter_1 = generate_okok_iterator(vec![20i64,i64::MAX]);
38 let ret = dotproduct!(i64, iter_0, iter_1, 0i64);
39 assert!(ret.err().unwrap().message().unwrap().contains("multiple overflow"));
40 }
41}