Skip to content

Commit 3abcb9f

Browse files
committed
---
yaml --- r: 216519 b: refs/heads/stable c: 354d16b h: refs/heads/master i: 216517: 4b62738 216515: 4614dc5 216511: c39a3af v: v3
1 parent 91e08ff commit 3abcb9f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+975
-735
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ refs/heads/tmp: 378a370ff2057afeb1eae86eb6e78c476866a4a6
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: a5286998df566e736b32f6795bfc3803bdaf453d
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: 5892b40859b65dd520ae92f7570069adaf313a8f
32+
refs/heads/stable: 354d16bd72ed002d6d8abe9896f89a445a60c21f
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375

branches/stable/src/doc/reference.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1557,8 +1557,7 @@ warnings are generated, or otherwise "you used a private item of another module
15571557
and weren't allowed to."
15581558

15591559
By default, everything in Rust is *private*, with one exception. Enum variants
1560-
in a `pub` enum are also public by default. You are allowed to alter this
1561-
default visibility with the `priv` keyword. When an item is declared as `pub`,
1560+
in a `pub` enum are also public by default. When an item is declared as `pub`,
15621561
it can be thought of as being accessible to the outside world. For example:
15631562

15641563
```
@@ -2426,11 +2425,18 @@ Tuples are written by enclosing zero or more comma-separated expressions in
24262425
parentheses. They are used to create [tuple-typed](#tuple-types) values.
24272426

24282427
```{.tuple}
2429-
(0,);
24302428
(0.0, 4.5);
24312429
("a", 4usize, true);
24322430
```
24332431

2432+
You can disambiguate a single-element tuple from a value in parentheses with a
2433+
comma:
2434+
2435+
```
2436+
(0,); // single-element tuple
2437+
(0); // zero in parentheses
2438+
```
2439+
24342440
### Unit expressions
24352441

24362442
The expression `()` denotes the _unit value_, the only value of the type with

branches/stable/src/doc/trpl/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,5 +190,5 @@ fn main() {
190190
We created an inner scope with an additional set of curly braces. `y` will go out of
191191
scope before we call `push()`, and so we’re all good.
192192

193-
This concept of ownership isn’t just good for preventing danging pointers, but an
193+
This concept of ownership isn’t just good for preventing dangling pointers, but an
194194
entire set of related problems, like iterator invalidation, concurrency, and more.

branches/stable/src/doc/trpl/attributes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,4 @@ Rust attributes are used for a number of different things. There is a full list
6767
of attributes [in the reference][reference]. Currently, you are not allowed to
6868
create your own attributes, the Rust compiler defines them.
6969

70-
[reference]: reference.html#attributes
70+
[reference]: ../reference.html#attributes

branches/stable/src/doc/trpl/const-and-static.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,16 @@ this reason.
1919
# `static`
2020

2121
Rust provides a ‘global variable’ sort of facility in static items. They’re
22-
similar to [constants][const], but static items aren’t inlined upon use. This
23-
means that there is only one instance for each value, and it’s at a fixed
24-
location in memory.
22+
similar to constants, but static items aren’t inlined upon use. This means that
23+
there is only one instance for each value, and it’s at a fixed location in
24+
memory.
2525

2626
Here’s an example:
2727

2828
```rust
2929
static N: i32 = 5;
3030
```
3131

32-
[const]: const.html
33-
3432
Unlike [`let`][let] bindings, you must annotate the type of a `static`.
3533

3634
[let]: variable-bindings.html

branches/stable/src/doc/trpl/iterators.md

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -235,26 +235,15 @@ Ranges are one of two basic iterators that you'll see. The other is `iter()`.
235235
in turn:
236236

237237
```rust
238-
let nums = [1, 2, 3];
238+
let nums = vec![1, 2, 3];
239239

240240
for num in nums.iter() {
241241
println!("{}", num);
242242
}
243243
```
244244

245245
These two basic iterators should serve you well. There are some more
246-
advanced iterators, including ones that are infinite. Like using range syntax
247-
and `step_by`:
248-
249-
```rust
250-
# #![feature(step_by)]
251-
(1..).step_by(5);
252-
```
253-
254-
This iterator counts up from one, adding five each time. It will give
255-
you a new integer every time, forever (well, technically, until it reaches the
256-
maximum number representable by an `i32`). But since iterators are lazy,
257-
that's okay! You probably don't want to use `collect()` on it, though...
246+
advanced iterators, including ones that are infinite.
258247

259248
That's enough about iterators. Iterator adapters are the last concept
260249
we need to talk about with regards to iterators. Let's get to it!

branches/stable/src/doc/trpl/nightly-rust.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ If not, there are a number of places where you can get help. The easiest is
9393
[the #rust IRC channel on irc.mozilla.org][irc], which you can access through
9494
[Mibbit][mibbit]. Click that link, and you'll be chatting with other Rustaceans
9595
(a silly nickname we call ourselves), and we can help you out. Other great
96-
resources include [the user’s forum][users], and [Stack Overflow][stack
97-
overflow].
96+
resources include [the user’s forum][users], and [Stack Overflow][stack overflow].
9897

9998
[irc]: irc://irc.mozilla.org/#rust
10099
[mibbit]: http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust

branches/stable/src/doc/trpl/primitive-types.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,14 @@ or “breaks up” the tuple, and assigns the bits to three bindings.
248248

249249
This pattern is very powerful, and we’ll see it repeated more later.
250250

251+
You can disambiguate a single-element tuple from a value in parentheses with a
252+
comma:
253+
254+
```
255+
(0,); // single-element tuple
256+
(0); // zero in parentheses
257+
```
258+
251259
## Tuple Indexing
252260

253261
You can also access fields of a tuple with indexing syntax:

branches/stable/src/doc/trpl/raw-pointers.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ Raw pointers are useful for FFI: Rust’s `*const T` and `*mut T` are similar to
8080
C’s `const T*` and `T*`, respectfully. For more about this use, consult the
8181
[FFI chapter][ffi].
8282

83-
[ffi]: ffi.md
83+
[ffi]: ffi.html
8484

8585
# References and raw pointers
8686

branches/stable/src/doc/trpl/unsafe.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Rust has a feature called ‘`static mut`’ which allows for mutable global sta
101101
Doing so can cause a data race, and as such is inherently not safe. For more
102102
details, see the [static][static] section of the book.
103103

104-
[static]: static.html
104+
[static]: const-and-static.html#static
105105

106106
## Dereference a raw pointer
107107

branches/stable/src/doc/trpl/unsized-types.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@ impl Foo for &str {
3838
```
3939

4040
Meaning, this implementation would only work for [references][ref], and not
41-
other types of pointers. With this `impl`, all pointers, including (at some
42-
point, there are some bugs to fix first) user-defined custom smart pointers,
43-
can use this `impl`.
41+
other types of pointers. With the `impl for str`, all pointers, including (at
42+
some point, there are some bugs to fix first) user-defined custom smart
43+
pointers, can use this `impl`.
44+
45+
[ref]: references-and-borrowing.html
4446

4547
# ?Sized
4648

