NUMPY_API * This function needs to update the state of the map iterator * and point mit->dataptr to the memory-location of the next object * * Note that this function never handles an extra operand but provides * compatibility for an old (exposed) API. */
| 2307 | * compatibility for an old (exposed) API. |
| 2308 | */ |
| 2309 | NPY_NO_EXPORT void |
| 2310 | PyArray_MapIterNext(PyArrayMapIterObject *mit) |
| 2311 | { |
| 2312 | int i; |
| 2313 | char *baseptr; |
| 2314 | npy_intp indval; |
| 2315 | |
| 2316 | if (mit->subspace_iter) { |
| 2317 | if (--mit->iter_count > 0) { |
| 2318 | mit->subspace_ptrs[0] += mit->subspace_strides[0]; |
| 2319 | mit->dataptr = mit->subspace_ptrs[0]; |
| 2320 | return; |
| 2321 | } |
| 2322 | else if (mit->subspace_next(mit->subspace_iter)) { |
| 2323 | mit->iter_count = *NpyIter_GetInnerLoopSizePtr(mit->subspace_iter); |
| 2324 | mit->dataptr = mit->subspace_ptrs[0]; |
| 2325 | } |
| 2326 | else { |
| 2327 | if (!mit->outer_next(mit->outer)) { |
| 2328 | return; |
| 2329 | } |
| 2330 | |
| 2331 | baseptr = mit->baseoffset; |
| 2332 | |
| 2333 | for (i = 0; i < mit->numiter; i++) { |
| 2334 | indval = *((npy_intp*)mit->outer_ptrs[i]); |
| 2335 | if (indval < 0) { |
| 2336 | indval += mit->fancy_dims[i]; |
| 2337 | } |
| 2338 | baseptr += indval * mit->fancy_strides[i]; |
| 2339 | } |
| 2340 | NpyIter_ResetBasePointers(mit->subspace_iter, &baseptr, NULL); |
| 2341 | mit->iter_count = *NpyIter_GetInnerLoopSizePtr(mit->subspace_iter); |
| 2342 | |
| 2343 | mit->dataptr = mit->subspace_ptrs[0]; |
| 2344 | } |
| 2345 | } |
| 2346 | else { |
| 2347 | if (--mit->iter_count > 0) { |
| 2348 | baseptr = mit->baseoffset; |
| 2349 | |
| 2350 | for (i = 0; i < mit->numiter; i++) { |
| 2351 | mit->outer_ptrs[i] += mit->outer_strides[i]; |
| 2352 | |
| 2353 | indval = *((npy_intp*)mit->outer_ptrs[i]); |
| 2354 | if (indval < 0) { |
| 2355 | indval += mit->fancy_dims[i]; |
| 2356 | } |
| 2357 | baseptr += indval * mit->fancy_strides[i]; |
| 2358 | } |
| 2359 | |
| 2360 | mit->dataptr = baseptr; |
| 2361 | return; |
| 2362 | } |
| 2363 | else { |
| 2364 | if (!mit->outer_next(mit->outer)) { |
| 2365 | return; |
| 2366 | } |
no test coverage detected