| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package spec |
| |
| // Most of these are top-level functions, not methods, because their first |
| // argument is not a Vec. |
| |
| // BroadcastZ returns a vector with the input x assigned to all elements of the |
| // result. |
| // |
| //specgen:name Broadcast{z} |
| func BroadcastZ[E Elt, W Width](x E) (z Vec[E, W]) { |
| z = makeVec[E, W]() |
| for i := range z { |
| z[i] = x |
| } |
| return z |
| } |
| |
| // LoadZ loads a slice into a vector. If len(s) is less than the number of |
| // elements in the vector, it panics. |
| // |
| //specgen:name Load{z} |
| func LoadZ[E Elt, W Width](s []E) (z Vec[E, W]) { |
| z = makeVec[E, W]() |
| _ = s[:z.len()] |
| copy(z, s) |
| return z |
| } |
| |
| // LoadZArray loads an array into a vector. |
| // |
| //specgen:name Load{z}Array |
| func LoadZArray[E Elt, W FixedWidth](x *Array[E, W]) (z Vec[E, W]) { |
| z = makeVec[E, W]() |
| if len(*x) != z.len() { |
| panic("bad array size") |
| } |
| copy(z, *x) |
| return z |
| } |
| |
| // LoadZPart loads a slice into a vector and returns the vector and the number |
| // of elements loaded from s. If len(s) is less than the number of elements in |
| // the vector, the remaining vector elements will be zero-filled. |
| // |
| //specgen:name Load{z}Part |
| func LoadZPart[E Elt, W Width](s []E) (z Vec[E, W], n int) { |
| z = makeVec[E, W]() |
| n = copy(z, s) |
| return z, n |
| } |
| |
| // Store stores the elements of x into a slice. If len(s) is less than x.Len(), |
| // it panics. |
| func Store[E Elt, W Width](x Vec[E, W], s []E) { |
| _ = s[:x.len()] |
| copy(s, x) |
| } |
| |
| // StoreArray stores the elements of x to an array. |
| func StoreArray[E Elt, W FixedWidth](x Vec[E, W], y *Array[E, W]) { |
| if x.len() != len(*y) { |
| panic("bad array size") |
| } |
| copy(*y, x) |
| } |
| |
| // StoreArrayMasked stores the masked elements of x to an array. It does not |
| // modify elements of y that are false in the mask. |
| // |
| //specgen:require maskN=xN |
| func StoreArrayMasked[E Elt, W FixedWidth, mE MaskElt](x Vec[E, W], y *Array[E, W], mask Vec[mE, W]) { |
| for i, elt := range x { |
| if mask[i] != 0 { |
| (*y)[i] = elt |
| } |
| } |
| } |
| |
| // StorePart stores at most len(s) elements of x into s and returns the number |
| // of elements stored. |
| func StorePart[E Elt, W Width](x Vec[E, W], s []E) int { |
| return copy(s, x) |
| } |