Skip to content

Commit 6e0611a

Browse files
committed
Review and rebasing changes
1 parent 95cfc35 commit 6e0611a

File tree

8 files changed

+103
-42
lines changed

8 files changed

+103
-42
lines changed

src/libcollections/slice.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
//!
4545
//! A number of traits add methods that allow you to accomplish tasks with slices.
4646
//! These traits include `ImmutableSlice`, which is defined for `&[T]` types,
47-
//! and `MutableSlice`, defined for `&mut [T]` types.
47+
//! `MutableSlice`, defined for `&mut [T]` types, and `Slice` and `SliceMut`
48+
//! which are defined for `[T]`.
4849
//!
4950
//! An example is the `slice` method which enables slicing syntax `[a..b]` that
5051
//! returns an immutable "view" into a `Vec` or another slice from the index

src/libcollections/string.rs

+29
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,7 @@ impl<S: Str> Add<S, String> for String {
927927
}
928928
}
929929

930+
#[cfg(stage0)]
930931
impl ops::Slice<uint, str> for String {
931932
#[inline]
932933
fn as_slice_<'a>(&'a self) -> &'a str {
@@ -949,6 +950,34 @@ impl ops::Slice<uint, str> for String {
949950
}
950951
}
951952

953+
#[cfg(not(stage0))]
954+
#[inline]
955+
fn str_to_slice<'a, U: Str>(this: &'a U) -> &'a str {
956+
this.as_slice()
957+
}
958+
#[cfg(not(stage0))]
959+
impl ops::Slice<uint, str> for String {
960+
#[inline]
961+
fn as_slice<'a>(&'a self) -> &'a str {
962+
str_to_slice(self)
963+
}
964+
965+
#[inline]
966+
fn slice_from<'a>(&'a self, from: &uint) -> &'a str {
967+
self[][*from..]
968+
}
969+
970+
#[inline]
971+
fn slice_to<'a>(&'a self, to: &uint) -> &'a str {
972+
self[][..*to]
973+
}
974+
975+
#[inline]
976+
fn slice<'a>(&'a self, from: &uint, to: &uint) -> &'a str {
977+
self[][*from..*to]
978+
}
979+
}
980+
952981
/// Unsafe operations
953982
#[unstable = "waiting on raw module conventions"]
954983
pub mod raw {

src/libcollections/vec.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ impl<T> Index<uint,T> for Vec<T> {
462462

463463
// Annoying helper function because there are two Slice::as_slice functions in
464464
// scope.
465+
#[cfg(not(stage0))]
465466
#[inline]
466467
fn slice_to_slice<'a, T, U: Slice<T>>(this: &'a U) -> &'a [T] {
467468
this.as_slice()
@@ -983,7 +984,6 @@ impl<T> Vec<T> {
983984
/// assert!(vec[0..2] == [1, 2]);
984985
/// ```
985986
#[inline]
986-
#[deprecated = "use slicing syntax"]
987987
pub fn slice<'a>(&'a self, start: uint, end: uint) -> &'a [T] {
988988
self[start..end]
989989
}
@@ -1019,7 +1019,7 @@ impl<T> Vec<T> {
10191019
/// assert!(vec.tailn(2) == [3, 4]);
10201020
/// ```
10211021
#[inline]
1022-
#[deprecated = "use slicing syntax"]
1022+
#[deprecated = "use slice_from"]
10231023
pub fn tailn<'a>(&'a self, n: uint) -> &'a [T] {
10241024
self[n..]
10251025
}
@@ -1229,7 +1229,7 @@ impl<T> Vec<T> {
12291229
}
12301230

12311231
/// Deprecated: use `slice_mut`.
1232-
#[deprecated = "use slicing syntax"]
1232+
#[deprecated = "use slice_from"]
12331233
pub fn mut_slice<'a>(&'a mut self, start: uint, end: uint)
12341234
-> &'a mut [T] {
12351235
self[mut start..end]
@@ -1249,14 +1249,13 @@ impl<T> Vec<T> {
12491249
/// assert!(vec[mut 0..2] == [1, 2]);
12501250
/// ```
12511251
#[inline]
1252-
#[deprecated = "use slicing syntax"]
12531252
pub fn slice_mut<'a>(&'a mut self, start: uint, end: uint)
12541253
-> &'a mut [T] {
12551254
self[mut start..end]
12561255
}
12571256

12581257
/// Deprecated: use "slice_from_mut".
1259-
#[deprecated = "use slicing syntax"]
1258+
#[deprecated = "use slice_from_mut"]
12601259
pub fn mut_slice_from<'a>(&'a mut self, start: uint) -> &'a mut [T] {
12611260
self[mut start..]
12621261
}
@@ -1274,13 +1273,12 @@ impl<T> Vec<T> {
12741273
/// assert!(vec[mut 2..] == [3, 4]);
12751274
/// ```
12761275
#[inline]
1277-
#[deprecated = "use slicing syntax"]
12781276
pub fn slice_from_mut<'a>(&'a mut self, start: uint) -> &'a mut [T] {
12791277
self[mut start..]
12801278
}
12811279

12821280
/// Deprecated: use `slice_to_mut`.
1283-
#[deprecated = "use slicing syntax"]
1281+
#[deprecated = "use slice_to_mut"]
12841282
pub fn mut_slice_to<'a>(&'a mut self, end: uint) -> &'a mut [T] {
12851283
self[mut ..end]
12861284
}
@@ -1298,7 +1296,6 @@ impl<T> Vec<T> {
12981296
/// assert!(vec[mut ..2] == [1, 2]);
12991297
/// ```
13001298
#[inline]
1301-
#[deprecated = "use slicing syntax"]
13021299
pub fn slice_to_mut<'a>(&'a mut self, end: uint) -> &'a mut [T] {
13031300
self[mut ..end]
13041301
}
@@ -1375,7 +1372,6 @@ impl<T> Vec<T> {
13751372
/// assert!(vec[1..] == [2, 3]);
13761373
/// ```
13771374
#[inline]
1378-
#[deprecated = "use slicing syntax"]
13791375
pub fn slice_from<'a>(&'a self, start: uint) -> &'a [T] {
13801376
self[start..]
13811377
}
@@ -1393,7 +1389,6 @@ impl<T> Vec<T> {
13931389
/// assert!(vec[..2] == [1, 2]);
13941390
/// ```
13951391
#[inline]
1396-
#[deprecated = "use slicing syntax"]
13971392
pub fn slice_to<'a>(&'a self, end: uint) -> &'a [T] {
13981393
self[..end]
13991394
}

src/libcore/slice.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ pub trait ImmutableSlice<'a, T> {
152152
fn tail(&self) -> &'a [T];
153153

154154
/// Returns all but the first `n' elements of a slice.
155-
#[deprecated = "use slicing syntax"]
155+
#[deprecated = "use slice_from"]
156156
fn tailn(&self, n: uint) -> &'a [T];
157157

158158
/// Returns all but the last element of a slice.
@@ -161,7 +161,6 @@ pub trait ImmutableSlice<'a, T> {
161161

162162
/// Returns all but the last `n' elements of a slice.
163163
#[deprecated = "use slice_to but note the arguments are different"]
164-
#[deprecated = "use slicing syntax, but note the arguments are different"]
165164
fn initn(&self, n: uint) -> &'a [T];
166165

167166
/// Returns the last element of a slice, or `None` if it is empty.
@@ -321,7 +320,7 @@ impl<'a,T> ImmutableSlice<'a, T> for &'a [T] {
321320
fn tail(&self) -> &'a [T] { (*self)[1..] }
322321

323322
#[inline]
324-
#[deprecated = "use slicing syntax"]
323+
#[deprecated = "use slice_from"]
325324
fn tailn(&self, n: uint) -> &'a [T] { (*self)[n..] }
326325

327326
#[inline]
@@ -330,7 +329,7 @@ impl<'a,T> ImmutableSlice<'a, T> for &'a [T] {
330329
}
331330

332331
#[inline]
333-
#[deprecated = "use slicing syntax but note the arguments are different"]
332+
#[deprecated = "use slice_to but note the arguments are different"]
334333
fn initn(&self, n: uint) -> &'a [T] {
335334
(*self)[..self.len() - n]
336335
}
@@ -543,7 +542,6 @@ pub trait MutableSlice<'a, T> {
543542
fn get_mut(self, index: uint) -> Option<&'a mut T>;
544543
/// Work with `self` as a mut slice.
545544
/// Primarily intended for getting a &mut [T] from a [T, ..N].
546-
#[deprecated = "use slicing syntax"]
547545
fn as_mut_slice(self) -> &'a mut [T];
548546

549547
/// Deprecated: use `iter_mut`.

src/libcore/str.rs

+61-23
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,7 @@ pub mod traits {
11641164
fn equiv(&self, other: &S) -> bool { eq_slice(*self, other.as_slice()) }
11651165
}
11661166

1167+
#[cfg(stage0)]
11671168
impl ops::Slice<uint, str> for str {
11681169
#[inline]
11691170
fn as_slice_<'a>(&'a self) -> &'a str {
@@ -1172,17 +1173,39 @@ pub mod traits {
11721173

11731174
#[inline]
11741175
fn slice_from_<'a>(&'a self, from: &uint) -> &'a str {
1175-
self.slice_from(*from)
1176+
super::slice_from_impl(&self, *from)
11761177
}
11771178

11781179
#[inline]
11791180
fn slice_to_<'a>(&'a self, to: &uint) -> &'a str {
1180-
self.slice_to(*to)
1181+
super::slice_to_impl(&self, *to)
11811182
}
11821183

