Make sure "del d[n]" is properly supported. Was necessary because the

same method that implements __setitem__ also implements __delitem__.
Also, there were several good use cases (removing items from a queue
and implementing Forth style stack ops).
This commit is contained in:
Raymond Hettinger 2004-05-12 20:55:56 +00:00
parent fd3f4fb7b1
commit 0e371f2cb6
3 changed files with 63 additions and 14 deletions

View file

@ -352,6 +352,44 @@ deque_item(dequeobject *deque, int i)
return item;
}
static int
deque_del_item(dequeobject *deque, int i)
{
PyObject *item=NULL, *minus_i=NULL, *plus_i=NULL;
int rv = -1;
assert (i >= 0 && i < deque->len);
minus_i = Py_BuildValue("(i)", -i);
if (minus_i == NULL)
goto fail;
plus_i = Py_BuildValue("(i)", i);
if (plus_i == NULL)
goto fail;
item = deque_rotate(deque, minus_i);
if (item == NULL)
goto fail;
Py_DECREF(item);
item = deque_popleft(deque, NULL);
if (item == NULL)
goto fail;
Py_DECREF(item);
item = deque_rotate(deque, plus_i);
if (item == NULL)
goto fail;
rv = 0;
fail:
Py_XDECREF(item);
Py_XDECREF(minus_i);
Py_XDECREF(plus_i);
return rv;
}
static int
deque_ass_item(dequeobject *deque, int i, PyObject *v)
{
@ -364,6 +402,9 @@ deque_ass_item(dequeobject *deque, int i, PyObject *v)
"deque index out of range");
return -1;
}
if (v == NULL)
return deque_del_item(deque, i);
i += deque->leftindex;
n = i / BLOCKLEN;
i %= BLOCKLEN;