branches/stable/src/liballoc/boxed.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ impl<T: ?Sized + Hash> Hash for Box<T> {
240240
impl Box<Any> {
241241
#[inline]
242242
#[stable(feature = "rust1", since = "1.0.0")]
243+
/// Attempt to downcast the box to a concrete type.
243244
pub fn downcast<T: Any>(self) -> Result<Box<T>, Box<Any>> {
244245
if self.is::<T>() {
245246
unsafe {
@@ -257,11 +258,15 @@ impl Box<Any> {
257258
}
258259
}
259260

260-
impl Box<Any+Send> {
261+
impl Box<Any + Send> {
261262
#[inline]
262263
#[stable(feature = "rust1", since = "1.0.0")]
263-
pub fn downcast<T: Any>(self) -> Result<Box<T>, Box<Any>> {
264-
<Box<Any>>::downcast(self)
264+
/// Attempt to downcast the box to a concrete type.
265+
pub fn downcast<T: Any>(self) -> Result<Box<T>, Box<Any + Send>> {
266+
<Box<Any>>::downcast(self).map_err(|s| unsafe {
267+
// reapply the Send marker
268+
mem::transmute::<Box<Any>, Box<Any + Send>>(s)
269+
})
265270
}
266271
}
267272

branches/stable/src/libcollections/fmt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@
398398
//! longer than this width, then it is truncated down to this many characters and only those are
399399
//! emitted.
400400
//!
401-
//! For integral types, this has no meaning currently.
401+
//! For integral types, this is ignored.
402402
//!
403403
//! For floating-point types, this indicates how many digits after the decimal point should be
404404
//! printed.

branches/stable/src/libcollections/string.rs

Lines changed: 119 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ use rustc_unicode::str as unicode_str;
2626
use rustc_unicode::str::Utf16Item;
2727

2828
use borrow::{Cow, IntoCow};
29-
use str::{self, FromStr, Utf8Error};
29+
use range::RangeArgument;
30+
use str::{self, FromStr, Utf8Error, Chars};
3031
use vec::{DerefVec, Vec, as_vec};
3132

3233
/// A growable string stored as a UTF-8 encoded buffer.
@@ -695,6 +696,59 @@ impl String {
695696
pub fn clear(&mut self) {
696697
self.vec.clear()
697698
}
699+
700+
/// Create a draining iterator that removes the specified range in the string
701+
/// and yields the removed chars from start to end. The element range is
702+
/// removed even if the iterator is not consumed until the end.
703+
///
704+
/// # Panics
705+
///
706+
/// Panics if the starting point or end point are not on character boundaries,
707+
/// or if they are out of bounds.
708+
///
709+
/// # Examples
710+
///
711+
/// ```
712+
/// # #![feature(collections_drain)]
713+
///
714+
/// let mut s = String::from("α is alpha, β is beta");
715+
/// let beta_offset = s.find('β').unwrap_or(s.len());
716+
///
717+
/// // Remove the range up until the β from the string
718+
/// let t: String = s.drain(..beta_offset).collect();
719+
/// assert_eq!(t, "α is alpha, ");
720+
/// assert_eq!(s, "β is beta");
721+
///
722+
/// // A full range clears the string
723+
/// s.drain(..);
724+
/// assert_eq!(s, "");
725+
/// ```
726+
#[unstable(feature = "collections_drain",
727+
reason = "recently added, matches RFC")]
728+
pub fn drain<R>(&mut self, range: R) -> Drain where R: RangeArgument<usize> {
729+
// Memory safety
730+
//
731+
// The String version of Drain does not have the memory safety issues
732+
// of the vector version. The data is just plain bytes.
733+
// Because the range removal happens in Drop, if the Drain iterator is leaked,
734+
// the removal will not happen.
735+
let len = self.len();
736+
let start = *range.start().unwrap_or(&0);
737+
let end = *range.end().unwrap_or(&len);
738+
739+
// Take out two simultaneous borrows. The &mut String won't be accessed
740+
// until iteration is over, in Drop.
741+
let self_ptr = self as *mut _;
742+
// slicing does the appropriate bounds checks
743+
let chars_iter = self[start..end].chars();
744+
745+
Drain {
746+
start: start,
747+
end: end,
748+
iter: chars_iter,
749+
string: self_ptr,
750+
}
751+
}
698752
}
699753

700754
impl FromUtf8Error {
@@ -740,8 +794,7 @@ impl<'a> FromIterator<&'a str> for String {
740794
}
741795
}
742796

743-
#[unstable(feature = "collections",
744-
reason = "waiting on Extend stabilization")]
797+
#[stable(feature = "rust1", since = "1.0.0")]
745798
impl Extend<char> for String {
746799
fn extend<I: IntoIterator<Item=char>>(&mut self, iterable: I) {
747800
let iterator = iterable.into_iter();
@@ -753,8 +806,7 @@ impl Extend<char> for String {
753806
}
754807
}
755808

756-
#[unstable(feature = "collections",
757-
reason = "waiting on Extend stabilization")]
809+
#[stable(feature = "rust1", since = "1.0.0")]
758810
impl<'a> Extend<&'a str> for String {
759811
fn extend<I: IntoIterator<Item=&'a str>>(&mut self, iterable: I) {
760812
let iterator = iterable.into_iter();
@@ -869,8 +921,7 @@ impl hash::Hash for String {
869921
}
870922
}
871923

872-
#[unstable(feature = "collections",
873-
reason = "recent addition, needs more experience")]
924+
#[stable(feature = "rust1", since = "1.0.0")]
874925
impl<'a> Add<&'a str> for String {
875926
type Output = String;
876927

@@ -964,11 +1015,17 @@ pub fn as_string<'a>(x: &'a str) -> DerefString<'a> {
9641015
DerefString { x: as_vec(x.as_bytes()) }
9651016
}
9661017

