Skip to content

Commit d73f31b

Browse files
committed
Create Char trait
1 parent 3a323c1 commit d73f31b

File tree

2 files changed

+102
-56
lines changed

2 files changed

+102
-56
lines changed

src/libcore/char.rs

Lines changed: 101 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,53 @@ pub fn len_utf8_bytes(c: char) -> uint {
244244
else { fail!("invalid character!") }
245245
}
246246

247+
pub trait Char {
248+
fn is_alphabetic(&self) -> bool;
249+
fn is_XID_start(&self) -> bool;
250+
fn is_XID_continue(&self) -> bool;
251+
fn is_lowercase(&self) -> bool;
252+
fn is_uppercase(&self) -> bool;
253+
fn is_whitespace(&self) -> bool;
254+
fn is_alphanumeric(&self) -> bool;
255+
fn is_digit(&self) -> bool;
256+
fn is_digit_radix(&self, radix: uint) -> bool;
257+
fn to_digit(&self, radix: uint) -> Option<uint>;
258+
fn from_digit(num: uint, radix: uint) -> Option<char>;
259+
fn escape_unicode(&self) -> ~str;
260+
fn escape_default(&self) -> ~str;
261+
fn len_utf8_bytes(&self) -> uint;
262+
}
263+
264+
impl Char for char {
265+
fn is_alphabetic(&self) -> bool { is_alphabetic(*self) }
266+
267+
fn is_XID_start(&self) -> bool { is_XID_start(*self) }
268+
269+
fn is_XID_continue(&self) -> bool { is_XID_continue(*self) }
270+
271+
fn is_lowercase(&self) -> bool { is_lowercase(*self) }
272+
273+
fn is_uppercase(&self) -> bool { is_uppercase(*self) }
274+
275+
fn is_whitespace(&self) -> bool { is_whitespace(*self) }
276+
277+
fn is_alphanumeric(&self) -> bool { is_alphanumeric(*self) }
278+
279+
fn is_digit(&self) -> bool { is_digit(*self) }
280+
281+
fn is_digit_radix(&self, radix: uint) -> bool { is_digit_radix(*self, radix) }
282+
283+
fn to_digit(&self, radix: uint) -> Option<uint> { to_digit(*self, radix) }
284+
285+
fn from_digit(num: uint, radix: uint) -> Option<char> { from_digit(num, radix) }
286+
287+
fn escape_unicode(&self) -> ~str { escape_unicode(*self) }
288+
289+
fn escape_default(&self) -> ~str { escape_default(*self) }
290+
291+
fn len_utf8_bytes(&self) -> uint { len_utf8_bytes(*self) }
292+
}
293+
247294
#[cfg(not(test))]
248295
impl Eq for char {
249296
#[inline(always)]
@@ -266,84 +313,82 @@ impl Ord for char {
266313

267314
#[test]
268315
fn test_is_lowercase() {
269-
assert!(is_lowercase('a'));
270-
assert!(is_lowercase('ö'));
271-
assert!(is_lowercase('ß'));
272-
assert!(!is_lowercase('Ü'));
273-
assert!(!is_lowercase('P'));
316+
assert!('a'.is_lowercase());
317+
assert!('ö'.is_lowercase());
318+
assert!('ß'.is_lowercase());
319+
assert!(!'Ü'.is_lowercase());
320+
assert!(!'P'.is_lowercase());
274321
}
275322

276323
#[test]
277324
fn test_is_uppercase() {
278-
assert!(!is_uppercase('h'));
279-
assert!(!is_uppercase('ä'));
280-
assert!(!is_uppercase('ß'));
281-
assert!(is_uppercase('Ö'));
282-
assert!(is_uppercase('T'));
325+
assert!(!'h'.is_uppercase());
326+
assert!(!'ä'.is_uppercase());
327+
assert!(!'ß'.is_uppercase());
328+
assert!('Ö'.is_uppercase());
329+
assert!('T'.is_uppercase());
283330
}
284331

285332
#[test]
286333
fn test_is_whitespace() {
287-
assert!(is_whitespace(' '));
288-
assert!(is_whitespace('\u2007'));
289-
assert!(is_whitespace('\t'));
290-
assert!(is_whitespace('\n'));
291-
292-
assert!(!is_whitespace('a'));
293-
assert!(!is_whitespace('_'));
294-
assert!(!is_whitespace('\u0000'));
334+
assert!(' '.is_whitespace());
335+
assert!('\u2007'.is_whitespace());
336+
assert!('\t'.is_whitespace());
337+
assert!('\n'.is_whitespace());
338+
assert!(!'a'.is_whitespace());
339+
assert!(!'_'.is_whitespace());
340+
assert!(!'\u0000'.is_whitespace());
295341
}
296342

297343
#[test]
298344
fn test_to_digit() {
299-
assert_eq!(to_digit('0', 10u), Some(0u));
300-
assert_eq!(to_digit('1', 2u), Some(1u));
301-
assert_eq!(to_digit('2', 3u), Some(2u));
302-
assert_eq!(to_digit('9', 10u), Some(9u));
303-
assert_eq!(to_digit('a', 16u), Some(10u));
304-
assert_eq!(to_digit('A', 16u), Some(10u));
305-
assert_eq!(to_digit('b', 16u), Some(11u));
306-
assert_eq!(to_digit('B', 16u), Some(11u));
307-
assert_eq!(to_digit('z', 36u), Some(35u));
308-
assert_eq!(to_digit('Z', 36u), Some(35u));
309-
310-
assert!(to_digit(' ', 10u).is_none());
311-
assert!(to_digit('$', 36u).is_none());
345+
assert_eq!('0'.to_digit(10u), Some(0u));
346+
assert_eq!('1'.to_digit(2u), Some(1u));
347+
assert_eq!('2'.to_digit(3u), Some(2u));
348+
assert_eq!('9'.to_digit(10u), Some(9u));
349+
assert_eq!('a'.to_digit(16u), Some(10u));
350+
assert_eq!('A'.to_digit(16u), Some(10u));
351+
assert_eq!('b'.to_digit(16u), Some(11u));
352+
assert_eq!('B'.to_digit(16u), Some(11u));
353+
assert_eq!('z'.to_digit(36u), Some(35u));
354+
assert_eq!('Z'.to_digit(36u), Some(35u));
355+
assert_eq!(' '.to_digit(10u), None);
356+
assert_eq!('$'.to_digit(36u), None);
312357
}
313358

314359
#[test]
315360
fn test_is_digit() {
316-
assert!(is_digit('2'));
317-
assert!(is_digit('7'));
318-
assert!(! is_digit('c'));
319-
assert!(! is_digit('i'));
320-
assert!(! is_digit('z'));
321-
assert!(! is_digit('Q'));
361+
assert!('2'.is_digit());
362+
assert!('7'.is_digit());
363+
assert!(!'c'.is_digit());
364+
assert!(!'i'.is_digit());
365+
assert!(!'z'.is_digit());
366+
assert!(!'Q'.is_digit());
322367
}
323368

324369
#[test]
325370
fn test_escape_default() {
326-
assert_eq!(escape_default('\n'), ~"\\n");
327-
assert_eq!(escape_default('\r'), ~"\\r");
328-
assert_eq!(escape_default('\''), ~"\\'");
329-
assert_eq!(escape_default('"'), ~"\\\"");
330-
assert_eq!(escape_default(' '), ~" ");
331-
assert_eq!(escape_default('a'), ~"a");
332-
assert_eq!(escape_default('~'), ~"~");
333-
assert_eq!(escape_default('\x00'), ~"\\x00");
334-
assert_eq!(escape_default('\x1f'), ~"\\x1f");
335-
assert_eq!(escape_default('\x7f'), ~"\\x7f");
336-
assert_eq!(escape_default('\xff'), ~"\\xff");
337-
assert_eq!(escape_default('\u011b'), ~"\\u011b");
338-
assert_eq!(escape_default('\U0001d4b6'), ~"\\U0001d4b6");
371+
assert_eq!('\n'.escape_default(), ~"\\n");
372+
assert_eq!('\r'.escape_default(), ~"\\r");
373+
assert_eq!('\''.escape_default(), ~"\\'");
374+
assert_eq!('"'.escape_default(), ~"\\\"");
375+
assert_eq!(' '.escape_default(), ~" ");
376+
assert_eq!('a'.escape_default(), ~"a");
377+
assert_eq!('~'.escape_default(), ~"~");
378+
assert_eq!('\x00'.escape_default(), ~"\\x00");
379+
assert_eq!('\x1f'.escape_default(), ~"\\x1f");
380+
assert_eq!('\x7f'.escape_default(), ~"\\x7f");
381+
assert_eq!('\xff'.escape_default(), ~"\\xff");
382+
assert_eq!('\u011b'.escape_default(), ~"\\u011b");
383+
assert_eq!('\U0001d4b6'.escape_default(), ~"\\U0001d4b6");
339384
}
340385
341386
#[test]
342387
fn test_escape_unicode() {
343-
assert_eq!(escape_unicode('\x00'), ~"\\x00");
344-
assert_eq!(escape_unicode('\n'), ~"\\x0a");
345-
assert_eq!(escape_unicode(' '), ~"\\x20");
346-
assert_eq!(escape_unicode('a'), ~"\\x61");
347-
assert_eq!(escape_unicode('\u011b'), ~"\\u011b");
348-
assert_eq!(escape_unicode('\U0001d4b6'), ~"\\U0001d4b6");
388+
assert_eq!('\x00'.escape_unicode(), ~"\\x00");
389+
assert_eq!('\n'.escape_unicode(), ~"\\x0a");
390+
assert_eq!(' '.escape_unicode(), ~"\\x20");
391+
assert_eq!('a'.escape_unicode(), ~"\\x61");
392+
assert_eq!('\u011b'.escape_unicode(), ~"\\u011b");
393+
assert_eq!('\U0001d4b6'.escape_unicode(), ~"\\U0001d4b6");
349394
}

src/libcore/prelude.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub use io::{print, println};
2929

3030
pub use clone::{Clone, DeepClone};
3131
pub use cmp::{Eq, ApproxEq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater, Equiv};
32+
pub use char::Char;
3233
pub use container::{Container, Mutable, Map, Set};
3334
pub use hash::Hash;
3435
pub use old_iter::{BaseIter, ReverseIter, MutableIter, ExtendedIter, EqIter};

0 commit comments

Comments
 (0)