cpython: b75160d24b7b (original) (raw)

Mercurial > cpython

changeset 95333:b75160d24b7b

Issue 23793: Add deque support for __add__(), __mul__(), and __imul__().

Raymond Hettinger python@rcn.com
date Tue, 31 Mar 2015 08:12:23 -0700
parents c59d81b802f8
children d9374864d4a9
files Doc/library/collections.rst Lib/test/test_deque.py Misc/NEWS Modules/_collectionsmodule.c
diffstat 4 files changed, 204 insertions(+), 10 deletions(-)[+] [-] Doc/library/collections.rst 3 Lib/test/test_deque.py 77 Misc/NEWS 1 Modules/_collectionsmodule.c 133

line wrap: on

line diff

--- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -526,6 +526,9 @@ the :keyword:in operator, and subscrip access is O(1) at both ends but slows to O(n) in the middle. For fast random access, use lists instead. +Starting in version 3.5, deques support __add__(), __mul__(), +and __imul__(). + Example: .. doctest::

--- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -192,6 +192,26 @@ class TestBasic(unittest.TestCase): d.extend(d) self.assertEqual(list(d), list('abcdabcd'))

+

+

+ def test_iadd(self): d = deque('a') d += 'bcd' @@ -279,6 +299,63 @@ class TestBasic(unittest.TestCase): s.insert(i, 'Z') self.assertEqual(list(d), s)

+

+

+

+

+

+

+

+

+ def test_setitem(self): n = 200 d = deque(range(n))

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -152,6 +152,7 @@ Library

--- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -110,6 +110,12 @@ static PyTypeObject deque_type; #define CHECK_NOT_END(link) #endif +/* To prevent len from overflowing PY_SSIZE_T_MAX, we refuse to

+#define MAX_DEQUE_LEN (PY_SSIZE_T_MAX - 3BLOCKLEN) + / A simple freelisting scheme is used to minimize calls to the memory allocator. It accommodates common use cases where new blocks are being added at about the same rate as old blocks are being freed. @@ -122,9 +128,7 @@ static block *freeblocks[MAXFREEBLOCKS]; static block * newblock(Py_ssize_t len) { block *b;

@@ -498,6 +502,115 @@ deque_inplace_concat(dequeobject *deque, return (PyObject *)deque; } +static PyObject *deque_copy(PyObject *deque); + +static PyObject * +deque_concat(dequeobject *deque, PyObject *other) +{

+

+

+} + +static void deque_clear(dequeobject *deque); + +static PyObject * +deque_repeat(dequeobject *deque, Py_ssize_t n) +{

+

+

+

+} + +static PyObject * +deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) +{

+

+

+

+

+

+

+

+

+} + /* The rotate() method is part of the public API and is used internally as a primitive for other methods. @@ -1283,6 +1396,9 @@ deque_get_maxlen(dequeobject deque) return PyLong_FromSsize_t(deque->maxlen); } + +/ deque object ********************************************************/ + static PyGetSetDef deque_getset[] = { {"maxlen", (getter)deque_get_maxlen, (setter)NULL, "maximum size of a deque or None if unbounded"}, @@ -1291,15 +1407,15 @@ static PyGetSetDef deque_getset[] = { static PySequenceMethods deque_as_sequence = { (lenfunc)deque_len, /* sq_length */

}; static PyNumberMethods deque_as_number = { @@ -1316,9 +1432,6 @@ static PyNumberMethods deque_as_number = 0, /* nb_invert / }; - -/ deque object ********************************************************/ - static PyObject *deque_iter(dequeobject *deque); static PyObject *deque_reviter(dequeobject *deque); PyDoc_STRVAR(reversed_doc, @@ -1367,7 +1480,7 @@ static PyMethodDef deque_methods[] = { PyDoc_STRVAR(deque_doc, "deque([iterable[, maxlen]]) --> deque object\n[](#l4.184) \n[](#l4.185) -Build an ordered collection with optimized access from its endpoints."); +A list-like sequence optimized for data accesses near its endpoints."); static PyTypeObject deque_type = { PyVarObject_HEAD_INIT(NULL, 0)