From 313fef902af99842716e7583b5d160d698ca899c Mon Sep 17 00:00:00 2001 From: Pavel Petrukhin Date: Tue, 9 Jun 2020 13:13:51 +0300 Subject: [PATCH 1/6] feat(package): use strings.Builder instead of bytes.Buffer --- common.go | 6 +++--- convert.go | 16 ++++++++-------- format.go | 14 +++++++------- manipulate.go | 5 ++--- translate.go | 6 +++--- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/common.go b/common.go index 2aff57a..4c45a7b 100644 --- a/common.go +++ b/common.go @@ -4,14 +4,14 @@ package xstrings import ( - "bytes" + "strings" ) const bufferMaxInitGrowSize = 2048 // Lazy initialize a buffer. -func allocBuffer(orig, cur string) *bytes.Buffer { - output := &bytes.Buffer{} +func allocBuffer(orig, cur string) *strings.Builder { + output := &strings.Builder{} maxSize := len(orig) * 4 // Avoid to reserve too much memory at once. diff --git a/convert.go b/convert.go index 3d58fa8..d2cc555 100644 --- a/convert.go +++ b/convert.go @@ -4,8 +4,8 @@ package xstrings import ( - "bytes" "math/rand" + "strings" "unicode" "unicode/utf8" ) @@ -23,7 +23,7 @@ func ToCamelCase(str string) string { return "" } - buf := &bytes.Buffer{} + buf := &strings.Builder{} var r0, r1 rune var size int @@ -112,7 +112,7 @@ func camelCaseToLowerCase(str string, connector rune) string { return "" } - buf := &bytes.Buffer{} + buf := &strings.Builder{} wt, word, remaining := nextWord(str) for len(remaining) > 0 { @@ -374,7 +374,7 @@ func nextValidRune(str string, prev rune) (r rune, size int) { return } -func toLower(buf *bytes.Buffer, wt wordType, str string, connector rune) { +func toLower(buf *strings.Builder, wt wordType, str string, connector rune) { buf.Grow(buf.Len() + len(str)) if wt != upperCaseWord && wt != connectorWord { @@ -401,7 +401,7 @@ func SwapCase(str string) string { var r rune var size int - buf := &bytes.Buffer{} + buf := &strings.Builder{} for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -435,7 +435,7 @@ func FirstRuneToUpper(str string) string { return str } - buf := &bytes.Buffer{} + buf := &strings.Builder{} buf.WriteRune(unicode.ToUpper(r)) buf.WriteString(str[size:]) return buf.String() @@ -453,7 +453,7 @@ func FirstRuneToLower(str string) string { return str } - buf := &bytes.Buffer{} + buf := &strings.Builder{} buf.WriteRune(unicode.ToLower(r)) buf.WriteString(str[size:]) return buf.String() @@ -566,7 +566,7 @@ func Successor(str string) string { // Needs to add one character for carry. if i < 0 && carry != ' ' { - buf := &bytes.Buffer{} + buf := &strings.Builder{} buf.Grow(l + 4) // Reserve enough space for write. if lastAlphanumeric != 0 { diff --git a/format.go b/format.go index 2d02df1..b0d127f 100644 --- a/format.go +++ b/format.go @@ -4,7 +4,7 @@ package xstrings import ( - "bytes" + "strings" "unicode/utf8" ) @@ -28,7 +28,7 @@ func ExpandTabs(str string, tabSize int) string { var r rune var i, size, column, expand int - var output *bytes.Buffer + var output *strings.Builder orig := str @@ -43,7 +43,7 @@ func ExpandTabs(str string, tabSize int) string { } for i = 0; i < expand; i++ { - output.WriteByte(byte(' ')) + output.WriteRune(' ') } column += expand @@ -88,7 +88,7 @@ func LeftJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bytes.Buffer{} + output := &strings.Builder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) output.WriteString(str) writePadString(output, pad, padLen, remains) @@ -114,7 +114,7 @@ func RightJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bytes.Buffer{} + output := &strings.Builder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains) output.WriteString(str) @@ -140,7 +140,7 @@ func Center(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bytes.Buffer{} + output := &strings.Builder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains/2) output.WriteString(str) @@ -148,7 +148,7 @@ func Center(str string, length int, pad string) string { return output.String() } -func writePadString(output *bytes.Buffer, pad string, padLen, remains int) { +func writePadString(output *strings.Builder, pad string, padLen, remains int) { var r rune var size int diff --git a/manipulate.go b/manipulate.go index 0eefb43..3157d28 100644 --- a/manipulate.go +++ b/manipulate.go @@ -4,7 +4,6 @@ package xstrings import ( - "bytes" "strings" "unicode/utf8" ) @@ -131,7 +130,7 @@ func Insert(dst, src string, index int) string { // Scrub scrubs invalid utf8 bytes with repl string. // Adjacent invalid bytes are replaced only once. func Scrub(str, repl string) string { - var buf *bytes.Buffer + var buf *strings.Builder var r rune var size, pos int var hasError bool @@ -144,7 +143,7 @@ func Scrub(str, repl string) string { if r == utf8.RuneError { if !hasError { if buf == nil { - buf = &bytes.Buffer{} + buf = &strings.Builder{} } buf.WriteString(origin[:pos]) diff --git a/translate.go b/translate.go index 66e23f8..f9f2086 100644 --- a/translate.go +++ b/translate.go @@ -4,7 +4,7 @@ package xstrings import ( - "bytes" + "strings" "unicode" "unicode/utf8" ) @@ -303,7 +303,7 @@ func (tr *Translator) Translate(str string) string { orig := str - var output *bytes.Buffer + var output *strings.Builder for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -500,7 +500,7 @@ func Squeeze(str, pattern string) string { var size int var skipSqueeze, matched bool var tr *Translator - var output *bytes.Buffer + var output *strings.Builder orig := str last = -1 From bf1ee65c41a1e9004ddbb4c503ac7ae06196d0a4 Mon Sep 17 00:00:00 2001 From: Pavel Petrukhin Date: Tue, 9 Jun 2020 13:16:20 +0300 Subject: [PATCH 2/6] style(project): reformat project --- count_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/count_test.go b/count_test.go index 0500b14..9cc0b83 100644 --- a/count_test.go +++ b/count_test.go @@ -31,9 +31,9 @@ func TestWordCount(t *testing.T) { "中文": "0", "你好,sekai!": "1", "oh, it's super-fancy!!a": "4", - "": "0", - "-": "0", - "it's-'s": "1", + "": "0", + "-": "0", + "it's-'s": "1", }) } @@ -45,7 +45,7 @@ func TestWidth(t *testing.T) { runTestCases(t, runner, _M{ "abcd\t0123\n7890": "12", "中zh英eng文混排": "15", - "": "0", + "": "0", }) } From a81d2954276fd9be245272d46fd800f1c8658717 Mon Sep 17 00:00:00 2001 From: Pavel Petrukhin Date: Wed, 10 Jun 2020 11:52:39 +0300 Subject: [PATCH 3/6] fix(buffer): type aliases for back compatibility with go <= 1.10 --- buffer.go | 7 +++++++ buffer_old.go | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 buffer.go create mode 100644 buffer_old.go diff --git a/buffer.go b/buffer.go new file mode 100644 index 0000000..14b9bf7 --- /dev/null +++ b/buffer.go @@ -0,0 +1,7 @@ +//+build go1.10 + +package xstrings + +import "strings" + +type bufferString = strings.Builder diff --git a/buffer_old.go b/buffer_old.go new file mode 100644 index 0000000..4b4c380 --- /dev/null +++ b/buffer_old.go @@ -0,0 +1,9 @@ +//+build !go1.10 + +package xstrings + +import "bytes" + +type bufferString struct { + bytes.Buffer +} From dd8a951e688fcfa6390e0cf7a19ec19d67a85efe Mon Sep 17 00:00:00 2001 From: Pavel Petrukhin Date: Wed, 10 Jun 2020 11:54:39 +0300 Subject: [PATCH 4/6] fix(package): use bufferString type alias instead of string builder --- common.go | 8 ++------ convert.go | 15 +++++++-------- format.go | 11 +++++------ manipulate.go | 4 ++-- translate.go | 5 ++--- 5 files changed, 18 insertions(+), 25 deletions(-) diff --git a/common.go b/common.go index 4c45a7b..c16ae0f 100644 --- a/common.go +++ b/common.go @@ -3,15 +3,11 @@ package xstrings -import ( - "strings" -) - const bufferMaxInitGrowSize = 2048 // Lazy initialize a buffer. -func allocBuffer(orig, cur string) *strings.Builder { - output := &strings.Builder{} +func allocBuffer(orig, cur string) *bufferString { + output := &bufferString{} maxSize := len(orig) * 4 // Avoid to reserve too much memory at once. diff --git a/convert.go b/convert.go index d2cc555..bc5a03c 100644 --- a/convert.go +++ b/convert.go @@ -5,7 +5,6 @@ package xstrings import ( "math/rand" - "strings" "unicode" "unicode/utf8" ) @@ -23,7 +22,7 @@ func ToCamelCase(str string) string { return "" } - buf := &strings.Builder{} + buf := &bufferString{} var r0, r1 rune var size int @@ -112,7 +111,7 @@ func camelCaseToLowerCase(str string, connector rune) string { return "" } - buf := &strings.Builder{} + buf := &bufferString{} wt, word, remaining := nextWord(str) for len(remaining) > 0 { @@ -374,7 +373,7 @@ func nextValidRune(str string, prev rune) (r rune, size int) { return } -func toLower(buf *strings.Builder, wt wordType, str string, connector rune) { +func toLower(buf *bufferString, wt wordType, str string, connector rune) { buf.Grow(buf.Len() + len(str)) if wt != upperCaseWord && wt != connectorWord { @@ -401,7 +400,7 @@ func SwapCase(str string) string { var r rune var size int - buf := &strings.Builder{} + buf := &bufferString{} for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -435,7 +434,7 @@ func FirstRuneToUpper(str string) string { return str } - buf := &strings.Builder{} + buf := &bufferString{} buf.WriteRune(unicode.ToUpper(r)) buf.WriteString(str[size:]) return buf.String() @@ -453,7 +452,7 @@ func FirstRuneToLower(str string) string { return str } - buf := &strings.Builder{} + buf := &bufferString{} buf.WriteRune(unicode.ToLower(r)) buf.WriteString(str[size:]) return buf.String() @@ -566,7 +565,7 @@ func Successor(str string) string { // Needs to add one character for carry. if i < 0 && carry != ' ' { - buf := &strings.Builder{} + buf := &bufferString{} buf.Grow(l + 4) // Reserve enough space for write. if lastAlphanumeric != 0 { diff --git a/format.go b/format.go index b0d127f..b197912 100644 --- a/format.go +++ b/format.go @@ -4,7 +4,6 @@ package xstrings import ( - "strings" "unicode/utf8" ) @@ -28,7 +27,7 @@ func ExpandTabs(str string, tabSize int) string { var r rune var i, size, column, expand int - var output *strings.Builder + var output *bufferString orig := str @@ -88,7 +87,7 @@ func LeftJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &strings.Builder{} + output := &bufferString{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) output.WriteString(str) writePadString(output, pad, padLen, remains) @@ -114,7 +113,7 @@ func RightJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &strings.Builder{} + output := &bufferString{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains) output.WriteString(str) @@ -140,7 +139,7 @@ func Center(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &strings.Builder{} + output := &bufferString{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains/2) output.WriteString(str) @@ -148,7 +147,7 @@ func Center(str string, length int, pad string) string { return output.String() } -func writePadString(output *strings.Builder, pad string, padLen, remains int) { +func writePadString(output *bufferString, pad string, padLen, remains int) { var r rune var size int diff --git a/manipulate.go b/manipulate.go index 3157d28..f232fb7 100644 --- a/manipulate.go +++ b/manipulate.go @@ -130,7 +130,7 @@ func Insert(dst, src string, index int) string { // Scrub scrubs invalid utf8 bytes with repl string. // Adjacent invalid bytes are replaced only once. func Scrub(str, repl string) string { - var buf *strings.Builder + var buf *bufferString var r rune var size, pos int var hasError bool @@ -143,7 +143,7 @@ func Scrub(str, repl string) string { if r == utf8.RuneError { if !hasError { if buf == nil { - buf = &strings.Builder{} + buf = &bufferString{} } buf.WriteString(origin[:pos]) diff --git a/translate.go b/translate.go index f9f2086..7ad8755 100644 --- a/translate.go +++ b/translate.go @@ -4,7 +4,6 @@ package xstrings import ( - "strings" "unicode" "unicode/utf8" ) @@ -303,7 +302,7 @@ func (tr *Translator) Translate(str string) string { orig := str - var output *strings.Builder + var output *bufferString for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -500,7 +499,7 @@ func Squeeze(str, pattern string) string { var size int var skipSqueeze, matched bool var tr *Translator - var output *strings.Builder + var output *bufferString orig := str last = -1 From 225e7bf383e67e74f6439018fe2b1ca741caa2f9 Mon Sep 17 00:00:00 2001 From: Pavel Petrukhin Date: Wed, 10 Jun 2020 12:47:25 +0300 Subject: [PATCH 5/6] rfr(string buffer): rename stringbuffer* to stringbuilder --- buffer.go => stringbuilder.go | 0 buffer_old.go => stringbuilder_go110.go | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename buffer.go => stringbuilder.go (100%) rename buffer_old.go => stringbuilder_go110.go (100%) diff --git a/buffer.go b/stringbuilder.go similarity index 100% rename from buffer.go rename to stringbuilder.go diff --git a/buffer_old.go b/stringbuilder_go110.go similarity index 100% rename from buffer_old.go rename to stringbuilder_go110.go From ac7d5dba631a4e290307ddcf615c741cded1eefc Mon Sep 17 00:00:00 2001 From: Pavel Petrukhin Date: Wed, 10 Jun 2020 12:49:20 +0300 Subject: [PATCH 6/6] rfr(package): rename stringBuffer to stringBuilder --- common.go | 4 ++-- convert.go | 14 +++++++------- format.go | 10 +++++----- manipulate.go | 4 ++-- stringbuilder.go | 2 +- stringbuilder_go110.go | 2 +- translate.go | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/common.go b/common.go index c16ae0f..f427cc8 100644 --- a/common.go +++ b/common.go @@ -6,8 +6,8 @@ package xstrings const bufferMaxInitGrowSize = 2048 // Lazy initialize a buffer. -func allocBuffer(orig, cur string) *bufferString { - output := &bufferString{} +func allocBuffer(orig, cur string) *stringBuilder { + output := &stringBuilder{} maxSize := len(orig) * 4 // Avoid to reserve too much memory at once. diff --git a/convert.go b/convert.go index bc5a03c..3d5a349 100644 --- a/convert.go +++ b/convert.go @@ -22,7 +22,7 @@ func ToCamelCase(str string) string { return "" } - buf := &bufferString{} + buf := &stringBuilder{} var r0, r1 rune var size int @@ -111,7 +111,7 @@ func camelCaseToLowerCase(str string, connector rune) string { return "" } - buf := &bufferString{} + buf := &stringBuilder{} wt, word, remaining := nextWord(str) for len(remaining) > 0 { @@ -373,7 +373,7 @@ func nextValidRune(str string, prev rune) (r rune, size int) { return } -func toLower(buf *bufferString, wt wordType, str string, connector rune) { +func toLower(buf *stringBuilder, wt wordType, str string, connector rune) { buf.Grow(buf.Len() + len(str)) if wt != upperCaseWord && wt != connectorWord { @@ -400,7 +400,7 @@ func SwapCase(str string) string { var r rune var size int - buf := &bufferString{} + buf := &stringBuilder{} for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -434,7 +434,7 @@ func FirstRuneToUpper(str string) string { return str } - buf := &bufferString{} + buf := &stringBuilder{} buf.WriteRune(unicode.ToUpper(r)) buf.WriteString(str[size:]) return buf.String() @@ -452,7 +452,7 @@ func FirstRuneToLower(str string) string { return str } - buf := &bufferString{} + buf := &stringBuilder{} buf.WriteRune(unicode.ToLower(r)) buf.WriteString(str[size:]) return buf.String() @@ -565,7 +565,7 @@ func Successor(str string) string { // Needs to add one character for carry. if i < 0 && carry != ' ' { - buf := &bufferString{} + buf := &stringBuilder{} buf.Grow(l + 4) // Reserve enough space for write. if lastAlphanumeric != 0 { diff --git a/format.go b/format.go index b197912..8cd76c5 100644 --- a/format.go +++ b/format.go @@ -27,7 +27,7 @@ func ExpandTabs(str string, tabSize int) string { var r rune var i, size, column, expand int - var output *bufferString + var output *stringBuilder orig := str @@ -87,7 +87,7 @@ func LeftJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bufferString{} + output := &stringBuilder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) output.WriteString(str) writePadString(output, pad, padLen, remains) @@ -113,7 +113,7 @@ func RightJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bufferString{} + output := &stringBuilder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains) output.WriteString(str) @@ -139,7 +139,7 @@ func Center(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bufferString{} + output := &stringBuilder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains/2) output.WriteString(str) @@ -147,7 +147,7 @@ func Center(str string, length int, pad string) string { return output.String() } -func writePadString(output *bufferString, pad string, padLen, remains int) { +func writePadString(output *stringBuilder, pad string, padLen, remains int) { var r rune var size int diff --git a/manipulate.go b/manipulate.go index f232fb7..64075f9 100644 --- a/manipulate.go +++ b/manipulate.go @@ -130,7 +130,7 @@ func Insert(dst, src string, index int) string { // Scrub scrubs invalid utf8 bytes with repl string. // Adjacent invalid bytes are replaced only once. func Scrub(str, repl string) string { - var buf *bufferString + var buf *stringBuilder var r rune var size, pos int var hasError bool @@ -143,7 +143,7 @@ func Scrub(str, repl string) string { if r == utf8.RuneError { if !hasError { if buf == nil { - buf = &bufferString{} + buf = &stringBuilder{} } buf.WriteString(origin[:pos]) diff --git a/stringbuilder.go b/stringbuilder.go index 14b9bf7..bb0919d 100644 --- a/stringbuilder.go +++ b/stringbuilder.go @@ -4,4 +4,4 @@ package xstrings import "strings" -type bufferString = strings.Builder +type stringBuilder = strings.Builder diff --git a/stringbuilder_go110.go b/stringbuilder_go110.go index 4b4c380..dac389d 100644 --- a/stringbuilder_go110.go +++ b/stringbuilder_go110.go @@ -4,6 +4,6 @@ package xstrings import "bytes" -type bufferString struct { +type stringBuilder struct { bytes.Buffer } diff --git a/translate.go b/translate.go index 7ad8755..4210037 100644 --- a/translate.go +++ b/translate.go @@ -302,7 +302,7 @@ func (tr *Translator) Translate(str string) string { orig := str - var output *bufferString + var output *stringBuilder for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -499,7 +499,7 @@ func Squeeze(str, pattern string) string { var size int var skipSqueeze, matched bool var tr *Translator - var output *bufferString + var output *stringBuilder orig := str last = -1