示例#1
0
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;
}
示例#2
0
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();
}