Skip to content

Commit 8c41c3e

Browse files
committed
use RangeArgument for indexing
1 parent ae907df commit 8c41c3e

File tree

6 files changed

+61
-334
lines changed

6 files changed

+61
-334
lines changed

src/libcollections/string.rs

+6-54
Original file line numberDiff line numberDiff line change
@@ -1569,68 +1569,20 @@ impl<'a> Add<&'a str> for String {
15691569
}
15701570

15711571
#[stable(feature = "rust1", since = "1.0.0")]
1572-
impl ops::Index<ops::Range<usize>> for String {
1572+
impl<R: RangeArgument<usize>> ops::Index<R> for String {
15731573
type Output = str;
15741574

15751575
#[inline]
1576-
fn index(&self, index: ops::Range<usize>) -> &str {
1577-
&self[..][index]
1578-
}
1579-
}
1580-
#[stable(feature = "rust1", since = "1.0.0")]
1581-
impl ops::Index<ops::RangeTo<usize>> for String {
1582-
type Output = str;
1583-
1584-
#[inline]
1585-
fn index(&self, index: ops::RangeTo<usize>) -> &str {
1586-
&self[..][index]
1587-
}
1588-
}
1589-
#[stable(feature = "rust1", since = "1.0.0")]
1590-
impl ops::Index<ops::RangeFrom<usize>> for String {
1591-
type Output = str;
1592-
1593-
#[inline]
1594-
fn index(&self, index: ops::RangeFrom<usize>) -> &str {
1595-
&self[..][index]
1596-
}
1597-
}
1598-
#[stable(feature = "rust1", since = "1.0.0")]
1599-
impl ops::Index<ops::RangeFull> for String {
1600-
type Output = str;
1601-
1602-
#[inline]
1603-
fn index(&self, _index: ops::RangeFull) -> &str {
1604-
unsafe { str::from_utf8_unchecked(&self.vec) }
1576+
fn index(&self, index: R) -> &str {
1577+
&(**self)[index]
16051578
}
16061579
}
16071580

16081581
#[stable(feature = "derefmut_for_string", since = "1.2.0")]
1609-
impl ops::IndexMut<ops::Range<usize>> for String {
1610-
#[inline]
1611-
fn index_mut(&mut self, index: ops::Range<usize>) -> &mut str {
1612-
&mut self[..][index]
1613-
}
1614-
}
1615-
#[stable(feature = "derefmut_for_string", since = "1.2.0")]
1616-
impl ops::IndexMut<ops::RangeTo<usize>> for String {
1617-
#[inline]
1618-
fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut str {
1619-
&mut self[..][index]
1620-
}
1621-
}
1622-
#[stable(feature = "derefmut_for_string", since = "1.2.0")]
1623-
impl ops::IndexMut<ops::RangeFrom<usize>> for String {
1624-
#[inline]
1625-
fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut str {
1626-
&mut self[..][index]
1627-
}
1628-
}
1629-
#[stable(feature = "derefmut_for_string", since = "1.2.0")]
1630-
impl ops::IndexMut<ops::RangeFull> for String {
1582+
impl<R: RangeArgument<usize>> ops::IndexMut<R> for String {
16311583
#[inline]
1632-
fn index_mut(&mut self, _index: ops::RangeFull) -> &mut str {
1633-
unsafe { mem::transmute(&mut *self.vec) }
1584+
fn index_mut(&mut self, index: R) -> &mut str {
1585+
&mut (**self)[index]
16341586
}
16351587
}
16361588

src/libcollections/vec.rs

+4-52
Original file line numberDiff line numberDiff line change
@@ -1144,70 +1144,22 @@ impl<T> IndexMut<usize> for Vec<T> {
11441144

11451145

11461146
#[stable(feature = "rust1", since = "1.0.0")]
1147-
impl<T> ops::Index<ops::Range<usize>> for Vec<T> {
1147+
impl<T, R: RangeArgument<usize>> ops::Index<R> for Vec<T> {
11481148
type Output = [T];
11491149

11501150
#[inline]
1151-
fn index(&self, index: ops::Range<usize>) -> &[T] {
1151+
fn index(&self, index: R) -> &[T] {
11521152
Index::index(&**self, index)
11531153
}
11541154
}
1155-
#[stable(feature = "rust1", since = "1.0.0")]
1156-
impl<T> ops::Index<ops::RangeTo<usize>> for Vec<T> {
1157-
type Output = [T];
1158-
1159-
#[inline]
1160-
fn index(&self, index: ops::RangeTo<usize>) -> &[T] {
1161-
Index::index(&**self, index)
1162-
}
1163-
}
1164-
#[stable(feature = "rust1", since = "1.0.0")]
1165-
impl<T> ops::Index<ops::RangeFrom<usize>> for Vec<T> {
1166-
type Output = [T];
1167-
1168-
#[inline]
1169-
fn index(&self, index: ops::RangeFrom<usize>) -> &[T] {
1170-
Index::index(&**self, index)
1171-
}
1172-
}
1173-
#[stable(feature = "rust1", since = "1.0.0")]
1174-
impl<T> ops::Index<ops::RangeFull> for Vec<T> {
1175-
type Output = [T];
1176-
1177-
#[inline]
1178-
fn index(&self, _index: ops::RangeFull) -> &[T] {
1179-
self
1180-
}
1181-
}
11821155

11831156
#[stable(feature = "rust1", since = "1.0.0")]
1184-
impl<T> ops::IndexMut<ops::Range<usize>> for Vec<T> {
1185-
#[inline]
1186-
fn index_mut(&mut self, index: ops::Range<usize>) -> &mut [T] {
1187-
IndexMut::index_mut(&mut **self, index)
1188-
}
1189-
}
1190-
#[stable(feature = "rust1", since = "1.0.0")]
1191-
impl<T> ops::IndexMut<ops::RangeTo<usize>> for Vec<T> {
1192-
#[inline]
1193-
fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut [T] {
1194-
IndexMut::index_mut(&mut **self, index)
1195-
}
1196-
}
1197-
#[stable(feature = "rust1", since = "1.0.0")]
1198-
impl<T> ops::IndexMut<ops::RangeFrom<usize>> for Vec<T> {
1157+
impl<T, R: RangeArgument<usize>> ops::IndexMut<R> for Vec<T> {
11991158
#[inline]
1200-
fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut [T] {
1159+
fn index_mut(&mut self, index: R) -> &mut [T] {
12011160
IndexMut::index_mut(&mut **self, index)
12021161
}
12031162
}
1204-
#[stable(feature = "rust1", since = "1.0.0")]
1205-
impl<T> ops::IndexMut<ops::RangeFull> for Vec<T> {
1206-
#[inline]
1207-
fn index_mut(&mut self, _index: ops::RangeFull) -> &mut [T] {
1208-
self
1209-
}
1210-
}
12111163

12121164
#[stable(feature = "rust1", since = "1.0.0")]
12131165
impl<T> ops::Deref for Vec<T> {

src/libcore/slice.rs

+23-67
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ use cmp;
4040
use default::Default;
4141
use intrinsics::assume;
4242
use iter::*;
43-
use ops::{FnMut, self, Index};
44-
use ops::RangeFull;
43+
use ops::{FnMut, self};
4544
use option::Option;
4645
use option::Option::{None, Some};
4746
use result::Result;
@@ -522,91 +521,48 @@ fn slice_index_order_fail(index: usize, end: usize) -> ! {
522521
}
523522

524523
#[stable(feature = "rust1", since = "1.0.0")]
525-
impl<T> ops::Index<ops::Range<usize>> for [T] {
524+
impl<T, R: ops::RangeArgument<usize>> ops::Index<R> for [T] {
526525
type Output = [T];
527526

528527
#[inline]
529-
fn index(&self, index: ops::Range<usize>) -> &[T] {
530-
if index.start > index.end {
531-
slice_index_order_fail(index.start, index.end);
532-
} else if index.end > self.len() {
533-
slice_index_len_fail(index.end, self.len());
528+
fn index(&self, index: R) -> &[T] {
529+
let len = self.len();
530+
let start = *index.start().unwrap_or(&0);
531+
let end = *index.end().unwrap_or(&len);
532+
if start > end {
533+
slice_index_order_fail(start, end);
534+
} else if end > len {
535+
slice_index_len_fail(end, len);
534536
}
535537
unsafe {
536538
from_raw_parts (
537-
self.as_ptr().offset(index.start as isize),
538-
index.end - index.start
539+
self.as_ptr().offset(start as isize),
540+
end - start
539541
)
540542
}
541543
}
542544
}
543-
#[stable(feature = "rust1", since = "1.0.0")]
544-
impl<T> ops::Index<ops::RangeTo<usize>> for [T] {
545-
type Output = [T];
546545

547-
#[inline]
548-
fn index(&self, index: ops::RangeTo<usize>) -> &[T] {
549-
self.index(ops::Range{ start: 0, end: index.end })
550-
}
551-
}
552546
#[stable(feature = "rust1", since = "1.0.0")]
553-
impl<T> ops::Index<ops::RangeFrom<usize>> for [T] {
554-
type Output = [T];
555-
547+
impl<T, R: ops::RangeArgument<usize>> ops::IndexMut<R> for [T] {
556548
#[inline]
557-
fn index(&self, index: ops::RangeFrom<usize>) -> &[T] {
558-
self.index(ops::Range{ start: index.start, end: self.len() })
559-
}
560-
}
561-
#[stable(feature = "rust1", since = "1.0.0")]
562-
impl<T> ops::Index<RangeFull> for [T] {
563-
type Output = [T];
564-
565-
#[inline]
566-
fn index(&self, _index: RangeFull) -> &[T] {
567-
self
568-
}
569-
}
570-
571-
#[stable(feature = "rust1", since = "1.0.0")]
572-
impl<T> ops::IndexMut<ops::Range<usize>> for [T] {
573-
#[inline]
574-
fn index_mut(&mut self, index: ops::Range<usize>) -> &mut [T] {
575-
if index.start > index.end {
576-
slice_index_order_fail(index.start, index.end);
577-
} else if index.end > self.len() {
578-
slice_index_len_fail(index.end, self.len());
549+
fn index_mut(&mut self, index: R) -> &mut [T] {
550+
let len = self.len();
551+
let start = *index.start().unwrap_or(&0);
552+
let end = *index.end().unwrap_or(&len);
553+
if start > end {
554+
slice_index_order_fail(start, end);
555+
} else if end > len {
556+
slice_index_len_fail(end, len);
579557
}
580558
unsafe {
581559
from_raw_parts_mut(
582-
self.as_mut_ptr().offset(index.start as isize),
583-
index.end - index.start
560+
self.as_mut_ptr().offset(start as isize),
561+
end - start
584562
)
585563
}
586564
}
587565
}
588-
#[stable(feature = "rust1", since = "1.0.0")]
589-
impl<T> ops::IndexMut<ops::RangeTo<usize>> for [T] {
590-
#[inline]
591-
fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut [T] {
592-
self.index_mut(ops::Range{ start: 0, end: index.end })
593-
}
594-
}
595-
#[stable(feature = "rust1", since = "1.0.0")]
596-
impl<T> ops::IndexMut<ops::RangeFrom<usize>> for [T] {
597-
#[inline]
598-
fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut [T] {
599-
let len = self.len();
600-
self.index_mut(ops::Range{ start: index.start, end: len })
601-
}
602-
}
603-
#[stable(feature = "rust1", since = "1.0.0")]
604-
impl<T> ops::IndexMut<RangeFull> for [T] {
605-
#[inline]
606-
fn index_mut(&mut self, _index: RangeFull) -> &mut [T] {
607-
self
608-
}
609-
}
610566

611567

612568
////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)