Audit integer types in libunicode, libcore/(char, str) and libstd/ascii
This commit is contained in:
@@ -366,7 +366,7 @@ def emit_conversions_module(f, lowerupper, upperlower):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bsearch_case_table(c: char, table: &'static [(char, char)]) -> Option<uint> {
|
fn bsearch_case_table(c: char, table: &'static [(char, char)]) -> Option<usize> {
|
||||||
match table.binary_search(|&(key, _)| {
|
match table.binary_search(|&(key, _)| {
|
||||||
if c == key { Equal }
|
if c == key { Equal }
|
||||||
else if key < c { Less }
|
else if key < c { Less }
|
||||||
@@ -449,13 +449,13 @@ def emit_charwidth_module(f, width_table):
|
|||||||
""")
|
""")
|
||||||
|
|
||||||
f.write("""
|
f.write("""
|
||||||
pub fn width(c: char, is_cjk: bool) -> Option<uint> {
|
pub fn width(c: char, is_cjk: bool) -> Option<usize> {
|
||||||
match c as uint {
|
match c as usize {
|
||||||
_c @ 0 => Some(0), // null is zero width
|
_c @ 0 => Some(0), // null is zero width
|
||||||
cu if cu < 0x20 => None, // control sequences have no width
|
cu if cu < 0x20 => None, // control sequences have no width
|
||||||
cu if cu < 0x7F => Some(1), // ASCII
|
cu if cu < 0x7F => Some(1), // ASCII
|
||||||
cu if cu < 0xA0 => None, // more control sequences
|
cu if cu < 0xA0 => None, // more control sequences
|
||||||
_ => Some(bsearch_range_value_table(c, is_cjk, charwidth_table) as uint)
|
_ => Some(bsearch_range_value_table(c, is_cjk, charwidth_table) as usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -610,7 +610,7 @@ if __name__ == "__main__":
|
|||||||
rf.write("""
|
rf.write("""
|
||||||
/// The version of [Unicode](http://www.unicode.org/)
|
/// The version of [Unicode](http://www.unicode.org/)
|
||||||
/// that the `UnicodeChar` and `UnicodeStrPrelude` traits are based on.
|
/// that the `UnicodeChar` and `UnicodeStrPrelude` traits are based on.
|
||||||
pub const UNICODE_VERSION: (uint, uint, uint) = (%s, %s, %s);
|
pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s);
|
||||||
""" % unicode_version)
|
""" % unicode_version)
|
||||||
(canon_decomp, compat_decomp, gencats, combines,
|
(canon_decomp, compat_decomp, gencats, combines,
|
||||||
lowerupper, upperlower) = load_unicode_data("UnicodeData.txt")
|
lowerupper, upperlower) = load_unicode_data("UnicodeData.txt")
|
||||||
|
|||||||
@@ -119,16 +119,16 @@ pub fn from_u32(i: u32) -> Option<char> {
|
|||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "core", reason = "pending integer conventions")]
|
#[unstable(feature = "core", reason = "pending integer conventions")]
|
||||||
pub fn from_digit(num: uint, radix: uint) -> Option<char> {
|
pub fn from_digit(num: u32, radix: u32) -> Option<char> {
|
||||||
if radix > 36 {
|
if radix > 36 {
|
||||||
panic!("from_digit: radix is too high (maximum 36)");
|
panic!("from_digit: radix is too high (maximum 36)");
|
||||||
}
|
}
|
||||||
if num < radix {
|
if num < radix {
|
||||||
unsafe {
|
unsafe {
|
||||||
if num < 10 {
|
if num < 10 {
|
||||||
Some(transmute(('0' as uint + num) as u32))
|
Some(transmute('0' as u32 + num))
|
||||||
} else {
|
} else {
|
||||||
Some(transmute(('a' as uint + num - 10) as u32))
|
Some(transmute('a' as u32 + num - 10))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -164,7 +164,7 @@ pub trait CharExt {
|
|||||||
/// ```
|
/// ```
|
||||||
#[unstable(feature = "core",
|
#[unstable(feature = "core",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn is_digit(self, radix: uint) -> bool;
|
fn is_digit(self, radix: u32) -> bool;
|
||||||
|
|
||||||
/// Converts a character to the corresponding digit.
|
/// Converts a character to the corresponding digit.
|
||||||
///
|
///
|
||||||
@@ -189,7 +189,7 @@ pub trait CharExt {
|
|||||||
/// ```
|
/// ```
|
||||||
#[unstable(feature = "core",
|
#[unstable(feature = "core",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn to_digit(self, radix: uint) -> Option<uint>;
|
fn to_digit(self, radix: u32) -> Option<u32>;
|
||||||
|
|
||||||
/// Returns an iterator that yields the hexadecimal Unicode escape of a character, as `char`s.
|
/// Returns an iterator that yields the hexadecimal Unicode escape of a character, as `char`s.
|
||||||
///
|
///
|
||||||
@@ -275,7 +275,7 @@ pub trait CharExt {
|
|||||||
/// assert_eq!(n, 2);
|
/// assert_eq!(n, 2);
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf8(self) -> uint;
|
fn len_utf8(self) -> usize;
|
||||||
|
|
||||||
/// Returns the number of bytes this character would need if encoded in UTF-16.
|
/// Returns the number of bytes this character would need if encoded in UTF-16.
|
||||||
///
|
///
|
||||||
@@ -287,7 +287,7 @@ pub trait CharExt {
|
|||||||
/// assert_eq!(n, 1);
|
/// assert_eq!(n, 1);
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf16(self) -> uint;
|
fn len_utf16(self) -> usize;
|
||||||
|
|
||||||
/// Encodes this character as UTF-8 into the provided byte buffer, and then returns the number
|
/// Encodes this character as UTF-8 into the provided byte buffer, and then returns the number
|
||||||
/// of bytes written.
|
/// of bytes written.
|
||||||
@@ -317,7 +317,7 @@ pub trait CharExt {
|
|||||||
/// assert_eq!(result, None);
|
/// assert_eq!(result, None);
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint>;
|
fn encode_utf8(self, dst: &mut [u8]) -> Option<usize>;
|
||||||
|
|
||||||
/// Encodes this character as UTF-16 into the provided `u16` buffer, and then returns the
|
/// Encodes this character as UTF-16 into the provided `u16` buffer, and then returns the
|
||||||
/// number of `u16`s written.
|
/// number of `u16`s written.
|
||||||
@@ -347,27 +347,27 @@ pub trait CharExt {
|
|||||||
/// assert_eq!(result, None);
|
/// assert_eq!(result, None);
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint>;
|
fn encode_utf16(self, dst: &mut [u16]) -> Option<usize>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl CharExt for char {
|
impl CharExt for char {
|
||||||
#[unstable(feature = "core",
|
#[unstable(feature = "core",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn is_digit(self, radix: uint) -> bool {
|
fn is_digit(self, radix: u32) -> bool {
|
||||||
self.to_digit(radix).is_some()
|
self.to_digit(radix).is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(feature = "core",
|
#[unstable(feature = "core",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn to_digit(self, radix: uint) -> Option<uint> {
|
fn to_digit(self, radix: u32) -> Option<u32> {
|
||||||
if radix > 36 {
|
if radix > 36 {
|
||||||
panic!("to_digit: radix is too high (maximum 36)");
|
panic!("to_digit: radix is too high (maximum 36)");
|
||||||
}
|
}
|
||||||
let val = match self {
|
let val = match self {
|
||||||
'0' ... '9' => self as uint - ('0' as uint),
|
'0' ... '9' => self as u32 - '0' as u32,
|
||||||
'a' ... 'z' => self as uint + 10 - ('a' as uint),
|
'a' ... 'z' => self as u32 - 'a' as u32 + 10,
|
||||||
'A' ... 'Z' => self as uint + 10 - ('A' as uint),
|
'A' ... 'Z' => self as u32 - 'A' as u32 + 10,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
};
|
};
|
||||||
if val < radix { Some(val) }
|
if val < radix { Some(val) }
|
||||||
@@ -396,7 +396,7 @@ impl CharExt for char {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf8(self) -> uint {
|
fn len_utf8(self) -> usize {
|
||||||
let code = self as u32;
|
let code = self as u32;
|
||||||
match () {
|
match () {
|
||||||
_ if code < MAX_ONE_B => 1,
|
_ if code < MAX_ONE_B => 1,
|
||||||
@@ -408,7 +408,7 @@ impl CharExt for char {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf16(self) -> uint {
|
fn len_utf16(self) -> usize {
|
||||||
let ch = self as u32;
|
let ch = self as u32;
|
||||||
if (ch & 0xFFFF_u32) == ch { 1 } else { 2 }
|
if (ch & 0xFFFF_u32) == ch { 1 } else { 2 }
|
||||||
}
|
}
|
||||||
@@ -416,14 +416,14 @@ impl CharExt for char {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "core",
|
#[unstable(feature = "core",
|
||||||
reason = "pending decision about Iterator/Writer/Reader")]
|
reason = "pending decision about Iterator/Writer/Reader")]
|
||||||
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint> {
|
fn encode_utf8(self, dst: &mut [u8]) -> Option<usize> {
|
||||||
encode_utf8_raw(self as u32, dst)
|
encode_utf8_raw(self as u32, dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "core",
|
#[unstable(feature = "core",
|
||||||
reason = "pending decision about Iterator/Writer/Reader")]
|
reason = "pending decision about Iterator/Writer/Reader")]
|
||||||
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint> {
|
fn encode_utf16(self, dst: &mut [u16]) -> Option<usize> {
|
||||||
encode_utf16_raw(self as u32, dst)
|
encode_utf16_raw(self as u32, dst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -435,7 +435,7 @@ impl CharExt for char {
|
|||||||
/// and a `None` will be returned.
|
/// and a `None` will be returned.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "core")]
|
#[unstable(feature = "core")]
|
||||||
pub fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> Option<uint> {
|
pub fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> Option<usize> {
|
||||||
// Marked #[inline] to allow llvm optimizing it away
|
// Marked #[inline] to allow llvm optimizing it away
|
||||||
if code < MAX_ONE_B && dst.len() >= 1 {
|
if code < MAX_ONE_B && dst.len() >= 1 {
|
||||||
dst[0] = code as u8;
|
dst[0] = code as u8;
|
||||||
@@ -467,7 +467,7 @@ pub fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> Option<uint> {
|
|||||||
/// and a `None` will be returned.
|
/// and a `None` will be returned.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "core")]
|
#[unstable(feature = "core")]
|
||||||
pub fn encode_utf16_raw(mut ch: u32, dst: &mut [u16]) -> Option<uint> {
|
pub fn encode_utf16_raw(mut ch: u32, dst: &mut [u16]) -> Option<usize> {
|
||||||
// Marked #[inline] to allow llvm optimizing it away
|
// Marked #[inline] to allow llvm optimizing it away
|
||||||
if (ch & 0xFFFF_u32) == ch && dst.len() >= 1 {
|
if (ch & 0xFFFF_u32) == ch && dst.len() >= 1 {
|
||||||
// The BMP falls through (assuming non-surrogate, as it should)
|
// The BMP falls through (assuming non-surrogate, as it should)
|
||||||
@@ -499,7 +499,7 @@ enum EscapeUnicodeState {
|
|||||||
Backslash,
|
Backslash,
|
||||||
Type,
|
Type,
|
||||||
LeftBrace,
|
LeftBrace,
|
||||||
Value(uint),
|
Value(usize),
|
||||||
RightBrace,
|
RightBrace,
|
||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ macro_rules! delegate_iter {
|
|||||||
delegate_iter!{$te : $ti}
|
delegate_iter!{$te : $ti}
|
||||||
impl<'a> ExactSizeIterator for $ti {
|
impl<'a> ExactSizeIterator for $ti {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn len(&self) -> uint {
|
fn len(&self) -> usize {
|
||||||
self.0.len()
|
self.0.len()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ macro_rules! delegate_iter {
|
|||||||
self.0.next()
|
self.0.next()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
self.0.size_hint()
|
self.0.size_hint()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ macro_rules! delegate_iter {
|
|||||||
self.0.next()
|
self.0.next()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
self.0.size_hint()
|
self.0.size_hint()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ macro_rules! delegate_iter {
|
|||||||
self.0.next()
|
self.0.next()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
self.0.size_hint()
|
self.0.size_hint()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,7 @@ pub enum Utf8Error {
|
|||||||
/// The offset is guaranteed to be in bounds of the slice in question, and
|
/// The offset is guaranteed to be in bounds of the slice in question, and
|
||||||
/// the byte at the specified offset was the first invalid byte in the
|
/// the byte at the specified offset was the first invalid byte in the
|
||||||
/// sequence detected.
|
/// sequence detected.
|
||||||
InvalidByte(uint),
|
InvalidByte(usize),
|
||||||
|
|
||||||
/// The byte slice was invalid because more bytes were needed but no more
|
/// The byte slice was invalid because more bytes were needed but no more
|
||||||
/// bytes were available.
|
/// bytes were available.
|
||||||
@@ -227,7 +227,7 @@ pub unsafe fn from_utf8_unchecked<'a>(v: &'a [u8]) -> &'a str {
|
|||||||
pub unsafe fn from_c_str(s: *const i8) -> &'static str {
|
pub unsafe fn from_c_str(s: *const i8) -> &'static str {
|
||||||
let s = s as *const u8;
|
let s = s as *const u8;
|
||||||
let mut len = 0;
|
let mut len = 0;
|
||||||
while *s.offset(len as int) != 0 {
|
while *s.offset(len as isize) != 0 {
|
||||||
len += 1;
|
len += 1;
|
||||||
}
|
}
|
||||||
let v: &'static [u8] = ::mem::transmute(Slice { data: s, len: len });
|
let v: &'static [u8] = ::mem::transmute(Slice { data: s, len: len });
|
||||||
@@ -250,7 +250,7 @@ impl CharEq for char {
|
|||||||
fn matches(&mut self, c: char) -> bool { *self == c }
|
fn matches(&mut self, c: char) -> bool { *self == c }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn only_ascii(&self) -> bool { (*self as uint) < 128 }
|
fn only_ascii(&self) -> bool { (*self as u32) < 128 }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F> CharEq for F where F: FnMut(char) -> bool {
|
impl<F> CharEq for F where F: FnMut(char) -> bool {
|
||||||
@@ -383,7 +383,7 @@ impl<'a> Iterator for Chars<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
let (len, _) = self.iter.size_hint();
|
let (len, _) = self.iter.size_hint();
|
||||||
(len.saturating_add(3) / 4, Some(len))
|
(len.saturating_add(3) / 4, Some(len))
|
||||||
}
|
}
|
||||||
@@ -428,16 +428,16 @@ impl<'a> DoubleEndedIterator for Chars<'a> {
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub struct CharIndices<'a> {
|
pub struct CharIndices<'a> {
|
||||||
front_offset: uint,
|
front_offset: usize,
|
||||||
iter: Chars<'a>,
|
iter: Chars<'a>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<'a> Iterator for CharIndices<'a> {
|
impl<'a> Iterator for CharIndices<'a> {
|
||||||
type Item = (uint, char);
|
type Item = (usize, char);
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<(uint, char)> {
|
fn next(&mut self) -> Option<(usize, char)> {
|
||||||
let (pre_len, _) = self.iter.iter.size_hint();
|
let (pre_len, _) = self.iter.iter.size_hint();
|
||||||
match self.iter.next() {
|
match self.iter.next() {
|
||||||
None => None,
|
None => None,
|
||||||
@@ -451,7 +451,7 @@ impl<'a> Iterator for CharIndices<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
self.iter.size_hint()
|
self.iter.size_hint()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -459,7 +459,7 @@ impl<'a> Iterator for CharIndices<'a> {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<'a> DoubleEndedIterator for CharIndices<'a> {
|
impl<'a> DoubleEndedIterator for CharIndices<'a> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next_back(&mut self) -> Option<(uint, char)> {
|
fn next_back(&mut self) -> Option<(usize, char)> {
|
||||||
match self.iter.next_back() {
|
match self.iter.next_back() {
|
||||||
None => None,
|
None => None,
|
||||||
Some(ch) => {
|
Some(ch) => {
|
||||||
@@ -512,7 +512,7 @@ struct CharSplits<'a, Sep> {
|
|||||||
struct CharSplitsN<'a, Sep> {
|
struct CharSplitsN<'a, Sep> {
|
||||||
iter: CharSplits<'a, Sep>,
|
iter: CharSplits<'a, Sep>,
|
||||||
/// The number of splits remaining
|
/// The number of splits remaining
|
||||||
count: uint,
|
count: usize,
|
||||||
invert: bool,
|
invert: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -636,7 +636,7 @@ impl<'a, Sep: CharEq> Iterator for CharSplitsN<'a, Sep> {
|
|||||||
/// within a larger string using naive search
|
/// within a larger string using naive search
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct NaiveSearcher {
|
struct NaiveSearcher {
|
||||||
position: uint
|
position: usize
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NaiveSearcher {
|
impl NaiveSearcher {
|
||||||
@@ -644,7 +644,7 @@ impl NaiveSearcher {
|
|||||||
NaiveSearcher { position: 0 }
|
NaiveSearcher { position: 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next(&mut self, haystack: &[u8], needle: &[u8]) -> Option<(uint, uint)> {
|
fn next(&mut self, haystack: &[u8], needle: &[u8]) -> Option<(usize, usize)> {
|
||||||
while self.position + needle.len() <= haystack.len() {
|
while self.position + needle.len() <= haystack.len() {
|
||||||
if &haystack[self.position .. self.position + needle.len()] == needle {
|
if &haystack[self.position .. self.position + needle.len()] == needle {
|
||||||
let match_pos = self.position;
|
let match_pos = self.position;
|
||||||
@@ -663,13 +663,13 @@ impl NaiveSearcher {
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct TwoWaySearcher {
|
struct TwoWaySearcher {
|
||||||
// constants
|
// constants
|
||||||
crit_pos: uint,
|
crit_pos: usize,
|
||||||
period: uint,
|
period: usize,
|
||||||
byteset: u64,
|
byteset: u64,
|
||||||
|
|
||||||
// variables
|
// variables
|
||||||
position: uint,
|
position: usize,
|
||||||
memory: uint
|
memory: usize
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -756,7 +756,7 @@ impl TwoWaySearcher {
|
|||||||
|
|
||||||
// This isn't in the original algorithm, as far as I'm aware.
|
// This isn't in the original algorithm, as far as I'm aware.
|
||||||
let byteset = needle.iter()
|
let byteset = needle.iter()
|
||||||
.fold(0, |a, &b| (1 << ((b & 0x3f) as uint)) | a);
|
.fold(0, |a, &b| (1 << ((b & 0x3f) as usize)) | a);
|
||||||
|
|
||||||
// A particularly readable explanation of what's going on here can be found
|
// A particularly readable explanation of what's going on here can be found
|
||||||
// in Crochemore and Rytter's book "Text Algorithms", ch 13. Specifically
|
// in Crochemore and Rytter's book "Text Algorithms", ch 13. Specifically
|
||||||
@@ -794,7 +794,8 @@ impl TwoWaySearcher {
|
|||||||
// How far we can jump when we encounter a mismatch is all based on the fact
|
// How far we can jump when we encounter a mismatch is all based on the fact
|
||||||
// that (u, v) is a critical factorization for the needle.
|
// that (u, v) is a critical factorization for the needle.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self, haystack: &[u8], needle: &[u8], long_period: bool) -> Option<(uint, uint)> {
|
fn next(&mut self, haystack: &[u8], needle: &[u8], long_period: bool)
|
||||||
|
-> Option<(usize, usize)> {
|
||||||
'search: loop {
|
'search: loop {
|
||||||
// Check that we have room to search in
|
// Check that we have room to search in
|
||||||
if self.position + needle.len() > haystack.len() {
|
if self.position + needle.len() > haystack.len() {
|
||||||
@@ -804,7 +805,7 @@ impl TwoWaySearcher {
|
|||||||
// Quickly skip by large portions unrelated to our substring
|
// Quickly skip by large portions unrelated to our substring
|
||||||
if (self.byteset >>
|
if (self.byteset >>
|
||||||
((haystack[self.position + needle.len() - 1] & 0x3f)
|
((haystack[self.position + needle.len() - 1] & 0x3f)
|
||||||
as uint)) & 1 == 0 {
|
as usize)) & 1 == 0 {
|
||||||
self.position += needle.len();
|
self.position += needle.len();
|
||||||
if !long_period {
|
if !long_period {
|
||||||
self.memory = 0;
|
self.memory = 0;
|
||||||
@@ -851,7 +852,7 @@ impl TwoWaySearcher {
|
|||||||
// Specifically, returns (i, p), where i is the starting index of v in some
|
// Specifically, returns (i, p), where i is the starting index of v in some
|
||||||
// critical factorization (u, v) and p = period(v)
|
// critical factorization (u, v) and p = period(v)
|
||||||
#[inline]
|
#[inline]
|
||||||
fn maximal_suffix(arr: &[u8], reversed: bool) -> (uint, uint) {
|
fn maximal_suffix(arr: &[u8], reversed: bool) -> (usize, usize) {
|
||||||
let mut left = -1; // Corresponds to i in the paper
|
let mut left = -1; // Corresponds to i in the paper
|
||||||
let mut right = 0; // Corresponds to j in the paper
|
let mut right = 0; // Corresponds to j in the paper
|
||||||
let mut offset = 1; // Corresponds to k in the paper
|
let mut offset = 1; // Corresponds to k in the paper
|
||||||
@@ -937,16 +938,16 @@ pub struct MatchIndices<'a> {
|
|||||||
#[unstable(feature = "core", reason = "type may be removed")]
|
#[unstable(feature = "core", reason = "type may be removed")]
|
||||||
pub struct SplitStr<'a> {
|
pub struct SplitStr<'a> {
|
||||||
it: MatchIndices<'a>,
|
it: MatchIndices<'a>,
|
||||||
last_end: uint,
|
last_end: usize,
|
||||||
finished: bool
|
finished: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<'a> Iterator for MatchIndices<'a> {
|
impl<'a> Iterator for MatchIndices<'a> {
|
||||||
type Item = (uint, uint);
|
type Item = (usize, usize);
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<(uint, uint)> {
|
fn next(&mut self) -> Option<(usize, usize)> {
|
||||||
match self.searcher {
|
match self.searcher {
|
||||||
Naive(ref mut searcher)
|
Naive(ref mut searcher)
|
||||||
=> searcher.next(self.haystack.as_bytes(), self.needle.as_bytes()),
|
=> searcher.next(self.haystack.as_bytes(), self.needle.as_bytes()),
|
||||||
@@ -991,8 +992,9 @@ Section: Comparing strings
|
|||||||
/// to compare &[u8] byte slices that are not necessarily valid UTF-8.
|
/// to compare &[u8] byte slices that are not necessarily valid UTF-8.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn eq_slice_(a: &str, b: &str) -> bool {
|
fn eq_slice_(a: &str, b: &str) -> bool {
|
||||||
|
// NOTE: In theory n should be libc::size_t and not usize, but libc is not available here
|
||||||
#[allow(improper_ctypes)]
|
#[allow(improper_ctypes)]
|
||||||
extern { fn memcmp(s1: *const i8, s2: *const i8, n: uint) -> i32; }
|
extern { fn memcmp(s1: *const i8, s2: *const i8, n: usize) -> i32; }
|
||||||
a.len() == b.len() && unsafe {
|
a.len() == b.len() && unsafe {
|
||||||
memcmp(a.as_ptr() as *const i8,
|
memcmp(a.as_ptr() as *const i8,
|
||||||
b.as_ptr() as *const i8,
|
b.as_ptr() as *const i8,
|
||||||
@@ -1049,7 +1051,7 @@ fn run_utf8_validation_iterator(iter: &mut slice::Iter<u8>)
|
|||||||
// ASCII characters are always valid, so only large
|
// ASCII characters are always valid, so only large
|
||||||
// bytes need more examination.
|
// bytes need more examination.
|
||||||
if first >= 128 {
|
if first >= 128 {
|
||||||
let w = UTF8_CHAR_WIDTH[first as uint] as uint;
|
let w = UTF8_CHAR_WIDTH[first as usize] as usize;
|
||||||
let second = next!();
|
let second = next!();
|
||||||
// 2-byte encoding is for codepoints \u{0080} to \u{07ff}
|
// 2-byte encoding is for codepoints \u{0080} to \u{07ff}
|
||||||
// first C2 80 last DF BF
|
// first C2 80 last DF BF
|
||||||
@@ -1124,7 +1126,7 @@ pub struct CharRange {
|
|||||||
/// Current `char`
|
/// Current `char`
|
||||||
pub ch: char,
|
pub ch: char,
|
||||||
/// Index of the first byte of the next `char`
|
/// Index of the first byte of the next `char`
|
||||||
pub next: uint,
|
pub next: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Mask of the value bits of a continuation byte
|
/// Mask of the value bits of a continuation byte
|
||||||
@@ -1209,10 +1211,10 @@ mod traits {
|
|||||||
/// // &s[3 .. 100];
|
/// // &s[3 .. 100];
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl ops::Index<ops::Range<uint>> for str {
|
impl ops::Index<ops::Range<usize>> for str {
|
||||||
type Output = str;
|
type Output = str;
|
||||||
#[inline]
|
#[inline]
|
||||||
fn index(&self, index: &ops::Range<uint>) -> &str {
|
fn index(&self, index: &ops::Range<usize>) -> &str {
|
||||||
// is_char_boundary checks that the index is in [0, .len()]
|
// is_char_boundary checks that the index is in [0, .len()]
|
||||||
if index.start <= index.end &&
|
if index.start <= index.end &&
|
||||||
self.is_char_boundary(index.start) &&
|
self.is_char_boundary(index.start) &&
|
||||||
@@ -1232,10 +1234,10 @@ mod traits {
|
|||||||
/// Panics when `end` does not point to a valid character, or is
|
/// Panics when `end` does not point to a valid character, or is
|
||||||
/// out of bounds.
|
/// out of bounds.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl ops::Index<ops::RangeTo<uint>> for str {
|
impl ops::Index<ops::RangeTo<usize>> for str {
|
||||||
type Output = str;
|
type Output = str;
|
||||||
#[inline]
|
#[inline]
|
||||||
fn index(&self, index: &ops::RangeTo<uint>) -> &str {
|
fn index(&self, index: &ops::RangeTo<usize>) -> &str {
|
||||||
// is_char_boundary checks that the index is in [0, .len()]
|
// is_char_boundary checks that the index is in [0, .len()]
|
||||||
if self.is_char_boundary(index.end) {
|
if self.is_char_boundary(index.end) {
|
||||||
unsafe { self.slice_unchecked(0, index.end) }
|
unsafe { self.slice_unchecked(0, index.end) }
|
||||||
@@ -1252,10 +1254,10 @@ mod traits {
|
|||||||
/// Panics when `begin` does not point to a valid character, or is
|
/// Panics when `begin` does not point to a valid character, or is
|
||||||
/// out of bounds.
|
/// out of bounds.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl ops::Index<ops::RangeFrom<uint>> for str {
|
impl ops::Index<ops::RangeFrom<usize>> for str {
|
||||||
type Output = str;
|
type Output = str;
|
||||||
#[inline]
|
#[inline]
|
||||||
fn index(&self, index: &ops::RangeFrom<uint>) -> &str {
|
fn index(&self, index: &ops::RangeFrom<usize>) -> &str {
|
||||||
// is_char_boundary checks that the index is in [0, .len()]
|
// is_char_boundary checks that the index is in [0, .len()]
|
||||||
if self.is_char_boundary(index.start) {
|
if self.is_char_boundary(index.start) {
|
||||||
unsafe { self.slice_unchecked(index.start, self.len()) }
|
unsafe { self.slice_unchecked(index.start, self.len()) }
|
||||||
@@ -1332,40 +1334,40 @@ pub trait StrExt {
|
|||||||
fn bytes<'a>(&'a self) -> Bytes<'a>;
|
fn bytes<'a>(&'a self) -> Bytes<'a>;
|
||||||
fn char_indices<'a>(&'a self) -> CharIndices<'a>;
|
fn char_indices<'a>(&'a self) -> CharIndices<'a>;
|
||||||
fn split<'a, P: CharEq>(&'a self, pat: P) -> Split<'a, P>;
|
fn split<'a, P: CharEq>(&'a self, pat: P) -> Split<'a, P>;
|
||||||
fn splitn<'a, P: CharEq>(&'a self, count: uint, pat: P) -> SplitN<'a, P>;
|
fn splitn<'a, P: CharEq>(&'a self, count: usize, pat: P) -> SplitN<'a, P>;
|
||||||
fn split_terminator<'a, P: CharEq>(&'a self, pat: P) -> SplitTerminator<'a, P>;
|
fn split_terminator<'a, P: CharEq>(&'a self, pat: P) -> SplitTerminator<'a, P>;
|
||||||
fn rsplitn<'a, P: CharEq>(&'a self, count: uint, pat: P) -> RSplitN<'a, P>;
|
fn rsplitn<'a, P: CharEq>(&'a self, count: usize, pat: P) -> RSplitN<'a, P>;
|
||||||
fn match_indices<'a>(&'a self, sep: &'a str) -> MatchIndices<'a>;
|
fn match_indices<'a>(&'a self, sep: &'a str) -> MatchIndices<'a>;
|
||||||
fn split_str<'a>(&'a self, pat: &'a str) -> SplitStr<'a>;
|
fn split_str<'a>(&'a self, pat: &'a str) -> SplitStr<'a>;
|
||||||
fn lines<'a>(&'a self) -> Lines<'a>;
|
fn lines<'a>(&'a self) -> Lines<'a>;
|
||||||
fn lines_any<'a>(&'a self) -> LinesAny<'a>;
|
fn lines_any<'a>(&'a self) -> LinesAny<'a>;
|
||||||
fn char_len(&self) -> uint;
|
fn char_len(&self) -> usize;
|
||||||
fn slice_chars<'a>(&'a self, begin: uint, end: uint) -> &'a str;
|
fn slice_chars<'a>(&'a self, begin: usize, end: usize) -> &'a str;
|
||||||
unsafe fn slice_unchecked<'a>(&'a self, begin: uint, end: uint) -> &'a str;
|
unsafe fn slice_unchecked<'a>(&'a self, begin: usize, end: usize) -> &'a str;
|
||||||
fn starts_with(&self, pat: &str) -> bool;
|
fn starts_with(&self, pat: &str) -> bool;
|
||||||
fn ends_with(&self, pat: &str) -> bool;
|
fn ends_with(&self, pat: &str) -> bool;
|
||||||
fn trim_matches<'a, P: CharEq>(&'a self, pat: P) -> &'a str;
|
fn trim_matches<'a, P: CharEq>(&'a self, pat: P) -> &'a str;
|
||||||
fn trim_left_matches<'a, P: CharEq>(&'a self, pat: P) -> &'a str;
|
fn trim_left_matches<'a, P: CharEq>(&'a self, pat: P) -> &'a str;
|
||||||
fn trim_right_matches<'a, P: CharEq>(&'a self, pat: P) -> &'a str;
|
fn trim_right_matches<'a, P: CharEq>(&'a self, pat: P) -> &'a str;
|
||||||
fn is_char_boundary(&self, index: uint) -> bool;
|
fn is_char_boundary(&self, index: usize) -> bool;
|
||||||
fn char_range_at(&self, start: uint) -> CharRange;
|
fn char_range_at(&self, start: usize) -> CharRange;
|
||||||
fn char_range_at_reverse(&self, start: uint) -> CharRange;
|
fn char_range_at_reverse(&self, start: usize) -> CharRange;
|
||||||
fn char_at(&self, i: uint) -> char;
|
fn char_at(&self, i: usize) -> char;
|
||||||
fn char_at_reverse(&self, i: uint) -> char;
|
fn char_at_reverse(&self, i: usize) -> char;
|
||||||
fn as_bytes<'a>(&'a self) -> &'a [u8];
|
fn as_bytes<'a>(&'a self) -> &'a [u8];
|
||||||
fn find<P: CharEq>(&self, pat: P) -> Option<uint>;
|
fn find<P: CharEq>(&self, pat: P) -> Option<usize>;
|
||||||
fn rfind<P: CharEq>(&self, pat: P) -> Option<uint>;
|
fn rfind<P: CharEq>(&self, pat: P) -> Option<usize>;
|
||||||
fn find_str(&self, pat: &str) -> Option<uint>;
|
fn find_str(&self, pat: &str) -> Option<usize>;
|
||||||
fn slice_shift_char<'a>(&'a self) -> Option<(char, &'a str)>;
|
fn slice_shift_char<'a>(&'a self) -> Option<(char, &'a str)>;
|
||||||
fn subslice_offset(&self, inner: &str) -> uint;
|
fn subslice_offset(&self, inner: &str) -> usize;
|
||||||
fn as_ptr(&self) -> *const u8;
|
fn as_ptr(&self) -> *const u8;
|
||||||
fn len(&self) -> uint;
|
fn len(&self) -> usize;
|
||||||
fn is_empty(&self) -> bool;
|
fn is_empty(&self) -> bool;
|
||||||
fn parse<T: FromStr>(&self) -> Result<T, T::Err>;
|
fn parse<T: FromStr>(&self) -> Result<T, T::Err>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
fn slice_error_fail(s: &str, begin: uint, end: uint) -> ! {
|
fn slice_error_fail(s: &str, begin: usize, end: usize) -> ! {
|
||||||
assert!(begin <= end);
|
assert!(begin <= end);
|
||||||
panic!("index {} and/or {} in `{}` do not lie on character boundary",
|
panic!("index {} and/or {} in `{}` do not lie on character boundary",
|
||||||
begin, end, s);
|
begin, end, s);
|
||||||
@@ -1409,7 +1411,7 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn splitn<P: CharEq>(&self, count: uint, pat: P) -> SplitN<P> {
|
fn splitn<P: CharEq>(&self, count: usize, pat: P) -> SplitN<P> {
|
||||||
SplitN(CharSplitsN {
|
SplitN(CharSplitsN {
|
||||||
iter: self.split(pat).0,
|
iter: self.split(pat).0,
|
||||||
count: count,
|
count: count,
|
||||||
@@ -1426,7 +1428,7 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn rsplitn<P: CharEq>(&self, count: uint, pat: P) -> RSplitN<P> {
|
fn rsplitn<P: CharEq>(&self, count: usize, pat: P) -> RSplitN<P> {
|
||||||
RSplitN(CharSplitsN {
|
RSplitN(CharSplitsN {
|
||||||
iter: self.split(pat).0,
|
iter: self.split(pat).0,
|
||||||
count: count,
|
count: count,
|
||||||
@@ -1470,9 +1472,9 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn char_len(&self) -> uint { self.chars().count() }
|
fn char_len(&self) -> usize { self.chars().count() }
|
||||||
|
|
||||||
fn slice_chars(&self, begin: uint, end: uint) -> &str {
|
fn slice_chars(&self, begin: usize, end: usize) -> &str {
|
||||||
assert!(begin <= end);
|
assert!(begin <= end);
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
let mut begin_byte = None;
|
let mut begin_byte = None;
|
||||||
@@ -1496,9 +1498,9 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
unsafe fn slice_unchecked(&self, begin: uint, end: uint) -> &str {
|
unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str {
|
||||||
mem::transmute(Slice {
|
mem::transmute(Slice {
|
||||||
data: self.as_ptr().offset(begin as int),
|
data: self.as_ptr().offset(begin as isize),
|
||||||
len: end - begin,
|
len: end - begin,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1550,7 +1552,7 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_char_boundary(&self, index: uint) -> bool {
|
fn is_char_boundary(&self, index: usize) -> bool {
|
||||||
if index == self.len() { return true; }
|
if index == self.len() { return true; }
|
||||||
match self.as_bytes().get(index) {
|
match self.as_bytes().get(index) {
|
||||||
None => false,
|
None => false,
|
||||||
@@ -1559,13 +1561,13 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn char_range_at(&self, i: uint) -> CharRange {
|
fn char_range_at(&self, i: usize) -> CharRange {
|
||||||
let (c, n) = char_range_at_raw(self.as_bytes(), i);
|
let (c, n) = char_range_at_raw(self.as_bytes(), i);
|
||||||
CharRange { ch: unsafe { mem::transmute(c) }, next: n }
|
CharRange { ch: unsafe { mem::transmute(c) }, next: n }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn char_range_at_reverse(&self, start: uint) -> CharRange {
|
fn char_range_at_reverse(&self, start: usize) -> CharRange {
|
||||||
let mut prev = start;
|
let mut prev = start;
|
||||||
|
|
||||||
prev = prev.saturating_sub(1);
|
prev = prev.saturating_sub(1);
|
||||||
@@ -1574,14 +1576,14 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Multibyte case is a fn to allow char_range_at_reverse to inline cleanly
|
// Multibyte case is a fn to allow char_range_at_reverse to inline cleanly
|
||||||
fn multibyte_char_range_at_reverse(s: &str, mut i: uint) -> CharRange {
|
fn multibyte_char_range_at_reverse(s: &str, mut i: usize) -> CharRange {
|
||||||
// while there is a previous byte == 10......
|
// while there is a previous byte == 10......
|
||||||
while i > 0 && s.as_bytes()[i] & !CONT_MASK == TAG_CONT_U8 {
|
while i > 0 && s.as_bytes()[i] & !CONT_MASK == TAG_CONT_U8 {
|
||||||
i -= 1;
|
i -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut val = s.as_bytes()[i] as u32;
|
let mut val = s.as_bytes()[i] as u32;
|
||||||
let w = UTF8_CHAR_WIDTH[val as uint] as uint;
|
let w = UTF8_CHAR_WIDTH[val as usize] as usize;
|
||||||
assert!((w != 0));
|
assert!((w != 0));
|
||||||
|
|
||||||
val = utf8_first_byte!(val, w);
|
val = utf8_first_byte!(val, w);
|
||||||
@@ -1596,12 +1598,12 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn char_at(&self, i: uint) -> char {
|
fn char_at(&self, i: usize) -> char {
|
||||||
self.char_range_at(i).ch
|
self.char_range_at(i).ch
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn char_at_reverse(&self, i: uint) -> char {
|
fn char_at_reverse(&self, i: usize) -> char {
|
||||||
self.char_range_at_reverse(i).ch
|
self.char_range_at_reverse(i).ch
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1610,7 +1612,7 @@ impl StrExt for str {
|
|||||||
unsafe { mem::transmute(self) }
|
unsafe { mem::transmute(self) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find<P: CharEq>(&self, mut pat: P) -> Option<uint> {
|
fn find<P: CharEq>(&self, mut pat: P) -> Option<usize> {
|
||||||
if pat.only_ascii() {
|
if pat.only_ascii() {
|
||||||
self.bytes().position(|b| pat.matches(b as char))
|
self.bytes().position(|b| pat.matches(b as char))
|
||||||
} else {
|
} else {
|
||||||
@@ -1621,7 +1623,7 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rfind<P: CharEq>(&self, mut pat: P) -> Option<uint> {
|
fn rfind<P: CharEq>(&self, mut pat: P) -> Option<usize> {
|
||||||
if pat.only_ascii() {
|
if pat.only_ascii() {
|
||||||
self.bytes().rposition(|b| pat.matches(b as char))
|
self.bytes().rposition(|b| pat.matches(b as char))
|
||||||
} else {
|
} else {
|
||||||
@@ -1632,7 +1634,7 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_str(&self, needle: &str) -> Option<uint> {
|
fn find_str(&self, needle: &str) -> Option<usize> {
|
||||||
if needle.is_empty() {
|
if needle.is_empty() {
|
||||||
Some(0)
|
Some(0)
|
||||||
} else {
|
} else {
|
||||||
@@ -1653,10 +1655,10 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn subslice_offset(&self, inner: &str) -> uint {
|
fn subslice_offset(&self, inner: &str) -> usize {
|
||||||
let a_start = self.as_ptr() as uint;
|
let a_start = self.as_ptr() as usize;
|
||||||
let a_end = a_start + self.len();
|
let a_end = a_start + self.len();
|
||||||
let b_start = inner.as_ptr() as uint;
|
let b_start = inner.as_ptr() as usize;
|
||||||
let b_end = b_start + inner.len();
|
let b_end = b_start + inner.len();
|
||||||
|
|
||||||
assert!(a_start <= b_start);
|
assert!(a_start <= b_start);
|
||||||
@@ -1670,7 +1672,7 @@ impl StrExt for str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn len(&self) -> uint { self.repr().len }
|
fn len(&self) -> usize { self.repr().len }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_empty(&self) -> bool { self.len() == 0 }
|
fn is_empty(&self) -> bool { self.len() == 0 }
|
||||||
@@ -1683,15 +1685,15 @@ impl StrExt for str {
|
|||||||
/// index of the next code point.
|
/// index of the next code point.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "core")]
|
#[unstable(feature = "core")]
|
||||||
pub fn char_range_at_raw(bytes: &[u8], i: uint) -> (u32, usize) {
|
pub fn char_range_at_raw(bytes: &[u8], i: usize) -> (u32, usize) {
|
||||||
if bytes[i] < 128u8 {
|
if bytes[i] < 128u8 {
|
||||||
return (bytes[i] as u32, i + 1);
|
return (bytes[i] as u32, i + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multibyte case is a fn to allow char_range_at to inline cleanly
|
// Multibyte case is a fn to allow char_range_at to inline cleanly
|
||||||
fn multibyte_char_range_at(bytes: &[u8], i: uint) -> (u32, usize) {
|
fn multibyte_char_range_at(bytes: &[u8], i: usize) -> (u32, usize) {
|
||||||
let mut val = bytes[i] as u32;
|
let mut val = bytes[i] as u32;
|
||||||
let w = UTF8_CHAR_WIDTH[val as uint] as uint;
|
let w = UTF8_CHAR_WIDTH[val as usize] as usize;
|
||||||
assert!((w != 0));
|
assert!((w != 0));
|
||||||
|
|
||||||
val = utf8_first_byte!(val, w);
|
val = utf8_first_byte!(val, w);
|
||||||
@@ -1718,7 +1720,7 @@ impl<'a> Iterator for Lines<'a> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<&'a str> { self.inner.next() }
|
fn next(&mut self) -> Option<&'a str> { self.inner.next() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
|
fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@@ -1734,7 +1736,7 @@ impl<'a> Iterator for LinesAny<'a> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<&'a str> { self.inner.next() }
|
fn next(&mut self) -> Option<&'a str> { self.inner.next() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
|
fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|||||||
@@ -159,12 +159,12 @@ impl AsciiExt for u8 {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn to_ascii_uppercase(&self) -> u8 {
|
fn to_ascii_uppercase(&self) -> u8 {
|
||||||
ASCII_UPPERCASE_MAP[*self as uint]
|
ASCII_UPPERCASE_MAP[*self as usize]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn to_ascii_lowercase(&self) -> u8 {
|
fn to_ascii_lowercase(&self) -> u8 {
|
||||||
ASCII_LOWERCASE_MAP[*self as uint]
|
ASCII_LOWERCASE_MAP[*self as usize]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
#![feature(no_std)]
|
#![feature(no_std)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![feature(slicing_syntax)]
|
#![feature(slicing_syntax)]
|
||||||
#![feature(int_uint)]
|
|
||||||
#![feature(core)]
|
#![feature(core)]
|
||||||
|
|
||||||
extern crate core;
|
extern crate core;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
/// The version of [Unicode](http://www.unicode.org/)
|
/// The version of [Unicode](http://www.unicode.org/)
|
||||||
/// that the unicode parts of `CharExt` and `UnicodeStrPrelude` traits are based on.
|
/// that the unicode parts of `CharExt` and `UnicodeStrPrelude` traits are based on.
|
||||||
pub const UNICODE_VERSION: (uint, uint, uint) = (7, 0, 0);
|
pub const UNICODE_VERSION: (u64, u64, u64) = (7, 0, 0);
|
||||||
|
|
||||||
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
|
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
|
||||||
use core::cmp::Ordering::{Equal, Less, Greater};
|
use core::cmp::Ordering::{Equal, Less, Greater};
|
||||||
@@ -6977,7 +6977,7 @@ pub mod conversions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bsearch_case_table(c: char, table: &'static [(char, char)]) -> Option<uint> {
|
fn bsearch_case_table(c: char, table: &'static [(char, char)]) -> Option<usize> {
|
||||||
match table.binary_search_by(|&(key, _)| {
|
match table.binary_search_by(|&(key, _)| {
|
||||||
if c == key { Equal }
|
if c == key { Equal }
|
||||||
else if key < c { Less }
|
else if key < c { Less }
|
||||||
@@ -7613,13 +7613,13 @@ pub mod charwidth {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn width(c: char, is_cjk: bool) -> Option<uint> {
|
pub fn width(c: char, is_cjk: bool) -> Option<usize> {
|
||||||
match c as uint {
|
match c as usize {
|
||||||
_c @ 0 => Some(0), // null is zero width
|
_c @ 0 => Some(0), // null is zero width
|
||||||
cu if cu < 0x20 => None, // control sequences have no width
|
cu if cu < 0x20 => None, // control sequences have no width
|
||||||
cu if cu < 0x7F => Some(1), // ASCII
|
cu if cu < 0x7F => Some(1), // ASCII
|
||||||
cu if cu < 0xA0 => None, // more control sequences
|
cu if cu < 0xA0 => None, // more control sequences
|
||||||
_ => Some(bsearch_range_value_table(c, is_cjk, charwidth_table) as uint)
|
_ => Some(bsearch_range_value_table(c, is_cjk, charwidth_table) as usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ pub trait CharExt {
|
|||||||
/// Panics if given a radix > 36.
|
/// Panics if given a radix > 36.
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn is_digit(self, radix: uint) -> bool;
|
fn is_digit(self, radix: u32) -> bool;
|
||||||
|
|
||||||
/// Converts a character to the corresponding digit.
|
/// Converts a character to the corresponding digit.
|
||||||
///
|
///
|
||||||
@@ -51,7 +51,7 @@ pub trait CharExt {
|
|||||||
/// Panics if given a radix outside the range [0..36].
|
/// Panics if given a radix outside the range [0..36].
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn to_digit(self, radix: uint) -> Option<uint>;
|
fn to_digit(self, radix: u32) -> Option<u32>;
|
||||||
|
|
||||||
/// Returns an iterator that yields the hexadecimal Unicode escape
|
/// Returns an iterator that yields the hexadecimal Unicode escape
|
||||||
/// of a character, as `char`s.
|
/// of a character, as `char`s.
|
||||||
@@ -80,12 +80,12 @@ pub trait CharExt {
|
|||||||
/// Returns the amount of bytes this character would need if encoded in
|
/// Returns the amount of bytes this character would need if encoded in
|
||||||
/// UTF-8.
|
/// UTF-8.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf8(self) -> uint;
|
fn len_utf8(self) -> usize;
|
||||||
|
|
||||||
/// Returns the amount of bytes this character would need if encoded in
|
/// Returns the amount of bytes this character would need if encoded in
|
||||||
/// UTF-16.
|
/// UTF-16.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf16(self) -> uint;
|
fn len_utf16(self) -> usize;
|
||||||
|
|
||||||
/// Encodes this character as UTF-8 into the provided byte buffer,
|
/// Encodes this character as UTF-8 into the provided byte buffer,
|
||||||
/// and then returns the number of bytes written.
|
/// and then returns the number of bytes written.
|
||||||
@@ -94,7 +94,7 @@ pub trait CharExt {
|
|||||||
/// and a `None` will be returned.
|
/// and a `None` will be returned.
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending decision about Iterator/Writer/Reader")]
|
reason = "pending decision about Iterator/Writer/Reader")]
|
||||||
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint>;
|
fn encode_utf8(self, dst: &mut [u8]) -> Option<usize>;
|
||||||
|
|
||||||
/// Encodes this character as UTF-16 into the provided `u16` buffer,
|
/// Encodes this character as UTF-16 into the provided `u16` buffer,
|
||||||
/// and then returns the number of `u16`s written.
|
/// and then returns the number of `u16`s written.
|
||||||
@@ -103,7 +103,7 @@ pub trait CharExt {
|
|||||||
/// and a `None` will be returned.
|
/// and a `None` will be returned.
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending decision about Iterator/Writer/Reader")]
|
reason = "pending decision about Iterator/Writer/Reader")]
|
||||||
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint>;
|
fn encode_utf16(self, dst: &mut [u16]) -> Option<usize>;
|
||||||
|
|
||||||
/// Returns whether the specified character is considered a Unicode
|
/// Returns whether the specified character is considered a Unicode
|
||||||
/// alphabetic code point.
|
/// alphabetic code point.
|
||||||
@@ -216,31 +216,31 @@ pub trait CharExt {
|
|||||||
/// `is_cjk` = `false`) if the context cannot be reliably determined.
|
/// `is_cjk` = `false`) if the context cannot be reliably determined.
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "needs expert opinion. is_cjk flag stands out as ugly")]
|
reason = "needs expert opinion. is_cjk flag stands out as ugly")]
|
||||||
fn width(self, is_cjk: bool) -> Option<uint>;
|
fn width(self, is_cjk: bool) -> Option<usize>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl CharExt for char {
|
impl CharExt for char {
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn is_digit(self, radix: uint) -> bool { C::is_digit(self, radix) }
|
fn is_digit(self, radix: u32) -> bool { C::is_digit(self, radix) }
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending integer conventions")]
|
reason = "pending integer conventions")]
|
||||||
fn to_digit(self, radix: uint) -> Option<uint> { C::to_digit(self, radix) }
|
fn to_digit(self, radix: u32) -> Option<u32> { C::to_digit(self, radix) }
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn escape_unicode(self) -> char::EscapeUnicode { C::escape_unicode(self) }
|
fn escape_unicode(self) -> char::EscapeUnicode { C::escape_unicode(self) }
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn escape_default(self) -> char::EscapeDefault { C::escape_default(self) }
|
fn escape_default(self) -> char::EscapeDefault { C::escape_default(self) }
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf8(self) -> uint { C::len_utf8(self) }
|
fn len_utf8(self) -> usize { C::len_utf8(self) }
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn len_utf16(self) -> uint { C::len_utf16(self) }
|
fn len_utf16(self) -> usize { C::len_utf16(self) }
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending decision about Iterator/Writer/Reader")]
|
reason = "pending decision about Iterator/Writer/Reader")]
|
||||||
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint> { C::encode_utf8(self, dst) }
|
fn encode_utf8(self, dst: &mut [u8]) -> Option<usize> { C::encode_utf8(self, dst) }
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "pending decision about Iterator/Writer/Reader")]
|
reason = "pending decision about Iterator/Writer/Reader")]
|
||||||
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint> { C::encode_utf16(self, dst) }
|
fn encode_utf16(self, dst: &mut [u16]) -> Option<usize> { C::encode_utf16(self, dst) }
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn is_alphabetic(self) -> bool {
|
fn is_alphabetic(self) -> bool {
|
||||||
@@ -313,5 +313,5 @@ impl CharExt for char {
|
|||||||
|
|
||||||
#[unstable(feature = "unicode",
|
#[unstable(feature = "unicode",
|
||||||
reason = "needs expert opinion. is_cjk flag stands out as ugly")]
|
reason = "needs expert opinion. is_cjk flag stands out as ugly")]
|
||||||
fn width(self, is_cjk: bool) -> Option<uint> { charwidth::width(self, is_cjk) }
|
fn width(self, is_cjk: bool) -> Option<usize> { charwidth::width(self, is_cjk) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ pub trait UnicodeStr {
|
|||||||
fn words<'a>(&'a self) -> Words<'a>;
|
fn words<'a>(&'a self) -> Words<'a>;
|
||||||
fn is_whitespace(&self) -> bool;
|
fn is_whitespace(&self) -> bool;
|
||||||
fn is_alphanumeric(&self) -> bool;
|
fn is_alphanumeric(&self) -> bool;
|
||||||
fn width(&self, is_cjk: bool) -> uint;
|
fn width(&self, is_cjk: bool) -> usize;
|
||||||
fn trim<'a>(&'a self) -> &'a str;
|
fn trim<'a>(&'a self) -> &'a str;
|
||||||
fn trim_left<'a>(&'a self) -> &'a str;
|
fn trim_left<'a>(&'a self) -> &'a str;
|
||||||
fn trim_right<'a>(&'a self) -> &'a str;
|
fn trim_right<'a>(&'a self) -> &'a str;
|
||||||
@@ -57,7 +57,7 @@ impl UnicodeStr for str {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn grapheme_indices(&self, is_extended: bool) -> GraphemeIndices {
|
fn grapheme_indices(&self, is_extended: bool) -> GraphemeIndices {
|
||||||
GraphemeIndices { start_offset: self.as_ptr() as uint, iter: self.graphemes(is_extended) }
|
GraphemeIndices { start_offset: self.as_ptr() as usize, iter: self.graphemes(is_extended) }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -78,7 +78,7 @@ impl UnicodeStr for str {
|
|||||||
fn is_alphanumeric(&self) -> bool { self.chars().all(|c| c.is_alphanumeric()) }
|
fn is_alphanumeric(&self) -> bool { self.chars().all(|c| c.is_alphanumeric()) }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn width(&self, is_cjk: bool) -> uint {
|
fn width(&self, is_cjk: bool) -> usize {
|
||||||
self.chars().map(|c| c.width(is_cjk).unwrap_or(0)).sum()
|
self.chars().map(|c| c.width(is_cjk).unwrap_or(0)).sum()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,28 +101,28 @@ impl UnicodeStr for str {
|
|||||||
/// External iterator for grapheme clusters and byte offsets.
|
/// External iterator for grapheme clusters and byte offsets.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GraphemeIndices<'a> {
|
pub struct GraphemeIndices<'a> {
|
||||||
start_offset: uint,
|
start_offset: usize,
|
||||||
iter: Graphemes<'a>,
|
iter: Graphemes<'a>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Iterator for GraphemeIndices<'a> {
|
impl<'a> Iterator for GraphemeIndices<'a> {
|
||||||
type Item = (uint, &'a str);
|
type Item = (usize, &'a str);
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<(uint, &'a str)> {
|
fn next(&mut self) -> Option<(usize, &'a str)> {
|
||||||
self.iter.next().map(|s| (s.as_ptr() as uint - self.start_offset, s))
|
self.iter.next().map(|s| (s.as_ptr() as usize - self.start_offset, s))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
self.iter.size_hint()
|
self.iter.size_hint()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> DoubleEndedIterator for GraphemeIndices<'a> {
|
impl<'a> DoubleEndedIterator for GraphemeIndices<'a> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next_back(&mut self) -> Option<(uint, &'a str)> {
|
fn next_back(&mut self) -> Option<(usize, &'a str)> {
|
||||||
self.iter.next_back().map(|s| (s.as_ptr() as uint - self.start_offset, s))
|
self.iter.next_back().map(|s| (s.as_ptr() as usize - self.start_offset, s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ impl<'a> Iterator for Graphemes<'a> {
|
|||||||
type Item = &'a str;
|
type Item = &'a str;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
let slen = self.string.len();
|
let slen = self.string.len();
|
||||||
(cmp::min(slen, 1), Some(slen))
|
(cmp::min(slen, 1), Some(slen))
|
||||||
}
|
}
|
||||||
@@ -378,8 +378,8 @@ static UTF8_CHAR_WIDTH: [u8; 256] = [
|
|||||||
|
|
||||||
/// Given a first byte, determine how many bytes are in this UTF-8 character
|
/// Given a first byte, determine how many bytes are in this UTF-8 character
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn utf8_char_width(b: u8) -> uint {
|
pub fn utf8_char_width(b: u8) -> usize {
|
||||||
return UTF8_CHAR_WIDTH[b as uint] as uint;
|
return UTF8_CHAR_WIDTH[b as usize] as usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Determines if a vector of `u16` contains valid UTF-16
|
/// Determines if a vector of `u16` contains valid UTF-16
|
||||||
@@ -468,7 +468,7 @@ impl<'a> Iterator for Utf16Items<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
let (low, high) = self.iter.size_hint();
|
let (low, high) = self.iter.size_hint();
|
||||||
// we could be entirely valid surrogates (2 elements per
|
// we could be entirely valid surrogates (2 elements per
|
||||||
// char), or entirely non-surrogates (1 element per char)
|
// char), or entirely non-surrogates (1 element per char)
|
||||||
@@ -534,7 +534,7 @@ impl<I> Iterator for Utf16Encoder<I> where I: Iterator<Item=char> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (uint, Option<uint>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
let (low, high) = self.chars.size_hint();
|
let (low, high) = self.chars.size_hint();
|
||||||
// every char gets either one u16 or two u16,
|
// every char gets either one u16 or two u16,
|
||||||
// so this iterator is between 1 or 2 times as
|
// so this iterator is between 1 or 2 times as
|
||||||
|
|||||||
Reference in New Issue
Block a user