From c32b9273a481579a4a0774c76ec3fba5ba98ad03 Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Thu, 18 Jan 2018 21:59:00 +0100 Subject: [PATCH 1/5] specialize Iterator::nth for Cycles over ExactSizeIterators to reduce clones at the cost of one remainder. This should be faster in most cases and may in some situations reduce memory churn via clones. --- src/libcore/iter/mod.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 06c29b47bf921..2c99ca184bfc6 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -645,6 +645,20 @@ impl Iterator for Cycle where I: Clone + Iterator { } } +#[stable(feature = "rust1", since = "1.0.0")] +impl Iterator for Cycle +where I: Clone + Iterator + ExactSizeIterator { + fn nth(&mut self, n: usize) -> Option<::Item> { + let cur_len = self.iter.len(); + if n < cur_len { + self.iter.nth(n) + } else { + self.iter = self.orig.clone(); + self.iter.nth((n - cur_len) % self.orig.len()) + } + } +} + #[unstable(feature = "fused", issue = "35602")] impl FusedIterator for Cycle where I: Clone + Iterator {} From 6c022d29f2d58146d100875e00cff828f14a5d2a Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sat, 20 Jan 2018 16:54:57 +0100 Subject: [PATCH 2/5] restrict the specialization to Item : Clone + Copy --- src/libcore/iter/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 2c99ca184bfc6..83cfc3a7d1149 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -647,7 +647,8 @@ impl Iterator for Cycle where I: Clone + Iterator { #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Cycle -where I: Clone + Iterator + ExactSizeIterator { +where I: Clone + Iterator + ExactSizeIterator, + ::Item : Clone + Copy { fn nth(&mut self, n: usize) -> Option<::Item> { let cur_len = self.iter.len(); if n < cur_len { From 754231df3ae7942625351b8de9541a9ceeedf161 Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sun, 21 Jan 2018 08:31:36 +0100 Subject: [PATCH 3/5] further restrict to I : Copy --- src/libcore/iter/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 83cfc3a7d1149..8722a4b876375 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -647,14 +647,13 @@ impl Iterator for Cycle where I: Clone + Iterator { #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Cycle -where I: Clone + Iterator + ExactSizeIterator, - ::Item : Clone + Copy { +where I: Copy + ExactSizeIterator, ::Item : Copy { fn nth(&mut self, n: usize) -> Option<::Item> { let cur_len = self.iter.len(); if n < cur_len { self.iter.nth(n) } else { - self.iter = self.orig.clone(); + self.iter = self.orig; self.iter.nth((n - cur_len) % self.orig.len()) } } From cc864ecfe6a600c9f243e3e87e36b69d57db115d Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sun, 21 Jan 2018 14:27:53 +0100 Subject: [PATCH 4/5] There are no Copy Iterators, so restrict to Clone instead --- src/libcore/iter/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 8722a4b876375..d46e1e2c835f4 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -647,13 +647,13 @@ impl Iterator for Cycle where I: Clone + Iterator { #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Cycle -where I: Copy + ExactSizeIterator, ::Item : Copy { +where I: Clone + ExactSizeIterator, ::Item : Copy { fn nth(&mut self, n: usize) -> Option<::Item> { let cur_len = self.iter.len(); if n < cur_len { self.iter.nth(n) } else { - self.iter = self.orig; + self.iter = self.orig.clone(); self.iter.nth((n - cur_len) % self.orig.len()) } } From 4e8af5209dc577b907da74bc5c5d545850c8c364 Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sun, 21 Jan 2018 17:03:38 +0100 Subject: [PATCH 5/5] stylish generics --- src/libcore/iter/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index d46e1e2c835f4..6b55c4dc5e2f1 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -647,7 +647,7 @@ impl Iterator for Cycle where I: Clone + Iterator { #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Cycle -where I: Clone + ExactSizeIterator, ::Item : Copy { +where I: Clone + ExactSizeIterator, I::Item : Copy { fn nth(&mut self, n: usize) -> Option<::Item> { let cur_len = self.iter.len(); if n < cur_len {