| 440 | |
| 441 | template<typename T> |
| 442 | Array<T> createSubArray(const Array<T> &parent, const vector<af_seq> &index, |
| 443 | bool copy) { |
| 444 | parent.eval(); |
| 445 | |
| 446 | dim4 dDims = parent.getDataDims(); |
| 447 | dim4 parent_strides = parent.strides(); |
| 448 | |
| 449 | if (parent.isLinear() == false) { |
| 450 | const Array<T> parentCopy = copyArray(parent); |
| 451 | return createSubArray(parentCopy, index, copy); |
| 452 | } |
| 453 | |
| 454 | const dim4 &pDims = parent.dims(); |
| 455 | |
| 456 | dim4 dims = toDims(index, pDims); |
| 457 | dim4 strides = toStride(index, dDims); |
| 458 | |
| 459 | // Find total offsets after indexing |
| 460 | dim4 offsets = toOffset(index, pDims); |
| 461 | dim_t offset = parent.getOffset(); |
| 462 | for (int i = 0; i < 4; i++) { offset += offsets[i] * parent_strides[i]; } |
| 463 | |
| 464 | Array<T> out = Array<T>(parent, dims, offset, strides); |
| 465 | |
| 466 | if (!copy) { return out; } |
| 467 | |
| 468 | if (strides[0] != 1 || strides[1] < 0 || strides[2] < 0 || strides[3] < 0) { |
| 469 | out = copyArray(out); |
| 470 | } |
| 471 | |
| 472 | return out; |
| 473 | } |
| 474 | |
| 475 | template<typename T> |
| 476 | Array<T> createHostDataArray(const dim4 &dims, const T *const data) { |