]> granicus.if.org Git - python/commitdiff
Cleanup: Define one internal utility for reversing a list slice, and
authorTim Peters <tim.peters@gmail.com>
Fri, 19 Jul 2002 02:33:08 +0000 (02:33 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 19 Jul 2002 02:33:08 +0000 (02:33 +0000)
use that everywhere.

Objects/listobject.c

index 81730255f717fff6a7c3b12d85f3ca292f600f24..f24b95e91819cba8d47e1340c43e514e830ab833 100644 (file)
@@ -739,6 +739,22 @@ listpop(PyListObject *self, PyObject *args)
        return v;
 }
 
+/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
+static void
+reverse_slice(PyObject **lo, PyObject **hi)
+{
+       assert(lo && hi);
+
+       --hi;
+       while (lo < hi) {
+               PyObject *t = *lo;
+               *lo = *hi;
+               *hi = t;
+               ++lo;
+               --hi;
+       }
+}
+
 /* New quicksort implementation for arrays of object pointers.
    Thanks to discussions with Tim Peters. */
 
@@ -1026,14 +1042,8 @@ samplesortslice(PyObject **lo, PyObject **hi, PyObject *compare)
        }
        if (hi - r <= MAXMERGE) {
                /* Reverse the reversed prefix, then insert the tail */
-               PyObject **originalr = r;
-               l = lo;
-               do {
-                       --r;
-                       tmp = *l; *l = *r; *r = tmp;
-                       ++l;
-               } while (l < r);
-               return binarysort(lo, hi, originalr, compare);
+               reverse_slice(lo, r);
+               return binarysort(lo, hi, r, compare);
        }
 
        /* ----------------------------------------------------------
@@ -1321,28 +1331,10 @@ PyList_Sort(PyObject *v)
        return 0;
 }
 
-static void
-_listreverse(PyListObject *self)
-{
-       register PyObject **p, **q;
-       register PyObject *tmp;
-       
-       if (self->ob_size > 1) {
-               for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
-                    p < q;
-                    p++, q--)
-               {
-                       tmp = *p;
-                       *p = *q;
-                       *q = tmp;
-               }
-       }
-}
-
 static PyObject *
 listreverse(PyListObject *self)
 {
-       _listreverse(self);
+       reverse_slice(self->ob_item, self->ob_item + self->ob_size);
        Py_INCREF(Py_None);
        return Py_None;
 }
@@ -1354,7 +1346,7 @@ PyList_Reverse(PyObject *v)
                PyErr_BadInternalCall();
                return -1;
        }
-       _listreverse((PyListObject *)v);
+       listreverse((PyListObject *)v);
        return 0;
 }