input/elasticapm/internal/modeldecoder/modeldecoderutil/slice.go (22 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package modeldecoderutil import ( "slices" ) // Reslice returns a slice with length n. It will reallocate the // slice if the capacity is not enough. func Reslice[Slice ~[]model, model any](slice Slice, n int) Slice { if n > cap(slice) { slice = slices.Grow(slice, n-len(slice)) } return slice[:n] } // ResliceAndPopulateNil ensures a slice of pointers has atleast // capacity for n elements and populates any non-nil elements // in the resulting slice with the value returned from newFn. func ResliceAndPopulateNil[Slice ~[]*model, model any](slice Slice, n int, newFn func() *model) Slice { slice = Reslice(slice, n) if newFn != nil { for i := 0; i < len(slice); i++ { if slice[i] == nil { slice[i] = newFn() } } } return slice } // NewType returns a new instance of the model type. func NewType[model any]() *model { return new(model) }