[Python-checkins] cpython: Refactor the deque trim logic to eliminate the two separate trim functions.
raymond.hettinger
python-checkins at python.org
Mon Oct 12 01:34:54 EDT 2015
https://hg.python.org/cpython/rev/4c9c0eb6e75c
changeset: 98705:4c9c0eb6e75c
user: Raymond Hettinger <python at rcn.com>
date: Sun Oct 11 22:34:48 2015 -0700
summary:
Refactor the deque trim logic to eliminate the two separate trim functions.
files:
Modules/_collectionsmodule.c | 39 ++++++++---------------
1 files changed, 14 insertions(+), 25 deletions(-)
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -276,29 +276,12 @@
* 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(),
* 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
-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);
- }
-}
+#define NEEDS_TRIM(deque, maxlen) ((size_t)(maxlen) < (size_t)(Py_SIZE(deque)))
static PyObject *
deque_append(dequeobject *deque, PyObject *item)
@@ -319,7 +302,10 @@
Py_INCREF(item);
deque->rightindex++;
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;
}
@@ -344,7 +330,10 @@
Py_INCREF(item);
deque->leftindex--;
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;
}
@@ -433,7 +422,7 @@
Py_SIZE(deque)++;
deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item;
- if (maxlen >= 0 && Py_SIZE(deque) > maxlen) {
+ if (NEEDS_TRIM(deque, maxlen)) {
PyObject *rv = deque_popleft(deque, NULL);
Py_DECREF(rv);
}
@@ -497,7 +486,7 @@
Py_SIZE(deque)++;
deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item;
- if (maxlen >= 0 && Py_SIZE(deque) > maxlen) {
+ if (NEEDS_TRIM(deque, maxlen)) {
PyObject *rv = deque_pop(deque, NULL);
Py_DECREF(rv);
}
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list