| 185 | |
| 186 | template <typename T = ListViewType, typename offset_type = typename T::offset_type> |
| 187 | void SwapListView(ArrayData* array, int64_t i, int64_t j) { |
| 188 | ASSERT_TRUE(is_list_view(array->type->id())); |
| 189 | ASSERT_EQ(array->type->id(), T::type_id); |
| 190 | ASSERT_LT(i, array->length); |
| 191 | ASSERT_LT(j, array->length); |
| 192 | auto* validity = array->GetMutableValues<uint8_t>(0); |
| 193 | if (validity) { |
| 194 | const bool is_valid_i = bit_util::GetBit(validity, array->offset + i); |
| 195 | const bool is_valid_j = bit_util::GetBit(validity, array->offset + j); |
| 196 | if (is_valid_i ^ is_valid_j) { |
| 197 | bit_util::SetBitTo(validity, array->offset + i, is_valid_j); |
| 198 | bit_util::SetBitTo(validity, array->offset + j, is_valid_i); |
| 199 | } |
| 200 | } |
| 201 | auto* offsets = array->GetMutableValues<offset_type>(1); |
| 202 | auto* sizes = array->GetMutableValues<offset_type>(2); |
| 203 | std::swap(offsets[i], offsets[j]); |
| 204 | std::swap(sizes[i], sizes[j]); |
| 205 | } |
| 206 | |
| 207 | template <typename T = ListViewType, typename offset_type = typename T::offset_type> |
| 208 | void SetListView(ArrayData* array, int64_t i, offset_type offset, offset_type size) { |