967-
#[unstable(feature = "collections", reason = "associated error type may change")]
1018+
/// Error returned from `String::from_str`
1019+
#[unstable(feature = "str_parse_error", reason = "may want to be replaced with \
1020+
Void if it ever exists")]
1021+
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1022+
pub struct ParseError(());
1023+
1024+
#[stable(feature = "rust1", since = "1.0.0")]
9681025
impl FromStr for String {
969-
type Err = ();
1026+
type Err = ParseError;
9701027
#[inline]
971-
fn from_str(s: &str) -> Result<String, ()> {
1028+
fn from_str(s: &str) -> Result<String, ParseError> {
9721029
Ok(String::from_str(s))
9731030
}
9741031
}
@@ -1072,3 +1129,55 @@ impl fmt::Write for String {
10721129
Ok(())
10731130
}
10741131
}
1132+
1133+
/// A draining iterator for `String`.
1134+
#[unstable(feature = "collections_drain", reason = "recently added")]
1135+
pub struct Drain<'a> {
1136+
/// Will be used as &'a mut String in the destructor
1137+
string: *mut String,
1138+
/// Start of part to remove
1139+
start: usize,
1140+
/// End of part to remove
1141+
end: usize,
1142+
/// Current remaining range to remove
1143+
iter: Chars<'a>,
1144+
}
1145+
1146+
unsafe impl<'a> Sync for Drain<'a> {}
1147+
unsafe impl<'a> Send for Drain<'a> {}
1148+
1149+
#[unstable(feature = "collections_drain", reason = "recently added")]
1150+
impl<'a> Drop for Drain<'a> {
1151+
fn drop(&mut self) {
1152+
unsafe {
1153+
// Use Vec::drain. "Reaffirm" the bounds checks to avoid
1154+
// panic code being inserted again.
1155+
let self_vec = (*self.string).as_mut_vec();
1156+
if self.start <= self.end && self.end <= self_vec.len() {
1157+
self_vec.drain(self.start..self.end);
1158+
}
1159+
}
1160+
}
1161+
}
1162+
1163+
#[unstable(feature = "collections_drain", reason = "recently added")]
1164+
impl<'a> Iterator for Drain<'a> {
1165+
type Item = char;
1166+
1167+
#[inline]
1168+
fn next(&mut self) -> Option<char> {
1169+
self.iter.next()
1170+
}
1171+
1172+
fn size_hint(&self) -> (usize, Option<usize>) {
1173+
self.iter.size_hint()
1174+
}
1175+
}
1176+
1177+
#[unstable(feature = "collections_drain", reason = "recently added")]
1178+
impl<'a> DoubleEndedIterator for Drain<'a> {
1179+
#[inline]
1180+
fn next_back(&mut self) -> Option<char> {
1181+
self.iter.next_back()
1182+
}
1183+
}

0 commit comments

Comments
 (0)