| 1282 | } |
| 1283 | |
| 1284 | Status SubarrayPartitioner::split_top_multi_range(bool* unsplittable) { |
| 1285 | // For easy reference |
| 1286 | const auto& partition = state_.multi_range_.front(); |
| 1287 | |
| 1288 | // Check if unsplittable |
| 1289 | if (partition.is_unary()) { |
| 1290 | *unsplittable = true; |
| 1291 | return Status::Ok(); |
| 1292 | } |
| 1293 | |
| 1294 | // Finding splitting value |
| 1295 | unsigned splitting_dim; |
| 1296 | uint64_t splitting_range = UINT64_MAX; |
| 1297 | ByteVecValue splitting_value; |
| 1298 | bool normal_order; |
| 1299 | RETURN_NOT_OK(compute_splitting_value_multi_range( |
| 1300 | &splitting_dim, |
| 1301 | &splitting_range, |
| 1302 | &splitting_value, |
| 1303 | &normal_order, |
| 1304 | unsplittable)); |
| 1305 | |
| 1306 | if (*unsplittable) |
| 1307 | return Status::Ok(); |
| 1308 | |
| 1309 | // Split partition into two partitions |
| 1310 | Subarray p1; |
| 1311 | Subarray p2; |
| 1312 | partition.split(splitting_range, splitting_dim, splitting_value, &p1, &p2); |
| 1313 | |
| 1314 | // Update list |
| 1315 | state_.multi_range_.pop_front(); |
| 1316 | if (normal_order) { |
| 1317 | state_.multi_range_.push_front(std::move(p2)); |
| 1318 | state_.multi_range_.push_front(std::move(p1)); |
| 1319 | } else { |
| 1320 | state_.multi_range_.push_front(std::move(p1)); |
| 1321 | state_.multi_range_.push_front(std::move(p2)); |
| 1322 | } |
| 1323 | |
| 1324 | return Status::Ok(); |
| 1325 | } |
| 1326 | |
| 1327 | void SubarrayPartitioner::swap(SubarrayPartitioner& partitioner) { |
| 1328 | std::swap(stats_, partitioner.stats_); |