| 1245 | } |
| 1246 | |
| 1247 | Status SubarrayPartitioner::split_top_single_range(bool* unsplittable) { |
| 1248 | // For easy reference |
| 1249 | const auto& range = state_.single_range_.front(); |
| 1250 | |
| 1251 | // Check if unsplittable |
| 1252 | if (range.is_unary()) { |
| 1253 | *unsplittable = true; |
| 1254 | return Status::Ok(); |
| 1255 | } |
| 1256 | |
| 1257 | // Finding splitting value |
| 1258 | ByteVecValue splitting_value; |
| 1259 | unsigned splitting_dim; |
| 1260 | bool normal_order; |
| 1261 | compute_splitting_value_single_range( |
| 1262 | range, &splitting_dim, &splitting_value, &normal_order, unsplittable); |
| 1263 | |
| 1264 | if (*unsplittable) |
| 1265 | return Status::Ok(); |
| 1266 | |
| 1267 | // Split remaining range into two ranges |
| 1268 | Subarray r1, r2; |
| 1269 | range.split(splitting_dim, splitting_value, &r1, &r2); |
| 1270 | |
| 1271 | // Update list |
| 1272 | state_.single_range_.pop_front(); |
| 1273 | if (normal_order) { |
| 1274 | state_.single_range_.push_front(std::move(r2)); |
| 1275 | state_.single_range_.push_front(std::move(r1)); |
| 1276 | } else { |
| 1277 | state_.single_range_.push_front(std::move(r1)); |
| 1278 | state_.single_range_.push_front(std::move(r2)); |
| 1279 | } |
| 1280 | |
| 1281 | return Status::Ok(); |
| 1282 | } |
| 1283 | |
| 1284 | Status SubarrayPartitioner::split_top_multi_range(bool* unsplittable) { |
| 1285 | // For easy reference |