@@ -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+
18381893impl < ' 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 {
0 commit comments