inline void init(const ndt::type& tp0, const char *metadata0, char *data0) { m_array_tp = tp0; m_iter_ndim = m_array_tp.get_ndim(); m_itersize = 1; if (m_iter_ndim != 0) { m_iterindex.init(m_iter_ndim); memset(m_iterindex.get(), 0, sizeof(intptr_t) * m_iter_ndim); m_itershape.init(m_iter_ndim); m_array_tp.extended()->get_shape(m_iter_ndim, 0, m_itershape.get(), metadata0); size_t iterdata_size = m_array_tp.extended()->get_iterdata_size(m_iter_ndim); m_iterdata = reinterpret_cast<iterdata_common *>(malloc(iterdata_size)); if (!m_iterdata) { throw std::bad_alloc(); } m_metadata = metadata0; m_array_tp.iterdata_construct(m_iterdata, &m_metadata, m_iter_ndim, m_itershape.get(), m_uniform_tp); m_data = m_iterdata->reset(m_iterdata, data0, m_iter_ndim); for (size_t i = 0, i_end = m_iter_ndim; i != i_end; ++i) { m_itersize *= m_itershape[i]; } } else { m_iterdata = NULL; m_uniform_tp = m_array_tp; m_data = data0; m_metadata = metadata0; } }