Commit b4e358d7 authored by Rob Pike's avatar Rob Pike

utf8.String: provide an Init method to avoid unnecessary allocation

when creating an array of Strings.

R=rsc
CC=golang-dev
https://golang.org/cl/2267046
parent 2d5e732c
...@@ -25,20 +25,29 @@ type String struct { ...@@ -25,20 +25,29 @@ type String struct {
// NewString returns a new UTF-8 string with the provided contents. // NewString returns a new UTF-8 string with the provided contents.
func NewString(contents string) *String { func NewString(contents string) *String {
return new(String).Init(contents)
}
// Init initializes an existing String to hold the provided contents.
// It returns a pointer to the initialized String.
func (s *String) Init(contents string) *String {
s.str = contents
s.bytePos = 0
s.runePos = 0
for i := 0; i < len(contents); i++ { for i := 0; i < len(contents); i++ {
if contents[i] >= RuneSelf { if contents[i] >= RuneSelf {
// Not ASCII. // Not ASCII.
_, wid := DecodeRuneInString(contents) s.numRunes = RuneCountInString(contents)
return &String{ _, s.width = DecodeRuneInString(contents)
str: contents, s.nonASCII = i
numRunes: RuneCountInString(contents), return s
width: wid,
nonASCII: i,
}
} }
} }
// ASCII is simple. Also, the empty string is ASCII. // ASCII is simple. Also, the empty string is ASCII.
return &String{str: contents, numRunes: len(contents), nonASCII: len(contents)} s.numRunes = len(contents)
s.width = 0
s.nonASCII = len(contents)
return s
} }
// String returns the contents of the String. This method also means the // String returns the contents of the String. This method also means the
......
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