(sctx *super.Context, elems []ListElem, in []vector.Any)
| 47 | } |
| 48 | |
| 49 | func buildList(sctx *super.Context, elems []ListElem, in []vector.Any) ([]uint32, vector.Any) { |
| 50 | n := in[0].Len() |
| 51 | var spreadOffs [][]uint32 |
| 52 | unionTags := make([][]uint32, len(elems)) |
| 53 | var viewIndexes [][]uint32 |
| 54 | var vecs []vector.Any |
| 55 | var vecTags []uint32 |
| 56 | for i, elem := range elems { |
| 57 | vec := in[i] |
| 58 | var offsets, index []uint32 |
| 59 | if elem.Spread != nil { |
| 60 | vec, offsets, index = unwrapSpread(in[i]) |
| 61 | if vec == nil { |
| 62 | // drop unspreadable elements. |
| 63 | continue |
| 64 | } |
| 65 | } |
| 66 | vecTags = append(vecTags, uint32(len(vecs))) |
| 67 | if union, ok := vec.(*vector.Union); ok && elem.Spread != nil { |
| 68 | vecs = append(vecs, union.Values...) |
| 69 | unionTags[i] = union.Tags |
| 70 | } else { |
| 71 | vecs = append(vecs, vec) |
| 72 | } |
| 73 | spreadOffs = append(spreadOffs, offsets) |
| 74 | viewIndexes = append(viewIndexes, index) |
| 75 | } |
| 76 | offsets := []uint32{0} |
| 77 | var tags []uint32 |
| 78 | for i := range n { |
| 79 | var size uint32 |
| 80 | for k, spreadOff := range spreadOffs { |
| 81 | tag := vecTags[k] |
| 82 | utags := unionTags[k] |
| 83 | if len(spreadOff) == 0 { |
| 84 | if utags != nil { |
| 85 | tag += utags[i] |
| 86 | } |
| 87 | tags = append(tags, tag) |
| 88 | size++ |
| 89 | } else { |
| 90 | if index := viewIndexes[k]; index != nil { |
| 91 | i = index[i] |
| 92 | } |
| 93 | off := spreadOff[i] |
| 94 | for end := spreadOff[i+1]; off < end; off++ { |
| 95 | if utags != nil { |
| 96 | tags = append(tags, tag+utags[off]) |
| 97 | } else { |
| 98 | tags = append(tags, tag) |
| 99 | } |
| 100 | size++ |
| 101 | } |
| 102 | } |
| 103 | } |
| 104 | offsets = append(offsets, offsets[i]+size) |
| 105 | } |
| 106 | if len(vecs) == 1 { |
no test coverage detected