core_simd/
iter.rs

1use crate::simd::Simd;
2use core::{
3    iter::{Product, Sum},
4    ops::{Add, Mul},
5};
6
7macro_rules! impl_traits {
8    { $type:ty } => {
9        impl<const N: usize> Sum<Self> for Simd<$type, N>
10        {
11            #[inline]
12            fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
13                iter.fold(Simd::splat(0 as $type), Add::add)
14            }
15        }
16
17        impl<const N: usize> Product<Self> for Simd<$type, N>
18        {
19            #[inline]
20            fn product<I: Iterator<Item = Self>>(iter: I) -> Self {
21                iter.fold(Simd::splat(1 as $type), Mul::mul)
22            }
23        }
24
25        impl<'a, const N: usize> Sum<&'a Self> for Simd<$type, N>
26        {
27            #[inline]
28            fn sum<I: Iterator<Item = &'a Self>>(iter: I) -> Self {
29                iter.fold(Simd::splat(0 as $type), Add::add)
30            }
31        }
32
33        impl<'a, const N: usize> Product<&'a Self> for Simd<$type, N>
34        {
35            #[inline]
36            fn product<I: Iterator<Item = &'a Self>>(iter: I) -> Self {
37                iter.fold(Simd::splat(1 as $type), Mul::mul)
38            }
39        }
40    }
41}
42
43impl_traits! { f32 }
44impl_traits! { f64 }
45impl_traits! { u8 }
46impl_traits! { u16 }
47impl_traits! { u32 }
48impl_traits! { u64 }
49impl_traits! { usize }
50impl_traits! { i8 }
51impl_traits! { i16 }
52impl_traits! { i32 }
53impl_traits! { i64 }
54impl_traits! { isize }