| 2165 | } |
| 2166 | |
| 2167 | static int |
| 2168 | npy_try_collapse(char *arr, run *stack, npy_intp *stack_ptr, |
| 2169 | buffer_char *buffer, size_t len, PyArray_CompareFunc *cmp, |
| 2170 | PyArrayObject *py_arr) |
| 2171 | { |
| 2172 | int ret; |
| 2173 | npy_intp A, B, C, top; |
| 2174 | top = *stack_ptr; |
| 2175 | |
| 2176 | while (1 < top) { |
| 2177 | B = stack[top - 2].l; |
| 2178 | C = stack[top - 1].l; |
| 2179 | |
| 2180 | if ((2 < top && stack[top - 3].l <= B + C) || |
| 2181 | (3 < top && stack[top - 4].l <= stack[top - 3].l + B)) { |
| 2182 | A = stack[top - 3].l; |
| 2183 | |
| 2184 | if (A <= C) { |
| 2185 | ret = npy_merge_at(arr, stack, top - 3, buffer, len, cmp, |
| 2186 | py_arr); |
| 2187 | |
| 2188 | if (NPY_UNLIKELY(ret < 0)) { |
| 2189 | return ret; |
| 2190 | } |
| 2191 | |
| 2192 | stack[top - 3].l += B; |
| 2193 | stack[top - 2] = stack[top - 1]; |
| 2194 | --top; |
| 2195 | } |
| 2196 | else { |
| 2197 | ret = npy_merge_at(arr, stack, top - 2, buffer, len, cmp, |
| 2198 | py_arr); |
| 2199 | |
| 2200 | if (NPY_UNLIKELY(ret < 0)) { |
| 2201 | return ret; |
| 2202 | } |
| 2203 | |
| 2204 | stack[top - 2].l += C; |
| 2205 | --top; |
| 2206 | } |
| 2207 | } |
| 2208 | else if (1 < top && B <= C) { |
| 2209 | ret = npy_merge_at(arr, stack, top - 2, buffer, len, cmp, py_arr); |
| 2210 | |
| 2211 | if (NPY_UNLIKELY(ret < 0)) { |
| 2212 | return ret; |
| 2213 | } |
| 2214 | |
| 2215 | stack[top - 2].l += C; |
| 2216 | --top; |
| 2217 | } |
| 2218 | else { |
| 2219 | break; |
| 2220 | } |
| 2221 | } |
| 2222 | |
| 2223 | *stack_ptr = top; |
| 2224 | return 0; |
no test coverage detected