Skip to content

Commit e5792f9

Browse files
committed
Repeat with fewer writes
1 parent 0f4f9b8 commit e5792f9

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
lines changed

encode.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ func (enc *TableEncoder) header() {
343343

344344
if enc.title != nil && enc.title.Width != 0 {
345345
maxWidth := ((enc.tableWidth() - enc.title.Width) / 2) + enc.title.Width
346-
enc.writeAligned(enc.title.Buf, rs.filler, AlignRight, enc.title.Width, maxWidth)
346+
enc.writeAligned(enc.title.Buf, &rs, AlignRight, enc.title.Width, maxWidth)
347347
enc.w.Write(enc.newline)
348348
}
349349
// draw top border
@@ -430,7 +430,7 @@ func (enc *TableEncoder) divider(rs rowStyle) {
430430

431431
for i, width := range enc.maxWidths {
432432
// column
433-
repeat(enc.w, rs.filler, width)
433+
rs.filler = repeat(enc.w, rs.filler, width)
434434

435435
// line feed indicator
436436
if rs.hasWrapping && enc.border >= 1 {
@@ -498,9 +498,9 @@ func (enc *TableEncoder) row(vals []*Value, rs rowStyle) {
498498
width += v.Width
499499
}
500500

501-
enc.writeAligned(v.Buf[start:end], rs.filler, v.Align, width, enc.maxWidths[i])
501+
enc.writeAligned(v.Buf[start:end], &rs, v.Align, width, enc.maxWidths[i])
502502
} else {
503-
repeat(enc.w, rs.filler, enc.maxWidths[i])
503+
rs.filler = repeat(enc.w, rs.filler, enc.maxWidths[i])
504504
}
505505

506506
// write newline wrap value
@@ -532,7 +532,7 @@ func (enc *TableEncoder) row(vals []*Value, rs rowStyle) {
532532
}
533533
}
534534

535-
func (enc *TableEncoder) writeAligned(b, filler []byte, a Align, width, max int) {
535+
func (enc *TableEncoder) writeAligned(b []byte, rs *rowStyle, a Align, width, max int) {
536536
// calc padding
537537
padding := max - width
538538
paddingLeft := 0
@@ -551,15 +551,15 @@ func (enc *TableEncoder) writeAligned(b, filler []byte, a Align, width, max int)
551551

552552
// add padding left
553553
if paddingLeft > 0 {
554-
repeat(enc.w, filler, paddingLeft)
554+
rs.filler = repeat(enc.w, rs.filler, paddingLeft)
555555
}
556556

557557
// write
558558
enc.w.Write(b)
559559

560560
// add padding right
561561
if paddingRight > 0 {
562-
repeat(enc.w, filler, paddingRight)
562+
rs.filler = repeat(enc.w, rs.filler, paddingRight)
563563
}
564564
}
565565

@@ -780,7 +780,7 @@ func (enc *ExpandedEncoder) record(i int, vals []*Value, rs rowStyle) {
780780
enc.w.WriteString(header)
781781
padding := enc.maxWidths[0] + enc.maxWidths[1] + runewidth.StringWidth(string(headerRS.middle))*2 - len(header) - 1
782782
if padding > 0 {
783-
repeat(enc.w, headerRS.filler, padding)
783+
headerRS.filler = repeat(enc.w, headerRS.filler, padding)
784784
}
785785
// write newline wrap value
786786
enc.w.Write(headerRS.filler)

util.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,16 @@ func condWrite(w io.Writer, repeat int, runes ...rune) error {
108108
return err
109109
}
110110

111-
func repeat(w io.Writer, b []byte, c int) {
112-
for i := 0; i < c; i++ {
113-
w.Write(b)
111+
// repeat b c times and write it to w, returning b with increased capacity
112+
func repeat(w io.Writer, b []byte, c int) []byte {
113+
if cap(b) >= c {
114+
w.Write(b[:c])
115+
return b
114116
}
117+
nb := b[:cap(b)]
118+
for len(nb) < c {
119+
nb = append(nb, nb...)
120+
}
121+
w.Write(nb[:c])
122+
return nb[:len(b)]
115123
}

util_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"os/exec"
1313
"strconv"
1414
"strings"
15+
"testing"
1516
"time"
1617
"unicode"
1718
)
@@ -356,3 +357,20 @@ type noopWriter struct {
356357
func (*noopWriter) Write(buf []byte) (int, error) {
357358
return len(buf), nil
358359
}
360+
361+
func TestRepeat(t *testing.T) {
362+
buf := new(bytes.Buffer)
363+
filler := []byte("x")
364+
filler = repeat(buf, filler, 10)
365+
filler = repeat(buf, filler, 10)
366+
if cap(filler) != 16 {
367+
t.Errorf("Expected filler to have cap of 16, got %d", cap(filler))
368+
}
369+
if len(filler) != 1 {
370+
t.Errorf("Expected filler to have len of 1, got %d", len(filler))
371+
}
372+
actual := buf.String()
373+
if actual != "xxxxxxxxxxxxxxxxxxxx" {
374+
t.Errorf("Expected buf to be 20 x's, got %s", actual)
375+
}
376+
}

0 commit comments

Comments
 (0)