11831184
#[inline]
11841185
fn slice_<'a>(&'a self, from: &uint, to: &uint) -> &'a str {
1185-
self.slice(*from, *to)
1186+
super::slice_impl(&self, *from, *to)
1187+
}
1188+
}
1189+
#[cfg(not(stage0))]
1190+
impl ops::Slice<uint, str> for str {
1191+
#[inline]
1192+
fn as_slice<'a>(&'a self) -> &'a str {
1193+
self
1194+
}
1195+
1196+
#[inline]
1197+
fn slice_from<'a>(&'a self, from: &uint) -> &'a str {
1198+
super::slice_from_impl(&self, *from)
1199+
}
1200+
1201+
#[inline]
1202+
fn slice_to<'a>(&'a self, to: &uint) -> &'a str {
1203+
super::slice_to_impl(&self, *to)
1204+
}
1205+
1206+
#[inline]
1207+
fn slice<'a>(&'a self, from: &uint, to: &uint) -> &'a str {
1208+
super::slice_impl(&self, *from, *to)
11861209
}
11871210
}
11881211
}
@@ -1835,6 +1858,38 @@ fn slice_error_fail(s: &str, begin: uint, end: uint) -> ! {
18351858
begin, end, s);
18361859
}
18371860

1861+
#[inline]
1862+
fn slice_impl<'a>(this: &&'a str, begin: uint, end: uint) -> &'a str {
1863+
// is_char_boundary checks that the index is in [0, .len()]
1864+
if begin <= end &&
1865+
this.is_char_boundary(begin) &&
1866+
this.is_char_boundary(end) {
1867+
unsafe { raw::slice_unchecked(*this, begin, end) }
1868+
} else {
1869+
slice_error_fail(*this, begin, end)
1870+
}
1871+
}
1872+
1873+
#[inline]
1874+
fn slice_from_impl<'a>(this: &&'a str, begin: uint) -> &'a str {
1875+
// is_char_boundary checks that the index is in [0, .len()]
1876+
if this.is_char_boundary(begin) {
1877+
unsafe { raw::slice_unchecked(*this, begin, this.len()) }
1878+
} else {
1879+
slice_error_fail(*this, begin, this.len())
1880+
}
1881+
}
1882+
1883+
#[inline]
1884+
fn slice_to_impl<'a>(this: &&'a str, end: uint) -> &'a str {
1885+
// is_char_boundary checks that the index is in [0, .len()]
1886+
if this.is_char_boundary(end) {
1887+
unsafe { raw::slice_unchecked(*this, 0, end) }
1888+
} else {
1889+
slice_error_fail(*this, 0, end)
1890+
}
1891+
}
1892+
18381893
impl<'a> StrSlice<'a> for &'a str {
18391894
#[inline]
18401895
fn contains<'a>(&self, needle: &'a str) -> bool {
@@ -1938,34 +1993,17 @@ impl<'a> StrSlice<'a> for &'a str {
19381993

19391994
#[inline]
19401995
fn slice(&self, begin: uint, end: uint) -> &'a str {
1941-
// is_char_boundary checks that the index is in [0, .len()]
1942-
if begin <= end &&
1943-
self.is_char_boundary(begin) &&
1944-
self.is_char_boundary(end) {
1945-
unsafe { raw::slice_unchecked(*self, begin, end) }
1946-
} else {
1947-
slice_error_fail(*self, begin, end)
1948-
}
1996+
slice_impl(self, begin, end)
19491997
}
19501998

19511999
#[inline]
19522000
fn slice_from(&self, begin: uint) -> &'a str {
1953-
// is_char_boundary checks that the index is in [0, .len()]
1954-
if self.is_char_boundary(begin) {
1955-
unsafe { raw::slice_unchecked(*self, begin, self.len()) }
1956-
} else {
1957-
slice_error_fail(*self, begin, self.len())
1958-
}
2001+
slice_from_impl(self, begin)
19592002
}
19602003

19612004
#[inline]
19622005
fn slice_to(&self, end: uint) -> &'a str {
1963-
// is_char_boundary checks that the index is in [0, .len()]
1964-
if self.is_char_boundary(end) {
1965-
unsafe { raw::slice_unchecked(*self, 0, end) }
1966-
} else {
1967-
slice_error_fail(*self, 0, end)
1968-
}
2006+
slice_to_impl(self, end)
19692007
}
19702008

19712009
fn slice_chars(&self, begin: uint, end: uint) -> &'a str {

src/libnative/io/pipe_windows.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ impl rtio::RtioPipe for UnixStream {
448448
}
449449
let ret = unsafe {
450450
libc::WriteFile(self.handle(),
451-
buf.slice_from(offset).as_ptr() as libc::LPVOID,
451+
buf[offset..].as_ptr() as libc::LPVOID,
452452
(buf.len() - offset) as libc::DWORD,
453453
&mut bytes_written,
454454
&mut overlapped)

src/libstd/os.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ pub mod windows {
144144
use option::{None, Option};
145145
use option;
146146
use os::TMPBUF_SZ;
147-
use slice::{MutableSlice, ImmutableSlice};
147+
use slice::MutableSlice;
148148
use string::String;
149149
use str::StrSlice;
150150
use vec::Vec;

src/libstd/rt/backtrace.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,7 @@ mod imp {
999999
let bytes = cstr.as_bytes();
10001000
match cstr.as_str() {
10011001
Some(s) => try!(super::demangle(w, s)),
1002-
None => try!(w.write(bytes.slice_to(bytes.len() - 1))),
1002+
None => try!(w.write(bytes[..bytes.len()-1])),
10031003
}
10041004
}
10051005
try!(w.write(['\n' as u8]));

0 commit comments

Comments
 (0)