about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCaleb Zulawski <caleb.zulawski@gmail.com>2021-06-13 17:52:44 +0000
committerCaleb Zulawski <caleb.zulawski@gmail.com>2021-06-13 17:52:44 +0000
commitbdcccba55cddfa2c47ba322efec5dc110865edd1 (patch)
tree74f4675c5173b61f80cdad867ef96c92501574fd
parent57e67c905fe9fb3d45a1714d25baa5dfc143299c (diff)
downloadrust-bdcccba55cddfa2c47ba322efec5dc110865edd1.tar.gz
rust-bdcccba55cddfa2c47ba322efec5dc110865edd1.zip
Implement Sum/Product traits
-rw-r--r--crates/core_simd/src/iter.rs52
-rw-r--r--crates/core_simd/src/lib.rs1
2 files changed, 53 insertions, 0 deletions
diff --git a/crates/core_simd/src/iter.rs b/crates/core_simd/src/iter.rs
new file mode 100644
index 00000000000..c49715932b4
--- /dev/null
+++ b/crates/core_simd/src/iter.rs
@@ -0,0 +1,52 @@
+macro_rules! impl_traits {
+    { $type:ident, $scalar:ty } => {
+        impl<const LANES: usize> core::iter::Sum<Self> for crate::$type<LANES>
+        where
+            Self: crate::LanesAtMost32,
+        {
+            fn sum<I: core::iter::Iterator<Item = Self>>(iter: I) -> Self {
+                iter.fold(Default::default(), core::ops::Add::add)
+            }
+        }
+
+        impl<const LANES: usize> core::iter::Product<Self> for crate::$type<LANES>
+        where
+            Self: crate::LanesAtMost32,
+        {
+            fn product<I: core::iter::Iterator<Item = Self>>(iter: I) -> Self {
+                iter.fold(Default::default(), core::ops::Mul::mul)
+            }
+        }
+
+        impl<const LANES: usize> core::iter::Sum<crate::$type<LANES>> for $scalar
+        where
+            crate::$type<LANES>: crate::LanesAtMost32,
+        {
+            fn sum<I: core::iter::Iterator<Item = crate::$type<LANES>>>(iter: I) -> Self {
+                iter.sum::<crate::$type<LANES>>().horizontal_sum()
+            }
+        }
+
+        impl<const LANES: usize> core::iter::Product<crate::$type<LANES>> for $scalar
+        where
+            crate::$type<LANES>: crate::LanesAtMost32,
+        {
+            fn product<I: core::iter::Iterator<Item = crate::$type<LANES>>>(iter: I) -> Self {
+                iter.product::<crate::$type<LANES>>().horizontal_product()
+            }
+        }
+    }
+}
+
+impl_traits! { SimdF32, f32 }
+impl_traits! { SimdF64, f64 }
+impl_traits! { SimdU8, u8 }
+impl_traits! { SimdU16, u16 }
+impl_traits! { SimdU32, u32 }
+impl_traits! { SimdU64, u64 }
+impl_traits! { SimdUsize, usize }
+impl_traits! { SimdI8, i8 }
+impl_traits! { SimdI16, i16 }
+impl_traits! { SimdI32, i32 }
+impl_traits! { SimdI64, i64 }
+impl_traits! { SimdIsize, isize }
diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs
index 7fe7d666e8d..5b74d1d574a 100644
--- a/crates/core_simd/src/lib.rs
+++ b/crates/core_simd/src/lib.rs
@@ -22,6 +22,7 @@ pub use to_bytes::ToBytes;
 mod comparisons;
 mod fmt;
 mod intrinsics;
+mod iter;
 mod ops;
 mod round;