| 192 | |
| 193 | template <typename T, typename FUNC> |
| 194 | INLINE void MergeArrays1 (FlatArray<T*> ptrs, |
| 195 | FlatArray<int> sizes, |
| 196 | // FlatArray<int> minvals, |
| 197 | FUNC f) |
| 198 | { |
| 199 | STACK_ARRAY(int, minvals, sizes.Size()); |
| 200 | int nactive = 0; |
| 201 | for (auto i : sizes.Range()) |
| 202 | if (sizes[i]) |
| 203 | { |
| 204 | nactive++; |
| 205 | minvals[i] = *ptrs[i]; |
| 206 | } |
| 207 | else |
| 208 | minvals[i] = numeric_limits<int>::max(); |
| 209 | |
| 210 | while (nactive) |
| 211 | { |
| 212 | int minval = minvals[0]; |
| 213 | for (int i = 1; i < sizes.Size(); i++) |
| 214 | minval = min2(minval, minvals[i]); |
| 215 | |
| 216 | |
| 217 | f(minval); |
| 218 | |
| 219 | for (int i : sizes.Range()) |
| 220 | while (minvals[i] == minval) // if -> while ... duplicate cols in row |
| 221 | { |
| 222 | ptrs[i]++; |
| 223 | sizes[i]--; |
| 224 | if (sizes[i] == 0) |
| 225 | { |
| 226 | nactive--; |
| 227 | minvals[i] = numeric_limits<int>::max(); |
| 228 | } |
| 229 | else |
| 230 | minvals[i] = *ptrs[i]; |
| 231 | } |
| 232 | } |
| 233 | } |
| 234 | |
| 235 | |
| 236 | template <typename T, typename FUNC> |
no test coverage detected