summaryrefslogtreecommitdiff
path: root/vendor/rayon/tests/octillion.rs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2024-01-08 00:21:28 +0300
committerValentin Popov <valentin@popov.link>2024-01-08 00:21:28 +0300
commit1b6a04ca5504955c571d1c97504fb45ea0befee4 (patch)
tree7579f518b23313e8a9748a88ab6173d5e030b227 /vendor/rayon/tests/octillion.rs
parent5ecd8cf2cba827454317368b68571df0d13d7842 (diff)
downloadfparkan-1b6a04ca5504955c571d1c97504fb45ea0befee4.tar.xz
fparkan-1b6a04ca5504955c571d1c97504fb45ea0befee4.zip
Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
Diffstat (limited to 'vendor/rayon/tests/octillion.rs')
-rw-r--r--vendor/rayon/tests/octillion.rs156
1 files changed, 156 insertions, 0 deletions
diff --git a/vendor/rayon/tests/octillion.rs b/vendor/rayon/tests/octillion.rs
new file mode 100644
index 0000000..1af9ad8
--- /dev/null
+++ b/vendor/rayon/tests/octillion.rs
@@ -0,0 +1,156 @@
+use rayon::prelude::*;
+
+const OCTILLION: u128 = 1_000_000_000_000_000_000_000_000_000;
+
+/// Produce a parallel iterator for 0u128..10²⁷
+fn octillion() -> rayon::range::Iter<u128> {
+ (0..OCTILLION).into_par_iter()
+}
+
+/// Produce a parallel iterator for 0u128..=10²⁷
+fn octillion_inclusive() -> rayon::range_inclusive::Iter<u128> {
+ (0..=OCTILLION).into_par_iter()
+}
+
+/// Produce a parallel iterator for 0u128..10²⁷ using `flat_map`
+fn octillion_flat() -> impl ParallelIterator<Item = u128> {
+ (0u32..1_000_000_000)
+ .into_par_iter()
+ .with_max_len(1_000)
+ .map(|i| u64::from(i) * 1_000_000_000)
+ .flat_map(|i| {
+ (0u32..1_000_000_000)
+ .into_par_iter()
+ .with_max_len(1_000)
+ .map(move |j| i + u64::from(j))
+ })
+ .map(|i| u128::from(i) * 1_000_000_000)
+ .flat_map(|i| {
+ (0u32..1_000_000_000)
+ .into_par_iter()
+ .with_max_len(1_000)
+ .map(move |j| i + u128::from(j))
+ })
+}
+
+// NOTE: `find_first` and `find_last` currently take too long on 32-bit targets,
+// because the `AtomicUsize` match position has much too limited resolution.
+
+#[test]
+#[cfg_attr(not(target_pointer_width = "64"), ignore)]
+fn find_first_octillion() {
+ let x = octillion().find_first(|_| true);
+ assert_eq!(x, Some(0));
+}
+
+#[test]
+#[cfg_attr(not(target_pointer_width = "64"), ignore)]
+fn find_first_octillion_inclusive() {
+ let x = octillion_inclusive().find_first(|_| true);
+ assert_eq!(x, Some(0));
+}
+
+#[test]
+#[cfg_attr(not(target_pointer_width = "64"), ignore)]
+fn find_first_octillion_flat() {
+ let x = octillion_flat().find_first(|_| true);
+ assert_eq!(x, Some(0));
+}
+
+fn two_threads<F: Send + FnOnce() -> R, R: Send>(f: F) -> R {
+ // FIXME: If we don't use at least two threads, then we end up walking
+ // through the entire iterator sequentially, without the benefit of any
+ // short-circuiting. We probably don't want testing to wait that long. ;)
+ let builder = rayon::ThreadPoolBuilder::new().num_threads(2);
+ let pool = builder.build().unwrap();
+
+ pool.install(f)
+}
+
+#[test]
+#[cfg_attr(
+ any(
+ not(target_pointer_width = "64"),
+ target_os = "emscripten",
+ target_family = "wasm"
+ ),
+ ignore
+)]
+fn find_last_octillion() {
+ // It would be nice if `find_last` could prioritize the later splits,
+ // basically flipping the `join` args, without needing indexed `rev`.
+ // (or could we have an unindexed `rev`?)
+ let x = two_threads(|| octillion().find_last(|_| true));
+ assert_eq!(x, Some(OCTILLION - 1));
+}
+
+#[test]
+#[cfg_attr(
+ any(
+ not(target_pointer_width = "64"),
+ target_os = "emscripten",
+ target_family = "wasm"
+ ),
+ ignore
+)]
+fn find_last_octillion_inclusive() {
+ let x = two_threads(|| octillion_inclusive().find_last(|_| true));
+ assert_eq!(x, Some(OCTILLION));
+}
+
+#[test]
+#[cfg_attr(
+ any(
+ not(target_pointer_width = "64"),
+ target_os = "emscripten",
+ target_family = "wasm"
+ ),
+ ignore
+)]
+fn find_last_octillion_flat() {
+ let x = two_threads(|| octillion_flat().find_last(|_| true));
+ assert_eq!(x, Some(OCTILLION - 1));
+}
+
+#[test]
+#[cfg_attr(any(target_os = "emscripten", target_family = "wasm"), ignore)]
+fn find_any_octillion() {
+ let x = two_threads(|| octillion().find_any(|x| *x > OCTILLION / 2));
+ assert!(x.is_some());
+}
+
+#[test]
+#[cfg_attr(any(target_os = "emscripten", target_family = "wasm"), ignore)]
+fn find_any_octillion_flat() {
+ let x = two_threads(|| octillion_flat().find_any(|x| *x > OCTILLION / 2));
+ assert!(x.is_some());
+}
+
+#[test]
+#[cfg_attr(any(target_os = "emscripten", target_family = "wasm"), ignore)]
+fn filter_find_any_octillion() {
+ let x = two_threads(|| {
+ octillion()
+ .filter(|x| *x > OCTILLION / 2)
+ .find_any(|_| true)
+ });
+ assert!(x.is_some());
+}
+
+#[test]
+#[cfg_attr(any(target_os = "emscripten", target_family = "wasm"), ignore)]
+fn filter_find_any_octillion_flat() {
+ let x = two_threads(|| {
+ octillion_flat()
+ .filter(|x| *x > OCTILLION / 2)
+ .find_any(|_| true)
+ });
+ assert!(x.is_some());
+}
+
+#[test]
+#[cfg_attr(any(target_os = "emscripten", target_family = "wasm"), ignore)]
+fn fold_find_any_octillion_flat() {
+ let x = two_threads(|| octillion_flat().fold(|| (), |_, _| ()).find_any(|_| true));
+ assert!(x.is_some());
+}