| 381 | //! get ptr at given index |
| 382 | template <typename T, typename Iter> |
| 383 | T* ptr(Iter idx_begin, Iter idx_end) { |
| 384 | auto ptr = this->template ptr<T>(); |
| 385 | size_t nidx = 0; |
| 386 | while (idx_begin != idx_end) { |
| 387 | mgb_assert(nidx < m_layout.ndim); |
| 388 | size_t idx = *idx_begin; |
| 389 | mgb_assert(idx < m_layout.shape[nidx]); |
| 390 | ptr += m_layout.stride[nidx] * idx; |
| 391 | |
| 392 | ++idx_begin; |
| 393 | ++nidx; |
| 394 | } |
| 395 | return ptr; |
| 396 | } |
| 397 | |
| 398 | template <typename T> |
| 399 | T* ptr(std::initializer_list<size_t> idx) { |