[chore] [pdata] Migrate the generator to go templates (#7241)
This commit is contained in:
parent
6f800ca227
commit
1f5865df1c
File diff suppressed because it is too large
Load Diff
|
|
@ -16,35 +16,35 @@ package internal // import "go.opentelemetry.io/collector/pdata/internal/cmd/pda
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const commonSliceTemplate = `// ${structName} logically represents a slice of ${elementName}.
|
||||
const sliceTemplate = `// {{ .structName }} logically represents a slice of {{ .elementName }}.
|
||||
//
|
||||
// This is a reference type. If passed by value and callee modifies it, the
|
||||
// caller will see the modification.
|
||||
//
|
||||
// Must use New${structName} function to create new instances.
|
||||
// Must use New{{ .structName }} function to create new instances.
|
||||
// Important: zero-initialized instance is not valid for use.
|
||||
type ${structName} struct {
|
||||
orig *[]${originElementType}
|
||||
type {{ .structName }} struct {
|
||||
orig *[]{{ .originElementType }}
|
||||
}
|
||||
|
||||
func new${structName}(orig *[]${originElementType}) ${structName} {
|
||||
return ${structName}{orig}
|
||||
func new{{ .structName }}(orig *[]{{ .originElementType }}) {{ .structName }} {
|
||||
return {{ .structName }}{orig}
|
||||
}
|
||||
|
||||
// New${structName} creates a ${structName} with 0 elements.
|
||||
// New{{ .structName }} creates a {{ .structName }} with 0 elements.
|
||||
// Can use "EnsureCapacity" to initialize with a given capacity.
|
||||
func New${structName}() ${structName} {
|
||||
orig := []${originElementType}(nil)
|
||||
return new${structName}(&orig)
|
||||
func New{{ .structName }}() {{ .structName }} {
|
||||
orig := []{{ .originElementType }}(nil)
|
||||
return new{{ .structName }}(&orig)
|
||||
}
|
||||
|
||||
// Len returns the number of elements in the slice.
|
||||
//
|
||||
// Returns "0" for a newly instance created with "New${structName}()".
|
||||
func (es ${structName}) Len() int {
|
||||
// Returns "0" for a newly instance created with "New{{ .structName }}()".
|
||||
func (es {{ .structName }}) Len() int {
|
||||
return len(*es.orig)
|
||||
}
|
||||
|
||||
|
|
@ -55,42 +55,42 @@ func (es ${structName}) Len() int {
|
|||
// e := es.At(i)
|
||||
// ... // Do something with the element
|
||||
// }
|
||||
func (es ${structName}) At(i int) ${elementName} {
|
||||
return ${newElement}
|
||||
func (es {{ .structName }}) At(i int) {{ .elementName }} {
|
||||
return {{ .newElement }}
|
||||
}
|
||||
|
||||
// EnsureCapacity is an operation that ensures the slice has at least the specified capacity.
|
||||
// 1. If the newCap <= cap then no change in capacity.
|
||||
// 2. If the newCap > cap then the slice capacity will be expanded to equal newCap.
|
||||
//
|
||||
// Here is how a new ${structName} can be initialized:
|
||||
// es := New${structName}()
|
||||
// Here is how a new {{ .structName }} can be initialized:
|
||||
// es := New{{ .structName }}()
|
||||
// es.EnsureCapacity(4)
|
||||
// for i := 0; i < 4; i++ {
|
||||
// e := es.AppendEmpty()
|
||||
// // Here should set all the values for e.
|
||||
// }
|
||||
func (es ${structName}) EnsureCapacity(newCap int) {
|
||||
func (es {{ .structName }}) EnsureCapacity(newCap int) {
|
||||
oldCap := cap(*es.orig)
|
||||
if newCap <= oldCap {
|
||||
return
|
||||
}
|
||||
|
||||
newOrig := make([]${originElementType}, len(*es.orig), newCap)
|
||||
newOrig := make([]{{ .originElementType }}, len(*es.orig), newCap)
|
||||
copy(newOrig, *es.orig)
|
||||
*es.orig = newOrig
|
||||
}
|
||||
|
||||
// AppendEmpty will append to the end of the slice an empty ${elementName}.
|
||||
// It returns the newly added ${elementName}.
|
||||
func (es ${structName}) AppendEmpty() ${elementName} {
|
||||
*es.orig = append(*es.orig, ${emptyOriginElement})
|
||||
// AppendEmpty will append to the end of the slice an empty {{ .elementName }}.
|
||||
// It returns the newly added {{ .elementName }}.
|
||||
func (es {{ .structName }}) AppendEmpty() {{ .elementName }} {
|
||||
*es.orig = append(*es.orig, {{ .emptyOriginElement }})
|
||||
return es.At(es.Len() - 1)
|
||||
}
|
||||
|
||||
// MoveAndAppendTo moves all elements from the current slice and appends them to the dest.
|
||||
// The current slice will be cleared.
|
||||
func (es ${structName}) MoveAndAppendTo(dest ${structName}) {
|
||||
func (es {{ .structName }}) MoveAndAppendTo(dest {{ .structName }}) {
|
||||
if *dest.orig == nil {
|
||||
// We can simply move the entire vector and avoid any allocations.
|
||||
*dest.orig = *es.orig
|
||||
|
|
@ -102,7 +102,7 @@ func (es ${structName}) MoveAndAppendTo(dest ${structName}) {
|
|||
|
||||
// RemoveIf calls f sequentially for each element present in the slice.
|
||||
// If f returns true, the element is removed from the slice.
|
||||
func (es ${structName}) RemoveIf(f func(${elementName}) bool) {
|
||||
func (es {{ .structName }}) RemoveIf(f func({{ .elementName }}) bool) {
|
||||
newLen := 0
|
||||
for i := 0; i < len(*es.orig); i++ {
|
||||
if f(es.At(i)) {
|
||||
|
|
@ -118,76 +118,117 @@ func (es ${structName}) RemoveIf(f func(${elementName}) bool) {
|
|||
}
|
||||
// TODO: Prevent memory leak by erasing truncated values.
|
||||
*es.orig = (*es.orig)[:newLen]
|
||||
}`
|
||||
}
|
||||
|
||||
const commonSliceTestTemplate = `func Test${structName}(t *testing.T) {
|
||||
es := New${structName}()
|
||||
|
||||
// CopyTo copies all elements from the current slice overriding the destination.
|
||||
func (es {{ .structName }}) CopyTo(dest {{ .structName }}) {
|
||||
srcLen := es.Len()
|
||||
destCap := cap(*dest.orig)
|
||||
if srcLen <= destCap {
|
||||
(*dest.orig) = (*dest.orig)[:srcLen:destCap]
|
||||
|
||||
{{- if eq .type "sliceOfPtrs" }}
|
||||
for i := range *es.orig {
|
||||
new{{ .elementName }}((*es.orig)[i]).CopyTo(new{{ .elementName }}((*dest.orig)[i]))
|
||||
}
|
||||
return
|
||||
}
|
||||
origs := make([]{{ .originName }}, srcLen)
|
||||
wrappers := make([]*{{ .originName }}, srcLen)
|
||||
for i := range *es.orig {
|
||||
wrappers[i] = &origs[i]
|
||||
new{{ .elementName }}((*es.orig)[i]).CopyTo(new{{ .elementName }}(wrappers[i]))
|
||||
}
|
||||
*dest.orig = wrappers
|
||||
|
||||
{{- else }}
|
||||
} else {
|
||||
(*dest.orig) = make([]{{ .originElementType }}, srcLen)
|
||||
}
|
||||
for i := range *es.orig {
|
||||
{{ .newElement }}.CopyTo(new{{ .elementName }}(&(*dest.orig)[i]))
|
||||
}
|
||||
{{- end }}
|
||||
}
|
||||
|
||||
{{ if eq .type "sliceOfPtrs" -}}
|
||||
// Sort sorts the {{ .elementName }} elements within {{ .structName }} given the
|
||||
// provided less function so that two instances of {{ .structName }}
|
||||
// can be compared.
|
||||
func (es {{ .structName }}) Sort(less func(a, b {{ .elementName }}) bool) {
|
||||
sort.SliceStable(*es.orig, func(i, j int) bool { return less(es.At(i), es.At(j)) })
|
||||
}
|
||||
{{- end }}`
|
||||
|
||||
const sliceTestTemplate = `func Test{{ .structName }}(t *testing.T) {
|
||||
es := New{{ .structName }}()
|
||||
assert.Equal(t, 0, es.Len())
|
||||
es = new${structName}(&[]${originElementType}{})
|
||||
es = new{{ .structName }}(&[]{{ .originElementType }}{})
|
||||
assert.Equal(t, 0, es.Len())
|
||||
|
||||
emptyVal := New${elementName}()
|
||||
testVal := generateTest${elementName}()
|
||||
emptyVal := New{{ .elementName }}()
|
||||
testVal := generateTest{{ .elementName }}()
|
||||
for i := 0; i < 7; i++ {
|
||||
el := es.AppendEmpty()
|
||||
assert.Equal(t, emptyVal, es.At(i))
|
||||
fillTest${elementName}(el)
|
||||
fillTest{{ .elementName }}(el)
|
||||
assert.Equal(t, testVal, es.At(i))
|
||||
}
|
||||
assert.Equal(t, 7, es.Len())
|
||||
}
|
||||
|
||||
func Test${structName}_CopyTo(t *testing.T) {
|
||||
dest := New${structName}()
|
||||
func Test{{ .structName }}_CopyTo(t *testing.T) {
|
||||
dest := New{{ .structName }}()
|
||||
// Test CopyTo to empty
|
||||
New${structName}().CopyTo(dest)
|
||||
assert.Equal(t, New${structName}(), dest)
|
||||
New{{ .structName }}().CopyTo(dest)
|
||||
assert.Equal(t, New{{ .structName }}(), dest)
|
||||
|
||||
// Test CopyTo larger slice
|
||||
generateTest${structName}().CopyTo(dest)
|
||||
assert.Equal(t, generateTest${structName}(), dest)
|
||||
generateTest{{ .structName }}().CopyTo(dest)
|
||||
assert.Equal(t, generateTest{{ .structName }}(), dest)
|
||||
|
||||
// Test CopyTo same size slice
|
||||
generateTest${structName}().CopyTo(dest)
|
||||
assert.Equal(t, generateTest${structName}(), dest)
|
||||
generateTest{{ .structName }}().CopyTo(dest)
|
||||
assert.Equal(t, generateTest{{ .structName }}(), dest)
|
||||
}
|
||||
|
||||
func Test${structName}_EnsureCapacity(t *testing.T) {
|
||||
es := generateTest${structName}()
|
||||
func Test{{ .structName }}_EnsureCapacity(t *testing.T) {
|
||||
es := generateTest{{ .structName }}()
|
||||
|
||||
// Test ensure smaller capacity.
|
||||
const ensureSmallLen = 4
|
||||
es.EnsureCapacity(ensureSmallLen)
|
||||
assert.Less(t, ensureSmallLen, es.Len())
|
||||
assert.Equal(t, es.Len(), cap(*es.orig))
|
||||
assert.Equal(t, generateTest${structName}(), es)
|
||||
assert.Equal(t, generateTest{{ .structName }}(), es)
|
||||
|
||||
// Test ensure larger capacity
|
||||
const ensureLargeLen = 9
|
||||
es.EnsureCapacity(ensureLargeLen)
|
||||
assert.Less(t, generateTest${structName}().Len(), ensureLargeLen)
|
||||
assert.Less(t, generateTest{{ .structName }}().Len(), ensureLargeLen)
|
||||
assert.Equal(t, ensureLargeLen, cap(*es.orig))
|
||||
assert.Equal(t, generateTest${structName}(), es)
|
||||
assert.Equal(t, generateTest{{ .structName }}(), es)
|
||||
}
|
||||
|
||||
func Test${structName}_MoveAndAppendTo(t *testing.T) {
|
||||
func Test{{ .structName }}_MoveAndAppendTo(t *testing.T) {
|
||||
// Test MoveAndAppendTo to empty
|
||||
expectedSlice := generateTest${structName}()
|
||||
dest := New${structName}()
|
||||
src := generateTest${structName}()
|
||||
expectedSlice := generateTest{{ .structName }}()
|
||||
dest := New{{ .structName }}()
|
||||
src := generateTest{{ .structName }}()
|
||||
src.MoveAndAppendTo(dest)
|
||||
assert.Equal(t, generateTest${structName}(), dest)
|
||||
assert.Equal(t, generateTest{{ .structName }}(), dest)
|
||||
assert.Equal(t, 0, src.Len())
|
||||
assert.Equal(t, expectedSlice.Len(), dest.Len())
|
||||
|
||||
// Test MoveAndAppendTo empty slice
|
||||
src.MoveAndAppendTo(dest)
|
||||
assert.Equal(t, generateTest${structName}(), dest)
|
||||
assert.Equal(t, generateTest{{ .structName }}(), dest)
|
||||
assert.Equal(t, 0, src.Len())
|
||||
assert.Equal(t, expectedSlice.Len(), dest.Len())
|
||||
|
||||
// Test MoveAndAppendTo not empty slice
|
||||
generateTest${structName}().MoveAndAppendTo(dest)
|
||||
generateTest{{ .structName }}().MoveAndAppendTo(dest)
|
||||
assert.Equal(t, 2*expectedSlice.Len(), dest.Len())
|
||||
for i := 0; i < expectedSlice.Len(); i++ {
|
||||
assert.Equal(t, expectedSlice.At(i), dest.At(i))
|
||||
|
|
@ -195,94 +236,53 @@ func Test${structName}_MoveAndAppendTo(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func Test${structName}_RemoveIf(t *testing.T) {
|
||||
func Test{{ .structName }}_RemoveIf(t *testing.T) {
|
||||
// Test RemoveIf on empty slice
|
||||
emptySlice := New${structName}()
|
||||
emptySlice.RemoveIf(func(el ${elementName}) bool {
|
||||
emptySlice := New{{ .structName }}()
|
||||
emptySlice.RemoveIf(func(el {{ .elementName }}) bool {
|
||||
t.Fail()
|
||||
return false
|
||||
})
|
||||
|
||||
// Test RemoveIf
|
||||
filtered := generateTest${structName}()
|
||||
filtered := generateTest{{ .structName }}()
|
||||
pos := 0
|
||||
filtered.RemoveIf(func(el ${elementName}) bool {
|
||||
filtered.RemoveIf(func(el {{ .elementName }}) bool {
|
||||
pos++
|
||||
return pos%3 == 0
|
||||
})
|
||||
assert.Equal(t, 5, filtered.Len())
|
||||
}`
|
||||
|
||||
const slicePtrTemplate = `// CopyTo copies all elements from the current slice overriding the destination.
|
||||
func (es ${structName}) CopyTo(dest ${structName}) {
|
||||
srcLen := es.Len()
|
||||
destCap := cap(*dest.orig)
|
||||
if srcLen <= destCap {
|
||||
(*dest.orig) = (*dest.orig)[:srcLen:destCap]
|
||||
for i := range *es.orig {
|
||||
new${elementName}((*es.orig)[i]).CopyTo(new${elementName}((*dest.orig)[i]))
|
||||
}
|
||||
return
|
||||
}
|
||||
origs := make([]${originName}, srcLen)
|
||||
wrappers := make([]*${originName}, srcLen)
|
||||
for i := range *es.orig {
|
||||
wrappers[i] = &origs[i]
|
||||
new${elementName}((*es.orig)[i]).CopyTo(new${elementName}(wrappers[i]))
|
||||
}
|
||||
*dest.orig = wrappers
|
||||
}
|
||||
|
||||
// Sort sorts the ${elementName} elements within ${structName} given the
|
||||
// provided less function so that two instances of ${structName}
|
||||
// can be compared.
|
||||
func (es ${structName}) Sort(less func(a, b ${elementName}) bool) {
|
||||
sort.SliceStable(*es.orig, func(i, j int) bool { return less(es.At(i), es.At(j)) })
|
||||
}`
|
||||
|
||||
// TODO: Use assert.Less once https://github.com/stretchr/testify/pull/1339 is merged.
|
||||
const slicePtrTestTemplate = `func Test${structName}_Sort(t *testing.T) {
|
||||
es := generateTest${structName}()
|
||||
es.Sort(func(a, b ${elementName}) bool {
|
||||
{{ if eq .type "sliceOfPtrs" -}}
|
||||
func Test{{ .structName }}_Sort(t *testing.T) {
|
||||
es := generateTest{{ .structName }}()
|
||||
es.Sort(func(a, b {{ .elementName }}) bool {
|
||||
return uintptr(unsafe.Pointer(a.orig)) < uintptr(unsafe.Pointer(b.orig))
|
||||
})
|
||||
for i := 1; i < es.Len(); i++ {
|
||||
assert.True(t, uintptr(unsafe.Pointer(es.At(i-1).orig)) < uintptr(unsafe.Pointer(es.At(i).orig)))
|
||||
}
|
||||
es.Sort(func(a, b ${elementName}) bool {
|
||||
es.Sort(func(a, b {{ .elementName }}) bool {
|
||||
return uintptr(unsafe.Pointer(a.orig)) > uintptr(unsafe.Pointer(b.orig))
|
||||
})
|
||||
for i := 1; i < es.Len(); i++ {
|
||||
assert.True(t, uintptr(unsafe.Pointer(es.At(i-1).orig)) > uintptr(unsafe.Pointer(es.At(i).orig)))
|
||||
}
|
||||
}`
|
||||
}
|
||||
{{- end }}`
|
||||
|
||||
const sliceValueTemplate = `// CopyTo copies all elements from the current slice overriding the destination.
|
||||
func (es ${structName}) CopyTo(dest ${structName}) {
|
||||
srcLen := es.Len()
|
||||
destCap := cap(*dest.orig)
|
||||
if srcLen <= destCap {
|
||||
(*dest.orig) = (*dest.orig)[:srcLen:destCap]
|
||||
} else {
|
||||
(*dest.orig) = make([]${originName}, srcLen)
|
||||
}
|
||||
|
||||
for i := range *es.orig {
|
||||
new${elementName}(&(*es.orig)[i]).CopyTo(new${elementName}(&(*dest.orig)[i]))
|
||||
}
|
||||
}`
|
||||
|
||||
const commonSliceGenerateTest = `func generateTest${structName}() ${structName} {
|
||||
es := New${structName}()
|
||||
fillTest${structName}(es)
|
||||
const sliceGenerateTest = `func generateTest{{ .structName }}() {{ .structName }} {
|
||||
es := New{{ .structName }}()
|
||||
fillTest{{ .structName }}(es)
|
||||
return es
|
||||
}
|
||||
|
||||
func fillTest${structName}(es ${structName}) {
|
||||
*es.orig = make([]${originElementType}, 7)
|
||||
func fillTest{{ .structName }}(es {{ .structName }}) {
|
||||
*es.orig = make([]{{ .originElementType }}, 7)
|
||||
for i := 0; i < 7; i++ {
|
||||
(*es.orig)[i] = ${emptyOriginElement}
|
||||
fillTest${elementName}(${newElement})
|
||||
(*es.orig)[i] = {{ .emptyOriginElement }}
|
||||
fillTest{{ .elementName }}({{ .newElement }})
|
||||
}
|
||||
}`
|
||||
|
||||
|
|
@ -307,37 +307,35 @@ func (ss *sliceOfPtrs) getPackageName() string {
|
|||
}
|
||||
|
||||
func (ss *sliceOfPtrs) generateStruct(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(commonSliceTemplate, ss.templateFields()) + newLine + newLine)
|
||||
sb.WriteString(os.Expand(slicePtrTemplate, ss.templateFields()))
|
||||
t := template.Must(template.New("sliceTemplate").Parse(sliceTemplate))
|
||||
if err := t.Execute(sb, ss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ss *sliceOfPtrs) generateTests(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(commonSliceTestTemplate, ss.templateFields()) + newLine + newLine)
|
||||
sb.WriteString(os.Expand(slicePtrTestTemplate, ss.templateFields()))
|
||||
t := template.Must(template.New("sliceTestTemplate").Parse(sliceTestTemplate))
|
||||
if err := t.Execute(sb, ss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ss *sliceOfPtrs) generateTestValueHelpers(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(commonSliceGenerateTest, ss.templateFields()))
|
||||
t := template.Must(template.New("sliceGenerateTest").Parse(sliceGenerateTest))
|
||||
if err := t.Execute(sb, ss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ss *sliceOfPtrs) templateFields() func(name string) string {
|
||||
return func(name string) string {
|
||||
switch name {
|
||||
case "structName":
|
||||
return ss.structName
|
||||
case "elementName":
|
||||
return ss.element.structName
|
||||
case "originName":
|
||||
return ss.element.originFullName
|
||||
case "originElementType":
|
||||
return "*" + ss.element.originFullName
|
||||
case "emptyOriginElement":
|
||||
return "&" + ss.element.originFullName + "{}"
|
||||
case "newElement":
|
||||
return "new" + ss.element.structName + "((*es.orig)[i])"
|
||||
default:
|
||||
panic(name)
|
||||
}
|
||||
func (ss *sliceOfPtrs) templateFields() map[string]any {
|
||||
return map[string]any{
|
||||
"type": "sliceOfPtrs",
|
||||
"structName": ss.structName,
|
||||
"elementName": ss.element.structName,
|
||||
"originName": ss.element.originFullName,
|
||||
"originElementType": "*" + ss.element.originFullName,
|
||||
"emptyOriginElement": "&" + ss.element.originFullName + "{}",
|
||||
"newElement": "new" + ss.element.structName + "((*es.orig)[i])",
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -361,36 +359,35 @@ func (ss *sliceOfValues) getPackageName() string {
|
|||
}
|
||||
|
||||
func (ss *sliceOfValues) generateStruct(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(commonSliceTemplate, ss.templateFields()) + newLine + newLine)
|
||||
sb.WriteString(os.Expand(sliceValueTemplate, ss.templateFields()))
|
||||
t := template.Must(template.New("sliceTemplate").Parse(sliceTemplate))
|
||||
if err := t.Execute(sb, ss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ss *sliceOfValues) generateTests(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(commonSliceTestTemplate, ss.templateFields()))
|
||||
t := template.Must(template.New("sliceTestTemplate").Parse(sliceTestTemplate))
|
||||
if err := t.Execute(sb, ss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ss *sliceOfValues) generateTestValueHelpers(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(commonSliceGenerateTest, ss.templateFields()))
|
||||
t := template.Must(template.New("sliceGenerateTest").Parse(sliceGenerateTest))
|
||||
if err := t.Execute(sb, ss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ss *sliceOfValues) templateFields() func(name string) string {
|
||||
return func(name string) string {
|
||||
switch name {
|
||||
case "structName":
|
||||
return ss.structName
|
||||
case "elementName":
|
||||
return ss.element.structName
|
||||
case "originName":
|
||||
return ss.element.originFullName
|
||||
case "originElementType":
|
||||
return ss.element.originFullName
|
||||
case "emptyOriginElement":
|
||||
return ss.element.originFullName + "{}"
|
||||
case "newElement":
|
||||
return "new" + ss.element.structName + "(&(*es.orig)[i])"
|
||||
default:
|
||||
panic(name)
|
||||
}
|
||||
func (ss *sliceOfValues) templateFields() map[string]any {
|
||||
return map[string]any{
|
||||
"type": "sliceOfValues",
|
||||
"structName": ss.structName,
|
||||
"elementName": ss.element.structName,
|
||||
"originName": ss.element.originFullName,
|
||||
"originElementType": ss.element.originFullName,
|
||||
"emptyOriginElement": ss.element.originFullName + "{}",
|
||||
"newElement": "new" + ss.element.structName + "(&(*es.orig)[i])",
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,93 +16,116 @@ package internal // import "go.opentelemetry.io/collector/pdata/internal/cmd/pda
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const messageValueTemplate = `${description}
|
||||
const messageValueTemplate = `{{ .description }}
|
||||
//
|
||||
// This is a reference type, if passed by value and callee modifies it the
|
||||
// caller will see the modification.
|
||||
//
|
||||
// Must use New${structName} function to create new instances.
|
||||
// Must use New{{ .structName }} function to create new instances.
|
||||
// Important: zero-initialized instance is not valid for use.
|
||||
${typeDeclaration}
|
||||
{{- if .isCommon }}
|
||||
type {{ .structName }} internal.{{ .structName }}
|
||||
{{- else }}
|
||||
type {{ .structName }} struct {
|
||||
orig *{{ .originName }}
|
||||
}
|
||||
{{- end }}
|
||||
|
||||
func new${structName}(orig *${originName}) ${structName} {
|
||||
return ${newFuncValue}
|
||||
func new{{ .structName }}(orig *{{ .originName }}) {{ .structName }} {
|
||||
{{- if .isCommon }}
|
||||
return {{ .structName }}(internal.New{{ .structName }}(orig))
|
||||
{{- else }}
|
||||
return {{ .structName }}{orig}
|
||||
{{- end }}
|
||||
}
|
||||
|
||||
// New${structName} creates a new empty ${structName}.
|
||||
// New{{ .structName }} creates a new empty {{ .structName }}.
|
||||
//
|
||||
// This must be used only in testing code. Users should use "AppendEmpty" when part of a Slice,
|
||||
// OR directly access the member if this is embedded in another struct.
|
||||
func New${structName}() ${structName} {
|
||||
return new${structName}(&${originName}{})
|
||||
func New{{ .structName }}() {{ .structName }} {
|
||||
return new{{ .structName }}(&{{ .originName }}{})
|
||||
}
|
||||
|
||||
// MoveTo moves all properties from the current struct overriding the destination and
|
||||
// resetting the current instance to its zero value
|
||||
func (ms ${structName}) MoveTo(dest ${structName}) {
|
||||
*dest.${origAccessor} = *ms.${origAccessor}
|
||||
*ms.${origAccessor} = ${originName}{}
|
||||
}`
|
||||
|
||||
const messageValueGetOrigTemplate = `func (ms ${structName}) getOrig() *${originName} {
|
||||
return internal.GetOrig${structName}(internal.${structName}(ms))
|
||||
}`
|
||||
|
||||
const messageValueCopyToHeaderTemplate = `// CopyTo copies all properties from the current struct overriding the destination.
|
||||
func (ms ${structName}) CopyTo(dest ${structName}) {`
|
||||
|
||||
const messageValueCopyToFooterTemplate = `}`
|
||||
|
||||
const messageValueTestTemplate = `
|
||||
func Test${structName}_MoveTo(t *testing.T) {
|
||||
ms := ${generateTestData}
|
||||
dest := New${structName}()
|
||||
ms.MoveTo(dest)
|
||||
assert.Equal(t, New${structName}(), ms)
|
||||
assert.Equal(t, ${generateTestData}, dest)
|
||||
func (ms {{ .structName }}) MoveTo(dest {{ .structName }}) {
|
||||
*dest.{{ .origAccessor }} = *ms.{{ .origAccessor }}
|
||||
*ms.{{ .origAccessor }} = {{ .originName }}{}
|
||||
}
|
||||
|
||||
func Test${structName}_CopyTo(t *testing.T) {
|
||||
ms := New${structName}()
|
||||
orig := New${structName}()
|
||||
orig.CopyTo(ms)
|
||||
assert.Equal(t, orig, ms)
|
||||
orig = ${generateTestData}
|
||||
orig.CopyTo(ms)
|
||||
assert.Equal(t, orig, ms)
|
||||
{{ if .isCommon -}}
|
||||
func (ms {{ .structName }}) getOrig() *{{ .originName }} {
|
||||
return internal.GetOrig{{ .structName }}(internal.{{ .structName }}(ms))
|
||||
}
|
||||
{{- end }}
|
||||
|
||||
{{ range .fields -}}
|
||||
{{ .GenerateAccessors $.messageStruct }}
|
||||
{{ end }}
|
||||
|
||||
// CopyTo copies all properties from the current struct overriding the destination.
|
||||
func (ms {{ .structName }}) CopyTo(dest {{ .structName }}) {
|
||||
{{- range .fields }}
|
||||
{{ .GenerateCopyToValue $.messageStruct }}
|
||||
{{- end }}
|
||||
}`
|
||||
|
||||
const messageValueGenerateTestTemplate = `func generateTest${structName}() ${structName} {
|
||||
tv := New${structName}()
|
||||
fillTest${structName}(tv)
|
||||
return tv
|
||||
}`
|
||||
const messageValueTestTemplate = `
|
||||
func Test{{ .structName }}_MoveTo(t *testing.T) {
|
||||
ms := {{ .generateTestData }}
|
||||
dest := New{{ .structName }}()
|
||||
ms.MoveTo(dest)
|
||||
assert.Equal(t, New{{ .structName }}(), ms)
|
||||
assert.Equal(t, {{ .generateTestData }}, dest)
|
||||
}
|
||||
|
||||
const messageValueGenerateTestTemplateCommon = `func GenerateTest${structName}() ${structName} {
|
||||
orig := ${originName}{}
|
||||
tv := New${structName}(&orig)
|
||||
FillTest${structName}(tv)
|
||||
func Test{{ .structName }}_CopyTo(t *testing.T) {
|
||||
ms := New{{ .structName }}()
|
||||
orig := New{{ .structName }}()
|
||||
orig.CopyTo(ms)
|
||||
assert.Equal(t, orig, ms)
|
||||
orig = {{ .generateTestData }}
|
||||
orig.CopyTo(ms)
|
||||
assert.Equal(t, orig, ms)
|
||||
}
|
||||
|
||||
{{ range .fields }}
|
||||
{{ .GenerateAccessorsTest $.messageStruct }}
|
||||
{{ end }}`
|
||||
|
||||
const messageValueGenerateTestTemplate = `func {{ upperIfInternal "g" }}enerateTest{{ .structName }}() {{ .structName }} {
|
||||
{{- if .isCommon }}
|
||||
orig := {{ .originName }}{}
|
||||
{{- end }}
|
||||
tv := New{{ .structName }}({{ if .isCommon }}&orig{{ end }})
|
||||
{{ upperIfInternal "f" }}illTest{{ .structName }}(tv)
|
||||
return tv
|
||||
}
|
||||
|
||||
func {{ upperIfInternal "f" }}illTest{{ .structName }}(tv {{ .structName }}) {
|
||||
{{- range .fields }}
|
||||
{{ .GenerateSetWithTestValue $.messageStruct }}
|
||||
{{- end }}
|
||||
}`
|
||||
|
||||
const messageValueAliasTemplate = `
|
||||
type ${structName} struct {
|
||||
orig *${originName}
|
||||
type {{ .structName }} struct {
|
||||
orig *{{ .originName }}
|
||||
}
|
||||
|
||||
func GetOrig${structName}(ms ${structName}) *${originName} {
|
||||
func GetOrig{{ .structName }}(ms {{ .structName }}) *{{ .originName }} {
|
||||
return ms.orig
|
||||
}
|
||||
|
||||
func New${structName}(orig *${originName}) ${structName} {
|
||||
return ${structName}{orig: orig}
|
||||
func New{{ .structName }}(orig *{{ .originName }}) {{ .structName }} {
|
||||
return {{ .structName }}{orig: orig}
|
||||
}`
|
||||
|
||||
const newLine = "\n"
|
||||
|
||||
type baseStruct interface {
|
||||
getName() string
|
||||
getPackageName() string
|
||||
|
|
@ -131,96 +154,56 @@ func (ms *messageValueStruct) getPackageName() string {
|
|||
}
|
||||
|
||||
func (ms *messageValueStruct) generateStruct(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(messageValueTemplate, ms.templateFields()))
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
sb.WriteString(newLine + newLine)
|
||||
sb.WriteString(os.Expand(messageValueGetOrigTemplate, ms.templateFields()))
|
||||
t := template.Must(template.New("messageValueTemplate").Parse(messageValueTemplate))
|
||||
if err := t.Execute(sb, ms.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Write accessors for the struct
|
||||
for _, f := range ms.fields {
|
||||
sb.WriteString(newLine + newLine)
|
||||
f.generateAccessors(ms, sb)
|
||||
}
|
||||
sb.WriteString(newLine + newLine)
|
||||
sb.WriteString(os.Expand(messageValueCopyToHeaderTemplate, ms.templateFields()))
|
||||
|
||||
// Write accessors CopyTo for the struct
|
||||
for _, f := range ms.fields {
|
||||
sb.WriteString(newLine)
|
||||
f.generateCopyToValue(ms, sb)
|
||||
}
|
||||
sb.WriteString(newLine)
|
||||
sb.WriteString(messageValueCopyToFooterTemplate)
|
||||
}
|
||||
|
||||
func (ms *messageValueStruct) generateTests(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(messageValueTestTemplate, ms.templateFields()))
|
||||
|
||||
// Write accessors tests for the struct
|
||||
for _, f := range ms.fields {
|
||||
sb.WriteString(newLine + newLine)
|
||||
f.generateAccessorsTest(ms, sb)
|
||||
t := template.Must(template.New("messageValueTestTemplate").Parse(messageValueTestTemplate))
|
||||
if err := t.Execute(sb, ms.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ms *messageValueStruct) generateTestValueHelpers(sb *bytes.Buffer) {
|
||||
// Write generateTest func for the struct
|
||||
template := messageValueGenerateTestTemplate
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
template = messageValueGenerateTestTemplateCommon
|
||||
funcs := template.FuncMap{
|
||||
"upperIfInternal": func(in string) string {
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
return strings.ToUpper(in)
|
||||
}
|
||||
return in
|
||||
},
|
||||
}
|
||||
sb.WriteString(os.Expand(template, ms.templateFields()))
|
||||
|
||||
// Write fillTest func for the struct
|
||||
sb.WriteString(newLine + newLine + "func ")
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
sb.WriteString("FillTest")
|
||||
} else {
|
||||
sb.WriteString("fillTest")
|
||||
t := template.Must(template.New("messageValueGenerateTestTemplate").Funcs(funcs).Parse(messageValueGenerateTestTemplate))
|
||||
if err := t.Execute(sb, ms.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
sb.WriteString(ms.structName + "(tv " + ms.structName + ") {")
|
||||
for _, f := range ms.fields {
|
||||
sb.WriteString(newLine)
|
||||
f.generateSetWithTestValue(ms, sb)
|
||||
}
|
||||
sb.WriteString(newLine + "}" + newLine)
|
||||
}
|
||||
|
||||
func (ms *messageValueStruct) generateInternal(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(messageValueAliasTemplate, ms.templateFields()))
|
||||
sb.WriteString(newLine + newLine)
|
||||
t := template.Must(template.New("messageValueAliasTemplate").Parse(messageValueAliasTemplate))
|
||||
if err := t.Execute(sb, ms.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ms *messageValueStruct) templateFields() func(name string) string {
|
||||
return func(name string) string {
|
||||
switch name {
|
||||
case "structName":
|
||||
return ms.structName
|
||||
case "originName":
|
||||
return ms.originFullName
|
||||
case "generateTestData":
|
||||
func (ms *messageValueStruct) templateFields() map[string]any {
|
||||
return map[string]any{
|
||||
"messageStruct": ms,
|
||||
"fields": ms.fields,
|
||||
"structName": ms.structName,
|
||||
"originName": ms.originFullName,
|
||||
"generateTestData": func() string {
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
return ms.structName + "(internal.GenerateTest" + ms.structName + "())"
|
||||
}
|
||||
return "generateTest" + ms.structName + "()"
|
||||
case "description":
|
||||
return ms.description
|
||||
case "typeDeclaration":
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
return "type " + ms.structName + " internal." + ms.structName
|
||||
}
|
||||
return "type " + ms.structName + " struct {\n\torig *" + ms.originFullName + "\n}"
|
||||
case "newFuncValue":
|
||||
if usedByOtherDataTypes(ms.packageName) {
|
||||
return ms.structName + "(internal.New" + ms.structName + "(orig))"
|
||||
}
|
||||
return ms.structName + "{orig}"
|
||||
case "origAccessor":
|
||||
return origAccessor(ms)
|
||||
default:
|
||||
panic(name)
|
||||
}
|
||||
}(),
|
||||
"description": ms.description,
|
||||
"isCommon": usedByOtherDataTypes(ms.packageName),
|
||||
"origAccessor": origAccessor(ms),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@ type Package struct {
|
|||
structs []baseStruct
|
||||
}
|
||||
|
||||
const newLine = "\n"
|
||||
|
||||
// GenerateFiles generates files with the configured data structures for this Package.
|
||||
func (p *Package) GenerateFiles() error {
|
||||
for _, s := range p.structs {
|
||||
|
|
|
|||
|
|
@ -16,136 +16,136 @@ package internal // import "go.opentelemetry.io/collector/pdata/internal/cmd/pda
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const primitiveSliceTemplate = `// ${structName} represents a []${itemType} slice.
|
||||
// The instance of ${structName} can be assigned to multiple objects since it's immutable.
|
||||
const primitiveSliceTemplate = `// {{ .structName }} represents a []{{ .itemType }} slice.
|
||||
// The instance of {{ .structName }} can be assigned to multiple objects since it's immutable.
|
||||
//
|
||||
// Must use New${structName} function to create new instances.
|
||||
// Must use New{{ .structName }} function to create new instances.
|
||||
// Important: zero-initialized instance is not valid for use.
|
||||
type ${structName} internal.${structName}
|
||||
type {{ .structName }} internal.{{ .structName }}
|
||||
|
||||
func (ms ${structName}) getOrig() *[]${itemType} {
|
||||
return internal.GetOrig${structName}(internal.${structName}(ms))
|
||||
func (ms {{ .structName }}) getOrig() *[]{{ .itemType }} {
|
||||
return internal.GetOrig{{ .structName }}(internal.{{ .structName }}(ms))
|
||||
}
|
||||
|
||||
// New${structName} creates a new empty ${structName}.
|
||||
func New${structName}() ${structName} {
|
||||
orig := []${itemType}(nil)
|
||||
return ${structName}(internal.New${structName}(&orig))
|
||||
// New{{ .structName }} creates a new empty {{ .structName }}.
|
||||
func New{{ .structName }}() {{ .structName }} {
|
||||
orig := []{{ .itemType }}(nil)
|
||||
return {{ .structName }}(internal.New{{ .structName }}(&orig))
|
||||
}
|
||||
|
||||
// AsRaw returns a copy of the []${itemType} slice.
|
||||
func (ms ${structName}) AsRaw() []${itemType} {
|
||||
return copy${structName}(nil, *ms.getOrig())
|
||||
// AsRaw returns a copy of the []{{ .itemType }} slice.
|
||||
func (ms {{ .structName }}) AsRaw() []{{ .itemType }} {
|
||||
return copy{{ .structName }}(nil, *ms.getOrig())
|
||||
}
|
||||
|
||||
// FromRaw copies raw []${itemType} into the slice ${structName}.
|
||||
func (ms ${structName}) FromRaw(val []${itemType}) {
|
||||
*ms.getOrig() = copy${structName}(*ms.getOrig(), val)
|
||||
// FromRaw copies raw []{{ .itemType }} into the slice {{ .structName }}.
|
||||
func (ms {{ .structName }}) FromRaw(val []{{ .itemType }}) {
|
||||
*ms.getOrig() = copy{{ .structName }}(*ms.getOrig(), val)
|
||||
}
|
||||
|
||||
// Len returns length of the []${itemType} slice value.
|
||||
// Equivalent of len(${lowerStructName}).
|
||||
func (ms ${structName}) Len() int {
|
||||
// Len returns length of the []{{ .itemType }} slice value.
|
||||
// Equivalent of len({{ .lowerStructName }}).
|
||||
func (ms {{ .structName }}) Len() int {
|
||||
return len(*ms.getOrig())
|
||||
}
|
||||
|
||||
// At returns an item from particular index.
|
||||
// Equivalent of ${lowerStructName}[i].
|
||||
func (ms ${structName}) At(i int) ${itemType} {
|
||||
// Equivalent of {{ .lowerStructName }}[i].
|
||||
func (ms {{ .structName }}) At(i int) {{ .itemType }} {
|
||||
return (*ms.getOrig())[i]
|
||||
}
|
||||
|
||||
// SetAt sets ${itemType} item at particular index.
|
||||
// Equivalent of ${lowerStructName}[i] = val
|
||||
func (ms ${structName}) SetAt(i int, val ${itemType}) {
|
||||
// SetAt sets {{ .itemType }} item at particular index.
|
||||
// Equivalent of {{ .lowerStructName }}[i] = val
|
||||
func (ms {{ .structName }}) SetAt(i int, val {{ .itemType }}) {
|
||||
(*ms.getOrig())[i] = val
|
||||
}
|
||||
|
||||
// EnsureCapacity ensures ${structName} has at least the specified capacity.
|
||||
// EnsureCapacity ensures {{ .structName }} has at least the specified capacity.
|
||||
// 1. If the newCap <= cap, then is no change in capacity.
|
||||
// 2. If the newCap > cap, then the slice capacity will be expanded to the provided value which will be equivalent of:
|
||||
// buf := make([]${itemType}, len(${lowerStructName}), newCap)
|
||||
// copy(buf, ${lowerStructName})
|
||||
// ${lowerStructName} = buf
|
||||
func (ms ${structName}) EnsureCapacity(newCap int) {
|
||||
// buf := make([]{{ .itemType }}, len({{ .lowerStructName }}), newCap)
|
||||
// copy(buf, {{ .lowerStructName }})
|
||||
// {{ .lowerStructName }} = buf
|
||||
func (ms {{ .structName }}) EnsureCapacity(newCap int) {
|
||||
oldCap := cap(*ms.getOrig())
|
||||
if newCap <= oldCap {
|
||||
return
|
||||
}
|
||||
|
||||
newOrig := make([]${itemType}, len(*ms.getOrig()), newCap)
|
||||
newOrig := make([]{{ .itemType }}, len(*ms.getOrig()), newCap)
|
||||
copy(newOrig, *ms.getOrig())
|
||||
*ms.getOrig() = newOrig
|
||||
}
|
||||
|
||||
// Append appends extra elements to ${structName}.
|
||||
// Equivalent of ${lowerStructName} = append(${lowerStructName}, elms...)
|
||||
func (ms ${structName}) Append(elms ...${itemType}) {
|
||||
// Append appends extra elements to {{ .structName }}.
|
||||
// Equivalent of {{ .lowerStructName }} = append({{ .lowerStructName }}, elms...)
|
||||
func (ms {{ .structName }}) Append(elms ...{{ .itemType }}) {
|
||||
*ms.getOrig() = append(*ms.getOrig(), elms...)
|
||||
}
|
||||
|
||||
// MoveTo moves all elements from the current slice overriding the destination and
|
||||
// resetting the current instance to its zero value.
|
||||
func (ms ${structName}) MoveTo(dest ${structName}) {
|
||||
func (ms {{ .structName }}) MoveTo(dest {{ .structName }}) {
|
||||
*dest.getOrig() = *ms.getOrig()
|
||||
*ms.getOrig() = nil
|
||||
}
|
||||
|
||||
// CopyTo copies all elements from the current slice overriding the destination.
|
||||
func (ms ${structName}) CopyTo(dest ${structName}) {
|
||||
*dest.getOrig() = copy${structName}(*dest.getOrig(), *ms.getOrig())
|
||||
func (ms {{ .structName }}) CopyTo(dest {{ .structName }}) {
|
||||
*dest.getOrig() = copy{{ .structName }}(*dest.getOrig(), *ms.getOrig())
|
||||
}
|
||||
|
||||
func copy${structName}(dst, src []${itemType}) []${itemType} {
|
||||
func copy{{ .structName }}(dst, src []{{ .itemType }}) []{{ .itemType }} {
|
||||
dst = dst[:0]
|
||||
return append(dst, src...)
|
||||
}`
|
||||
|
||||
const immutableSliceTestTemplate = `func TestNew${structName}(t *testing.T) {
|
||||
ms := New${structName}()
|
||||
const immutableSliceTestTemplate = `func TestNew{{ .structName }}(t *testing.T) {
|
||||
ms := New{{ .structName }}()
|
||||
assert.Equal(t, 0, ms.Len())
|
||||
ms.FromRaw([]${itemType}{1, 2, 3})
|
||||
ms.FromRaw([]{{ .itemType }}{1, 2, 3})
|
||||
assert.Equal(t, 3, ms.Len())
|
||||
assert.Equal(t, []${itemType}{1, 2, 3}, ms.AsRaw())
|
||||
ms.SetAt(1, ${itemType}(5))
|
||||
assert.Equal(t, []${itemType}{1, 5, 3}, ms.AsRaw())
|
||||
ms.FromRaw([]${itemType}{3})
|
||||
assert.Equal(t, []{{ .itemType }}{1, 2, 3}, ms.AsRaw())
|
||||
ms.SetAt(1, {{ .itemType }}(5))
|
||||
assert.Equal(t, []{{ .itemType }}{1, 5, 3}, ms.AsRaw())
|
||||
ms.FromRaw([]{{ .itemType }}{3})
|
||||
assert.Equal(t, 1, ms.Len())
|
||||
assert.Equal(t, ${itemType}(3), ms.At(0))
|
||||
assert.Equal(t, {{ .itemType }}(3), ms.At(0))
|
||||
|
||||
cp := New${structName}()
|
||||
cp := New{{ .structName }}()
|
||||
ms.CopyTo(cp)
|
||||
ms.SetAt(0, ${itemType}(2))
|
||||
assert.Equal(t, ${itemType}(2), ms.At(0))
|
||||
assert.Equal(t, ${itemType}(3), cp.At(0))
|
||||
ms.SetAt(0, {{ .itemType }}(2))
|
||||
assert.Equal(t, {{ .itemType }}(2), ms.At(0))
|
||||
assert.Equal(t, {{ .itemType }}(3), cp.At(0))
|
||||
ms.CopyTo(cp)
|
||||
assert.Equal(t, ${itemType}(2), cp.At(0))
|
||||
assert.Equal(t, {{ .itemType }}(2), cp.At(0))
|
||||
|
||||
mv := New${structName}()
|
||||
mv := New{{ .structName }}()
|
||||
ms.MoveTo(mv)
|
||||
assert.Equal(t, 0, ms.Len())
|
||||
assert.Equal(t, 1, mv.Len())
|
||||
assert.Equal(t, ${itemType}(2), mv.At(0))
|
||||
ms.FromRaw([]${itemType}{1, 2, 3})
|
||||
assert.Equal(t, {{ .itemType }}(2), mv.At(0))
|
||||
ms.FromRaw([]{{ .itemType }}{1, 2, 3})
|
||||
ms.MoveTo(mv)
|
||||
assert.Equal(t, 3, mv.Len())
|
||||
assert.Equal(t, ${itemType}(1), mv.At(0))
|
||||
assert.Equal(t, {{ .itemType }}(1), mv.At(0))
|
||||
}
|
||||
|
||||
func Test${structName}Append(t *testing.T) {
|
||||
ms := New${structName}()
|
||||
ms.FromRaw([]${itemType}{1, 2, 3})
|
||||
func Test{{ .structName }}Append(t *testing.T) {
|
||||
ms := New{{ .structName }}()
|
||||
ms.FromRaw([]{{ .itemType }}{1, 2, 3})
|
||||
ms.Append(4, 5)
|
||||
assert.Equal(t, 5, ms.Len())
|
||||
assert.Equal(t, ${itemType}(5), ms.At(4))
|
||||
assert.Equal(t, {{ .itemType }}(5), ms.At(4))
|
||||
}
|
||||
|
||||
func Test${structName}EnsureCapacity(t *testing.T) {
|
||||
ms := New${structName}()
|
||||
func Test{{ .structName }}EnsureCapacity(t *testing.T) {
|
||||
ms := New{{ .structName }}()
|
||||
ms.EnsureCapacity(4)
|
||||
assert.Equal(t, 4, cap(*ms.getOrig()))
|
||||
ms.EnsureCapacity(2)
|
||||
|
|
@ -153,16 +153,16 @@ func Test${structName}EnsureCapacity(t *testing.T) {
|
|||
}`
|
||||
|
||||
const primitiveSliceInternalTemplate = `
|
||||
type ${structName} struct {
|
||||
orig *[]${itemType}
|
||||
type {{ .structName }} struct {
|
||||
orig *[]{{ .itemType }}
|
||||
}
|
||||
|
||||
func GetOrig${structName}(ms ${structName}) *[]${itemType} {
|
||||
func GetOrig{{ .structName }}(ms {{ .structName }}) *[]{{ .itemType }} {
|
||||
return ms.orig
|
||||
}
|
||||
|
||||
func New${structName}(orig *[]${itemType}) ${structName} {
|
||||
return ${structName}{orig: orig}
|
||||
func New{{ .structName }}(orig *[]{{ .itemType }}) {{ .structName }} {
|
||||
return {{ .structName }}{orig: orig}
|
||||
}`
|
||||
|
||||
// primitiveSliceStruct generates a struct for a slice of primitive value elements. The structs are always generated
|
||||
|
|
@ -182,44 +182,32 @@ func (iss *primitiveSliceStruct) getPackageName() string {
|
|||
}
|
||||
|
||||
func (iss *primitiveSliceStruct) generateStruct(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(primitiveSliceTemplate, func(name string) string {
|
||||
switch name {
|
||||
case "structName":
|
||||
return iss.structName
|
||||
case "lowerStructName":
|
||||
return strings.ToLower(iss.structName[:1]) + iss.structName[1:]
|
||||
case "itemType":
|
||||
return iss.itemType
|
||||
default:
|
||||
panic(name)
|
||||
}
|
||||
}))
|
||||
t := template.Must(template.New("primitiveSliceTemplate").Parse(primitiveSliceTemplate))
|
||||
if err := t.Execute(sb, iss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (iss *primitiveSliceStruct) generateTests(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(immutableSliceTestTemplate, func(name string) string {
|
||||
switch name {
|
||||
case "structName":
|
||||
return iss.structName
|
||||
case "itemType":
|
||||
return iss.itemType
|
||||
default:
|
||||
panic(name)
|
||||
}
|
||||
}))
|
||||
t := template.Must(template.New("immutableSliceTestTemplate").Parse(immutableSliceTestTemplate))
|
||||
if err := t.Execute(sb, iss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (iss *primitiveSliceStruct) generateTestValueHelpers(*bytes.Buffer) {}
|
||||
|
||||
func (iss *primitiveSliceStruct) generateInternal(sb *bytes.Buffer) {
|
||||
sb.WriteString(os.Expand(primitiveSliceInternalTemplate, func(name string) string {
|
||||
switch name {
|
||||
case "structName":
|
||||
return iss.structName
|
||||
case "itemType":
|
||||
return iss.itemType
|
||||
default:
|
||||
panic(name)
|
||||
}
|
||||
}))
|
||||
t := template.Must(template.New("primitiveSliceInternalTemplate").Parse(primitiveSliceInternalTemplate))
|
||||
if err := t.Execute(sb, iss.templateFields()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (iss *primitiveSliceStruct) templateFields() map[string]any {
|
||||
return map[string]any{
|
||||
"structName": iss.structName,
|
||||
"itemType": iss.itemType,
|
||||
"lowerStructName": strings.ToLower(iss.structName[:1]) + iss.structName[1:],
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,7 +133,6 @@ func (es ExemplarSlice) CopyTo(dest ExemplarSlice) {
|
|||
} else {
|
||||
(*dest.orig) = make([]otlpmetrics.Exemplar, srcLen)
|
||||
}
|
||||
|
||||
for i := range *es.orig {
|
||||
newExemplar(&(*es.orig)[i]).CopyTo(newExemplar(&(*dest.orig)[i]))
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue