1 // Copyright 2018 The Go Authors. All rights reserved. |
1 // Copyright 2018 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style |
2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. |
3 // license that can be found in the LICENSE file. |
4 |
4 |
|
5 //go:build !purego && !appengine |
5 // +build !purego,!appengine |
6 // +build !purego,!appengine |
6 |
7 |
7 package strs |
8 package strs |
8 |
9 |
9 import ( |
10 import ( |
10 "unsafe" |
11 "unsafe" |
11 |
12 |
12 pref "google.golang.org/protobuf/reflect/protoreflect" |
13 "google.golang.org/protobuf/reflect/protoreflect" |
13 ) |
14 ) |
14 |
15 |
15 type ( |
16 type ( |
16 stringHeader struct { |
17 stringHeader struct { |
17 Data unsafe.Pointer |
18 Data unsafe.Pointer |
56 buf []byte |
57 buf []byte |
57 } |
58 } |
58 |
59 |
59 // AppendFullName is equivalent to protoreflect.FullName.Append, |
60 // AppendFullName is equivalent to protoreflect.FullName.Append, |
60 // but optimized for large batches where each name has a shared lifetime. |
61 // but optimized for large batches where each name has a shared lifetime. |
61 func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.FullName { |
62 func (sb *Builder) AppendFullName(prefix protoreflect.FullName, name protoreflect.Name) protoreflect.FullName { |
62 n := len(prefix) + len(".") + len(name) |
63 n := len(prefix) + len(".") + len(name) |
63 if len(prefix) == 0 { |
64 if len(prefix) == 0 { |
64 n -= len(".") |
65 n -= len(".") |
65 } |
66 } |
66 sb.grow(n) |
67 sb.grow(n) |
67 sb.buf = append(sb.buf, prefix...) |
68 sb.buf = append(sb.buf, prefix...) |
68 sb.buf = append(sb.buf, '.') |
69 sb.buf = append(sb.buf, '.') |
69 sb.buf = append(sb.buf, name...) |
70 sb.buf = append(sb.buf, name...) |
70 return pref.FullName(sb.last(n)) |
71 return protoreflect.FullName(sb.last(n)) |
71 } |
72 } |
72 |
73 |
73 // MakeString is equivalent to string(b), but optimized for large batches |
74 // MakeString is equivalent to string(b), but optimized for large batches |
74 // with a shared lifetime. |
75 // with a shared lifetime. |
75 func (sb *Builder) MakeString(b []byte) string { |
76 func (sb *Builder) MakeString(b []byte) string { |