Skip to content

Commit ee0177b

Browse files
committed
Move string append to libraries. Closes #2710.
1 parent 8c64a98 commit ee0177b

File tree

7 files changed

+59
-25
lines changed

7 files changed

+59
-25
lines changed

src/libcore/char.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ fn escape_unicode(c: char) -> str {
139139
else { ('U', 8u) });
140140
assert str::len(s) <= pad;
141141
let mut out = "\\";
142-
out += str::from_char(c);
143-
for uint::range(str::len(s), pad) |_i| { out += "0"; }
144-
out += s;
142+
str::push_str(out, str::from_char(c));
143+
for uint::range(str::len(s), pad) |_i| { str::push_str(out, "0"); }
144+
str::push_str(out, s);
145145
ret out;
146146
}
147147

src/libcore/rand.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ impl extensions for rng {
144144
* Return a random string of the specified length composed of A-Z,a-z,0-9
145145
*/
146146
fn gen_str(len: uint) -> str {
147-
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
148-
"abcdefghijklmnopqrstuvwxyz" +
149-
"0123456789";
147+
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\
148+
abcdefghijklmnopqrstuvwxyz\
149+
0123456789";
150150
let mut s = "";
151151
let mut i = 0u;
152152
while (i < len) {

src/libcore/str.rs

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export
1515
from_byte,
1616
from_char,
1717
from_chars,
18+
append,
1819
concat,
1920
connect,
2021

@@ -25,6 +26,7 @@ export
2526
unpack_slice,
2627

2728
// Adding things to and removing things from a string
29+
push_str,
2830
push_char,
2931
pop_char,
3032
shift_char,
@@ -233,19 +235,47 @@ pure fn from_chars(chs: &[const char]) -> str {
233235
ret buf;
234236
}
235237

238+
/// Appends a string slice to the back of a string
239+
#[inline(always)]
240+
fn push_str(&lhs: str, rhs: str/&) {
241+
unsafe {
242+
let llen = lhs.len();
243+
let rlen = rhs.len();
244+
reserve(lhs, llen + rlen);
245+
do as_buf(lhs) |lbuf| {
246+
do unpack_slice(rhs) |rbuf, _rlen| {
247+
let dst = ptr::offset(lbuf, llen);
248+
ptr::memcpy(dst, rbuf, rlen);
249+
}
250+
}
251+
unsafe::set_len(lhs, llen + rlen);
252+
}
253+
}
254+
255+
/// Concatenate two strings together
256+
#[inline(always)]
257+
pure fn append(+lhs: str, rhs: str/&) -> str {
258+
let mut v <- lhs;
259+
unchecked {
260+
push_str(v, rhs);
261+
}
262+
ret v;
263+
}
264+
265+
236266
/// Concatenate a vector of strings
237267
pure fn concat(v: &[const str]) -> str {
238268
let mut s: str = "";
239-
for vec::each(v) |ss| { s += ss; }
269+
for vec::each(v) |ss| { unchecked { push_str(s, ss) }; }
240270
ret s;
241271
}
242272

243273
/// Concatenate a vector of strings, placing a given separator between each
244274
pure fn connect(v: &[const str], sep: str) -> str {
245275
let mut s = "", first = true;
246276
for vec::each(v) |ss| {
247-
if first { first = false; } else { s += sep; }
248-
s += ss;
277+
if first { first = false; } else { unchecked { push_str(s, sep); } }
278+
unchecked { push_str(s, ss) };
249279
}
250280
ret s;
251281
}
@@ -576,8 +606,8 @@ pure fn to_upper(s: str/&) -> str {
576606
pure fn replace(s: str, from: str, to: str) -> str {
577607
let mut result = "", first = true;
578608
do iter_between_matches(s, from) |start, end| {
579-
if first { first = false; } else { result += to; }
580-
unsafe { result += unsafe::slice_bytes(s, start, end); }
609+
if first { first = false; } else { unchecked {push_str(result, to); }}
610+
unsafe { push_str(result, unsafe::slice_bytes(s, start, end)); }
581611
}
582612
result
583613
}
@@ -1694,7 +1724,7 @@ pure fn escape_default(s: str/&) -> str {
16941724
let mut out: str = "";
16951725
unchecked {
16961726
reserve_at_least(out, str::len(s));
1697-
chars_iter(s, |c| out += char::escape_default(c));
1727+
chars_iter(s, |c| push_str(out, char::escape_default(c)));
16981728
}
16991729
ret out;
17001730
}
@@ -1704,7 +1734,7 @@ pure fn escape_unicode(s: str/&) -> str {
17041734
let mut out: str = "";
17051735
unchecked {
17061736
reserve_at_least(out, str::len(s));
1707-
chars_iter(s, |c| out += char::escape_unicode(c));
1737+
chars_iter(s, |c| push_str(out, char::escape_unicode(c)));
17081738
}
17091739
ret out;
17101740
}
@@ -1863,6 +1893,12 @@ impl extensions for str {
18631893
/// Returns a string with trailing whitespace removed
18641894
#[inline]
18651895
fn trim_right() -> str { trim_right(self) }
1896+
1897+
/// Concatenate two strings: operator version
1898+
#[inline(always)]
1899+
pure fn +(rhs: str/&) -> str {
1900+
append(self, rhs)
1901+
}
18661902
}
18671903

18681904
/// Extension methods for strings
@@ -2311,13 +2347,13 @@ mod tests {
23112347
fn a_million_letter_a() -> str {
23122348
let mut i = 0;
23132349
let mut rs = "";
2314-
while i < 100000 { rs += "aaaaaaaaaa"; i += 1; }
2350+
while i < 100000 { push_str(rs, "aaaaaaaaaa"); i += 1; }
23152351
ret rs;
23162352
}
23172353
fn half_a_million_letter_a() -> str {
23182354
let mut i = 0;
23192355
let mut rs = "";
2320-
while i < 100000 { rs += "aaaaa"; i += 1; }
2356+
while i < 100000 { push_str(rs, "aaaaa"); i += 1; }
23212357
ret rs;
23222358
}
23232359
assert eq(half_a_million_letter_a(),
@@ -2422,13 +2458,13 @@ mod tests {
24222458
fn a_million_letter_X() -> str {
24232459
let mut i = 0;
24242460
let mut rs = "";
2425-
while i < 100000 { rs += "华华华华华华华华华华"; i += 1; }
2461+
while i < 100000 { push_str(rs, "华华华华华华华华华华"); i += 1; }
24262462
ret rs;
24272463
}
24282464
fn half_a_million_letter_X() -> str {
24292465
let mut i = 0;
24302466
let mut rs = "";
2431-
while i < 100000 { rs += "华华华华华"; i += 1; }
2467+
while i < 100000 { push_str(rs, "华华华华华"); i += 1; }
24322468
ret rs;
24332469
}
24342470
assert eq(half_a_million_letter_X(),

src/libcore/to_str.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ impl <A: to_str> of to_str for ~[A] {
6161
let mut acc = "[", first = true;
6262
for vec::each(self) |elt| {
6363
if first { first = false; }
64-
else { acc += ", "; }
65-
acc += elt.to_str();
64+
else { str::push_str(acc, ", "); }
65+
str::push_str(acc, elt.to_str());
6666
}
67-
acc += "]";
67+
str::push_char(acc, ']');
6868
acc
6969
}
7070
}

src/rustc/middle/ty.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2963,8 +2963,8 @@ fn is_binopable(_cx: ctxt, ty: t, op: ast::binop) -> bool {
29632963
/*bool*/ ~[f, f, f, f, t, t, t, t],
29642964
/*int*/ ~[t, t, t, t, t, t, t, f],
29652965
/*float*/ ~[t, t, t, f, t, t, f, f],
2966-
/*str*/ ~[t, f, f, f, t, t, f, f],
2967-
/*vec*/ ~[t, f, f, f, t, t, f, f],
2966+
/*str*/ ~[f, f, f, f, t, t, f, f],
2967+
/*vec*/ ~[f, f, f, f, t, t, f, f],
29682968
/*bot*/ ~[f, f, f, f, t, t, f, f],
29692969
/*struct*/ ~[t, t, t, t, t, t, t, t]];
29702970

src/test/run-pass/module-polymorphism.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,4 @@ mod f32 {
4242
#[path = "template.rs"]
4343
mod template;
4444

45-
}
45+
}

src/test/run-pass/module-polymorphism4.rc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#[no_core];
2-
31

42
#[path = "module-polymorphism4-files"]
53
mod cat {

0 commit comments

Comments
 (0)