static int array_ass_slice(PyArrayObject *self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { int ret; PyArrayObject *tmp; if (v == NULL) { PyErr_SetString(PyExc_ValueError, "cannot delete array elements"); return -1; } if (!PyArray_ISWRITEABLE(self)) { PyErr_SetString(PyExc_RuntimeError, "array is not writeable"); return -1; } tmp = (PyArrayObject *)array_slice(self, ilow, ihigh); if (tmp == NULL) { return -1; } ret = PyArray_CopyObject(tmp, v); Py_DECREF(tmp); return ret; }
static PyObj array_subscript(PyObj self, PyObj arg) { Py_ssize_t len = py_array_length(self); if (PyIndex_Check(arg)) { Py_ssize_t i = PyNumber_AsSsize_t(arg, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return(NULL); if (i < 0) i += py_array_length(self); return(array_item(self, i)); } else if (PySlice_Check(arg)) { Py_ssize_t start, stop, step, slicelength; int r; r = PySlice_GetIndicesEx(arg, len, &start, &stop, &step, &slicelength); if (r < 0) return(NULL); if (step != 1) { /* TODO: implement custom step values for array subscript */ PyErr_Format(PyExc_NotImplementedError, "unsupported step value in array subscript"); return(NULL); } if (slicelength == len && start == 0) { Py_INCREF(self); return(self); } return(array_slice(self, start, stop)); } else { PyErr_Format(PyExc_TypeError, "array indexes must be integers, not %.200s", Py_TYPE(arg)->tp_name); return(NULL); } }
MemRef BasicArray<T>::slice(size_t offset, size_t slice_size, Allocator& target_alloc) const { REALM_ASSERT(is_attached()); // FIXME: This can be optimized as a single contiguous copy // operation. BasicArray array_slice(target_alloc); _impl::ShallowArrayDestroyGuard dg(&array_slice); array_slice.create(); // Throws size_t begin = offset; size_t end = offset + slice_size; for (size_t i = begin; i != end; ++i) { T value = get(i); array_slice.add(value); // Throws } dg.release(); return array_slice.get_mem(); }