Commit 37f71e8a authored by David G. Andersen's avatar David G. Andersen Committed by Russ Cox

An asked-for-in #go-nuts extension to quickly create a repeated

	copy of a string or a byte array.
        strings.Repeat("-", 50)
	bytes.Repeat(b, 99)

R=rsc
https://golang.org/cl/155063
parent 11c1aa9f
......@@ -239,6 +239,19 @@ func Map(mapping func(rune int) int, s []byte) []byte {
return b[0:nbytes];
}
// Repeat returns a new byte array consisting of count copies of b.
func Repeat(b []byte, count int) []byte {
nb := make([]byte, len(b)*count);
bp := 0;
for i := 0; i < count; i++ {
for j := 0; j < len(b); j++ {
nb[bp] = b[j];
bp++;
}
}
return nb;
}
// ToUpper returns a copy of the byte array s with all Unicode letters mapped to their upper case.
func ToUpper(s []byte) []byte { return Map(unicode.ToUpper, s) }
......
......@@ -361,3 +361,30 @@ func TestAddByte(t *testing.T) {
}
}
}
type RepeatTest struct {
in, out string;
count int;
}
var RepeatTests = []RepeatTest{
RepeatTest{"", "", 0},
RepeatTest{"", "", 1},
RepeatTest{"", "", 2},
RepeatTest{"-", "", 0},
RepeatTest{"-", "-", 1},
RepeatTest{"-", "----------", 10},
RepeatTest{"abc ", "abc abc abc ", 3},
}
func TestRepeat(t *testing.T) {
for _, tt := range RepeatTests {
tin := strings.Bytes(tt.in);
tout := strings.Bytes(tt.out);
a := Repeat(tin, tt.count);
if !Equal(a, tout) {
t.Errorf("Repeat(%q, %d) = %q; want %q", tin, tt.count, a, tout);
continue;
}
}
}
......@@ -188,6 +188,20 @@ func Map(mapping func(rune int) int, s string) string {
return string(b[0:nbytes]);
}
// Repeat returns a new string consisting of count copies of the string s.
func Repeat(s string, count int) string {
b := make([]byte, len(s)*count);
bp := 0;
for i := 0; i < count; i++ {
for j := 0; j < len(s); j++ {
b[bp] = s[j];
bp++;
}
}
return string(b);
}
// ToUpper returns a copy of the string s with all Unicode letters mapped to their upper case.
func ToUpper(s string) string { return Map(unicode.ToUpper, s) }
......
......@@ -336,3 +336,28 @@ func TestCaseConsistency(t *testing.T) {
}
*/
}
type RepeatTest struct {
in, out string;
count int;
}
var RepeatTests = []RepeatTest{
RepeatTest{"", "", 0},
RepeatTest{"", "", 1},
RepeatTest{"", "", 2},
RepeatTest{"-", "", 0},
RepeatTest{"-", "-", 1},
RepeatTest{"-", "----------", 10},
RepeatTest{"abc ", "abc abc abc ", 3},
}
func TestRepeat(t *testing.T) {
for _, tt := range RepeatTests {
a := Repeat(tt.in, tt.count);
if !equal("Repeat(s)", a, tt.out, t) {
t.Errorf("Repeat(%v, %d) = %v; want %v", tt.in, tt.count, a, tt.out);
continue;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment