mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Simply deque repeat by reusing code in in-line repeat. Avoid unnecessary division.
This commit is contained in:
parent
87e8fe6cb3
commit
f5d72f35e8
1 changed files with 18 additions and 30 deletions
|
@ -538,32 +538,6 @@ deque_concat(dequeobject *deque, PyObject *other)
|
||||||
|
|
||||||
static void deque_clear(dequeobject *deque);
|
static void deque_clear(dequeobject *deque);
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
deque_repeat(dequeobject *deque, Py_ssize_t n)
|
|
||||||
{
|
|
||||||
dequeobject *new_deque;
|
|
||||||
PyObject *result;
|
|
||||||
|
|
||||||
/* XXX add a special case for when maxlen is defined */
|
|
||||||
if (n < 0)
|
|
||||||
n = 0;
|
|
||||||
else if (n > 0 && Py_SIZE(deque) > MAX_DEQUE_LEN / n)
|
|
||||||
return PyErr_NoMemory();
|
|
||||||
|
|
||||||
new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
|
|
||||||
new_deque->maxlen = deque->maxlen;
|
|
||||||
|
|
||||||
for ( ; n ; n--) {
|
|
||||||
result = deque_extend(new_deque, (PyObject *)deque);
|
|
||||||
if (result == NULL) {
|
|
||||||
Py_DECREF(new_deque);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
Py_DECREF(result);
|
|
||||||
}
|
|
||||||
return (PyObject *)new_deque;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
|
deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
|
||||||
{
|
{
|
||||||
|
@ -583,10 +557,6 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
|
||||||
return (PyObject *)deque;
|
return (PyObject *)deque;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size > MAX_DEQUE_LEN / n) {
|
|
||||||
return PyErr_NoMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size == 1) {
|
if (size == 1) {
|
||||||
/* common case, repeating a single element */
|
/* common case, repeating a single element */
|
||||||
PyObject *item = deque->leftblock->data[deque->leftindex];
|
PyObject *item = deque->leftblock->data[deque->leftindex];
|
||||||
|
@ -594,6 +564,9 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
|
||||||
if (deque->maxlen != -1 && n > deque->maxlen)
|
if (deque->maxlen != -1 && n > deque->maxlen)
|
||||||
n = deque->maxlen;
|
n = deque->maxlen;
|
||||||
|
|
||||||
|
if (n > MAX_DEQUE_LEN)
|
||||||
|
return PyErr_NoMemory();
|
||||||
|
|
||||||
for (i = 0 ; i < n-1 ; i++) {
|
for (i = 0 ; i < n-1 ; i++) {
|
||||||
rv = deque_append(deque, item);
|
rv = deque_append(deque, item);
|
||||||
if (rv == NULL)
|
if (rv == NULL)
|
||||||
|
@ -604,6 +577,10 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
|
||||||
return (PyObject *)deque;
|
return (PyObject *)deque;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((size_t)size > MAX_DEQUE_LEN / (size_t)n) {
|
||||||
|
return PyErr_NoMemory();
|
||||||
|
}
|
||||||
|
|
||||||
seq = PySequence_List((PyObject *)deque);
|
seq = PySequence_List((PyObject *)deque);
|
||||||
if (seq == NULL)
|
if (seq == NULL)
|
||||||
return seq;
|
return seq;
|
||||||
|
@ -621,6 +598,17 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
|
||||||
return (PyObject *)deque;
|
return (PyObject *)deque;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
deque_repeat(dequeobject *deque, Py_ssize_t n)
|
||||||
|
{
|
||||||
|
dequeobject *new_deque;
|
||||||
|
|
||||||
|
new_deque = (dequeobject *)deque_copy((PyObject *) deque);
|
||||||
|
if (new_deque == NULL)
|
||||||
|
return NULL;
|
||||||
|
return deque_inplace_repeat(new_deque, n);
|
||||||
|
}
|
||||||
|
|
||||||
/* The rotate() method is part of the public API and is used internally
|
/* The rotate() method is part of the public API and is used internally
|
||||||
as a primitive for other methods.
|
as a primitive for other methods.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue