| 217 | } |
| 218 | |
| 219 | ArrayVectorPtr VectorMaker::arrayVector( |
| 220 | const std::vector<vector_size_t>& offsets, |
| 221 | const VectorPtr& elements, |
| 222 | const std::vector<vector_size_t>& nulls) { |
| 223 | const auto size = offsets.size(); |
| 224 | BufferPtr offsetsBuffer = allocateOffsets(size, pool_); |
| 225 | BufferPtr sizesBuffer = allocateSizes(size, pool_); |
| 226 | BufferPtr nullsBuffer = nullptr; |
| 227 | auto rawOffsets = offsetsBuffer->asMutable<vector_size_t>(); |
| 228 | auto rawSizes = sizesBuffer->asMutable<vector_size_t>(); |
| 229 | |
| 230 | for (int i = 0; i < size - 1; i++) { |
| 231 | rawSizes[i] = offsets[i + 1] - offsets[i]; |
| 232 | } |
| 233 | rawSizes[size - 1] = elements->size() - offsets.back(); |
| 234 | |
| 235 | memcpy(rawOffsets, offsets.data(), size * sizeof(vector_size_t)); |
| 236 | |
| 237 | if (!nulls.empty()) { |
| 238 | nullsBuffer = AlignedBuffer::allocate<bool>(size, pool_, bits::kNotNull); |
| 239 | auto rawNulls = nullsBuffer->asMutable<uint64_t>(); |
| 240 | |
| 241 | for (int i = 0; i < nulls.size(); i++) { |
| 242 | bits::setNull(rawNulls, nulls[i]); |
| 243 | } |
| 244 | } |
| 245 | |
| 246 | return std::make_shared<ArrayVector>( |
| 247 | pool_, |
| 248 | ARRAY(elements->type()), |
| 249 | nullsBuffer, |
| 250 | size, |
| 251 | offsetsBuffer, |
| 252 | sizesBuffer, |
| 253 | elements); |
| 254 | } |
| 255 | |
| 256 | MapVectorPtr VectorMaker::mapVector( |
| 257 | const std::vector<vector_size_t>& offsets, |
no test coverage detected