Skip to content

Commit b072b53

Browse files
committed
---
yaml --- r: 7888 b: refs/heads/snap-stage3 c: 025e6ff h: refs/heads/master v: v3
1 parent 1868dc7 commit b072b53

File tree

2 files changed

+147
-1
lines changed

2 files changed

+147
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 2898dcc5d97da9427ac367542382b6239d9c0bbf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 1be3a7c2637b11f82bcbbbff5e92532d7e2fc9b8
4+
refs/heads/snap-stage3: 025e6ff1586999caef7460a1884cbd9685ad2277
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/snap-stage3/src/libcore/vec.rs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,110 @@ fn slice_mut<T: copy>(v: [const T], start: uint, end: uint) -> [mutable T] {
278278
ret result;
279279
}
280280

281+
/*
282+
Function: split
283+
284+
Split the vector `v` by applying each element against the predicate `f`.
285+
*/
286+
fn split<T: copy>(v: [T], f: fn(T) -> bool) -> [[T]] {
287+
let ln = len(v);
288+
if (ln == 0u) { ret [] }
289+
290+
let start = 0u;
291+
let result = [];
292+
while start < ln {
293+
alt position_from(v, start, ln, f) {
294+
none { break }
295+
some(i) {
296+
push(result, slice(v, start, i));
297+
start = i + 1u;
298+
}
299+
}
300+
}
301+
push(result, slice(v, start, ln));
302+
result
303+
}
304+
305+
/*
306+
Function: splitn
307+
308+
Split the vector `v` by applying each element against the predicate `f` up
309+
to `n` times.
310+
*/
311+
fn splitn<T: copy>(v: [T], n: uint, f: fn(T) -> bool) -> [[T]] {
312+
let ln = len(v);
313+
if (ln == 0u) { ret [] }
314+
315+
let start = 0u;
316+
let count = n;
317+
let result = [];
318+
while start < ln && count > 0u {
319+
alt position_from(v, start, ln, f) {
320+
none { break }
321+
some(i) {
322+
push(result, slice(v, start, i));
323+
// Make sure to skip the separator.
324+
start = i + 1u;
325+
count -= 1u;
326+
}
327+
}
328+
}
329+
push(result, slice(v, start, ln));
330+
result
331+
}
332+
333+
/*
334+
Function: rsplit
335+
336+
Reverse split the vector `v` by applying each element against the predicate
337+
`f`.
338+
*/
339+
fn rsplit<T: copy>(v: [T], f: fn(T) -> bool) -> [[T]] {
340+
let ln = len(v);
341+
if (ln == 0u) { ret [] }
342+
343+
let end = ln;
344+
let result = [];
345+
while end > 0u {
346+
alt rposition_from(v, 0u, end, f) {
347+
none { break }
348+
some(i) {
349+
push(result, slice(v, i + 1u, end));
350+
end = i;
351+
}
352+
}
353+
}
354+
push(result, slice(v, 0u, end));
355+
reversed(result)
356+
}
357+
358+
/*
359+
Function: rsplitn
360+
361+
Reverse split the vector `v` by applying each element against the predicate
362+
`f` up to `n times.
363+
*/
364+
fn rsplitn<T: copy>(v: [T], n: uint, f: fn(T) -> bool) -> [[T]] {
365+
let ln = len(v);
366+
if (ln == 0u) { ret [] }
367+
368+
let end = ln;
369+
let count = n;
370+
let result = [];
371+
while end > 0u && count > 0u {
372+
alt rposition_from(v, 0u, end, f) {
373+
none { break }
374+
some(i) {
375+
push(result, slice(v, i + 1u, end));
376+
// Make sure to skip the separator.
377+
end = i;
378+
count -= 1u;
379+
}
380+
}
381+
}
382+
push(result, slice(v, 0u, end));
383+
reversed(result)
384+
}
281385

282386
// Mutators
283387

@@ -1641,6 +1745,48 @@ mod tests {
16411745
assert v == [1, 2];
16421746
}
16431747

1748+
#[test]
1749+
fn test_split() {
1750+
fn f(&&x: int) -> bool { x == 3 }
1751+
1752+
assert split([], f) == [];
1753+
assert split([1, 2], f) == [[1, 2]];
1754+
assert split([3, 1, 2], f) == [[], [1, 2]];
1755+
assert split([1, 2, 3], f) == [[1, 2], []];
1756+
assert split([1, 2, 3, 4, 3, 5], f) == [[1, 2], [4], [5]];
1757+
}
1758+
1759+
#[test]
1760+
fn test_splitn() {
1761+
fn f(&&x: int) -> bool { x == 3 }
1762+
1763+
assert splitn([], 1u, f) == [];
1764+
assert splitn([1, 2], 1u, f) == [[1, 2]];
1765+
assert splitn([3, 1, 2], 1u, f) == [[], [1, 2]];
1766+
assert splitn([1, 2, 3], 1u, f) == [[1, 2], []];
1767+
assert splitn([1, 2, 3, 4, 3, 5], 1u, f) == [[1, 2], [4, 3, 5]];
1768+
}
1769+
1770+
#[test]
1771+
fn test_rsplit() {
1772+
fn f(&&x: int) -> bool { x == 3 }
1773+
1774+
assert rsplit([], f) == [];
1775+
assert rsplit([1, 2], f) == [[1, 2]];
1776+
assert rsplit([1, 2, 3], f) == [[1, 2], []];
1777+
assert rsplit([1, 2, 3, 4, 3, 5], f) == [[1, 2], [4], [5]];
1778+
}
1779+
1780+
#[test]
1781+
fn test_rsplitn() {
1782+
fn f(&&x: int) -> bool { x == 3 }
1783+
1784+
assert rsplitn([], 1u, f) == [];
1785+
assert rsplitn([1, 2], 1u, f) == [[1, 2]];
1786+
assert rsplitn([1, 2, 3], 1u, f) == [[1, 2], []];
1787+
assert rsplitn([1, 2, 3, 4, 3, 5], 1u, f) == [[1, 2, 3, 4], [5]];
1788+
}
1789+
16441790
#[test]
16451791
// FIXME: Windows can't undwind
16461792
#[ignore(cfg(target_os = "win32"))]

0 commit comments

Comments
 (0)