Skip to content

Instantly share code, notes, and snippets.

@bluss
Last active April 22, 2016 16:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bluss/ee1396d6b845f8eefa04ead1fa940533 to your computer and use it in GitHub Desktop.
Save bluss/ee1396d6b845f8eefa04ead1fa940533 to your computer and use it in GitHub Desktop.
---
src/libcore/iter/mod.rs | 52 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 39 insertions(+), 13 deletions(-)
diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs
index f1a3b8a..e2b9dd5 100644
--- a/src/libcore/iter/mod.rs
+++ b/src/libcore/iter/mod.rs
@@ -301,6 +301,7 @@
use clone::Clone;
use cmp;
+use default::Default;
use fmt;
use iter_private::TrustedRandomAccess;
use ops::FnMut;
@@ -606,8 +607,7 @@ impl<A, B> DoubleEndedIterator for Chain<A, B> where
pub struct Zip<A, B> {
a: A,
b: B,
- index: usize,
- len: usize,
+ spec: <(A, B) as ZipImplData>::Data,
}
#[stable(feature = "rust1", since = "1.0.0")]
@@ -649,6 +649,17 @@ trait ZipImpl<A, B> {
B: DoubleEndedIterator + ExactSizeIterator;
}
+// Zip specialization data members
+#[doc(hidden)]
+trait ZipImplData {
+ type Data: Clone + Default + fmt::Debug;
+}
+
+#[doc(hidden)]
+impl<T> ZipImplData for T {
+ default type Data = ();
+}
+
// General Zip impl
#[doc(hidden)]
impl<A, B> ZipImpl<A, B> for Zip<A, B>
@@ -659,8 +670,7 @@ impl<A, B> ZipImpl<A, B> for Zip<A, B>
Zip {
a: a,
b: b,
- index: 0, // not used in general case
- len: 0,
+ spec: Default::default(), // unused
}
}
@@ -714,6 +724,20 @@ impl<A, B> ZipImpl<A, B> for Zip<A, B>
}
#[doc(hidden)]
+#[derive(Default, Debug, Clone)]
+struct ZipImplFields {
+ index: usize,
+ len: usize,
+}
+
+#[doc(hidden)]
+impl<A, B> ZipImplData for (A, B)
+ where A: TrustedRandomAccess, B: TrustedRandomAccess
+{
+ type Data = ZipImplFields;
+}
+
+#[doc(hidden)]
impl<A, B> ZipImpl<A, B> for Zip<A, B>
where A: TrustedRandomAccess, B: TrustedRandomAccess
{
@@ -722,16 +746,18 @@ impl<A, B> ZipImpl<A, B> for Zip<A, B>
Zip {
a: a,
b: b,
- index: 0,
- len: len,
+ spec: ZipImplFields {
+ index: 0,
+ len: len,
+ }
}
}
#[inline]
fn next(&mut self) -> Option<(A::Item, B::Item)> {
- if self.index < self.len {
- let i = self.index;
- self.index += 1;
+ if self.spec.index < self.spec.len {
+ let i = self.spec.index;
+ self.spec.index += 1;
unsafe {
Some((self.a.get_unchecked(i), self.b.get_unchecked(i)))
}
@@ -742,7 +768,7 @@ impl<A, B> ZipImpl<A, B> for Zip<A, B>
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
- let len = self.len - self.index;
+ let len = self.spec.len - self.spec.index;
(len, Some(len))
}
@@ -751,9 +777,9 @@ impl<A, B> ZipImpl<A, B> for Zip<A, B>
where A: DoubleEndedIterator + ExactSizeIterator,
B: DoubleEndedIterator + ExactSizeIterator
{
- if self.index < self.len {
- self.len -= 1;
- let i = self.len;
+ if self.spec.index < self.spec.len {
+ self.spec.len -= 1;
+ let i = self.spec.len;
unsafe {
Some((self.a.get_unchecked(i), self.b.get_unchecked(i)))
}
--
2.8.0.rc3
rustc: x86_64-unknown-linux-gnu/stage0/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_typeck
src/librustc_mir/graphviz.rs:109:29: 109:52 error: borrowed value does not live long enough
src/librustc_mir/graphviz.rs:109 for (&target, label) in terminator.successors().iter().zip(labels) {
^~~~~~~~~~~~~~~~~~~~~~~
src/librustc_mir/graphviz.rs:109:5: 111:6 note: reference must be valid for the destruction scope surrounding statement at 109:4...
src/librustc_mir/graphviz.rs:109 for (&target, label) in terminator.successors().iter().zip(labels) {
src/librustc_mir/graphviz.rs:110 writeln!(w, r#" {} -> {} [label="{}"];"#, node(source), node(target), label)?;
src/librustc_mir/graphviz.rs:111 }
src/librustc_mir/graphviz.rs:109:5: 111:6 note: ...but borrowed value is only valid for the statement at 109:4
src/librustc_mir/graphviz.rs:109 for (&target, label) in terminator.successors().iter().zip(labels) {
src/librustc_mir/graphviz.rs:110 writeln!(w, r#" {} -> {} [label="{}"];"#, node(source), node(target), label)?;
src/librustc_mir/graphviz.rs:111 }
src/librustc_mir/graphviz.rs:109:5: 111:6 help: consider using a `let` binding to increase its lifetime
src/librustc_mir/graphviz.rs:109 for (&target, label) in terminator.successors().iter().zip(labels) {
src/librustc_mir/graphviz.rs:110 writeln!(w, r#" {} -> {} [label="{}"];"#, node(source), node(target), label)?;
src/librustc_mir/graphviz.rs:111 }
error: aborting due to previous error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment