@@ -22,17 +22,46 @@ pub struct Ascii { priv chr: u8 }
22
22
23
23
pub impl Ascii {
24
24
/// Converts a ascii character into a `u8`.
25
+ #[ inline( always) ]
25
26
fn to_byte ( self ) -> u8 {
26
27
self . chr
27
28
}
28
29
29
30
/// Converts a ascii character into a `char`.
31
+ #[ inline( always) ]
30
32
fn to_char ( self ) -> char {
31
33
self . chr as char
32
34
}
35
+
36
+ /// Convert to lowercase.
37
+ #[ inline( always) ]
38
+ fn to_lower ( self ) -> Ascii {
39
+ if self . chr >= 65 && self . chr <= 90 {
40
+ Ascii { chr : self . chr | 0x20 }
41
+ } else {
42
+ self
43
+ }
44
+ }
45
+
46
+ /// Convert to uppercase.
47
+ #[ inline( always) ]
48
+ fn to_upper ( self ) -> Ascii {
49
+ if self . chr >= 97 && self . chr <= 122 {
50
+ Ascii { chr : self . chr & !0x20 }
51
+ } else {
52
+ self
53
+ }
54
+ }
55
+
56
+ // Compares two ascii characters of equality, ignoring case.
57
+ #[ inline( always) ]
58
+ fn eq_ignore_case ( self , other : Ascii ) -> bool {
59
+ self . to_lower ( ) . chr == other. to_lower ( ) . chr
60
+ }
33
61
}
34
62
35
63
impl ToStr for Ascii {
64
+ #[ inline( always) ]
36
65
fn to_str ( & self ) -> ~str { str:: from_bytes ( [ '\'' as u8 , self . chr , '\'' as u8 ] ) }
37
66
}
38
67
@@ -46,12 +75,14 @@ pub trait AsciiCast<T> {
46
75
}
47
76
48
77
impl < ' self > AsciiCast < & ' self [ Ascii ] > for & ' self [ u8 ] {
78
+ #[ inline( always) ]
49
79
fn to_ascii ( & self ) -> & ' self [ Ascii ] {
50
80
assert ! ( self . is_ascii( ) ) ;
51
81
52
82
unsafe { cast:: transmute ( * self ) }
53
83
}
54
84
85
+ #[ inline( always) ]
55
86
fn is_ascii ( & self ) -> bool {
56
87
for self . each |b| {
57
88
if !b. is_ascii ( ) { return false ; }
@@ -61,13 +92,15 @@ impl<'self> AsciiCast<&'self[Ascii]> for &'self [u8] {
61
92
}
62
93
63
94
impl < ' self > AsciiCast < & ' self [ Ascii ] > for & ' self str {
95
+ #[ inline( always) ]
64
96
fn to_ascii ( & self ) -> & ' self [ Ascii ] {
65
97
assert ! ( self . is_ascii( ) ) ;
66
98
67
99
let ( p, len) : ( * u8 , uint ) = unsafe { cast:: transmute ( * self ) } ;
68
100
unsafe { cast:: transmute ( ( p, len - 1 ) ) }
69
101
}
70
102
103
+ #[ inline( always) ]
71
104
fn is_ascii ( & self ) -> bool {
72
105
for self . each |b| {
73
106
if !b. is_ascii ( ) { return false ; }
@@ -77,22 +110,27 @@ impl<'self> AsciiCast<&'self[Ascii]> for &'self str {
77
110
}
78
111
79
112
impl AsciiCast < Ascii > for u8 {
113
+ #[ inline( always) ]
80
114
fn to_ascii ( & self ) -> Ascii {
81
115
assert ! ( self . is_ascii( ) ) ;
82
116
Ascii { chr : * self }
83
117
}
84
118
119
+ #[ inline( always) ]
85
120
fn is_ascii ( & self ) -> bool {
86
121
* self & 128 == 0u8
87
122
}
88
123
}
89
124
90
125
impl AsciiCast < Ascii > for char {
126
+
127
+ #[ inline( always) ]
91
128
fn to_ascii ( & self ) -> Ascii {
92
129
assert ! ( self . is_ascii( ) ) ;
93
130
Ascii { chr : * self as u8 }
94
131
}
95
132
133
+ #[ inline( always) ]
96
134
fn is_ascii ( & self ) -> bool {
97
135
* self - ( '\x7F' & * self ) == '\x00'
98
136
}
@@ -105,6 +143,7 @@ pub trait OwnedAsciiCast {
105
143
}
106
144
107
145
impl OwnedAsciiCast for ~[ u8 ] {
146
+ #[ inline( always) ]
108
147
fn to_ascii_consume ( self ) -> ~[ Ascii ] {
109
148
assert ! ( self . is_ascii( ) ) ;
110
149
@@ -113,6 +152,7 @@ impl OwnedAsciiCast for ~[u8] {
113
152
}
114
153
115
154
impl OwnedAsciiCast for ~str {
155
+ #[ inline( always) ]
116
156
fn to_ascii_consume ( self ) -> ~[ Ascii ] {
117
157
let mut s = self ;
118
158
unsafe {
@@ -129,6 +169,7 @@ pub trait ToStrAscii {
129
169
}
130
170
131
171
impl < ' self > ToStrAscii for & ' self [ Ascii ] {
172
+ #[ inline( always) ]
132
173
fn to_str_ascii ( & self ) -> ~str {
133
174
let mut cpy = self . to_owned ( ) ;
134
175
cpy. push ( 0u8 . to_ascii ( ) ) ;
@@ -137,6 +178,7 @@ impl<'self> ToStrAscii for &'self [Ascii] {
137
178
}
138
179
139
180
impl ToStrConsume for ~[ Ascii ] {
181
+ #[ inline( always) ]
140
182
fn to_str_consume ( self ) -> ~str {
141
183
let mut cpy = self ;
142
184
cpy. push ( 0u8 . to_ascii ( ) ) ;
@@ -163,6 +205,16 @@ mod tests {
163
205
assert_eq ! ( 65u8 . to_ascii( ) . to_char( ) , 'A' ) ;
164
206
assert_eq ! ( 'A' . to_ascii( ) . to_char( ) , 'A' ) ;
165
207
assert_eq ! ( 'A' . to_ascii( ) . to_byte( ) , 65u8 ) ;
208
+
209
+ assert_eq ! ( 'A' . to_ascii( ) . to_lower( ) . to_char, 'a' ) ;
210
+ assert_eq ! ( 'Z' . to_ascii( ) . to_lower( ) . to_char, 'z' ) ;
211
+ assert_eq ! ( 'a' . to_ascii( ) . to_upper( ) . to_char, 'A' ) ;
212
+ assert_eq ! ( 'z' . to_ascii( ) . to_upper( ) . to_char, 'Z' ) ;
213
+
214
+ assert_eq ! ( '@' . to_ascii( ) . to_lower( ) . to_char, '@' ) ;
215
+ assert_eq ! ( '[' . to_ascii( ) . to_lower( ) . to_char, '[' ) ;
216
+ assert_eq ! ( '`' . to_ascii( ) . to_upper( ) . to_char, '`' ) ;
217
+ assert_eq ! ( '{' . to_ascii( ) . to_upper( ) . to_char, '{' ) ;
166
218
}
167
219
168
220
#[ test]
0 commit comments