| 73 | } |
| 74 | |
| 75 | vector_size_t VectorMaker::createOffsetsAndSizes( |
| 76 | vector_size_t size, |
| 77 | std::function<vector_size_t(vector_size_t /* row */)> sizeAt, |
| 78 | std::function<bool(vector_size_t /*row */)> isNullAt, |
| 79 | BufferPtr* nulls, |
| 80 | BufferPtr* offsets, |
| 81 | BufferPtr* sizes) { |
| 82 | *offsets = AlignedBuffer::allocate<vector_size_t>(size, pool_); |
| 83 | *sizes = AlignedBuffer::allocate<vector_size_t>(size, pool_); |
| 84 | |
| 85 | auto rawOffsets = (*offsets)->asMutable<vector_size_t>(); |
| 86 | auto rawSizes = (*sizes)->asMutable<vector_size_t>(); |
| 87 | |
| 88 | uint64_t* rawNulls; |
| 89 | if (isNullAt) { |
| 90 | *nulls = AlignedBuffer::allocate<bool>(size, pool_); |
| 91 | rawNulls = (*nulls)->asMutable<uint64_t>(); |
| 92 | memset(rawNulls, bits::kNotNullByte, (*nulls)->capacity()); |
| 93 | } |
| 94 | |
| 95 | vector_size_t offset = 0; |
| 96 | for (vector_size_t i = 0; i < size; ++i) { |
| 97 | if (isNullAt && isNullAt(i)) { |
| 98 | bits::setNull(rawNulls, i, true); |
| 99 | rawOffsets[i] = 0; |
| 100 | rawSizes[i] = 0; |
| 101 | continue; |
| 102 | } |
| 103 | auto s = sizeAt(i); |
| 104 | rawOffsets[i] = offset; |
| 105 | rawSizes[i] = s; |
| 106 | offset += s; |
| 107 | } |
| 108 | return offset; |
| 109 | } |
| 110 | |
| 111 | ArrayVectorPtr VectorMaker::allNullArrayVector( |
| 112 | vector_size_t size, |