Refactor the deque trim logic to eliminate the two separate trim functions.

This commit is contained in:
Raymond Hettinger 2015-10-11 22:34:48 -07:00
parent 9e6d7a524d
commit d96db09b57

View File

@ -276,29 +276,12 @@ PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
* the limit. If it has, we get the size back down to the limit by popping an * the limit. If it has, we get the size back down to the limit by popping an
* item off of the opposite end. The methods that can trigger this are append(), * item off of the opposite end. The methods that can trigger this are append(),
* appendleft(), extend(), and extendleft(). * appendleft(), extend(), and extendleft().
*
* The macro to check whether a deque needs to be trimmed uses a single
* unsigned test that returns true whenever 0 <= maxlen < Py_SIZE(deque).
*/ */
static void #define NEEDS_TRIM(deque, maxlen) ((size_t)(maxlen) < (size_t)(Py_SIZE(deque)))
deque_trim_right(dequeobject *deque)
{
if (deque->maxlen >= 0 && Py_SIZE(deque) > deque->maxlen) {
PyObject *rv = deque_pop(deque, NULL);
assert(rv != NULL);
assert(Py_SIZE(deque) <= deque->maxlen);
Py_DECREF(rv);
}
}
static void
deque_trim_left(dequeobject *deque)
{
if (deque->maxlen >= 0 && Py_SIZE(deque) > deque->maxlen) {
PyObject *rv = deque_popleft(deque, NULL);
assert(rv != NULL);
assert(Py_SIZE(deque) <= deque->maxlen);
Py_DECREF(rv);
}
}
static PyObject * static PyObject *
deque_append(dequeobject *deque, PyObject *item) deque_append(dequeobject *deque, PyObject *item)
@ -319,7 +302,10 @@ deque_append(dequeobject *deque, PyObject *item)
Py_INCREF(item); Py_INCREF(item);
deque->rightindex++; deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item; deque->rightblock->data[deque->rightindex] = item;
deque_trim_left(deque); if (NEEDS_TRIM(deque, deque->maxlen)) {
PyObject *rv = deque_popleft(deque, NULL);
Py_DECREF(rv);
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }
@ -344,7 +330,10 @@ deque_appendleft(dequeobject *deque, PyObject *item)
Py_INCREF(item); Py_INCREF(item);
deque->leftindex--; deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item; deque->leftblock->data[deque->leftindex] = item;
deque_trim_right(deque); if (NEEDS_TRIM(deque, deque->maxlen)) {
PyObject *rv = deque_pop(deque, NULL);
Py_DECREF(rv);
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }
@ -433,7 +422,7 @@ deque_extend(dequeobject *deque, PyObject *iterable)
Py_SIZE(deque)++; Py_SIZE(deque)++;
deque->rightindex++; deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item; deque->rightblock->data[deque->rightindex] = item;
if (maxlen >= 0 && Py_SIZE(deque) > maxlen) { if (NEEDS_TRIM(deque, maxlen)) {
PyObject *rv = deque_popleft(deque, NULL); PyObject *rv = deque_popleft(deque, NULL);
Py_DECREF(rv); Py_DECREF(rv);
} }
@ -497,7 +486,7 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
Py_SIZE(deque)++; Py_SIZE(deque)++;
deque->leftindex--; deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item; deque->leftblock->data[deque->leftindex] = item;
if (maxlen >= 0 && Py_SIZE(deque) > maxlen) { if (NEEDS_TRIM(deque, maxlen)) {
PyObject *rv = deque_pop(deque, NULL); PyObject *rv = deque_pop(deque, NULL);
Py_DECREF(rv); Py_DECREF(rv);
} }