| 126 | }; |
| 127 | |
| 128 | static int SplitRange(THashMap<int, TVector<TSRTransfer>>* res, int iter, int beg, int fin) { |
| 129 | int mid = (beg + fin + 1) / 2; |
| 130 | if (mid == fin) { |
| 131 | return iter; |
| 132 | } |
| 133 | for (int i = 0; i < fin - mid; ++i) { |
| 134 | (*res)[iter].push_back(TSRTransfer(beg + i, mid + i, beg, mid)); |
| 135 | (*res)[iter].push_back(TSRTransfer(mid + i, beg + i, mid, fin)); |
| 136 | } |
| 137 | if (fin - mid < mid - beg) { |
| 138 | // [mid - 1] did not receive [mid;fin) |
| 139 | (*res)[iter].push_back(TSRTransfer(mid, mid - 1, mid, fin)); |
| 140 | } |
| 141 | int rv1 = SplitRange(res, iter + 1, beg, mid); |
| 142 | int rv2 = SplitRange(res, iter + 1, mid, fin); |
| 143 | return Max(rv1, rv2); |
| 144 | } |
| 145 | |
| 146 | static void CreatePow2Merge(TMergePlan* plan, int colSize) { |
| 147 | // finally everybody has full range [0;ColSize) |
no test coverage detected