blob: 1dd4b998100572b40d6ae22bfc73708d4a10c694 [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
Benjamin Peterson40056de2013-01-12 21:22:18 -0500642static void
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)
Raymond Hettingere9044272015-10-06 23:12:02 -0400653 return;
654
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);
704 return;
705
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 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000712}
713
714static PyObject *
Raymond Hettinger33fcf9d2008-07-24 00:08:18 +0000715deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000716{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000717 block *b;
718 PyObject *item;
719 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000720
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000721 if (i < 0 || i >= deque->len) {
722 PyErr_SetString(PyExc_IndexError,
723 "deque index out of range");
724 return NULL;
725 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 if (i == 0) {
728 i = deque->leftindex;
729 b = deque->leftblock;
730 } else if (i == deque->len - 1) {
731 i = deque->rightindex;
732 b = deque->rightblock;
733 } else {
734 i += deque->leftindex;
735 n = i / BLOCKLEN;
736 i %= BLOCKLEN;
737 if (index < (deque->len >> 1)) {
738 b = deque->leftblock;
739 while (n--)
740 b = b->rightlink;
741 } else {
742 n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
743 b = deque->rightblock;
744 while (n--)
745 b = b->leftlink;
746 }
747 }
748 item = b->data[i];
749 Py_INCREF(item);
750 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000751}
752
Raymond Hettinger616f4f62004-06-26 04:42:06 +0000753/* delitem() implemented in terms of rotate for simplicity and reasonable
754 performance near the end points. If for some reason this method becomes
Tim Peters1065f752004-10-01 01:03:29 +0000755 popular, it is not hard to re-implement this using direct data movement
Raymond Hettinger616f4f62004-06-26 04:42:06 +0000756 (similar to code in list slice assignment) and achieve a two or threefold
757 performance boost.
758*/
759
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000760static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000761deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000762{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000763 PyObject *item;
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700764 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000765
Benjamin Peterson5863a392015-05-15 12:19:18 -0400766 assert (i >= 0 && i < deque->len);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700767 if (_deque_rotate(deque, -i))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000768 return -1;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000769 item = deque_popleft(deque, NULL);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700770 rv = _deque_rotate(deque, i);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000771 assert (item != NULL);
772 Py_DECREF(item);
Raymond Hettinger79f2c5b2015-05-02 10:53:27 -0700773 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000774}
775
776static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000777deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000778{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000779 PyObject *old_value;
780 block *b;
781 Py_ssize_t n, len=deque->len, halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000782
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000783 if (i < 0 || i >= len) {
784 PyErr_SetString(PyExc_IndexError,
785 "deque index out of range");
786 return -1;
787 }
788 if (v == NULL)
789 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000790
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000791 i += deque->leftindex;
792 n = i / BLOCKLEN;
793 i %= BLOCKLEN;
794 if (index <= halflen) {
795 b = deque->leftblock;
796 while (n--)
797 b = b->rightlink;
798 } else {
799 n = (deque->leftindex + len - 1) / BLOCKLEN - n;
800 b = deque->rightblock;
801 while (n--)
802 b = b->leftlink;
803 }
804 Py_INCREF(v);
805 old_value = b->data[i];
806 b->data[i] = v;
807 Py_DECREF(old_value);
808 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000809}
810
811static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000812deque_clearmethod(dequeobject *deque)
813{
Benjamin Peterson40056de2013-01-12 21:22:18 -0500814 deque_clear(deque);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000815 Py_RETURN_NONE;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000816}
817
818PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
819
820static void
821deque_dealloc(dequeobject *deque)
822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000823 PyObject_GC_UnTrack(deque);
824 if (deque->weakreflist != NULL)
825 PyObject_ClearWeakRefs((PyObject *) deque);
826 if (deque->leftblock != NULL) {
827 deque_clear(deque);
828 assert(deque->leftblock != NULL);
829 freeblock(deque->leftblock);
830 }
831 deque->leftblock = NULL;
832 deque->rightblock = NULL;
833 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000834}
835
836static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000837deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000838{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000839 block *b;
840 PyObject *item;
841 Py_ssize_t index;
842 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000843
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000844 for (b = deque->leftblock; b != NULL; b = b->rightlink) {
845 const Py_ssize_t indexhi = b == deque->rightblock ?
846 deque->rightindex :
847 BLOCKLEN - 1;
Tim Peters10c7e862004-10-01 02:01:04 +0000848
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000849 for (index = indexlo; index <= indexhi; ++index) {
850 item = b->data[index];
851 Py_VISIT(item);
852 }
853 indexlo = 0;
854 }
855 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000856}
857
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000858static PyObject *
859deque_copy(PyObject *deque)
860{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000861 if (((dequeobject *)deque)->maxlen == -1)
862 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
863 else
864 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
865 deque, ((dequeobject *)deque)->maxlen, NULL);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000866}
867
868PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
869
870static PyObject *
871deque_reduce(dequeobject *deque)
872{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000873 PyObject *dict, *result, *aslist;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000874
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000875 dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
876 if (dict == NULL)
877 PyErr_Clear();
878 aslist = PySequence_List((PyObject *)deque);
879 if (aslist == NULL) {
880 Py_XDECREF(dict);
881 return NULL;
882 }
883 if (dict == NULL) {
884 if (deque->maxlen == -1)
885 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
886 else
887 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
888 } else {
889 if (deque->maxlen == -1)
890 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
891 else
892 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
893 }
894 Py_XDECREF(dict);
895 Py_DECREF(aslist);
896 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000897}
898
899PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
900
901static PyObject *
902deque_repr(PyObject *deque)
903{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000904 PyObject *aslist, *result, *fmt;
905 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000906
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000907 i = Py_ReprEnter(deque);
908 if (i != 0) {
909 if (i < 0)
910 return NULL;
911 return PyString_FromString("[...]");
912 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000913
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000914 aslist = PySequence_List(deque);
915 if (aslist == NULL) {
916 Py_ReprLeave(deque);
917 return NULL;
918 }
919 if (((dequeobject *)deque)->maxlen != -1)
920 fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)",
921 ((dequeobject *)deque)->maxlen);
922 else
923 fmt = PyString_FromString("deque(%r)");
924 if (fmt == NULL) {
925 Py_DECREF(aslist);
926 Py_ReprLeave(deque);
927 return NULL;
928 }
929 result = PyString_Format(fmt, aslist);
930 Py_DECREF(fmt);
931 Py_DECREF(aslist);
932 Py_ReprLeave(deque);
933 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000934}
935
936static int
937deque_tp_print(PyObject *deque, FILE *fp, int flags)
938{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000939 PyObject *it, *item;
940 char *emit = ""; /* No separator emitted on first pass */
941 char *separator = ", ";
942 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000943
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000944 i = Py_ReprEnter(deque);
945 if (i != 0) {
946 if (i < 0)
947 return i;
948 Py_BEGIN_ALLOW_THREADS
949 fputs("[...]", fp);
950 Py_END_ALLOW_THREADS
951 return 0;
952 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000953
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000954 it = PyObject_GetIter(deque);
955 if (it == NULL)
956 return -1;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000957
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000958 Py_BEGIN_ALLOW_THREADS
959 fputs("deque([", fp);
960 Py_END_ALLOW_THREADS
961 while ((item = PyIter_Next(it)) != NULL) {
962 Py_BEGIN_ALLOW_THREADS
963 fputs(emit, fp);
964 Py_END_ALLOW_THREADS
965 emit = separator;
966 if (PyObject_Print(item, fp, 0) != 0) {
967 Py_DECREF(item);
968 Py_DECREF(it);
969 Py_ReprLeave(deque);
970 return -1;
971 }
972 Py_DECREF(item);
973 }
974 Py_ReprLeave(deque);
975 Py_DECREF(it);
976 if (PyErr_Occurred())
977 return -1;
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000978
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000979 Py_BEGIN_ALLOW_THREADS
980 if (((dequeobject *)deque)->maxlen == -1)
981 fputs("])", fp);
982 else
983 fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen);
984 Py_END_ALLOW_THREADS
985 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000986}
987
Raymond Hettinger738ec902004-02-29 02:15:56 +0000988static PyObject *
989deque_richcompare(PyObject *v, PyObject *w, int op)
990{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000991 PyObject *it1=NULL, *it2=NULL, *x, *y;
992 Py_ssize_t vs, ws;
993 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +0000994
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000995 if (!PyObject_TypeCheck(v, &deque_type) ||
996 !PyObject_TypeCheck(w, &deque_type)) {
997 Py_INCREF(Py_NotImplemented);
998 return Py_NotImplemented;
999 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001000
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001001 /* Shortcuts */
1002 vs = ((dequeobject *)v)->len;
1003 ws = ((dequeobject *)w)->len;
1004 if (op == Py_EQ) {
1005 if (v == w)
1006 Py_RETURN_TRUE;
1007 if (vs != ws)
1008 Py_RETURN_FALSE;
1009 }
1010 if (op == Py_NE) {
1011 if (v == w)
1012 Py_RETURN_FALSE;
1013 if (vs != ws)
1014 Py_RETURN_TRUE;
1015 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001016
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001017 /* Search for the first index where items are different */
1018 it1 = PyObject_GetIter(v);
1019 if (it1 == NULL)
1020 goto done;
1021 it2 = PyObject_GetIter(w);
1022 if (it2 == NULL)
1023 goto done;
1024 for (;;) {
1025 x = PyIter_Next(it1);
1026 if (x == NULL && PyErr_Occurred())
1027 goto done;
1028 y = PyIter_Next(it2);
1029 if (x == NULL || y == NULL)
1030 break;
1031 b = PyObject_RichCompareBool(x, y, Py_EQ);
1032 if (b == 0) {
1033 cmp = PyObject_RichCompareBool(x, y, op);
1034 Py_DECREF(x);
1035 Py_DECREF(y);
1036 goto done;
1037 }
1038 Py_DECREF(x);
1039 Py_DECREF(y);
1040 if (b == -1)
1041 goto done;
1042 }
1043 /* We reached the end of one deque or both */
1044 Py_XDECREF(x);
1045 Py_XDECREF(y);
1046 if (PyErr_Occurred())
1047 goto done;
1048 switch (op) {
1049 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1050 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1051 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1052 case Py_NE: cmp = x != y; break; /* if one deque continues */
1053 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1054 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1055 }
Tim Peters1065f752004-10-01 01:03:29 +00001056
Raymond Hettinger738ec902004-02-29 02:15:56 +00001057done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001058 Py_XDECREF(it1);
1059 Py_XDECREF(it2);
1060 if (cmp == 1)
1061 Py_RETURN_TRUE;
1062 if (cmp == 0)
1063 Py_RETURN_FALSE;
1064 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001065}
1066
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001067static int
Raymond Hettingera7fc4b12007-10-05 02:47:07 +00001068deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001069{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001070 PyObject *iterable = NULL;
1071 PyObject *maxlenobj = NULL;
1072 Py_ssize_t maxlen = -1;
1073 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001074
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001075 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1076 return -1;
1077 if (maxlenobj != NULL && maxlenobj != Py_None) {
1078 maxlen = PyInt_AsSsize_t(maxlenobj);
1079 if (maxlen == -1 && PyErr_Occurred())
1080 return -1;
1081 if (maxlen < 0) {
1082 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1083 return -1;
1084 }
1085 }
1086 deque->maxlen = maxlen;
Raymond Hettingerf358d2b2015-11-12 18:20:21 -08001087 if (deque->len > 0)
Raymond Hettingere9044272015-10-06 23:12:02 -04001088 deque_clear(deque);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001089 if (iterable != NULL) {
1090 PyObject *rv = deque_extend(deque, iterable);
1091 if (rv == NULL)
1092 return -1;
1093 Py_DECREF(rv);
1094 }
1095 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001096}
1097
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001098static PyObject *
Jesus Cead4e58dc2012-08-03 14:48:23 +02001099deque_sizeof(dequeobject *deque, void *unused)
1100{
1101 Py_ssize_t res;
1102 Py_ssize_t blocks;
1103
Serhiy Storchakac06a6d02015-12-19 20:07:48 +02001104 res = _PyObject_SIZE(Py_TYPE(deque));
Jesus Cead4e58dc2012-08-03 14:48:23 +02001105 blocks = (deque->leftindex + deque->len + BLOCKLEN - 1) / BLOCKLEN;
1106 assert(deque->leftindex + deque->len - 1 ==
1107 (blocks - 1) * BLOCKLEN + deque->rightindex);
1108 res += blocks * sizeof(block);
1109 return PyLong_FromSsize_t(res);
1110}
1111
1112PyDoc_STRVAR(sizeof_doc,
1113"D.__sizeof__() -- size of D in memory, in bytes");
1114
1115static PyObject *
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001116deque_get_maxlen(dequeobject *deque)
1117{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001118 if (deque->maxlen == -1)
1119 Py_RETURN_NONE;
1120 return PyInt_FromSsize_t(deque->maxlen);
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001121}
1122
1123static PyGetSetDef deque_getset[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1125 "maximum size of a deque or None if unbounded"},
1126 {0}
Raymond Hettinger56411aa2009-03-10 12:50:59 +00001127};
1128
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001129static PySequenceMethods deque_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001130 (lenfunc)deque_len, /* sq_length */
1131 0, /* sq_concat */
1132 0, /* sq_repeat */
1133 (ssizeargfunc)deque_item, /* sq_item */
1134 0, /* sq_slice */
1135 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
1136 0, /* sq_ass_slice */
1137 0, /* sq_contains */
1138 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
1139 0, /* sq_inplace_repeat */
Raymond Hettinger0b3263b2009-12-10 06:00:33 +00001140
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001141};
1142
1143/* deque object ********************************************************/
1144
1145static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001146static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001147PyDoc_STRVAR(reversed_doc,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001148 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001149
1150static PyMethodDef deque_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001151 {"append", (PyCFunction)deque_append,
1152 METH_O, append_doc},
1153 {"appendleft", (PyCFunction)deque_appendleft,
1154 METH_O, appendleft_doc},
1155 {"clear", (PyCFunction)deque_clearmethod,
1156 METH_NOARGS, clear_doc},
1157 {"__copy__", (PyCFunction)deque_copy,
1158 METH_NOARGS, copy_doc},
1159 {"count", (PyCFunction)deque_count,
1160 METH_O, count_doc},
1161 {"extend", (PyCFunction)deque_extend,
1162 METH_O, extend_doc},
1163 {"extendleft", (PyCFunction)deque_extendleft,
1164 METH_O, extendleft_doc},
1165 {"pop", (PyCFunction)deque_pop,
1166 METH_NOARGS, pop_doc},
1167 {"popleft", (PyCFunction)deque_popleft,
1168 METH_NOARGS, popleft_doc},
1169 {"__reduce__", (PyCFunction)deque_reduce,
1170 METH_NOARGS, reduce_doc},
1171 {"remove", (PyCFunction)deque_remove,
1172 METH_O, remove_doc},
1173 {"__reversed__", (PyCFunction)deque_reviter,
1174 METH_NOARGS, reversed_doc},
1175 {"reverse", (PyCFunction)deque_reverse,
1176 METH_NOARGS, reverse_doc},
1177 {"rotate", (PyCFunction)deque_rotate,
Jesus Cead4e58dc2012-08-03 14:48:23 +02001178 METH_VARARGS, rotate_doc},
1179 {"__sizeof__", (PyCFunction)deque_sizeof,
1180 METH_NOARGS, sizeof_doc},
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001181 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001182};
1183
1184PyDoc_STRVAR(deque_doc,
Andrew Svetlov227f59b2012-10-31 11:50:00 +02001185"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001186\n\
Raymond Hettingerdb9d64b2011-03-29 17:28:25 -07001187Build an ordered collection with optimized access from its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001188
Neal Norwitz87f10132004-02-29 15:40:53 +00001189static PyTypeObject deque_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001190 PyVarObject_HEAD_INIT(NULL, 0)
1191 "collections.deque", /* tp_name */
1192 sizeof(dequeobject), /* tp_basicsize */
1193 0, /* tp_itemsize */
1194 /* methods */
1195 (destructor)deque_dealloc, /* tp_dealloc */
1196 deque_tp_print, /* tp_print */
1197 0, /* tp_getattr */
1198 0, /* tp_setattr */
1199 0, /* tp_compare */
1200 deque_repr, /* tp_repr */
1201 0, /* tp_as_number */
1202 &deque_as_sequence, /* tp_as_sequence */
1203 0, /* tp_as_mapping */
1204 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
1205 0, /* tp_call */
1206 0, /* tp_str */
1207 PyObject_GenericGetAttr, /* tp_getattro */
1208 0, /* tp_setattro */
1209 0, /* tp_as_buffer */
1210 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1211 Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
1212 deque_doc, /* tp_doc */
1213 (traverseproc)deque_traverse, /* tp_traverse */
1214 (inquiry)deque_clear, /* tp_clear */
1215 (richcmpfunc)deque_richcompare, /* tp_richcompare */
1216 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
1217 (getiterfunc)deque_iter, /* tp_iter */
1218 0, /* tp_iternext */
1219 deque_methods, /* tp_methods */
1220 0, /* tp_members */
1221 deque_getset, /* tp_getset */
1222 0, /* tp_base */
1223 0, /* tp_dict */
1224 0, /* tp_descr_get */
1225 0, /* tp_descr_set */
1226 0, /* tp_dictoffset */
1227 (initproc)deque_init, /* tp_init */
1228 PyType_GenericAlloc, /* tp_alloc */
1229 deque_new, /* tp_new */
1230 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001231};
1232
1233/*********************** Deque Iterator **************************/
1234
1235typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001236 PyObject_HEAD
1237 Py_ssize_t index;
1238 block *b;
1239 dequeobject *deque;
1240 long state; /* state when the iterator is created */
1241 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001242} dequeiterobject;
1243
Martin v. Löwis111c1802008-06-13 07:47:47 +00001244static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001245
1246static PyObject *
1247deque_iter(dequeobject *deque)
1248{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001249 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001250
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001251 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1252 if (it == NULL)
1253 return NULL;
1254 it->b = deque->leftblock;
1255 it->index = deque->leftindex;
1256 Py_INCREF(deque);
1257 it->deque = deque;
1258 it->state = deque->state;
1259 it->counter = deque->len;
1260 PyObject_GC_Track(it);
1261 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001262}
1263
Antoine Pitrouaa687902009-01-01 14:11:22 +00001264static int
1265dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1266{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001267 Py_VISIT(dio->deque);
1268 return 0;
Antoine Pitrouaa687902009-01-01 14:11:22 +00001269}
1270
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001271static void
1272dequeiter_dealloc(dequeiterobject *dio)
1273{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001274 Py_XDECREF(dio->deque);
1275 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001276}
1277
1278static PyObject *
1279dequeiter_next(dequeiterobject *it)
1280{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001281 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001282
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001283 if (it->deque->state != it->state) {
1284 it->counter = 0;
1285 PyErr_SetString(PyExc_RuntimeError,
1286 "deque mutated during iteration");
1287 return NULL;
1288 }
1289 if (it->counter == 0)
1290 return NULL;
1291 assert (!(it->b == it->deque->rightblock &&
1292 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001293
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001294 item = it->b->data[it->index];
1295 it->index++;
1296 it->counter--;
1297 if (it->index == BLOCKLEN && it->counter > 0) {
1298 assert (it->b->rightlink != NULL);
1299 it->b = it->b->rightlink;
1300 it->index = 0;
1301 }
1302 Py_INCREF(item);
1303 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001304}
1305
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001306static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001307dequeiter_len(dequeiterobject *it)
1308{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001309 return PyInt_FromLong(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001310}
1311
Armin Rigof5b3e362006-02-11 21:32:43 +00001312PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001313
1314static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001315 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
1316 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001317};
1318
Martin v. Löwis111c1802008-06-13 07:47:47 +00001319static PyTypeObject dequeiter_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001320 PyVarObject_HEAD_INIT(NULL, 0)
1321 "deque_iterator", /* tp_name */
1322 sizeof(dequeiterobject), /* tp_basicsize */
1323 0, /* tp_itemsize */
1324 /* methods */
1325 (destructor)dequeiter_dealloc, /* tp_dealloc */
1326 0, /* tp_print */
1327 0, /* tp_getattr */
1328 0, /* tp_setattr */
1329 0, /* tp_compare */
1330 0, /* tp_repr */
1331 0, /* tp_as_number */
1332 0, /* tp_as_sequence */
1333 0, /* tp_as_mapping */
1334 0, /* tp_hash */
1335 0, /* tp_call */
1336 0, /* tp_str */
1337 PyObject_GenericGetAttr, /* tp_getattro */
1338 0, /* tp_setattro */
1339 0, /* tp_as_buffer */
1340 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1341 0, /* tp_doc */
1342 (traverseproc)dequeiter_traverse, /* tp_traverse */
1343 0, /* tp_clear */
1344 0, /* tp_richcompare */
1345 0, /* tp_weaklistoffset */
1346 PyObject_SelfIter, /* tp_iter */
1347 (iternextfunc)dequeiter_next, /* tp_iternext */
1348 dequeiter_methods, /* tp_methods */
1349 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001350};
1351
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001352/*********************** Deque Reverse Iterator **************************/
1353
Martin v. Löwis111c1802008-06-13 07:47:47 +00001354static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001355
1356static PyObject *
1357deque_reviter(dequeobject *deque)
1358{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001359 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001361 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1362 if (it == NULL)
1363 return NULL;
1364 it->b = deque->rightblock;
1365 it->index = deque->rightindex;
1366 Py_INCREF(deque);
1367 it->deque = deque;
1368 it->state = deque->state;
1369 it->counter = deque->len;
1370 PyObject_GC_Track(it);
1371 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001372}
1373
1374static PyObject *
1375dequereviter_next(dequeiterobject *it)
1376{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001377 PyObject *item;
1378 if (it->counter == 0)
1379 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001380
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001381 if (it->deque->state != it->state) {
1382 it->counter = 0;
1383 PyErr_SetString(PyExc_RuntimeError,
1384 "deque mutated during iteration");
1385 return NULL;
1386 }
1387 assert (!(it->b == it->deque->leftblock &&
1388 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001389
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001390 item = it->b->data[it->index];
1391 it->index--;
1392 it->counter--;
1393 if (it->index == -1 && it->counter > 0) {
1394 assert (it->b->leftlink != NULL);
1395 it->b = it->b->leftlink;
1396 it->index = BLOCKLEN - 1;
1397 }
1398 Py_INCREF(item);
1399 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001400}
1401
Martin v. Löwis111c1802008-06-13 07:47:47 +00001402static PyTypeObject dequereviter_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001403 PyVarObject_HEAD_INIT(NULL, 0)
1404 "deque_reverse_iterator", /* tp_name */
1405 sizeof(dequeiterobject), /* tp_basicsize */
1406 0, /* tp_itemsize */
1407 /* methods */
1408 (destructor)dequeiter_dealloc, /* tp_dealloc */
1409 0, /* tp_print */
1410 0, /* tp_getattr */
1411 0, /* tp_setattr */
1412 0, /* tp_compare */
1413 0, /* tp_repr */
1414 0, /* tp_as_number */
1415 0, /* tp_as_sequence */
1416 0, /* tp_as_mapping */
1417 0, /* tp_hash */
1418 0, /* tp_call */
1419 0, /* tp_str */
1420 PyObject_GenericGetAttr, /* tp_getattro */
1421 0, /* tp_setattro */
1422 0, /* tp_as_buffer */
1423 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1424 0, /* tp_doc */
1425 (traverseproc)dequeiter_traverse, /* tp_traverse */
1426 0, /* tp_clear */
1427 0, /* tp_richcompare */
1428 0, /* tp_weaklistoffset */
1429 PyObject_SelfIter, /* tp_iter */
1430 (iternextfunc)dequereviter_next, /* tp_iternext */
1431 dequeiter_methods, /* tp_methods */
1432 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001433};
1434
Guido van Rossum1968ad32006-02-25 22:38:04 +00001435/* defaultdict type *********************************************************/
1436
1437typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001438 PyDictObject dict;
1439 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001440} defdictobject;
1441
1442static PyTypeObject defdict_type; /* Forward */
1443
1444PyDoc_STRVAR(defdict_missing_doc,
1445"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Georg Brandlb51a57e2007-03-06 13:32:52 +00001446 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001447 self[key] = value = self.default_factory()\n\
1448 return value\n\
1449");
1450
1451static PyObject *
1452defdict_missing(defdictobject *dd, PyObject *key)
1453{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001454 PyObject *factory = dd->default_factory;
1455 PyObject *value;
1456 if (factory == NULL || factory == Py_None) {
1457 /* XXX Call dict.__missing__(key) */
1458 PyObject *tup;
1459 tup = PyTuple_Pack(1, key);
1460 if (!tup) return NULL;
1461 PyErr_SetObject(PyExc_KeyError, tup);
1462 Py_DECREF(tup);
1463 return NULL;
1464 }
1465 value = PyEval_CallObject(factory, NULL);
1466 if (value == NULL)
1467 return value;
1468 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1469 Py_DECREF(value);
1470 return NULL;
1471 }
1472 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001473}
1474
1475PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1476
1477static PyObject *
1478defdict_copy(defdictobject *dd)
1479{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001480 /* This calls the object's class. That only works for subclasses
1481 whose class constructor has the same signature. Subclasses that
1482 define a different constructor signature must override copy().
1483 */
Raymond Hettinger8fdab952009-08-04 19:08:05 +00001484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001485 if (dd->default_factory == NULL)
1486 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1487 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1488 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001489}
1490
1491static PyObject *
1492defdict_reduce(defdictobject *dd)
1493{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001494 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00001495
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001496 - factory function
1497 - tuple of args for the factory function
1498 - additional state (here None)
1499 - sequence iterator (here None)
1500 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00001501
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001502 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001504 For this to be useful with pickle.py, the default_factory
1505 must be picklable; e.g., None, a built-in, or a global
1506 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001507
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001508 Both shallow and deep copying are supported, but for deep
1509 copying, the default_factory must be deep-copyable; e.g. None,
1510 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00001511
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001512 This only works for subclasses as long as their constructor
1513 signature is compatible; the first argument must be the
1514 optional default_factory, defaulting to None.
1515 */
1516 PyObject *args;
1517 PyObject *items;
1518 PyObject *result;
1519 if (dd->default_factory == NULL || dd->default_factory == Py_None)
1520 args = PyTuple_New(0);
1521 else
1522 args = PyTuple_Pack(1, dd->default_factory);
1523 if (args == NULL)
1524 return NULL;
1525 items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()");
1526 if (items == NULL) {
1527 Py_DECREF(args);
1528 return NULL;
1529 }
1530 result = PyTuple_Pack(5, Py_TYPE(dd), args,
1531 Py_None, Py_None, items);
1532 Py_DECREF(items);
1533 Py_DECREF(args);
1534 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001535}
1536
1537static PyMethodDef defdict_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001538 {"__missing__", (PyCFunction)defdict_missing, METH_O,
1539 defdict_missing_doc},
1540 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1541 defdict_copy_doc},
1542 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1543 defdict_copy_doc},
1544 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1545 reduce_doc},
1546 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001547};
1548
1549static PyMemberDef defdict_members[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001550 {"default_factory", T_OBJECT,
1551 offsetof(defdictobject, default_factory), 0,
1552 PyDoc_STR("Factory for default value called by __missing__().")},
1553 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001554};
1555
1556static void
1557defdict_dealloc(defdictobject *dd)
1558{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001559 Py_CLEAR(dd->default_factory);
1560 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001561}
1562
1563static int
1564defdict_print(defdictobject *dd, FILE *fp, int flags)
1565{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001566 int sts;
1567 Py_BEGIN_ALLOW_THREADS
1568 fprintf(fp, "defaultdict(");
1569 Py_END_ALLOW_THREADS
1570 if (dd->default_factory == NULL) {
1571 Py_BEGIN_ALLOW_THREADS
1572 fprintf(fp, "None");
1573 Py_END_ALLOW_THREADS
1574 } else {
1575 PyObject_Print(dd->default_factory, fp, 0);
1576 }
1577 Py_BEGIN_ALLOW_THREADS
1578 fprintf(fp, ", ");
1579 Py_END_ALLOW_THREADS
1580 sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);
1581 Py_BEGIN_ALLOW_THREADS
1582 fprintf(fp, ")");
1583 Py_END_ALLOW_THREADS
1584 return sts;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001585}
1586
1587static PyObject *
1588defdict_repr(defdictobject *dd)
1589{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001590 PyObject *defrepr;
1591 PyObject *baserepr;
1592 PyObject *result;
1593 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
1594 if (baserepr == NULL)
1595 return NULL;
1596 if (dd->default_factory == NULL)
1597 defrepr = PyString_FromString("None");
1598 else
1599 {
1600 int status = Py_ReprEnter(dd->default_factory);
1601 if (status != 0) {
Antoine Pitrouc39cd782012-02-15 02:42:46 +01001602 if (status < 0) {
1603 Py_DECREF(baserepr);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001604 return NULL;
Antoine Pitrouc39cd782012-02-15 02:42:46 +01001605 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001606 defrepr = PyString_FromString("...");
1607 }
1608 else
1609 defrepr = PyObject_Repr(dd->default_factory);
1610 Py_ReprLeave(dd->default_factory);
1611 }
1612 if (defrepr == NULL) {
1613 Py_DECREF(baserepr);
1614 return NULL;
1615 }
1616 result = PyString_FromFormat("defaultdict(%s, %s)",
1617 PyString_AS_STRING(defrepr),
1618 PyString_AS_STRING(baserepr));
1619 Py_DECREF(defrepr);
1620 Py_DECREF(baserepr);
1621 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001622}
1623
1624static int
1625defdict_traverse(PyObject *self, visitproc visit, void *arg)
1626{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001627 Py_VISIT(((defdictobject *)self)->default_factory);
1628 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001629}
1630
1631static int
1632defdict_tp_clear(defdictobject *dd)
1633{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001634 Py_CLEAR(dd->default_factory);
1635 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001636}
1637
1638static int
1639defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
1640{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001641 defdictobject *dd = (defdictobject *)self;
1642 PyObject *olddefault = dd->default_factory;
1643 PyObject *newdefault = NULL;
1644 PyObject *newargs;
1645 int result;
1646 if (args == NULL || !PyTuple_Check(args))
1647 newargs = PyTuple_New(0);
1648 else {
1649 Py_ssize_t n = PyTuple_GET_SIZE(args);
1650 if (n > 0) {
1651 newdefault = PyTuple_GET_ITEM(args, 0);
1652 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
1653 PyErr_SetString(PyExc_TypeError,
Raymond Hettingerfe13eac2015-07-20 03:08:09 -04001654 "first argument must be callable or None");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001655 return -1;
1656 }
1657 }
1658 newargs = PySequence_GetSlice(args, 1, n);
1659 }
1660 if (newargs == NULL)
1661 return -1;
1662 Py_XINCREF(newdefault);
1663 dd->default_factory = newdefault;
1664 result = PyDict_Type.tp_init(self, newargs, kwds);
1665 Py_DECREF(newargs);
1666 Py_XDECREF(olddefault);
1667 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001668}
1669
1670PyDoc_STRVAR(defdict_doc,
Benjamin Peterson06e486c2014-01-13 23:56:05 -05001671"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001672\n\
1673The default factory is called without arguments to produce\n\
1674a new value when a key is not present, in __getitem__ only.\n\
1675A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson06e486c2014-01-13 23:56:05 -05001676All remaining arguments are treated the same as if they were\n\
1677passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001678");
1679
Anthony Baxter3b8ff312006-04-04 15:05:23 +00001680/* See comment in xxsubtype.c */
1681#define DEFERRED_ADDRESS(ADDR) 0
1682
Guido van Rossum1968ad32006-02-25 22:38:04 +00001683static PyTypeObject defdict_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001684 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
1685 "collections.defaultdict", /* tp_name */
1686 sizeof(defdictobject), /* tp_basicsize */
1687 0, /* tp_itemsize */
1688 /* methods */
1689 (destructor)defdict_dealloc, /* tp_dealloc */
1690 (printfunc)defdict_print, /* tp_print */
1691 0, /* tp_getattr */
1692 0, /* tp_setattr */
1693 0, /* tp_compare */
1694 (reprfunc)defdict_repr, /* tp_repr */
1695 0, /* tp_as_number */
1696 0, /* tp_as_sequence */
1697 0, /* tp_as_mapping */
1698 0, /* tp_hash */
1699 0, /* tp_call */
1700 0, /* tp_str */
1701 PyObject_GenericGetAttr, /* tp_getattro */
1702 0, /* tp_setattro */
1703 0, /* tp_as_buffer */
1704 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1705 Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
1706 defdict_doc, /* tp_doc */
1707 defdict_traverse, /* tp_traverse */
1708 (inquiry)defdict_tp_clear, /* tp_clear */
1709 0, /* tp_richcompare */
1710 0, /* tp_weaklistoffset*/
1711 0, /* tp_iter */
1712 0, /* tp_iternext */
1713 defdict_methods, /* tp_methods */
1714 defdict_members, /* tp_members */
1715 0, /* tp_getset */
1716 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
1717 0, /* tp_dict */
1718 0, /* tp_descr_get */
1719 0, /* tp_descr_set */
1720 0, /* tp_dictoffset */
1721 defdict_init, /* tp_init */
1722 PyType_GenericAlloc, /* tp_alloc */
1723 0, /* tp_new */
1724 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00001725};
1726
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001727/* module level code ********************************************************/
1728
1729PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00001730"High performance data structures.\n\
1731- deque: ordered collection accessible from endpoints only\n\
1732- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001733");
1734
1735PyMODINIT_FUNC
Raymond Hettingereb979882007-02-28 18:37:52 +00001736init_collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001737{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001738 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001739
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 m = Py_InitModule3("_collections", NULL, module_doc);
1741 if (m == NULL)
1742 return;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001743
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001744 if (PyType_Ready(&deque_type) < 0)
1745 return;
1746 Py_INCREF(&deque_type);
1747 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 defdict_type.tp_base = &PyDict_Type;
1750 if (PyType_Ready(&defdict_type) < 0)
1751 return;
1752 Py_INCREF(&defdict_type);
1753 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001755 if (PyType_Ready(&dequeiter_type) < 0)
1756 return;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001757
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001758 if (PyType_Ready(&dequereviter_type) < 0)
1759 return;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001760
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001761 return;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001762}