blob: 9364aba549b1c1be8a213852fc572d3b15d230da [file] [log] [blame]
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001#include "Python.h"
Raymond Hettinger691d8052004-05-30 07:26:47 +00002#include "structmember.h"
Raymond Hettinger756b3f32004-01-29 06:37:52 +00003
4/* collections module implementation of a deque() datatype
5 Written and maintained by Raymond D. Hettinger <python@rcn.com>
Raymond Hettinger756b3f32004-01-29 06:37:52 +00006*/
7
Raymond Hettinger77e8bf12004-10-01 15:25:53 +00008/* The block length may be set to any number over 1. Larger numbers
Benjamin Peterson227f0fa2013-06-25 11:34:48 -07009 * reduce the number of calls to the memory allocator, give faster
10 * indexing and rotation, and reduce the link::data overhead ratio.
Raymond Hettinger662908b2013-07-28 02:34:42 -070011 *
12 * Ideally, the block length will be set to two less than some
13 * multiple of the cache-line length (so that the full block
14 * including the leftlink and rightlink will fit neatly into
15 * cache lines).
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000016 */
17
Raymond Hettinger662908b2013-07-28 02:34:42 -070018#define BLOCKLEN 62
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000019#define CENTER ((BLOCKLEN - 1) / 2)
Raymond Hettinger756b3f32004-01-29 06:37:52 +000020
Tim Petersd8768d32004-10-01 01:32:53 +000021/* A `dequeobject` is composed of a doubly-linked list of `block` nodes.
22 * This list is not circular (the leftmost block has leftlink==NULL,
23 * and the rightmost block has rightlink==NULL). A deque d's first
24 * element is at d.leftblock[leftindex] and its last element is at
25 * d.rightblock[rightindex]; note that, unlike as for Python slice
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000026 * indices, these indices are inclusive on both ends. By being inclusive
Tim Peters5566e962006-07-28 00:23:15 +000027 * on both ends, algorithms for left and right operations become
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000028 * symmetrical which simplifies the design.
Tim Peters5566e962006-07-28 00:23:15 +000029 *
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000030 * The list of blocks is never empty, so d.leftblock and d.rightblock
31 * are never equal to NULL.
32 *
33 * The indices, d.leftindex and d.rightindex are always in the range
34 * 0 <= index < BLOCKLEN.
Raymond Hettinger4ca4c7c2004-10-01 15:14:39 +000035 * Their exact relationship is:
36 * (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex.
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000037 *
38 * Empty deques have d.len == 0; d.leftblock==d.rightblock;
39 * d.leftindex == CENTER+1; and d.rightindex == CENTER.
40 * Checking for d.len == 0 is the intended way to see whether d is empty.
41 *
Tim Peters5566e962006-07-28 00:23:15 +000042 * Whenever d.leftblock == d.rightblock,
Raymond Hettinger4ca4c7c2004-10-01 15:14:39 +000043 * d.leftindex + d.len - 1 == d.rightindex.
Tim Peters5566e962006-07-28 00:23:15 +000044 *
Raymond Hettinger4ca4c7c2004-10-01 15:14:39 +000045 * However, when d.leftblock != d.rightblock, d.leftindex and d.rightindex
Tim Peters5566e962006-07-28 00:23:15 +000046 * become indices into distinct blocks and either may be larger than the
Raymond Hettinger4ca4c7c2004-10-01 15:14:39 +000047 * other.
Tim Petersd8768d32004-10-01 01:32:53 +000048 */
49
Raymond Hettinger756b3f32004-01-29 06:37:52 +000050typedef struct BLOCK {
Benjamin Peterson3968e292013-06-25 11:26:20 -070051 PyObject *data[BLOCKLEN];
Benjamin Peterson73d6aca2013-06-25 11:35:44 -070052 struct BLOCK *rightlink;
Raymond Hettinger90180c12013-07-16 01:59:30 -070053 struct BLOCK *leftlink;
Raymond Hettinger756b3f32004-01-29 06:37:52 +000054} block;
55
Raymond Hettingerd3ffd342007-11-10 01:54:03 +000056#define MAXFREEBLOCKS 10
Raymond Hettinger33fcf9d2008-07-24 00:08:18 +000057static Py_ssize_t numfreeblocks = 0;
Raymond Hettingerd3ffd342007-11-10 01:54:03 +000058static block *freeblocks[MAXFREEBLOCKS];
59
Tim Peters6f853562004-10-01 01:04:50 +000060static block *
Raymond Hettinger33fcf9d2008-07-24 00:08:18 +000061newblock(block *leftlink, block *rightlink, Py_ssize_t len) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000062 block *b;
Benjamin Peterson227f0fa2013-06-25 11:34:48 -070063 /* To prevent len from overflowing PY_SSIZE_T_MAX on 32-bit machines, we
64 * refuse to allocate new blocks if the current len is nearing overflow. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +000065 if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) {
66 PyErr_SetString(PyExc_OverflowError,
67 "cannot add more blocks to the deque");
68 return NULL;
69 }
70 if (numfreeblocks) {
71 numfreeblocks -= 1;
72 b = freeblocks[numfreeblocks];
73 } else {
74 b = PyMem_Malloc(sizeof(block));
75 if (b == NULL) {
76 PyErr_NoMemory();
77 return NULL;
78 }
79 }
80 b->leftlink = leftlink;
81 b->rightlink = rightlink;
82 return b;
Raymond Hettinger756b3f32004-01-29 06:37:52 +000083}
84
Martin v. Löwis111c1802008-06-13 07:47:47 +000085static void
Raymond Hettingerd3ffd342007-11-10 01:54:03 +000086freeblock(block *b)
87{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000088 if (numfreeblocks < MAXFREEBLOCKS) {
89 freeblocks[numfreeblocks] = b;
90 numfreeblocks++;
91 } else {
92 PyMem_Free(b);
93 }
Raymond Hettingerd3ffd342007-11-10 01:54:03 +000094}
95
Raymond Hettinger756b3f32004-01-29 06:37:52 +000096typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000097 PyObject_HEAD
98 block *leftblock;
99 block *rightblock;
100 Py_ssize_t leftindex; /* in range(BLOCKLEN) */
101 Py_ssize_t rightindex; /* in range(BLOCKLEN) */
102 Py_ssize_t len;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000103 long state; /* incremented whenever the indices move */
Raymond Hettingerb77ed2c2013-07-16 02:34:19 -0700104 Py_ssize_t maxlen;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000105 PyObject *weakreflist; /* List of weak references */
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000106} dequeobject;
107
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000108/* The deque's size limit is d.maxlen. The limit can be zero or positive.
109 * If there is no limit, then d.maxlen == -1.
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000110 *
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000111 * After an item is added to a deque, we check to see if the size has grown past
112 * the limit. If it has, we get the size back down to the limit by popping an
113 * item off of the opposite end. The methods that can trigger this are append(),
114 * appendleft(), extend(), and extendleft().
115 */
116
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000117#define TRIM(d, popfunction) \
118 if (d->maxlen != -1 && d->len > d->maxlen) { \
119 PyObject *rv = popfunction(d, NULL); \
120 assert(rv != NULL && d->len <= d->maxlen); \
121 Py_DECREF(rv); \
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000122 }
123
Neal Norwitz87f10132004-02-29 15:40:53 +0000124static PyTypeObject deque_type;
Raymond Hettinger738ec902004-02-29 02:15:56 +0000125
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000126static PyObject *
127deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
128{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000129 dequeobject *deque;
130 block *b;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000131
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000132 /* create dequeobject structure */
133 deque = (dequeobject *)type->tp_alloc(type, 0);
134 if (deque == NULL)
135 return NULL;
Tim Peters1065f752004-10-01 01:03:29 +0000136
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000137 b = newblock(NULL, NULL, 0);
138 if (b == NULL) {
139 Py_DECREF(deque);
140 return NULL;
141 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000142
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000143 assert(BLOCKLEN >= 2);
144 deque->leftblock = b;
145 deque->rightblock = b;
146 deque->leftindex = CENTER + 1;
147 deque->rightindex = CENTER;
148 deque->len = 0;
149 deque->state = 0;
150 deque->weakreflist = NULL;
151 deque->maxlen = -1;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000152
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000153 return (PyObject *)deque;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000154}
155
156static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000157deque_pop(dequeobject *deque, PyObject *unused)
158{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000159 PyObject *item;
160 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000161
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000162 if (deque->len == 0) {
163 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
164 return NULL;
165 }
166 item = deque->rightblock->data[deque->rightindex];
167 deque->rightindex--;
168 deque->len--;
169 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000170
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000171 if (deque->rightindex == -1) {
172 if (deque->len == 0) {
173 assert(deque->leftblock == deque->rightblock);
174 assert(deque->leftindex == deque->rightindex+1);
175 /* re-center instead of freeing a block */
176 deque->leftindex = CENTER + 1;
177 deque->rightindex = CENTER;
178 } else {
179 prevblock = deque->rightblock->leftlink;
180 assert(deque->leftblock != deque->rightblock);
181 freeblock(deque->rightblock);
182 prevblock->rightlink = NULL;
183 deque->rightblock = prevblock;
184 deque->rightindex = BLOCKLEN - 1;
185 }
186 }
187 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000188}
189
190PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
191
192static PyObject *
193deque_popleft(dequeobject *deque, PyObject *unused)
194{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000195 PyObject *item;
196 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000197
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000198 if (deque->len == 0) {
199 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
200 return NULL;
201 }
202 assert(deque->leftblock != NULL);
203 item = deque->leftblock->data[deque->leftindex];
204 deque->leftindex++;
205 deque->len--;
206 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000207
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000208 if (deque->leftindex == BLOCKLEN) {
209 if (deque->len == 0) {
210 assert(deque->leftblock == deque->rightblock);
211 assert(deque->leftindex == deque->rightindex+1);
212 /* re-center instead of freeing a block */
213 deque->leftindex = CENTER + 1;
214 deque->rightindex = CENTER;
215 } else {
216 assert(deque->leftblock != deque->rightblock);
217 prevblock = deque->leftblock->rightlink;
218 freeblock(deque->leftblock);
219 assert(prevblock != NULL);
220 prevblock->leftlink = NULL;
221 deque->leftblock = prevblock;
222 deque->leftindex = 0;
223 }
224 }
225 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000226}
227
228PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
229
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000230static PyObject *
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000231deque_append(dequeobject *deque, PyObject *item)
232{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000233 deque->state++;
234 if (deque->rightindex == BLOCKLEN-1) {
235 block *b = newblock(deque->rightblock, NULL, deque->len);
236 if (b == NULL)
237 return NULL;
238 assert(deque->rightblock->rightlink == NULL);
239 deque->rightblock->rightlink = b;
240 deque->rightblock = b;
241 deque->rightindex = -1;
242 }
243 Py_INCREF(item);
244 deque->len++;
245 deque->rightindex++;
246 deque->rightblock->data[deque->rightindex] = item;
247 TRIM(deque, deque_popleft);
248 Py_RETURN_NONE;
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000249}
250
251PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
252
253static PyObject *
254deque_appendleft(dequeobject *deque, PyObject *item)
255{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000256 deque->state++;
257 if (deque->leftindex == 0) {
258 block *b = newblock(NULL, deque->leftblock, deque->len);
259 if (b == NULL)
260 return NULL;
261 assert(deque->leftblock->leftlink == NULL);
262 deque->leftblock->leftlink = b;
263 deque->leftblock = b;
264 deque->leftindex = BLOCKLEN;
265 }
266 Py_INCREF(item);
267 deque->len++;
268 deque->leftindex--;
269 deque->leftblock->data[deque->leftindex] = item;
270 TRIM(deque, deque_pop);
271 Py_RETURN_NONE;
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000272}
273
274PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
275
Raymond Hettingerbac769b2009-03-10 09:31:48 +0000276
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000277/* Run an iterator to exhaustion. Shortcut for
Raymond Hettingerbac769b2009-03-10 09:31:48 +0000278 the extend/extendleft methods when maxlen == 0. */
279static PyObject*
280consume_iterator(PyObject *it)
281{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000282 PyObject *item;
Raymond Hettingerbac769b2009-03-10 09:31:48 +0000283
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000284 while ((item = PyIter_Next(it)) != NULL) {
285 Py_DECREF(item);
286 }
287 Py_DECREF(it);
288 if (PyErr_Occurred())
289 return NULL;
290 Py_RETURN_NONE;
Raymond Hettingerbac769b2009-03-10 09:31:48 +0000291}
292
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000293static PyObject *
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000294deque_extend(dequeobject *deque, PyObject *iterable)
295{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000296 PyObject *it, *item;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000297
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000298 /* Handle case where id(deque) == id(iterable) */
299 if ((PyObject *)deque == iterable) {
300 PyObject *result;
301 PyObject *s = PySequence_List(iterable);
302 if (s == NULL)
303 return NULL;
304 result = deque_extend(deque, s);
305 Py_DECREF(s);
306 return result;
307 }
Raymond Hettinger0b3263b2009-12-10 06:00:33 +0000308
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000309 it = PyObject_GetIter(iterable);
310 if (it == NULL)
311 return NULL;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000312
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000313 if (deque->maxlen == 0)
314 return consume_iterator(it);
Raymond Hettingerbac769b2009-03-10 09:31:48 +0000315
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000316 while ((item = PyIter_Next(it)) != NULL) {
317 deque->state++;
318 if (deque->rightindex == BLOCKLEN-1) {
319 block *b = newblock(deque->rightblock, NULL,
320 deque->len);
321 if (b == NULL) {
322 Py_DECREF(item);
323 Py_DECREF(it);
324 return NULL;
325 }
326 assert(deque->rightblock->rightlink == NULL);
327 deque->rightblock->rightlink = b;
328 deque->rightblock = b;
329 deque->rightindex = -1;
330 }
331 deque->len++;
332 deque->rightindex++;
333 deque->rightblock->data[deque->rightindex] = item;
334 TRIM(deque, deque_popleft);
335 }
336 Py_DECREF(it);
337 if (PyErr_Occurred())
338 return NULL;
339 Py_RETURN_NONE;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000340}
341
Tim Peters1065f752004-10-01 01:03:29 +0000342PyDoc_STRVAR(extend_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000343"Extend the right side of the deque with elements from the iterable");
344
345static PyObject *
346deque_extendleft(dequeobject *deque, PyObject *iterable)
347{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000348 PyObject *it, *item;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000349
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000350 /* Handle case where id(deque) == id(iterable) */
351 if ((PyObject *)deque == iterable) {
352 PyObject *result;
353 PyObject *s = PySequence_List(iterable);
354 if (s == NULL)
355 return NULL;
356 result = deque_extendleft(deque, s);
357 Py_DECREF(s);
358 return result;
359 }
Raymond Hettinger0b3263b2009-12-10 06:00:33 +0000360
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000361 it = PyObject_GetIter(iterable);
362 if (it == NULL)
363 return NULL;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000364
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000365 if (deque->maxlen == 0)
366 return consume_iterator(it);
Raymond Hettingerbac769b2009-03-10 09:31:48 +0000367
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000368 while ((item = PyIter_Next(it)) != NULL) {
369 deque->state++;
370 if (deque->leftindex == 0) {
371 block *b = newblock(NULL, deque->leftblock,
372 deque->len);
373 if (b == NULL) {
374 Py_DECREF(item);
375 Py_DECREF(it);
376 return NULL;
377 }
378 assert(deque->leftblock->leftlink == NULL);
379 deque->leftblock->leftlink = b;
380 deque->leftblock = b;
381 deque->leftindex = BLOCKLEN;
382 }
383 deque->len++;
384 deque->leftindex--;
385 deque->leftblock->data[deque->leftindex] = item;
386 TRIM(deque, deque_pop);
387 }
388 Py_DECREF(it);
389 if (PyErr_Occurred())
390 return NULL;
391 Py_RETURN_NONE;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000392}
393
Tim Peters1065f752004-10-01 01:03:29 +0000394PyDoc_STRVAR(extendleft_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000395"Extend the left side of the deque with elements from the iterable");
396
Raymond Hettinger0b3263b2009-12-10 06:00:33 +0000397static PyObject *
398deque_inplace_concat(dequeobject *deque, PyObject *other)
399{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000400 PyObject *result;
Raymond Hettinger0b3263b2009-12-10 06:00:33 +0000401
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000402 result = deque_extend(deque, other);
403 if (result == NULL)
404 return result;
405 Py_DECREF(result);
406 Py_INCREF(deque);
407 return (PyObject *)deque;
Raymond Hettinger0b3263b2009-12-10 06:00:33 +0000408}
409
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000410static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000411_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000412{
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500413 Py_ssize_t m, len=deque->len, halflen=len>>1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000414
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800415 if (len <= 1)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000416 return 0;
417 if (n > halflen || n < -halflen) {
418 n %= len;
419 if (n > halflen)
420 n -= len;
421 else if (n < -halflen)
422 n += len;
423 }
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500424 assert(len > 1);
425 assert(-halflen <= n && n <= halflen);
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000426
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800427 deque->state++;
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500428 while (n > 0) {
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800429 if (deque->leftindex == 0) {
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500430 block *b = newblock(NULL, deque->leftblock, len);
Raymond Hettinger42645322013-02-02 10:23:37 -0800431 if (b == NULL)
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800432 return -1;
Raymond Hettinger42645322013-02-02 10:23:37 -0800433 assert(deque->leftblock->leftlink == NULL);
434 deque->leftblock->leftlink = b;
435 deque->leftblock = b;
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800436 deque->leftindex = BLOCKLEN;
437 }
Raymond Hettinger42645322013-02-02 10:23:37 -0800438 assert(deque->leftindex > 0);
439
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500440 m = n;
Raymond Hettinger42645322013-02-02 10:23:37 -0800441 if (m > deque->rightindex + 1)
442 m = deque->rightindex + 1;
443 if (m > deque->leftindex)
444 m = deque->leftindex;
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500445 assert (m > 0 && m <= len);
Raymond Hettinger42645322013-02-02 10:23:37 -0800446 memcpy(&deque->leftblock->data[deque->leftindex - m],
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500447 &deque->rightblock->data[deque->rightindex + 1 - m],
Raymond Hettinger42645322013-02-02 10:23:37 -0800448 m * sizeof(PyObject *));
449 deque->rightindex -= m;
450 deque->leftindex -= m;
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500451 n -= m;
Raymond Hettinger42645322013-02-02 10:23:37 -0800452
453 if (deque->rightindex == -1) {
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500454 block *prevblock = deque->rightblock->leftlink;
Raymond Hettinger42645322013-02-02 10:23:37 -0800455 assert(deque->rightblock != NULL);
Raymond Hettinger42645322013-02-02 10:23:37 -0800456 assert(deque->leftblock != deque->rightblock);
457 freeblock(deque->rightblock);
458 prevblock->rightlink = NULL;
459 deque->rightblock = prevblock;
460 deque->rightindex = BLOCKLEN - 1;
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800461 }
Raymond Hettinger42645322013-02-02 10:23:37 -0800462 }
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500463 while (n < 0) {
Raymond Hettinger42645322013-02-02 10:23:37 -0800464 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500465 block *b = newblock(deque->rightblock, NULL, len);
Raymond Hettinger42645322013-02-02 10:23:37 -0800466 if (b == NULL)
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800467 return -1;
Raymond Hettinger42645322013-02-02 10:23:37 -0800468 assert(deque->rightblock->rightlink == NULL);
469 deque->rightblock->rightlink = b;
470 deque->rightblock = b;
Raymond Hettinger2cdb6432013-01-12 00:05:00 -0800471 deque->rightindex = -1;
472 }
Raymond Hettinger42645322013-02-02 10:23:37 -0800473 assert (deque->rightindex < BLOCKLEN - 1);
474
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500475 m = -n;
Raymond Hettinger42645322013-02-02 10:23:37 -0800476 if (m > BLOCKLEN - deque->leftindex)
477 m = BLOCKLEN - deque->leftindex;
478 if (m > BLOCKLEN - 1 - deque->rightindex)
479 m = BLOCKLEN - 1 - deque->rightindex;
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500480 assert (m > 0 && m <= len);
Raymond Hettinger42645322013-02-02 10:23:37 -0800481 memcpy(&deque->rightblock->data[deque->rightindex + 1],
482 &deque->leftblock->data[deque->leftindex],
483 m * sizeof(PyObject *));
484 deque->leftindex += m;
485 deque->rightindex += m;
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500486 n += m;
Raymond Hettinger42645322013-02-02 10:23:37 -0800487
488 if (deque->leftindex == BLOCKLEN) {
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500489 block *nextblock = deque->leftblock->rightlink;
Raymond Hettinger42645322013-02-02 10:23:37 -0800490 assert(deque->leftblock != deque->rightblock);
Raymond Hettinger42645322013-02-02 10:23:37 -0800491 freeblock(deque->leftblock);
Raymond Hettinger6688bdb2013-02-09 18:55:44 -0500492 assert(nextblock != NULL);
493 nextblock->leftlink = NULL;
494 deque->leftblock = nextblock;
Raymond Hettinger42645322013-02-02 10:23:37 -0800495 deque->leftindex = 0;
496 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000497 }
498 return 0;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000499}
500
501static PyObject *
502deque_rotate(dequeobject *deque, PyObject *args)
503{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000504 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000505
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000506 if (!PyArg_ParseTuple(args, "|n:rotate", &n))
507 return NULL;
508 if (_deque_rotate(deque, n) == 0)
509 Py_RETURN_NONE;
510 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000511}
512
Tim Peters1065f752004-10-01 01:03:29 +0000513PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000514"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000515
Raymond Hettingera5fd24e2009-12-10 06:42:54 +0000516static PyObject *
517deque_reverse(dequeobject *deque, PyObject *unused)
518{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000519 block *leftblock = deque->leftblock;
520 block *rightblock = deque->rightblock;
521 Py_ssize_t leftindex = deque->leftindex;
522 Py_ssize_t rightindex = deque->rightindex;
523 Py_ssize_t n = (deque->len)/2;
524 Py_ssize_t i;
525 PyObject *tmp;
Raymond Hettingera5fd24e2009-12-10 06:42:54 +0000526
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000527 for (i=0 ; i<n ; i++) {
528 /* Validate that pointers haven't met in the middle */
529 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettingera5fd24e2009-12-10 06:42:54 +0000530
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000531 /* Swap */
532 tmp = leftblock->data[leftindex];
533 leftblock->data[leftindex] = rightblock->data[rightindex];
534 rightblock->data[rightindex] = tmp;
Raymond Hettingera5fd24e2009-12-10 06:42:54 +0000535
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000536 /* Advance left block/index pair */
537 leftindex++;
538 if (leftindex == BLOCKLEN) {
Raymond Hettinger57a86892011-01-25 21:43:29 +0000539 if (leftblock->rightlink == NULL)
540 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000541 leftblock = leftblock->rightlink;
542 leftindex = 0;
543 }
Raymond Hettingera5fd24e2009-12-10 06:42:54 +0000544
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000545 /* Step backwards with the right block/index pair */
546 rightindex--;
547 if (rightindex == -1) {
Raymond Hettinger57a86892011-01-25 21:43:29 +0000548 if (rightblock->leftlink == NULL)
549 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000550 rightblock = rightblock->leftlink;
551 rightindex = BLOCKLEN - 1;
552 }
553 }
554 Py_RETURN_NONE;
Raymond Hettingera5fd24e2009-12-10 06:42:54 +0000555}
556
557PyDoc_STRVAR(reverse_doc,
558"D.reverse() -- reverse *IN PLACE*");
559
Raymond Hettinger5f516ed2010-04-03 18:10:37 +0000560static PyObject *
561deque_count(dequeobject *deque, PyObject *v)
562{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 block *leftblock = deque->leftblock;
564 Py_ssize_t leftindex = deque->leftindex;
Raymond Hettinger57a86892011-01-25 21:43:29 +0000565 Py_ssize_t n = deque->len;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000566 Py_ssize_t i;
567 Py_ssize_t count = 0;
568 PyObject *item;
569 long start_state = deque->state;
570 int cmp;
Raymond Hettinger5f516ed2010-04-03 18:10:37 +0000571
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000572 for (i=0 ; i<n ; i++) {
573 item = leftblock->data[leftindex];
574 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
575 if (cmp > 0)
576 count++;
577 else if (cmp < 0)
578 return NULL;
Raymond Hettinger5f516ed2010-04-03 18:10:37 +0000579
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 if (start_state != deque->state) {
581 PyErr_SetString(PyExc_RuntimeError,
582 "deque mutated during iteration");
583 return NULL;
584 }
Raymond Hettinger5f516ed2010-04-03 18:10:37 +0000585
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 /* Advance left block/index pair */
587 leftindex++;
588 if (leftindex == BLOCKLEN) {
Raymond Hettinger57a86892011-01-25 21:43:29 +0000589 if (leftblock->rightlink == NULL) /* can occur when i==n-1 */
590 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000591 leftblock = leftblock->rightlink;
592 leftindex = 0;
593 }
594 }
595 return PyInt_FromSsize_t(count);
Raymond Hettinger5f516ed2010-04-03 18:10:37 +0000596}
597
598PyDoc_STRVAR(count_doc,
599"D.count(value) -> integer -- return number of occurrences of value");
600
Martin v. Löwis18e16552006-02-15 17:27:45 +0000601static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000602deque_len(dequeobject *deque)
603{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000604 return deque->len;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000605}
606
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000607static PyObject *
608deque_remove(dequeobject *deque, PyObject *value)
609{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000610 Py_ssize_t i, n=deque->len;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000611
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 for (i=0 ; i<n ; i++) {
613 PyObject *item = deque->leftblock->data[deque->leftindex];
614 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +0000615
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000616 if (deque->len != n) {
617 PyErr_SetString(PyExc_IndexError,
618 "deque mutated during remove().");
619 return NULL;
620 }
621 if (cmp > 0) {
622 PyObject *tgt = deque_popleft(deque, NULL);
623 assert (tgt != NULL);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700624 if (_deque_rotate(deque, i))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000625 return NULL;
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700626 Py_DECREF(tgt);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000627 Py_RETURN_NONE;
628 }
629 else if (cmp < 0) {
630 _deque_rotate(deque, i);
631 return NULL;
632 }
633 _deque_rotate(deque, -1);
634 }
635 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
636 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000637}
638
639PyDoc_STRVAR(remove_doc,
640"D.remove(value) -- remove first occurrence of value.");
641
Serhiy Storchakadb107422018-05-31 10:32:43 +0300642static int
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000643deque_clear(dequeobject *deque)
644{
Raymond Hettingerd2a40732015-09-26 00:52:57 -0700645 block *b;
646 block *prevblock;
647 block *leftblock;
648 Py_ssize_t leftindex;
649 Py_ssize_t n;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000650 PyObject *item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000651
Raymond Hettinger3a754032015-11-12 07:18:45 -0800652 if (deque->len == 0)
Serhiy Storchakadb107422018-05-31 10:32:43 +0300653 return 0;
Raymond Hettingere9044272015-10-06 23:12:02 -0400654
Raymond Hettingerd2a40732015-09-26 00:52:57 -0700655 /* During the process of clearing a deque, decrefs can cause the
656 deque to mutate. To avoid fatal confusion, we have to make the
657 deque empty before clearing the blocks and never refer to
658 anything via deque->ref while clearing. (This is the same
659 technique used for clearing lists, sets, and dicts.)
660
661 Making the deque empty requires allocating a new empty block. In
662 the unlikely event that memory is full, we fall back to an
663 alternate method that doesn't require a new block. Repeating
664 pops in a while-loop is slower, possibly re-entrant (and a clever
665 adversary could cause it to never terminate).
666 */
667
668 b = newblock(NULL, NULL, 0);
669 if (b == NULL) {
670 PyErr_Clear();
671 goto alternate_method;
672 }
673
674 /* Remember the old size, leftblock, and leftindex */
675 leftblock = deque->leftblock;
676 leftindex = deque->leftindex;
677 n = deque->len;
678
679 /* Set the deque to be empty using the newly allocated block */
680 deque->len = 0;
681 deque->leftblock = b;
682 deque->rightblock = b;
683 deque->leftindex = CENTER + 1;
684 deque->rightindex = CENTER;
685 deque->state++;
686
687 /* Now the old size, leftblock, and leftindex are disconnected from
688 the empty deque and we can use them to decref the pointers.
689 */
690 while (n--) {
691 item = leftblock->data[leftindex];
692 Py_DECREF(item);
693 leftindex++;
694 if (leftindex == BLOCKLEN && n) {
695 assert(leftblock->rightlink != NULL);
696 prevblock = leftblock;
697 leftblock = leftblock->rightlink;
698 leftindex = 0;
699 freeblock(prevblock);
700 }
701 }
702 assert(leftblock->rightlink == NULL);
703 freeblock(leftblock);
Serhiy Storchakadb107422018-05-31 10:32:43 +0300704 return 0;
Raymond Hettingerd2a40732015-09-26 00:52:57 -0700705
706 alternate_method:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000707 while (deque->len) {
708 item = deque_pop(deque, NULL);
709 assert (item != NULL);
710 Py_DECREF(item);
711 }
Serhiy Storchakadb107422018-05-31 10:32:43 +0300712 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000713}
714
715static PyObject *
Raymond Hettinger33fcf9d2008-07-24 00:08:18 +0000716deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000717{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000718 block *b;
719 PyObject *item;
720 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000721
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000722 if (i < 0 || i >= deque->len) {
723 PyErr_SetString(PyExc_IndexError,
724 "deque index out of range");
725 return NULL;
726 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000727
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000728 if (i == 0) {
729 i = deque->leftindex;
730 b = deque->leftblock;
731 } else if (i == deque->len - 1) {
732 i = deque->rightindex;
733 b = deque->rightblock;
734 } else {
735 i += deque->leftindex;
736 n = i / BLOCKLEN;
737 i %= BLOCKLEN;
738 if (index < (deque->len >> 1)) {
739 b = deque->leftblock;
740 while (n--)
741 b = b->rightlink;
742 } else {
743 n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
744 b = deque->rightblock;
745 while (n--)
746 b = b->leftlink;
747 }
748 }
749 item = b->data[i];
750 Py_INCREF(item);
751 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000752}
753
Raymond Hettinger616f4f62004-06-26 04:42:06 +0000754/* delitem() implemented in terms of rotate for simplicity and reasonable
755 performance near the end points. If for some reason this method becomes
Tim Peters1065f752004-10-01 01:03:29 +0000756 popular, it is not hard to re-implement this using direct data movement
Raymond Hettinger616f4f62004-06-26 04:42:06 +0000757 (similar to code in list slice assignment) and achieve a two or threefold
758 performance boost.
759*/
760
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000761static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000762deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000763{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000764 PyObject *item;
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700765 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000766
Benjamin Peterson5863a392015-05-15 12:19:18 -0400767 assert (i >= 0 && i < deque->len);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700768 if (_deque_rotate(deque, -i))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000769 return -1;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000770 item = deque_popleft(deque, NULL);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700771 rv = _deque_rotate(deque, i);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000772 assert (item != NULL);
773 Py_DECREF(item);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700774 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000775}
776
777static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000778deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000779{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000780 PyObject *old_value;
781 block *b;
782 Py_ssize_t n, len=deque->len, halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000783
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000784 if (i < 0 || i >= len) {
785 PyErr_SetString(PyExc_IndexError,
786 "deque index out of range");
787 return -1;
788 }
789 if (v == NULL)
790 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000791
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000792 i += deque->leftindex;
793 n = i / BLOCKLEN;
794 i %= BLOCKLEN;
795 if (index <= halflen) {
796 b = deque->leftblock;
797 while (n--)
798 b = b->rightlink;
799 } else {
800 n = (deque->leftindex + len - 1) / BLOCKLEN - n;
801 b = deque->rightblock;
802 while (n--)
803 b = b->leftlink;
804 }
805 Py_INCREF(v);
806 old_value = b->data[i];
807 b->data[i] = v;
808 Py_DECREF(old_value);
809 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000810}
811
812static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000813deque_clearmethod(dequeobject *deque)
814{
Benjamin Peterson40056de2013-01-12 21:22:18 -0500815 deque_clear(deque);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000816 Py_RETURN_NONE;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000817}
818
819PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
820
821static void
822deque_dealloc(dequeobject *deque)
823{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000824 PyObject_GC_UnTrack(deque);
825 if (deque->weakreflist != NULL)
826 PyObject_ClearWeakRefs((PyObject *) deque);
827 if (deque->leftblock != NULL) {
828 deque_clear(deque);
829 assert(deque->leftblock != NULL);
830 freeblock(deque->leftblock);
831 }
832 deque->leftblock = NULL;
833 deque->rightblock = NULL;
834 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000835}
836
837static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000838deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000839{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 block *b;
841 PyObject *item;
842 Py_ssize_t index;
843 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000844
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000845 for (b = deque->leftblock; b != NULL; b = b->rightlink) {
846 const Py_ssize_t indexhi = b == deque->rightblock ?
847 deque->rightindex :
848 BLOCKLEN - 1;
Tim Peters10c7e862004-10-01 02:01:04 +0000849
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000850 for (index = indexlo; index <= indexhi; ++index) {
851 item = b->data[index];
852 Py_VISIT(item);
853 }
854 indexlo = 0;
855 }
856 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000857}
858
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000859static PyObject *
860deque_copy(PyObject *deque)
861{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000862 if (((dequeobject *)deque)->maxlen == -1)
863 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
864 else
865 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
866 deque, ((dequeobject *)deque)->maxlen, NULL);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000867}
868
869PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
870
871static PyObject *
872deque_reduce(dequeobject *deque)
873{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000874 PyObject *dict, *result, *aslist;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000875
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000876 dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
877 if (dict == NULL)
878 PyErr_Clear();
879 aslist = PySequence_List((PyObject *)deque);
880 if (aslist == NULL) {
881 Py_XDECREF(dict);
882 return NULL;
883 }
884 if (dict == NULL) {
885 if (deque->maxlen == -1)
886 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
887 else
888 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
889 } else {
890 if (deque->maxlen == -1)
891 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
892 else
893 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
894 }
895 Py_XDECREF(dict);
896 Py_DECREF(aslist);
897 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000898}
899
900PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
901
902static PyObject *
903deque_repr(PyObject *deque)
904{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000905 PyObject *aslist, *result, *fmt;
906 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000907
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000908 i = Py_ReprEnter(deque);
909 if (i != 0) {
910 if (i < 0)
911 return NULL;
912 return PyString_FromString("[...]");
913 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000914
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000915 aslist = PySequence_List(deque);
916 if (aslist == NULL) {
917 Py_ReprLeave(deque);
918 return NULL;
919 }
920 if (((dequeobject *)deque)->maxlen != -1)
921 fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)",
922 ((dequeobject *)deque)->maxlen);
923 else
924 fmt = PyString_FromString("deque(%r)");
925 if (fmt == NULL) {
926 Py_DECREF(aslist);
927 Py_ReprLeave(deque);
928 return NULL;
929 }
930 result = PyString_Format(fmt, aslist);
931 Py_DECREF(fmt);
932 Py_DECREF(aslist);
933 Py_ReprLeave(deque);
934 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000935}
936
937static int
938deque_tp_print(PyObject *deque, FILE *fp, int flags)
939{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000940 PyObject *it, *item;
941 char *emit = ""; /* No separator emitted on first pass */
942 char *separator = ", ";
943 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000944
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000945 i = Py_ReprEnter(deque);
946 if (i != 0) {
947 if (i < 0)
948 return i;
949 Py_BEGIN_ALLOW_THREADS
950 fputs("[...]", fp);
951 Py_END_ALLOW_THREADS
952 return 0;
953 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000954
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000955 it = PyObject_GetIter(deque);
956 if (it == NULL)
957 return -1;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000958
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000959 Py_BEGIN_ALLOW_THREADS
960 fputs("deque([", fp);
961 Py_END_ALLOW_THREADS
962 while ((item = PyIter_Next(it)) != NULL) {
963 Py_BEGIN_ALLOW_THREADS
964 fputs(emit, fp);
965 Py_END_ALLOW_THREADS
966 emit = separator;
967 if (PyObject_Print(item, fp, 0) != 0) {
968 Py_DECREF(item);
969 Py_DECREF(it);
970 Py_ReprLeave(deque);
971 return -1;
972 }
973 Py_DECREF(item);
974 }
975 Py_ReprLeave(deque);
976 Py_DECREF(it);
977 if (PyErr_Occurred())
978 return -1;
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000979
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 Py_BEGIN_ALLOW_THREADS
981 if (((dequeobject *)deque)->maxlen == -1)
982 fputs("])", fp);
983 else
984 fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen);
985 Py_END_ALLOW_THREADS
986 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000987}
988
Raymond Hettinger738ec902004-02-29 02:15:56 +0000989static PyObject *
990deque_richcompare(PyObject *v, PyObject *w, int op)
991{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000992 PyObject *it1=NULL, *it2=NULL, *x, *y;
993 Py_ssize_t vs, ws;
994 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +0000995
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000996 if (!PyObject_TypeCheck(v, &deque_type) ||
997 !PyObject_TypeCheck(w, &deque_type)) {
998 Py_INCREF(Py_NotImplemented);
999 return Py_NotImplemented;
1000 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001001
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001002 /* Shortcuts */
1003 vs = ((dequeobject *)v)->len;
1004 ws = ((dequeobject *)w)->len;
1005 if (op == Py_EQ) {
1006 if (v == w)
1007 Py_RETURN_TRUE;
1008 if (vs != ws)
1009 Py_RETURN_FALSE;
1010 }
1011 if (op == Py_NE) {
1012 if (v == w)
1013 Py_RETURN_FALSE;
1014 if (vs != ws)
1015 Py_RETURN_TRUE;
1016 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001017
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001018 /* Search for the first index where items are different */
1019 it1 = PyObject_GetIter(v);
1020 if (it1 == NULL)
1021 goto done;
1022 it2 = PyObject_GetIter(w);
1023 if (it2 == NULL)
1024 goto done;
1025 for (;;) {
1026 x = PyIter_Next(it1);
1027 if (x == NULL && PyErr_Occurred())
1028 goto done;
1029 y = PyIter_Next(it2);
1030 if (x == NULL || y == NULL)
1031 break;
1032 b = PyObject_RichCompareBool(x, y, Py_EQ);
1033 if (b == 0) {
1034 cmp = PyObject_RichCompareBool(x, y, op);
1035 Py_DECREF(x);
1036 Py_DECREF(y);
1037 goto done;
1038 }
1039 Py_DECREF(x);
1040 Py_DECREF(y);
1041 if (b == -1)
1042 goto done;
1043 }
1044 /* We reached the end of one deque or both */
1045 Py_XDECREF(x);
1046 Py_XDECREF(y);
1047 if (PyErr_Occurred())
1048 goto done;
1049 switch (op) {
1050 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1051 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1052 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1053 case Py_NE: cmp = x != y; break; /* if one deque continues */
1054 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1055 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1056 }
Tim Peters1065f752004-10-01 01:03:29 +00001057
Raymond Hettinger738ec902004-02-29 02:15:56 +00001058done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 Py_XDECREF(it1);
1060 Py_XDECREF(it2);
1061 if (cmp == 1)
1062 Py_RETURN_TRUE;
1063 if (cmp == 0)
1064 Py_RETURN_FALSE;
1065 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001066}
1067
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001068static int
Raymond Hettingera7fc4b12007-10-05 02:47:07 +00001069deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001070{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001071 PyObject *iterable = NULL;
1072 PyObject *maxlenobj = NULL;
1073 Py_ssize_t maxlen = -1;
1074 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001075
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001076 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1077 return -1;
1078 if (maxlenobj != NULL && maxlenobj != Py_None) {
1079 maxlen = PyInt_AsSsize_t(maxlenobj);
1080 if (maxlen == -1 && PyErr_Occurred())
1081 return -1;
1082 if (maxlen < 0) {
1083 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1084 return -1;
1085 }
1086 }
1087 deque->maxlen = maxlen;
Raymond Hettingerf358d2b2015-11-12 18:20:21 -08001088 if (deque->len > 0)
Raymond Hettingere9044272015-10-06 23:12:02 -04001089 deque_clear(deque);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001090 if (iterable != NULL) {
1091 PyObject *rv = deque_extend(deque, iterable);
1092 if (rv == NULL)
1093 return -1;
1094 Py_DECREF(rv);
1095 }
1096 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001097}
1098
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001099static PyObject *
Jesus Cead4e58dc2012-08-03 14:48:23 +02001100deque_sizeof(dequeobject *deque, void *unused)
1101{
1102 Py_ssize_t res;
1103 Py_ssize_t blocks;
1104
Serhiy Storchakac06a6d02015-12-19 20:07:48 +02001105 res = _PyObject_SIZE(Py_TYPE(deque));
Jesus Cead4e58dc2012-08-03 14:48:23 +02001106 blocks = (deque->leftindex + deque->len + BLOCKLEN - 1) / BLOCKLEN;
1107 assert(deque->leftindex + deque->len - 1 ==
1108 (blocks - 1) * BLOCKLEN + deque->rightindex);
1109 res += blocks * sizeof(block);
1110 return PyLong_FromSsize_t(res);
1111}
1112
1113PyDoc_STRVAR(sizeof_doc,
1114"D.__sizeof__() -- size of D in memory, in bytes");
1115
1116static PyObject *
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001117deque_get_maxlen(dequeobject *deque)
1118{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001119 if (deque->maxlen == -1)
1120 Py_RETURN_NONE;
1121 return PyInt_FromSsize_t(deque->maxlen);
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001122}
1123
1124static PyGetSetDef deque_getset[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001125 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1126 "maximum size of a deque or None if unbounded"},
1127 {0}
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001128};
1129
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001130static PySequenceMethods deque_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001131 (lenfunc)deque_len, /* sq_length */
1132 0, /* sq_concat */
1133 0, /* sq_repeat */
1134 (ssizeargfunc)deque_item, /* sq_item */
1135 0, /* sq_slice */
1136 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
1137 0, /* sq_ass_slice */
1138 0, /* sq_contains */
1139 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
1140 0, /* sq_inplace_repeat */
Raymond Hettinger0b3263b2009-12-10 06:00:33 +00001141
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001142};
1143
1144/* deque object ********************************************************/
1145
1146static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001147static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001148PyDoc_STRVAR(reversed_doc,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001149 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001150
1151static PyMethodDef deque_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001152 {"append", (PyCFunction)deque_append,
1153 METH_O, append_doc},
1154 {"appendleft", (PyCFunction)deque_appendleft,
1155 METH_O, appendleft_doc},
1156 {"clear", (PyCFunction)deque_clearmethod,
1157 METH_NOARGS, clear_doc},
1158 {"__copy__", (PyCFunction)deque_copy,
1159 METH_NOARGS, copy_doc},
1160 {"count", (PyCFunction)deque_count,
1161 METH_O, count_doc},
1162 {"extend", (PyCFunction)deque_extend,
1163 METH_O, extend_doc},
1164 {"extendleft", (PyCFunction)deque_extendleft,
1165 METH_O, extendleft_doc},
1166 {"pop", (PyCFunction)deque_pop,
1167 METH_NOARGS, pop_doc},
1168 {"popleft", (PyCFunction)deque_popleft,
1169 METH_NOARGS, popleft_doc},
1170 {"__reduce__", (PyCFunction)deque_reduce,
1171 METH_NOARGS, reduce_doc},
1172 {"remove", (PyCFunction)deque_remove,
1173 METH_O, remove_doc},
1174 {"__reversed__", (PyCFunction)deque_reviter,
1175 METH_NOARGS, reversed_doc},
1176 {"reverse", (PyCFunction)deque_reverse,
1177 METH_NOARGS, reverse_doc},
1178 {"rotate", (PyCFunction)deque_rotate,
Jesus Cead4e58dc2012-08-03 14:48:23 +02001179 METH_VARARGS, rotate_doc},
1180 {"__sizeof__", (PyCFunction)deque_sizeof,
1181 METH_NOARGS, sizeof_doc},
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001182 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001183};
1184
1185PyDoc_STRVAR(deque_doc,
Andrew Svetlov227f59b2012-10-31 11:50:00 +02001186"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001187\n\
Raymond Hettingerdb9d64b2011-03-29 17:28:25 -07001188Build an ordered collection with optimized access from its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001189
Neal Norwitz87f10132004-02-29 15:40:53 +00001190static PyTypeObject deque_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001191 PyVarObject_HEAD_INIT(NULL, 0)
1192 "collections.deque", /* tp_name */
1193 sizeof(dequeobject), /* tp_basicsize */
1194 0, /* tp_itemsize */
1195 /* methods */
1196 (destructor)deque_dealloc, /* tp_dealloc */
1197 deque_tp_print, /* tp_print */
1198 0, /* tp_getattr */
1199 0, /* tp_setattr */
1200 0, /* tp_compare */
1201 deque_repr, /* tp_repr */
1202 0, /* tp_as_number */
1203 &deque_as_sequence, /* tp_as_sequence */
1204 0, /* tp_as_mapping */
1205 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
1206 0, /* tp_call */
1207 0, /* tp_str */
1208 PyObject_GenericGetAttr, /* tp_getattro */
1209 0, /* tp_setattro */
1210 0, /* tp_as_buffer */
1211 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1212 Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
1213 deque_doc, /* tp_doc */
1214 (traverseproc)deque_traverse, /* tp_traverse */
1215 (inquiry)deque_clear, /* tp_clear */
1216 (richcmpfunc)deque_richcompare, /* tp_richcompare */
1217 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
1218 (getiterfunc)deque_iter, /* tp_iter */
1219 0, /* tp_iternext */
1220 deque_methods, /* tp_methods */
1221 0, /* tp_members */
1222 deque_getset, /* tp_getset */
1223 0, /* tp_base */
1224 0, /* tp_dict */
1225 0, /* tp_descr_get */
1226 0, /* tp_descr_set */
1227 0, /* tp_dictoffset */
1228 (initproc)deque_init, /* tp_init */
1229 PyType_GenericAlloc, /* tp_alloc */
1230 deque_new, /* tp_new */
1231 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001232};
1233
1234/*********************** Deque Iterator **************************/
1235
1236typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001237 PyObject_HEAD
1238 Py_ssize_t index;
1239 block *b;
1240 dequeobject *deque;
1241 long state; /* state when the iterator is created */
1242 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001243} dequeiterobject;
1244
Martin v. Löwis111c1802008-06-13 07:47:47 +00001245static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001246
1247static PyObject *
1248deque_iter(dequeobject *deque)
1249{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001251
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001252 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1253 if (it == NULL)
1254 return NULL;
1255 it->b = deque->leftblock;
1256 it->index = deque->leftindex;
1257 Py_INCREF(deque);
1258 it->deque = deque;
1259 it->state = deque->state;
1260 it->counter = deque->len;
1261 PyObject_GC_Track(it);
1262 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001263}
1264
Antoine Pitrouaa687902009-01-01 14:11:22 +00001265static int
1266dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1267{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001268 Py_VISIT(dio->deque);
1269 return 0;
Antoine Pitrouaa687902009-01-01 14:11:22 +00001270}
1271
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001272static void
1273dequeiter_dealloc(dequeiterobject *dio)
1274{
INADA Naoki4cde4bd2017-09-04 12:31:41 +09001275 /* bpo-31095: UnTrack is needed before calling any callbacks */
1276 PyObject_GC_UnTrack(dio);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001277 Py_XDECREF(dio->deque);
1278 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001279}
1280
1281static PyObject *
1282dequeiter_next(dequeiterobject *it)
1283{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001284 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001285
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001286 if (it->deque->state != it->state) {
1287 it->counter = 0;
1288 PyErr_SetString(PyExc_RuntimeError,
1289 "deque mutated during iteration");
1290 return NULL;
1291 }
1292 if (it->counter == 0)
1293 return NULL;
1294 assert (!(it->b == it->deque->rightblock &&
1295 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001296
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001297 item = it->b->data[it->index];
1298 it->index++;
1299 it->counter--;
1300 if (it->index == BLOCKLEN && it->counter > 0) {
1301 assert (it->b->rightlink != NULL);
1302 it->b = it->b->rightlink;
1303 it->index = 0;
1304 }
1305 Py_INCREF(item);
1306 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001307}
1308
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001309static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001310dequeiter_len(dequeiterobject *it)
1311{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001312 return PyInt_FromLong(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001313}
1314
Armin Rigof5b3e362006-02-11 21:32:43 +00001315PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001316
1317static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001318 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
1319 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001320};
1321
Martin v. Löwis111c1802008-06-13 07:47:47 +00001322static PyTypeObject dequeiter_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001323 PyVarObject_HEAD_INIT(NULL, 0)
1324 "deque_iterator", /* tp_name */
1325 sizeof(dequeiterobject), /* tp_basicsize */
1326 0, /* tp_itemsize */
1327 /* methods */
1328 (destructor)dequeiter_dealloc, /* tp_dealloc */
1329 0, /* tp_print */
1330 0, /* tp_getattr */
1331 0, /* tp_setattr */
1332 0, /* tp_compare */
1333 0, /* tp_repr */
1334 0, /* tp_as_number */
1335 0, /* tp_as_sequence */
1336 0, /* tp_as_mapping */
1337 0, /* tp_hash */
1338 0, /* tp_call */
1339 0, /* tp_str */
1340 PyObject_GenericGetAttr, /* tp_getattro */
1341 0, /* tp_setattro */
1342 0, /* tp_as_buffer */
1343 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1344 0, /* tp_doc */
1345 (traverseproc)dequeiter_traverse, /* tp_traverse */
1346 0, /* tp_clear */
1347 0, /* tp_richcompare */
1348 0, /* tp_weaklistoffset */
1349 PyObject_SelfIter, /* tp_iter */
1350 (iternextfunc)dequeiter_next, /* tp_iternext */
1351 dequeiter_methods, /* tp_methods */
1352 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001353};
1354
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001355/*********************** Deque Reverse Iterator **************************/
1356
Martin v. Löwis111c1802008-06-13 07:47:47 +00001357static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001358
1359static PyObject *
1360deque_reviter(dequeobject *deque)
1361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001362 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001364 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1365 if (it == NULL)
1366 return NULL;
1367 it->b = deque->rightblock;
1368 it->index = deque->rightindex;
1369 Py_INCREF(deque);
1370 it->deque = deque;
1371 it->state = deque->state;
1372 it->counter = deque->len;
1373 PyObject_GC_Track(it);
1374 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001375}
1376
1377static PyObject *
1378dequereviter_next(dequeiterobject *it)
1379{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001380 PyObject *item;
1381 if (it->counter == 0)
1382 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001383
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001384 if (it->deque->state != it->state) {
1385 it->counter = 0;
1386 PyErr_SetString(PyExc_RuntimeError,
1387 "deque mutated during iteration");
1388 return NULL;
1389 }
1390 assert (!(it->b == it->deque->leftblock &&
1391 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001392
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001393 item = it->b->data[it->index];
1394 it->index--;
1395 it->counter--;
1396 if (it->index == -1 && it->counter > 0) {
1397 assert (it->b->leftlink != NULL);
1398 it->b = it->b->leftlink;
1399 it->index = BLOCKLEN - 1;
1400 }
1401 Py_INCREF(item);
1402 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001403}
1404
Martin v. Löwis111c1802008-06-13 07:47:47 +00001405static PyTypeObject dequereviter_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001406 PyVarObject_HEAD_INIT(NULL, 0)
1407 "deque_reverse_iterator", /* tp_name */
1408 sizeof(dequeiterobject), /* tp_basicsize */
1409 0, /* tp_itemsize */
1410 /* methods */
1411 (destructor)dequeiter_dealloc, /* tp_dealloc */
1412 0, /* tp_print */
1413 0, /* tp_getattr */
1414 0, /* tp_setattr */
1415 0, /* tp_compare */
1416 0, /* tp_repr */
1417 0, /* tp_as_number */
1418 0, /* tp_as_sequence */
1419 0, /* tp_as_mapping */
1420 0, /* tp_hash */
1421 0, /* tp_call */
1422 0, /* tp_str */
1423 PyObject_GenericGetAttr, /* tp_getattro */
1424 0, /* tp_setattro */
1425 0, /* tp_as_buffer */
1426 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1427 0, /* tp_doc */
1428 (traverseproc)dequeiter_traverse, /* tp_traverse */
1429 0, /* tp_clear */
1430 0, /* tp_richcompare */
1431 0, /* tp_weaklistoffset */
1432 PyObject_SelfIter, /* tp_iter */
1433 (iternextfunc)dequereviter_next, /* tp_iternext */
1434 dequeiter_methods, /* tp_methods */
1435 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001436};
1437
Guido van Rossum1968ad32006-02-25 22:38:04 +00001438/* defaultdict type *********************************************************/
1439
1440typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001441 PyDictObject dict;
1442 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001443} defdictobject;
1444
1445static PyTypeObject defdict_type; /* Forward */
1446
1447PyDoc_STRVAR(defdict_missing_doc,
1448"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Georg Brandlb51a57e2007-03-06 13:32:52 +00001449 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001450 self[key] = value = self.default_factory()\n\
1451 return value\n\
1452");
1453
1454static PyObject *
1455defdict_missing(defdictobject *dd, PyObject *key)
1456{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001457 PyObject *factory = dd->default_factory;
1458 PyObject *value;
1459 if (factory == NULL || factory == Py_None) {
1460 /* XXX Call dict.__missing__(key) */
1461 PyObject *tup;
1462 tup = PyTuple_Pack(1, key);
1463 if (!tup) return NULL;
1464 PyErr_SetObject(PyExc_KeyError, tup);
1465 Py_DECREF(tup);
1466 return NULL;
1467 }
1468 value = PyEval_CallObject(factory, NULL);
1469 if (value == NULL)
1470 return value;
1471 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1472 Py_DECREF(value);
1473 return NULL;
1474 }
1475 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001476}
1477
1478PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1479
1480static PyObject *
1481defdict_copy(defdictobject *dd)
1482{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001483 /* This calls the object's class. That only works for subclasses
1484 whose class constructor has the same signature. Subclasses that
1485 define a different constructor signature must override copy().
1486 */
Raymond Hettinger8fdab952009-08-04 19:08:05 +00001487
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001488 if (dd->default_factory == NULL)
1489 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1490 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1491 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001492}
1493
1494static PyObject *
1495defdict_reduce(defdictobject *dd)
1496{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001497 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00001498
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001499 - factory function
1500 - tuple of args for the factory function
1501 - additional state (here None)
1502 - sequence iterator (here None)
1503 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00001504
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001505 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001506
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001507 For this to be useful with pickle.py, the default_factory
1508 must be picklable; e.g., None, a built-in, or a global
1509 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001510
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001511 Both shallow and deep copying are supported, but for deep
1512 copying, the default_factory must be deep-copyable; e.g. None,
1513 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00001514
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001515 This only works for subclasses as long as their constructor
1516 signature is compatible; the first argument must be the
1517 optional default_factory, defaulting to None.
1518 */
1519 PyObject *args;
1520 PyObject *items;
1521 PyObject *result;
1522 if (dd->default_factory == NULL || dd->default_factory == Py_None)
1523 args = PyTuple_New(0);
1524 else
1525 args = PyTuple_Pack(1, dd->default_factory);
1526 if (args == NULL)
1527 return NULL;
1528 items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()");
1529 if (items == NULL) {
1530 Py_DECREF(args);
1531 return NULL;
1532 }
1533 result = PyTuple_Pack(5, Py_TYPE(dd), args,
1534 Py_None, Py_None, items);
1535 Py_DECREF(items);
1536 Py_DECREF(args);
1537 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001538}
1539
1540static PyMethodDef defdict_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001541 {"__missing__", (PyCFunction)defdict_missing, METH_O,
1542 defdict_missing_doc},
1543 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1544 defdict_copy_doc},
1545 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1546 defdict_copy_doc},
1547 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1548 reduce_doc},
1549 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001550};
1551
1552static PyMemberDef defdict_members[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001553 {"default_factory", T_OBJECT,
1554 offsetof(defdictobject, default_factory), 0,
1555 PyDoc_STR("Factory for default value called by __missing__().")},
1556 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001557};
1558
1559static void
1560defdict_dealloc(defdictobject *dd)
1561{
INADA Naoki4cde4bd2017-09-04 12:31:41 +09001562 /* bpo-31095: UnTrack is needed before calling any callbacks */
1563 PyObject_GC_UnTrack(dd);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001564 Py_CLEAR(dd->default_factory);
1565 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001566}
1567
1568static int
1569defdict_print(defdictobject *dd, FILE *fp, int flags)
1570{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001571 int sts;
1572 Py_BEGIN_ALLOW_THREADS
1573 fprintf(fp, "defaultdict(");
1574 Py_END_ALLOW_THREADS
1575 if (dd->default_factory == NULL) {
1576 Py_BEGIN_ALLOW_THREADS
1577 fprintf(fp, "None");
1578 Py_END_ALLOW_THREADS
1579 } else {
1580 PyObject_Print(dd->default_factory, fp, 0);
1581 }
1582 Py_BEGIN_ALLOW_THREADS
1583 fprintf(fp, ", ");
1584 Py_END_ALLOW_THREADS
1585 sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);
1586 Py_BEGIN_ALLOW_THREADS
1587 fprintf(fp, ")");
1588 Py_END_ALLOW_THREADS
1589 return sts;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001590}
1591
1592static PyObject *
1593defdict_repr(defdictobject *dd)
1594{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001595 PyObject *defrepr;
1596 PyObject *baserepr;
1597 PyObject *result;
1598 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
1599 if (baserepr == NULL)
1600 return NULL;
1601 if (dd->default_factory == NULL)
1602 defrepr = PyString_FromString("None");
1603 else
1604 {
1605 int status = Py_ReprEnter(dd->default_factory);
1606 if (status != 0) {
Antoine Pitrouc39cd782012-02-15 02:42:46 +01001607 if (status < 0) {
1608 Py_DECREF(baserepr);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001609 return NULL;
Antoine Pitrouc39cd782012-02-15 02:42:46 +01001610 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001611 defrepr = PyString_FromString("...");
1612 }
1613 else
1614 defrepr = PyObject_Repr(dd->default_factory);
1615 Py_ReprLeave(dd->default_factory);
1616 }
1617 if (defrepr == NULL) {
1618 Py_DECREF(baserepr);
1619 return NULL;
1620 }
1621 result = PyString_FromFormat("defaultdict(%s, %s)",
1622 PyString_AS_STRING(defrepr),
1623 PyString_AS_STRING(baserepr));
1624 Py_DECREF(defrepr);
1625 Py_DECREF(baserepr);
1626 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001627}
1628
1629static int
1630defdict_traverse(PyObject *self, visitproc visit, void *arg)
1631{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001632 Py_VISIT(((defdictobject *)self)->default_factory);
1633 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001634}
1635
1636static int
1637defdict_tp_clear(defdictobject *dd)
1638{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001639 Py_CLEAR(dd->default_factory);
1640 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001641}
1642
1643static int
1644defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
1645{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 defdictobject *dd = (defdictobject *)self;
1647 PyObject *olddefault = dd->default_factory;
1648 PyObject *newdefault = NULL;
1649 PyObject *newargs;
1650 int result;
1651 if (args == NULL || !PyTuple_Check(args))
1652 newargs = PyTuple_New(0);
1653 else {
1654 Py_ssize_t n = PyTuple_GET_SIZE(args);
1655 if (n > 0) {
1656 newdefault = PyTuple_GET_ITEM(args, 0);
1657 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
1658 PyErr_SetString(PyExc_TypeError,
Raymond Hettingerfe13eac2015-07-20 03:08:09 -04001659 "first argument must be callable or None");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001660 return -1;
1661 }
1662 }
1663 newargs = PySequence_GetSlice(args, 1, n);
1664 }
1665 if (newargs == NULL)
1666 return -1;
1667 Py_XINCREF(newdefault);
1668 dd->default_factory = newdefault;
1669 result = PyDict_Type.tp_init(self, newargs, kwds);
1670 Py_DECREF(newargs);
1671 Py_XDECREF(olddefault);
1672 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001673}
1674
1675PyDoc_STRVAR(defdict_doc,
Benjamin Peterson06e486c2014-01-13 23:56:05 -05001676"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001677\n\
1678The default factory is called without arguments to produce\n\
1679a new value when a key is not present, in __getitem__ only.\n\
1680A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson06e486c2014-01-13 23:56:05 -05001681All remaining arguments are treated the same as if they were\n\
1682passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001683");
1684
Anthony Baxter3b8ff312006-04-04 15:05:23 +00001685/* See comment in xxsubtype.c */
1686#define DEFERRED_ADDRESS(ADDR) 0
1687
Guido van Rossum1968ad32006-02-25 22:38:04 +00001688static PyTypeObject defdict_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001689 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
1690 "collections.defaultdict", /* tp_name */
1691 sizeof(defdictobject), /* tp_basicsize */
1692 0, /* tp_itemsize */
1693 /* methods */
1694 (destructor)defdict_dealloc, /* tp_dealloc */
1695 (printfunc)defdict_print, /* tp_print */
1696 0, /* tp_getattr */
1697 0, /* tp_setattr */
1698 0, /* tp_compare */
1699 (reprfunc)defdict_repr, /* tp_repr */
1700 0, /* tp_as_number */
1701 0, /* tp_as_sequence */
1702 0, /* tp_as_mapping */
1703 0, /* tp_hash */
1704 0, /* tp_call */
1705 0, /* tp_str */
1706 PyObject_GenericGetAttr, /* tp_getattro */
1707 0, /* tp_setattro */
1708 0, /* tp_as_buffer */
1709 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1710 Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
1711 defdict_doc, /* tp_doc */
1712 defdict_traverse, /* tp_traverse */
1713 (inquiry)defdict_tp_clear, /* tp_clear */
1714 0, /* tp_richcompare */
1715 0, /* tp_weaklistoffset*/
1716 0, /* tp_iter */
1717 0, /* tp_iternext */
1718 defdict_methods, /* tp_methods */
1719 defdict_members, /* tp_members */
1720 0, /* tp_getset */
1721 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
1722 0, /* tp_dict */
1723 0, /* tp_descr_get */
1724 0, /* tp_descr_set */
1725 0, /* tp_dictoffset */
1726 defdict_init, /* tp_init */
1727 PyType_GenericAlloc, /* tp_alloc */
1728 0, /* tp_new */
1729 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00001730};
1731
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001732/* module level code ********************************************************/
1733
1734PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00001735"High performance data structures.\n\
1736- deque: ordered collection accessible from endpoints only\n\
1737- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001738");
1739
1740PyMODINIT_FUNC
Raymond Hettingereb979882007-02-28 18:37:52 +00001741init_collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001742{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001743 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001744
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001745 m = Py_InitModule3("_collections", NULL, module_doc);
1746 if (m == NULL)
1747 return;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 if (PyType_Ready(&deque_type) < 0)
1750 return;
1751 Py_INCREF(&deque_type);
1752 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001753
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001754 defdict_type.tp_base = &PyDict_Type;
1755 if (PyType_Ready(&defdict_type) < 0)
1756 return;
1757 Py_INCREF(&defdict_type);
1758 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001759
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001760 if (PyType_Ready(&dequeiter_type) < 0)
1761 return;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001762
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001763 if (PyType_Ready(&dequereviter_type) < 0)
1764 return;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001765
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001766 return;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001767}