-
-
Save bluss/ee1396d6b845f8eefa04ead1fa940533 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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