• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Python.h"
2 #include "structmember.h"
3 
4 /* collections module implementation of a deque() datatype
5    Written and maintained by Raymond D. Hettinger <python@rcn.com>
6    Copyright (c) 2004 Python Software Foundation.
7    All rights reserved.
8 */
9 
10 /* The block length may be set to any number over 1.  Larger numbers
11  * reduce the number of calls to the memory allocator, give faster
12  * indexing and rotation, and reduce the link::data overhead ratio.
13  *
14  * Ideally, the block length will be set to two less than some
15  * multiple of the cache-line length (so that the full block
16  * including the leftlink and rightlink will fit neatly into
17  * cache lines).
18  */
19 
20 #define BLOCKLEN 62
21 #define CENTER ((BLOCKLEN - 1) / 2)
22 
23 /* A `dequeobject` is composed of a doubly-linked list of `block` nodes.
24  * This list is not circular (the leftmost block has leftlink==NULL,
25  * and the rightmost block has rightlink==NULL).  A deque d's first
26  * element is at d.leftblock[leftindex] and its last element is at
27  * d.rightblock[rightindex]; note that, unlike as for Python slice
28  * indices, these indices are inclusive on both ends.  By being inclusive
29  * on both ends, algorithms for left and right operations become
30  * symmetrical which simplifies the design.
31  *
32  * The list of blocks is never empty, so d.leftblock and d.rightblock
33  * are never equal to NULL.
34  *
35  * The indices, d.leftindex and d.rightindex are always in the range
36  *     0 <= index < BLOCKLEN.
37  * Their exact relationship is:
38  *     (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex.
39  *
40  * Empty deques have d.len == 0; d.leftblock==d.rightblock;
41  * d.leftindex == CENTER+1; and d.rightindex == CENTER.
42  * Checking for d.len == 0 is the intended way to see whether d is empty.
43  *
44  * Whenever d.leftblock == d.rightblock,
45  *     d.leftindex + d.len - 1 == d.rightindex.
46  *
47  * However, when d.leftblock != d.rightblock, d.leftindex and d.rightindex
48  * become indices into distinct blocks and either may be larger than the
49  * other.
50  */
51 
52 typedef struct BLOCK {
53     PyObject *data[BLOCKLEN];
54     struct BLOCK *rightlink;
55     struct BLOCK *leftlink;
56 } block;
57 
58 #define MAXFREEBLOCKS 10
59 static Py_ssize_t numfreeblocks = 0;
60 static block *freeblocks[MAXFREEBLOCKS];
61 
62 static block *
newblock(block * leftlink,block * rightlink,Py_ssize_t len)63 newblock(block *leftlink, block *rightlink, Py_ssize_t len) {
64     block *b;
65     /* To prevent len from overflowing PY_SSIZE_T_MAX on 32-bit machines, we
66      * refuse to allocate new blocks if the current len is nearing overflow. */
67     if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) {
68         PyErr_SetString(PyExc_OverflowError,
69                         "cannot add more blocks to the deque");
70         return NULL;
71     }
72     if (numfreeblocks) {
73         numfreeblocks -= 1;
74         b = freeblocks[numfreeblocks];
75     } else {
76         b = PyMem_Malloc(sizeof(block));
77         if (b == NULL) {
78             PyErr_NoMemory();
79             return NULL;
80         }
81     }
82     b->leftlink = leftlink;
83     b->rightlink = rightlink;
84     return b;
85 }
86 
87 static void
freeblock(block * b)88 freeblock(block *b)
89 {
90     if (numfreeblocks < MAXFREEBLOCKS) {
91         freeblocks[numfreeblocks] = b;
92         numfreeblocks++;
93     } else {
94         PyMem_Free(b);
95     }
96 }
97 
98 typedef struct {
99     PyObject_HEAD
100     block *leftblock;
101     block *rightblock;
102     Py_ssize_t leftindex;       /* in range(BLOCKLEN) */
103     Py_ssize_t rightindex;      /* in range(BLOCKLEN) */
104     Py_ssize_t len;
105     long state;         /* incremented whenever the indices move */
106     Py_ssize_t maxlen;
107     PyObject *weakreflist; /* List of weak references */
108 } dequeobject;
109 
110 /* The deque's size limit is d.maxlen.  The limit can be zero or positive.
111  * If there is no limit, then d.maxlen == -1.
112  *
113  * After an item is added to a deque, we check to see if the size has grown past
114  * the limit. If it has, we get the size back down to the limit by popping an
115  * item off of the opposite end.  The methods that can trigger this are append(),
116  * appendleft(), extend(), and extendleft().
117  */
118 
119 #define TRIM(d, popfunction)                                    \
120     if (d->maxlen != -1 && d->len > d->maxlen) {                \
121         PyObject *rv = popfunction(d, NULL);                \
122         assert(rv != NULL  &&  d->len <= d->maxlen);        \
123         Py_DECREF(rv);                                      \
124     }
125 
126 static PyTypeObject deque_type;
127 
128 static PyObject *
deque_new(PyTypeObject * type,PyObject * args,PyObject * kwds)129 deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
130 {
131     dequeobject *deque;
132     block *b;
133 
134     /* create dequeobject structure */
135     deque = (dequeobject *)type->tp_alloc(type, 0);
136     if (deque == NULL)
137         return NULL;
138 
139     b = newblock(NULL, NULL, 0);
140     if (b == NULL) {
141         Py_DECREF(deque);
142         return NULL;
143     }
144 
145     assert(BLOCKLEN >= 2);
146     deque->leftblock = b;
147     deque->rightblock = b;
148     deque->leftindex = CENTER + 1;
149     deque->rightindex = CENTER;
150     deque->len = 0;
151     deque->state = 0;
152     deque->weakreflist = NULL;
153     deque->maxlen = -1;
154 
155     return (PyObject *)deque;
156 }
157 
158 static PyObject *
deque_pop(dequeobject * deque,PyObject * unused)159 deque_pop(dequeobject *deque, PyObject *unused)
160 {
161     PyObject *item;
162     block *prevblock;
163 
164     if (deque->len == 0) {
165         PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
166         return NULL;
167     }
168     item = deque->rightblock->data[deque->rightindex];
169     deque->rightindex--;
170     deque->len--;
171     deque->state++;
172 
173     if (deque->rightindex == -1) {
174         if (deque->len == 0) {
175             assert(deque->leftblock == deque->rightblock);
176             assert(deque->leftindex == deque->rightindex+1);
177             /* re-center instead of freeing a block */
178             deque->leftindex = CENTER + 1;
179             deque->rightindex = CENTER;
180         } else {
181             prevblock = deque->rightblock->leftlink;
182             assert(deque->leftblock != deque->rightblock);
183             freeblock(deque->rightblock);
184             prevblock->rightlink = NULL;
185             deque->rightblock = prevblock;
186             deque->rightindex = BLOCKLEN - 1;
187         }
188     }
189     return item;
190 }
191 
192 PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
193 
194 static PyObject *
deque_popleft(dequeobject * deque,PyObject * unused)195 deque_popleft(dequeobject *deque, PyObject *unused)
196 {
197     PyObject *item;
198     block *prevblock;
199 
200     if (deque->len == 0) {
201         PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
202         return NULL;
203     }
204     assert(deque->leftblock != NULL);
205     item = deque->leftblock->data[deque->leftindex];
206     deque->leftindex++;
207     deque->len--;
208     deque->state++;
209 
210     if (deque->leftindex == BLOCKLEN) {
211         if (deque->len == 0) {
212             assert(deque->leftblock == deque->rightblock);
213             assert(deque->leftindex == deque->rightindex+1);
214             /* re-center instead of freeing a block */
215             deque->leftindex = CENTER + 1;
216             deque->rightindex = CENTER;
217         } else {
218             assert(deque->leftblock != deque->rightblock);
219             prevblock = deque->leftblock->rightlink;
220             freeblock(deque->leftblock);
221             assert(prevblock != NULL);
222             prevblock->leftlink = NULL;
223             deque->leftblock = prevblock;
224             deque->leftindex = 0;
225         }
226     }
227     return item;
228 }
229 
230 PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
231 
232 static PyObject *
deque_append(dequeobject * deque,PyObject * item)233 deque_append(dequeobject *deque, PyObject *item)
234 {
235     deque->state++;
236     if (deque->rightindex == BLOCKLEN-1) {
237         block *b = newblock(deque->rightblock, NULL, deque->len);
238         if (b == NULL)
239             return NULL;
240         assert(deque->rightblock->rightlink == NULL);
241         deque->rightblock->rightlink = b;
242         deque->rightblock = b;
243         deque->rightindex = -1;
244     }
245     Py_INCREF(item);
246     deque->len++;
247     deque->rightindex++;
248     deque->rightblock->data[deque->rightindex] = item;
249     TRIM(deque, deque_popleft);
250     Py_RETURN_NONE;
251 }
252 
253 PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
254 
255 static PyObject *
deque_appendleft(dequeobject * deque,PyObject * item)256 deque_appendleft(dequeobject *deque, PyObject *item)
257 {
258     deque->state++;
259     if (deque->leftindex == 0) {
260         block *b = newblock(NULL, deque->leftblock, deque->len);
261         if (b == NULL)
262             return NULL;
263         assert(deque->leftblock->leftlink == NULL);
264         deque->leftblock->leftlink = b;
265         deque->leftblock = b;
266         deque->leftindex = BLOCKLEN;
267     }
268     Py_INCREF(item);
269     deque->len++;
270     deque->leftindex--;
271     deque->leftblock->data[deque->leftindex] = item;
272     TRIM(deque, deque_pop);
273     Py_RETURN_NONE;
274 }
275 
276 PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
277 
278 
279 /* Run an iterator to exhaustion.  Shortcut for
280    the extend/extendleft methods when maxlen == 0. */
281 static PyObject*
consume_iterator(PyObject * it)282 consume_iterator(PyObject *it)
283 {
284     PyObject *item;
285 
286     while ((item = PyIter_Next(it)) != NULL) {
287         Py_DECREF(item);
288     }
289     Py_DECREF(it);
290     if (PyErr_Occurred())
291         return NULL;
292     Py_RETURN_NONE;
293 }
294 
295 static PyObject *
deque_extend(dequeobject * deque,PyObject * iterable)296 deque_extend(dequeobject *deque, PyObject *iterable)
297 {
298     PyObject *it, *item;
299 
300     /* Handle case where id(deque) == id(iterable) */
301     if ((PyObject *)deque == iterable) {
302         PyObject *result;
303         PyObject *s = PySequence_List(iterable);
304         if (s == NULL)
305             return NULL;
306         result = deque_extend(deque, s);
307         Py_DECREF(s);
308         return result;
309     }
310 
311     it = PyObject_GetIter(iterable);
312     if (it == NULL)
313         return NULL;
314 
315     if (deque->maxlen == 0)
316         return consume_iterator(it);
317 
318     while ((item = PyIter_Next(it)) != NULL) {
319         deque->state++;
320         if (deque->rightindex == BLOCKLEN-1) {
321             block *b = newblock(deque->rightblock, NULL,
322                                 deque->len);
323             if (b == NULL) {
324                 Py_DECREF(item);
325                 Py_DECREF(it);
326                 return NULL;
327             }
328             assert(deque->rightblock->rightlink == NULL);
329             deque->rightblock->rightlink = b;
330             deque->rightblock = b;
331             deque->rightindex = -1;
332         }
333         deque->len++;
334         deque->rightindex++;
335         deque->rightblock->data[deque->rightindex] = item;
336         TRIM(deque, deque_popleft);
337     }
338     Py_DECREF(it);
339     if (PyErr_Occurred())
340         return NULL;
341     Py_RETURN_NONE;
342 }
343 
344 PyDoc_STRVAR(extend_doc,
345 "Extend the right side of the deque with elements from the iterable");
346 
347 static PyObject *
deque_extendleft(dequeobject * deque,PyObject * iterable)348 deque_extendleft(dequeobject *deque, PyObject *iterable)
349 {
350     PyObject *it, *item;
351 
352     /* Handle case where id(deque) == id(iterable) */
353     if ((PyObject *)deque == iterable) {
354         PyObject *result;
355         PyObject *s = PySequence_List(iterable);
356         if (s == NULL)
357             return NULL;
358         result = deque_extendleft(deque, s);
359         Py_DECREF(s);
360         return result;
361     }
362 
363     it = PyObject_GetIter(iterable);
364     if (it == NULL)
365         return NULL;
366 
367     if (deque->maxlen == 0)
368         return consume_iterator(it);
369 
370     while ((item = PyIter_Next(it)) != NULL) {
371         deque->state++;
372         if (deque->leftindex == 0) {
373             block *b = newblock(NULL, deque->leftblock,
374                                 deque->len);
375             if (b == NULL) {
376                 Py_DECREF(item);
377                 Py_DECREF(it);
378                 return NULL;
379             }
380             assert(deque->leftblock->leftlink == NULL);
381             deque->leftblock->leftlink = b;
382             deque->leftblock = b;
383             deque->leftindex = BLOCKLEN;
384         }
385         deque->len++;
386         deque->leftindex--;
387         deque->leftblock->data[deque->leftindex] = item;
388         TRIM(deque, deque_pop);
389     }
390     Py_DECREF(it);
391     if (PyErr_Occurred())
392         return NULL;
393     Py_RETURN_NONE;
394 }
395 
396 PyDoc_STRVAR(extendleft_doc,
397 "Extend the left side of the deque with elements from the iterable");
398 
399 static PyObject *
deque_inplace_concat(dequeobject * deque,PyObject * other)400 deque_inplace_concat(dequeobject *deque, PyObject *other)
401 {
402     PyObject *result;
403 
404     result = deque_extend(deque, other);
405     if (result == NULL)
406         return result;
407     Py_DECREF(result);
408     Py_INCREF(deque);
409     return (PyObject *)deque;
410 }
411 
412 static int
_deque_rotate(dequeobject * deque,Py_ssize_t n)413 _deque_rotate(dequeobject *deque, Py_ssize_t n)
414 {
415     Py_ssize_t m, len=deque->len, halflen=len>>1;
416 
417     if (len <= 1)
418         return 0;
419     if (n > halflen || n < -halflen) {
420         n %= len;
421         if (n > halflen)
422             n -= len;
423         else if (n < -halflen)
424             n += len;
425     }
426     assert(len > 1);
427     assert(-halflen <= n && n <= halflen);
428 
429     deque->state++;
430     while (n > 0) {
431         if (deque->leftindex == 0) {
432             block *b = newblock(NULL, deque->leftblock, len);
433             if (b == NULL)
434                 return -1;
435             assert(deque->leftblock->leftlink == NULL);
436             deque->leftblock->leftlink = b;
437             deque->leftblock = b;
438             deque->leftindex = BLOCKLEN;
439         }
440         assert(deque->leftindex > 0);
441 
442         m = n;
443         if (m > deque->rightindex + 1)
444             m = deque->rightindex + 1;
445         if (m > deque->leftindex)
446             m = deque->leftindex;
447         assert (m > 0 && m <= len);
448         memcpy(&deque->leftblock->data[deque->leftindex - m],
449                &deque->rightblock->data[deque->rightindex + 1 - m],
450                m * sizeof(PyObject *));
451         deque->rightindex -= m;
452         deque->leftindex -= m;
453         n -= m;
454 
455         if (deque->rightindex == -1) {
456             block *prevblock = deque->rightblock->leftlink;
457             assert(deque->rightblock != NULL);
458             assert(deque->leftblock != deque->rightblock);
459             freeblock(deque->rightblock);
460             prevblock->rightlink = NULL;
461             deque->rightblock = prevblock;
462             deque->rightindex = BLOCKLEN - 1;
463         }
464     }
465     while (n < 0) {
466         if (deque->rightindex == BLOCKLEN - 1) {
467             block *b = newblock(deque->rightblock, NULL, len);
468             if (b == NULL)
469                 return -1;
470             assert(deque->rightblock->rightlink == NULL);
471             deque->rightblock->rightlink = b;
472             deque->rightblock = b;
473             deque->rightindex = -1;
474         }
475         assert (deque->rightindex < BLOCKLEN - 1);
476 
477         m = -n;
478         if (m > BLOCKLEN - deque->leftindex)
479             m = BLOCKLEN - deque->leftindex;
480         if (m > BLOCKLEN - 1 - deque->rightindex)
481             m = BLOCKLEN - 1 - deque->rightindex;
482         assert (m > 0 && m <= len);
483         memcpy(&deque->rightblock->data[deque->rightindex + 1],
484                &deque->leftblock->data[deque->leftindex],
485                m * sizeof(PyObject *));
486         deque->leftindex += m;
487         deque->rightindex += m;
488         n += m;
489 
490         if (deque->leftindex == BLOCKLEN) {
491             block *nextblock = deque->leftblock->rightlink;
492             assert(deque->leftblock != deque->rightblock);
493             freeblock(deque->leftblock);
494             assert(nextblock != NULL);
495             nextblock->leftlink = NULL;
496             deque->leftblock = nextblock;
497             deque->leftindex = 0;
498         }
499     }
500     return 0;
501 }
502 
503 static PyObject *
deque_rotate(dequeobject * deque,PyObject * args)504 deque_rotate(dequeobject *deque, PyObject *args)
505 {
506     Py_ssize_t n=1;
507 
508     if (!PyArg_ParseTuple(args, "|n:rotate", &n))
509         return NULL;
510     if (_deque_rotate(deque, n) == 0)
511         Py_RETURN_NONE;
512     return NULL;
513 }
514 
515 PyDoc_STRVAR(rotate_doc,
516 "Rotate the deque n steps to the right (default n=1).  If n is negative, rotates left.");
517 
518 static PyObject *
deque_reverse(dequeobject * deque,PyObject * unused)519 deque_reverse(dequeobject *deque, PyObject *unused)
520 {
521     block *leftblock = deque->leftblock;
522     block *rightblock = deque->rightblock;
523     Py_ssize_t leftindex = deque->leftindex;
524     Py_ssize_t rightindex = deque->rightindex;
525     Py_ssize_t n = (deque->len)/2;
526     Py_ssize_t i;
527     PyObject *tmp;
528 
529     for (i=0 ; i<n ; i++) {
530         /* Validate that pointers haven't met in the middle */
531         assert(leftblock != rightblock || leftindex < rightindex);
532 
533         /* Swap */
534         tmp = leftblock->data[leftindex];
535         leftblock->data[leftindex] = rightblock->data[rightindex];
536         rightblock->data[rightindex] = tmp;
537 
538         /* Advance left block/index pair */
539         leftindex++;
540         if (leftindex == BLOCKLEN) {
541             if (leftblock->rightlink == NULL)
542                 break;
543             leftblock = leftblock->rightlink;
544             leftindex = 0;
545         }
546 
547         /* Step backwards with the right block/index pair */
548         rightindex--;
549         if (rightindex == -1) {
550             if (rightblock->leftlink == NULL)
551                 break;
552             rightblock = rightblock->leftlink;
553             rightindex = BLOCKLEN - 1;
554         }
555     }
556     Py_RETURN_NONE;
557 }
558 
559 PyDoc_STRVAR(reverse_doc,
560 "D.reverse() -- reverse *IN PLACE*");
561 
562 static PyObject *
deque_count(dequeobject * deque,PyObject * v)563 deque_count(dequeobject *deque, PyObject *v)
564 {
565     block *leftblock = deque->leftblock;
566     Py_ssize_t leftindex = deque->leftindex;
567     Py_ssize_t n = deque->len;
568     Py_ssize_t i;
569     Py_ssize_t count = 0;
570     PyObject *item;
571     long start_state = deque->state;
572     int cmp;
573 
574     for (i=0 ; i<n ; i++) {
575         item = leftblock->data[leftindex];
576         cmp = PyObject_RichCompareBool(item, v, Py_EQ);
577         if (cmp > 0)
578             count++;
579         else if (cmp < 0)
580             return NULL;
581 
582         if (start_state != deque->state) {
583             PyErr_SetString(PyExc_RuntimeError,
584                             "deque mutated during iteration");
585             return NULL;
586         }
587 
588         /* Advance left block/index pair */
589         leftindex++;
590         if (leftindex == BLOCKLEN) {
591             if (leftblock->rightlink == NULL)  /* can occur when i==n-1 */
592                 break;
593             leftblock = leftblock->rightlink;
594             leftindex = 0;
595         }
596     }
597     return PyInt_FromSsize_t(count);
598 }
599 
600 PyDoc_STRVAR(count_doc,
601 "D.count(value) -> integer -- return number of occurrences of value");
602 
603 static Py_ssize_t
deque_len(dequeobject * deque)604 deque_len(dequeobject *deque)
605 {
606     return deque->len;
607 }
608 
609 static PyObject *
deque_remove(dequeobject * deque,PyObject * value)610 deque_remove(dequeobject *deque, PyObject *value)
611 {
612     Py_ssize_t i, n=deque->len;
613 
614     for (i=0 ; i<n ; i++) {
615         PyObject *item = deque->leftblock->data[deque->leftindex];
616         int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
617 
618         if (deque->len != n) {
619             PyErr_SetString(PyExc_IndexError,
620                 "deque mutated during remove().");
621             return NULL;
622         }
623         if (cmp > 0) {
624             PyObject *tgt = deque_popleft(deque, NULL);
625             assert (tgt != NULL);
626             if (_deque_rotate(deque, i))
627                 return NULL;
628             Py_DECREF(tgt);
629             Py_RETURN_NONE;
630         }
631         else if (cmp < 0) {
632             _deque_rotate(deque, i);
633             return NULL;
634         }
635         _deque_rotate(deque, -1);
636     }
637     PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
638     return NULL;
639 }
640 
641 PyDoc_STRVAR(remove_doc,
642 "D.remove(value) -- remove first occurrence of value.");
643 
644 static void
deque_clear(dequeobject * deque)645 deque_clear(dequeobject *deque)
646 {
647     PyObject *item;
648 
649     while (deque->len) {
650         item = deque_pop(deque, NULL);
651         assert (item != NULL);
652         Py_DECREF(item);
653     }
654     assert(deque->leftblock == deque->rightblock &&
655            deque->leftindex - 1 == deque->rightindex &&
656            deque->len == 0);
657 }
658 
659 static PyObject *
deque_item(dequeobject * deque,Py_ssize_t i)660 deque_item(dequeobject *deque, Py_ssize_t i)
661 {
662     block *b;
663     PyObject *item;
664     Py_ssize_t n, index=i;
665 
666     if (i < 0 || i >= deque->len) {
667         PyErr_SetString(PyExc_IndexError,
668                         "deque index out of range");
669         return NULL;
670     }
671 
672     if (i == 0) {
673         i = deque->leftindex;
674         b = deque->leftblock;
675     } else if (i == deque->len - 1) {
676         i = deque->rightindex;
677         b = deque->rightblock;
678     } else {
679         i += deque->leftindex;
680         n = i / BLOCKLEN;
681         i %= BLOCKLEN;
682         if (index < (deque->len >> 1)) {
683             b = deque->leftblock;
684             while (n--)
685                 b = b->rightlink;
686         } else {
687             n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
688             b = deque->rightblock;
689             while (n--)
690                 b = b->leftlink;
691         }
692     }
693     item = b->data[i];
694     Py_INCREF(item);
695     return item;
696 }
697 
698 /* delitem() implemented in terms of rotate for simplicity and reasonable
699    performance near the end points.  If for some reason this method becomes
700    popular, it is not hard to re-implement this using direct data movement
701    (similar to code in list slice assignment) and achieve a two or threefold
702    performance boost.
703 */
704 
705 static int
deque_del_item(dequeobject * deque,Py_ssize_t i)706 deque_del_item(dequeobject *deque, Py_ssize_t i)
707 {
708     PyObject *item;
709     int rv;
710 
711     assert (i >= 0 && i < deque->len);
712     if (_deque_rotate(deque, -i))
713         return -1;
714     item = deque_popleft(deque, NULL);
715     rv = _deque_rotate(deque, i);
716     assert (item != NULL);
717     Py_DECREF(item);
718     return rv;
719 }
720 
721 static int
deque_ass_item(dequeobject * deque,Py_ssize_t i,PyObject * v)722 deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
723 {
724     PyObject *old_value;
725     block *b;
726     Py_ssize_t n, len=deque->len, halflen=(len+1)>>1, index=i;
727 
728     if (i < 0 || i >= len) {
729         PyErr_SetString(PyExc_IndexError,
730                         "deque index out of range");
731         return -1;
732     }
733     if (v == NULL)
734         return deque_del_item(deque, i);
735 
736     i += deque->leftindex;
737     n = i / BLOCKLEN;
738     i %= BLOCKLEN;
739     if (index <= halflen) {
740         b = deque->leftblock;
741         while (n--)
742             b = b->rightlink;
743     } else {
744         n = (deque->leftindex + len - 1) / BLOCKLEN - n;
745         b = deque->rightblock;
746         while (n--)
747             b = b->leftlink;
748     }
749     Py_INCREF(v);
750     old_value = b->data[i];
751     b->data[i] = v;
752     Py_DECREF(old_value);
753     return 0;
754 }
755 
756 static PyObject *
deque_clearmethod(dequeobject * deque)757 deque_clearmethod(dequeobject *deque)
758 {
759     deque_clear(deque);
760     Py_RETURN_NONE;
761 }
762 
763 PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
764 
765 static void
deque_dealloc(dequeobject * deque)766 deque_dealloc(dequeobject *deque)
767 {
768     PyObject_GC_UnTrack(deque);
769     if (deque->weakreflist != NULL)
770         PyObject_ClearWeakRefs((PyObject *) deque);
771     if (deque->leftblock != NULL) {
772         deque_clear(deque);
773         assert(deque->leftblock != NULL);
774         freeblock(deque->leftblock);
775     }
776     deque->leftblock = NULL;
777     deque->rightblock = NULL;
778     Py_TYPE(deque)->tp_free(deque);
779 }
780 
781 static int
deque_traverse(dequeobject * deque,visitproc visit,void * arg)782 deque_traverse(dequeobject *deque, visitproc visit, void *arg)
783 {
784     block *b;
785     PyObject *item;
786     Py_ssize_t index;
787     Py_ssize_t indexlo = deque->leftindex;
788 
789     for (b = deque->leftblock; b != NULL; b = b->rightlink) {
790         const Py_ssize_t indexhi = b == deque->rightblock ?
791                                  deque->rightindex :
792                      BLOCKLEN - 1;
793 
794         for (index = indexlo; index <= indexhi; ++index) {
795             item = b->data[index];
796             Py_VISIT(item);
797         }
798         indexlo = 0;
799     }
800     return 0;
801 }
802 
803 static PyObject *
deque_copy(PyObject * deque)804 deque_copy(PyObject *deque)
805 {
806     if (((dequeobject *)deque)->maxlen == -1)
807         return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
808     else
809         return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
810             deque, ((dequeobject *)deque)->maxlen, NULL);
811 }
812 
813 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
814 
815 static PyObject *
deque_reduce(dequeobject * deque)816 deque_reduce(dequeobject *deque)
817 {
818     PyObject *dict, *result, *aslist;
819 
820     dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
821     if (dict == NULL)
822         PyErr_Clear();
823     aslist = PySequence_List((PyObject *)deque);
824     if (aslist == NULL) {
825         Py_XDECREF(dict);
826         return NULL;
827     }
828     if (dict == NULL) {
829         if (deque->maxlen == -1)
830             result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
831         else
832             result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
833     } else {
834         if (deque->maxlen == -1)
835             result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
836         else
837             result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
838     }
839     Py_XDECREF(dict);
840     Py_DECREF(aslist);
841     return result;
842 }
843 
844 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
845 
846 static PyObject *
deque_repr(PyObject * deque)847 deque_repr(PyObject *deque)
848 {
849     PyObject *aslist, *result, *fmt;
850     int i;
851 
852     i = Py_ReprEnter(deque);
853     if (i != 0) {
854         if (i < 0)
855             return NULL;
856         return PyString_FromString("[...]");
857     }
858 
859     aslist = PySequence_List(deque);
860     if (aslist == NULL) {
861         Py_ReprLeave(deque);
862         return NULL;
863     }
864     if (((dequeobject *)deque)->maxlen != -1)
865         fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)",
866                                 ((dequeobject *)deque)->maxlen);
867     else
868         fmt = PyString_FromString("deque(%r)");
869     if (fmt == NULL) {
870         Py_DECREF(aslist);
871         Py_ReprLeave(deque);
872         return NULL;
873     }
874     result = PyString_Format(fmt, aslist);
875     Py_DECREF(fmt);
876     Py_DECREF(aslist);
877     Py_ReprLeave(deque);
878     return result;
879 }
880 
881 static int
deque_tp_print(PyObject * deque,FILE * fp,int flags)882 deque_tp_print(PyObject *deque, FILE *fp, int flags)
883 {
884     PyObject *it, *item;
885     char *emit = "";            /* No separator emitted on first pass */
886     char *separator = ", ";
887     int i;
888 
889     i = Py_ReprEnter(deque);
890     if (i != 0) {
891         if (i < 0)
892             return i;
893         Py_BEGIN_ALLOW_THREADS
894         fputs("[...]", fp);
895         Py_END_ALLOW_THREADS
896         return 0;
897     }
898 
899     it = PyObject_GetIter(deque);
900     if (it == NULL)
901         return -1;
902 
903     Py_BEGIN_ALLOW_THREADS
904     fputs("deque([", fp);
905     Py_END_ALLOW_THREADS
906     while ((item = PyIter_Next(it)) != NULL) {
907         Py_BEGIN_ALLOW_THREADS
908         fputs(emit, fp);
909         Py_END_ALLOW_THREADS
910         emit = separator;
911         if (PyObject_Print(item, fp, 0) != 0) {
912             Py_DECREF(item);
913             Py_DECREF(it);
914             Py_ReprLeave(deque);
915             return -1;
916         }
917         Py_DECREF(item);
918     }
919     Py_ReprLeave(deque);
920     Py_DECREF(it);
921     if (PyErr_Occurred())
922         return -1;
923 
924     Py_BEGIN_ALLOW_THREADS
925     if (((dequeobject *)deque)->maxlen == -1)
926         fputs("])", fp);
927     else
928         fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen);
929     Py_END_ALLOW_THREADS
930     return 0;
931 }
932 
933 static PyObject *
deque_richcompare(PyObject * v,PyObject * w,int op)934 deque_richcompare(PyObject *v, PyObject *w, int op)
935 {
936     PyObject *it1=NULL, *it2=NULL, *x, *y;
937     Py_ssize_t vs, ws;
938     int b, cmp=-1;
939 
940     if (!PyObject_TypeCheck(v, &deque_type) ||
941         !PyObject_TypeCheck(w, &deque_type)) {
942         Py_INCREF(Py_NotImplemented);
943         return Py_NotImplemented;
944     }
945 
946     /* Shortcuts */
947     vs = ((dequeobject *)v)->len;
948     ws = ((dequeobject *)w)->len;
949     if (op == Py_EQ) {
950         if (v == w)
951             Py_RETURN_TRUE;
952         if (vs != ws)
953             Py_RETURN_FALSE;
954     }
955     if (op == Py_NE) {
956         if (v == w)
957             Py_RETURN_FALSE;
958         if (vs != ws)
959             Py_RETURN_TRUE;
960     }
961 
962     /* Search for the first index where items are different */
963     it1 = PyObject_GetIter(v);
964     if (it1 == NULL)
965         goto done;
966     it2 = PyObject_GetIter(w);
967     if (it2 == NULL)
968         goto done;
969     for (;;) {
970         x = PyIter_Next(it1);
971         if (x == NULL && PyErr_Occurred())
972             goto done;
973         y = PyIter_Next(it2);
974         if (x == NULL || y == NULL)
975             break;
976         b = PyObject_RichCompareBool(x, y, Py_EQ);
977         if (b == 0) {
978             cmp = PyObject_RichCompareBool(x, y, op);
979             Py_DECREF(x);
980             Py_DECREF(y);
981             goto done;
982         }
983         Py_DECREF(x);
984         Py_DECREF(y);
985         if (b == -1)
986             goto done;
987     }
988     /* We reached the end of one deque or both */
989     Py_XDECREF(x);
990     Py_XDECREF(y);
991     if (PyErr_Occurred())
992         goto done;
993     switch (op) {
994     case Py_LT: cmp = y != NULL; break;  /* if w was longer */
995     case Py_LE: cmp = x == NULL; break;  /* if v was not longer */
996     case Py_EQ: cmp = x == y;    break;  /* if we reached the end of both */
997     case Py_NE: cmp = x != y;    break;  /* if one deque continues */
998     case Py_GT: cmp = x != NULL; break;  /* if v was longer */
999     case Py_GE: cmp = y == NULL; break;  /* if w was not longer */
1000     }
1001 
1002 done:
1003     Py_XDECREF(it1);
1004     Py_XDECREF(it2);
1005     if (cmp == 1)
1006         Py_RETURN_TRUE;
1007     if (cmp == 0)
1008         Py_RETURN_FALSE;
1009     return NULL;
1010 }
1011 
1012 static int
deque_init(dequeobject * deque,PyObject * args,PyObject * kwdargs)1013 deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
1014 {
1015     PyObject *iterable = NULL;
1016     PyObject *maxlenobj = NULL;
1017     Py_ssize_t maxlen = -1;
1018     char *kwlist[] = {"iterable", "maxlen", 0};
1019 
1020     if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1021         return -1;
1022     if (maxlenobj != NULL && maxlenobj != Py_None) {
1023         maxlen = PyInt_AsSsize_t(maxlenobj);
1024         if (maxlen == -1 && PyErr_Occurred())
1025             return -1;
1026         if (maxlen < 0) {
1027             PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1028             return -1;
1029         }
1030     }
1031     deque->maxlen = maxlen;
1032     deque_clear(deque);
1033     if (iterable != NULL) {
1034         PyObject *rv = deque_extend(deque, iterable);
1035         if (rv == NULL)
1036             return -1;
1037         Py_DECREF(rv);
1038     }
1039     return 0;
1040 }
1041 
1042 static PyObject *
deque_sizeof(dequeobject * deque,void * unused)1043 deque_sizeof(dequeobject *deque, void *unused)
1044 {
1045     Py_ssize_t res;
1046     Py_ssize_t blocks;
1047 
1048     res = sizeof(dequeobject);
1049     blocks = (deque->leftindex + deque->len + BLOCKLEN - 1) / BLOCKLEN;
1050     assert(deque->leftindex + deque->len - 1 ==
1051            (blocks - 1) * BLOCKLEN + deque->rightindex);
1052     res += blocks * sizeof(block);
1053     return PyLong_FromSsize_t(res);
1054 }
1055 
1056 PyDoc_STRVAR(sizeof_doc,
1057 "D.__sizeof__() -- size of D in memory, in bytes");
1058 
1059 static PyObject *
deque_get_maxlen(dequeobject * deque)1060 deque_get_maxlen(dequeobject *deque)
1061 {
1062     if (deque->maxlen == -1)
1063         Py_RETURN_NONE;
1064     return PyInt_FromSsize_t(deque->maxlen);
1065 }
1066 
1067 static PyGetSetDef deque_getset[] = {
1068     {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1069      "maximum size of a deque or None if unbounded"},
1070     {0}
1071 };
1072 
1073 static PySequenceMethods deque_as_sequence = {
1074     (lenfunc)deque_len,                 /* sq_length */
1075     0,                                  /* sq_concat */
1076     0,                                  /* sq_repeat */
1077     (ssizeargfunc)deque_item,           /* sq_item */
1078     0,                                  /* sq_slice */
1079     (ssizeobjargproc)deque_ass_item,            /* sq_ass_item */
1080     0,                                  /* sq_ass_slice */
1081     0,                                  /* sq_contains */
1082     (binaryfunc)deque_inplace_concat,           /* sq_inplace_concat */
1083     0,                                  /* sq_inplace_repeat */
1084 
1085 };
1086 
1087 /* deque object ********************************************************/
1088 
1089 static PyObject *deque_iter(dequeobject *deque);
1090 static PyObject *deque_reviter(dequeobject *deque);
1091 PyDoc_STRVAR(reversed_doc,
1092     "D.__reversed__() -- return a reverse iterator over the deque");
1093 
1094 static PyMethodDef deque_methods[] = {
1095     {"append",                  (PyCFunction)deque_append,
1096         METH_O,                  append_doc},
1097     {"appendleft",              (PyCFunction)deque_appendleft,
1098         METH_O,                  appendleft_doc},
1099     {"clear",                   (PyCFunction)deque_clearmethod,
1100         METH_NOARGS,             clear_doc},
1101     {"__copy__",                (PyCFunction)deque_copy,
1102         METH_NOARGS,             copy_doc},
1103     {"count",                   (PyCFunction)deque_count,
1104         METH_O,                         count_doc},
1105     {"extend",                  (PyCFunction)deque_extend,
1106         METH_O,                  extend_doc},
1107     {"extendleft",              (PyCFunction)deque_extendleft,
1108         METH_O,                  extendleft_doc},
1109     {"pop",                     (PyCFunction)deque_pop,
1110         METH_NOARGS,             pop_doc},
1111     {"popleft",                 (PyCFunction)deque_popleft,
1112         METH_NOARGS,             popleft_doc},
1113     {"__reduce__",      (PyCFunction)deque_reduce,
1114         METH_NOARGS,             reduce_doc},
1115     {"remove",                  (PyCFunction)deque_remove,
1116         METH_O,                  remove_doc},
1117     {"__reversed__",            (PyCFunction)deque_reviter,
1118         METH_NOARGS,             reversed_doc},
1119     {"reverse",                 (PyCFunction)deque_reverse,
1120         METH_NOARGS,             reverse_doc},
1121     {"rotate",                  (PyCFunction)deque_rotate,
1122         METH_VARARGS,            rotate_doc},
1123     {"__sizeof__",              (PyCFunction)deque_sizeof,
1124         METH_NOARGS,             sizeof_doc},
1125     {NULL,              NULL}   /* sentinel */
1126 };
1127 
1128 PyDoc_STRVAR(deque_doc,
1129 "deque([iterable[, maxlen]]) --> deque object\n\
1130 \n\
1131 Build an ordered collection with optimized access from its endpoints.");
1132 
1133 static PyTypeObject deque_type = {
1134     PyVarObject_HEAD_INIT(NULL, 0)
1135     "collections.deque",                /* tp_name */
1136     sizeof(dequeobject),                /* tp_basicsize */
1137     0,                                  /* tp_itemsize */
1138     /* methods */
1139     (destructor)deque_dealloc,          /* tp_dealloc */
1140     deque_tp_print,                     /* tp_print */
1141     0,                                  /* tp_getattr */
1142     0,                                  /* tp_setattr */
1143     0,                                  /* tp_compare */
1144     deque_repr,                         /* tp_repr */
1145     0,                                  /* tp_as_number */
1146     &deque_as_sequence,                 /* tp_as_sequence */
1147     0,                                  /* tp_as_mapping */
1148     (hashfunc)PyObject_HashNotImplemented,      /* tp_hash */
1149     0,                                  /* tp_call */
1150     0,                                  /* tp_str */
1151     PyObject_GenericGetAttr,            /* tp_getattro */
1152     0,                                  /* tp_setattro */
1153     0,                                  /* tp_as_buffer */
1154     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1155         Py_TPFLAGS_HAVE_WEAKREFS,               /* tp_flags */
1156     deque_doc,                          /* tp_doc */
1157     (traverseproc)deque_traverse,       /* tp_traverse */
1158     (inquiry)deque_clear,               /* tp_clear */
1159     (richcmpfunc)deque_richcompare,     /* tp_richcompare */
1160     offsetof(dequeobject, weakreflist),         /* tp_weaklistoffset*/
1161     (getiterfunc)deque_iter,            /* tp_iter */
1162     0,                                  /* tp_iternext */
1163     deque_methods,                      /* tp_methods */
1164     0,                                  /* tp_members */
1165     deque_getset,       /* tp_getset */
1166     0,                                  /* tp_base */
1167     0,                                  /* tp_dict */
1168     0,                                  /* tp_descr_get */
1169     0,                                  /* tp_descr_set */
1170     0,                                  /* tp_dictoffset */
1171     (initproc)deque_init,               /* tp_init */
1172     PyType_GenericAlloc,                /* tp_alloc */
1173     deque_new,                          /* tp_new */
1174     PyObject_GC_Del,                    /* tp_free */
1175 };
1176 
1177 /*********************** Deque Iterator **************************/
1178 
1179 typedef struct {
1180     PyObject_HEAD
1181     Py_ssize_t index;
1182     block *b;
1183     dequeobject *deque;
1184     long state;         /* state when the iterator is created */
1185     Py_ssize_t counter;    /* number of items remaining for iteration */
1186 } dequeiterobject;
1187 
1188 static PyTypeObject dequeiter_type;
1189 
1190 static PyObject *
deque_iter(dequeobject * deque)1191 deque_iter(dequeobject *deque)
1192 {
1193     dequeiterobject *it;
1194 
1195     it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1196     if (it == NULL)
1197         return NULL;
1198     it->b = deque->leftblock;
1199     it->index = deque->leftindex;
1200     Py_INCREF(deque);
1201     it->deque = deque;
1202     it->state = deque->state;
1203     it->counter = deque->len;
1204     PyObject_GC_Track(it);
1205     return (PyObject *)it;
1206 }
1207 
1208 static int
dequeiter_traverse(dequeiterobject * dio,visitproc visit,void * arg)1209 dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1210 {
1211     Py_VISIT(dio->deque);
1212     return 0;
1213 }
1214 
1215 static void
dequeiter_dealloc(dequeiterobject * dio)1216 dequeiter_dealloc(dequeiterobject *dio)
1217 {
1218     Py_XDECREF(dio->deque);
1219     PyObject_GC_Del(dio);
1220 }
1221 
1222 static PyObject *
dequeiter_next(dequeiterobject * it)1223 dequeiter_next(dequeiterobject *it)
1224 {
1225     PyObject *item;
1226 
1227     if (it->deque->state != it->state) {
1228         it->counter = 0;
1229         PyErr_SetString(PyExc_RuntimeError,
1230                         "deque mutated during iteration");
1231         return NULL;
1232     }
1233     if (it->counter == 0)
1234         return NULL;
1235     assert (!(it->b == it->deque->rightblock &&
1236               it->index > it->deque->rightindex));
1237 
1238     item = it->b->data[it->index];
1239     it->index++;
1240     it->counter--;
1241     if (it->index == BLOCKLEN && it->counter > 0) {
1242         assert (it->b->rightlink != NULL);
1243         it->b = it->b->rightlink;
1244         it->index = 0;
1245     }
1246     Py_INCREF(item);
1247     return item;
1248 }
1249 
1250 static PyObject *
dequeiter_len(dequeiterobject * it)1251 dequeiter_len(dequeiterobject *it)
1252 {
1253     return PyInt_FromLong(it->counter);
1254 }
1255 
1256 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
1257 
1258 static PyMethodDef dequeiter_methods[] = {
1259     {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
1260     {NULL,              NULL}           /* sentinel */
1261 };
1262 
1263 static PyTypeObject dequeiter_type = {
1264     PyVarObject_HEAD_INIT(NULL, 0)
1265     "deque_iterator",                           /* tp_name */
1266     sizeof(dequeiterobject),                    /* tp_basicsize */
1267     0,                                          /* tp_itemsize */
1268     /* methods */
1269     (destructor)dequeiter_dealloc,              /* tp_dealloc */
1270     0,                                          /* tp_print */
1271     0,                                          /* tp_getattr */
1272     0,                                          /* tp_setattr */
1273     0,                                          /* tp_compare */
1274     0,                                          /* tp_repr */
1275     0,                                          /* tp_as_number */
1276     0,                                          /* tp_as_sequence */
1277     0,                                          /* tp_as_mapping */
1278     0,                                          /* tp_hash */
1279     0,                                          /* tp_call */
1280     0,                                          /* tp_str */
1281     PyObject_GenericGetAttr,                    /* tp_getattro */
1282     0,                                          /* tp_setattro */
1283     0,                                          /* tp_as_buffer */
1284     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1285     0,                                          /* tp_doc */
1286     (traverseproc)dequeiter_traverse,           /* tp_traverse */
1287     0,                                          /* tp_clear */
1288     0,                                          /* tp_richcompare */
1289     0,                                          /* tp_weaklistoffset */
1290     PyObject_SelfIter,                          /* tp_iter */
1291     (iternextfunc)dequeiter_next,               /* tp_iternext */
1292     dequeiter_methods,                          /* tp_methods */
1293     0,
1294 };
1295 
1296 /*********************** Deque Reverse Iterator **************************/
1297 
1298 static PyTypeObject dequereviter_type;
1299 
1300 static PyObject *
deque_reviter(dequeobject * deque)1301 deque_reviter(dequeobject *deque)
1302 {
1303     dequeiterobject *it;
1304 
1305     it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1306     if (it == NULL)
1307         return NULL;
1308     it->b = deque->rightblock;
1309     it->index = deque->rightindex;
1310     Py_INCREF(deque);
1311     it->deque = deque;
1312     it->state = deque->state;
1313     it->counter = deque->len;
1314     PyObject_GC_Track(it);
1315     return (PyObject *)it;
1316 }
1317 
1318 static PyObject *
dequereviter_next(dequeiterobject * it)1319 dequereviter_next(dequeiterobject *it)
1320 {
1321     PyObject *item;
1322     if (it->counter == 0)
1323         return NULL;
1324 
1325     if (it->deque->state != it->state) {
1326         it->counter = 0;
1327         PyErr_SetString(PyExc_RuntimeError,
1328                         "deque mutated during iteration");
1329         return NULL;
1330     }
1331     assert (!(it->b == it->deque->leftblock &&
1332               it->index < it->deque->leftindex));
1333 
1334     item = it->b->data[it->index];
1335     it->index--;
1336     it->counter--;
1337     if (it->index == -1 && it->counter > 0) {
1338         assert (it->b->leftlink != NULL);
1339         it->b = it->b->leftlink;
1340         it->index = BLOCKLEN - 1;
1341     }
1342     Py_INCREF(item);
1343     return item;
1344 }
1345 
1346 static PyTypeObject dequereviter_type = {
1347     PyVarObject_HEAD_INIT(NULL, 0)
1348     "deque_reverse_iterator",                   /* tp_name */
1349     sizeof(dequeiterobject),                    /* tp_basicsize */
1350     0,                                          /* tp_itemsize */
1351     /* methods */
1352     (destructor)dequeiter_dealloc,              /* tp_dealloc */
1353     0,                                          /* tp_print */
1354     0,                                          /* tp_getattr */
1355     0,                                          /* tp_setattr */
1356     0,                                          /* tp_compare */
1357     0,                                          /* tp_repr */
1358     0,                                          /* tp_as_number */
1359     0,                                          /* tp_as_sequence */
1360     0,                                          /* tp_as_mapping */
1361     0,                                          /* tp_hash */
1362     0,                                          /* tp_call */
1363     0,                                          /* tp_str */
1364     PyObject_GenericGetAttr,                    /* tp_getattro */
1365     0,                                          /* tp_setattro */
1366     0,                                          /* tp_as_buffer */
1367     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1368     0,                                          /* tp_doc */
1369     (traverseproc)dequeiter_traverse,           /* tp_traverse */
1370     0,                                          /* tp_clear */
1371     0,                                          /* tp_richcompare */
1372     0,                                          /* tp_weaklistoffset */
1373     PyObject_SelfIter,                          /* tp_iter */
1374     (iternextfunc)dequereviter_next,            /* tp_iternext */
1375     dequeiter_methods,                          /* tp_methods */
1376     0,
1377 };
1378 
1379 /* defaultdict type *********************************************************/
1380 
1381 typedef struct {
1382     PyDictObject dict;
1383     PyObject *default_factory;
1384 } defdictobject;
1385 
1386 static PyTypeObject defdict_type; /* Forward */
1387 
1388 PyDoc_STRVAR(defdict_missing_doc,
1389 "__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
1390   if self.default_factory is None: raise KeyError((key,))\n\
1391   self[key] = value = self.default_factory()\n\
1392   return value\n\
1393 ");
1394 
1395 static PyObject *
defdict_missing(defdictobject * dd,PyObject * key)1396 defdict_missing(defdictobject *dd, PyObject *key)
1397 {
1398     PyObject *factory = dd->default_factory;
1399     PyObject *value;
1400     if (factory == NULL || factory == Py_None) {
1401         /* XXX Call dict.__missing__(key) */
1402         PyObject *tup;
1403         tup = PyTuple_Pack(1, key);
1404         if (!tup) return NULL;
1405         PyErr_SetObject(PyExc_KeyError, tup);
1406         Py_DECREF(tup);
1407         return NULL;
1408     }
1409     value = PyEval_CallObject(factory, NULL);
1410     if (value == NULL)
1411         return value;
1412     if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1413         Py_DECREF(value);
1414         return NULL;
1415     }
1416     return value;
1417 }
1418 
1419 PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1420 
1421 static PyObject *
defdict_copy(defdictobject * dd)1422 defdict_copy(defdictobject *dd)
1423 {
1424     /* This calls the object's class.  That only works for subclasses
1425        whose class constructor has the same signature.  Subclasses that
1426        define a different constructor signature must override copy().
1427     */
1428 
1429     if (dd->default_factory == NULL)
1430         return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1431     return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1432                                         dd->default_factory, dd, NULL);
1433 }
1434 
1435 static PyObject *
defdict_reduce(defdictobject * dd)1436 defdict_reduce(defdictobject *dd)
1437 {
1438     /* __reduce__ must return a 5-tuple as follows:
1439 
1440        - factory function
1441        - tuple of args for the factory function
1442        - additional state (here None)
1443        - sequence iterator (here None)
1444        - dictionary iterator (yielding successive (key, value) pairs
1445 
1446        This API is used by pickle.py and copy.py.
1447 
1448        For this to be useful with pickle.py, the default_factory
1449        must be picklable; e.g., None, a built-in, or a global
1450        function in a module or package.
1451 
1452        Both shallow and deep copying are supported, but for deep
1453        copying, the default_factory must be deep-copyable; e.g. None,
1454        or a built-in (functions are not copyable at this time).
1455 
1456        This only works for subclasses as long as their constructor
1457        signature is compatible; the first argument must be the
1458        optional default_factory, defaulting to None.
1459     */
1460     PyObject *args;
1461     PyObject *items;
1462     PyObject *result;
1463     if (dd->default_factory == NULL || dd->default_factory == Py_None)
1464         args = PyTuple_New(0);
1465     else
1466         args = PyTuple_Pack(1, dd->default_factory);
1467     if (args == NULL)
1468         return NULL;
1469     items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()");
1470     if (items == NULL) {
1471         Py_DECREF(args);
1472         return NULL;
1473     }
1474     result = PyTuple_Pack(5, Py_TYPE(dd), args,
1475                           Py_None, Py_None, items);
1476     Py_DECREF(items);
1477     Py_DECREF(args);
1478     return result;
1479 }
1480 
1481 static PyMethodDef defdict_methods[] = {
1482     {"__missing__", (PyCFunction)defdict_missing, METH_O,
1483      defdict_missing_doc},
1484     {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1485      defdict_copy_doc},
1486     {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1487      defdict_copy_doc},
1488     {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1489      reduce_doc},
1490     {NULL}
1491 };
1492 
1493 static PyMemberDef defdict_members[] = {
1494     {"default_factory", T_OBJECT,
1495      offsetof(defdictobject, default_factory), 0,
1496      PyDoc_STR("Factory for default value called by __missing__().")},
1497     {NULL}
1498 };
1499 
1500 static void
defdict_dealloc(defdictobject * dd)1501 defdict_dealloc(defdictobject *dd)
1502 {
1503     Py_CLEAR(dd->default_factory);
1504     PyDict_Type.tp_dealloc((PyObject *)dd);
1505 }
1506 
1507 static int
defdict_print(defdictobject * dd,FILE * fp,int flags)1508 defdict_print(defdictobject *dd, FILE *fp, int flags)
1509 {
1510     int sts;
1511     Py_BEGIN_ALLOW_THREADS
1512     fprintf(fp, "defaultdict(");
1513     Py_END_ALLOW_THREADS
1514     if (dd->default_factory == NULL) {
1515         Py_BEGIN_ALLOW_THREADS
1516         fprintf(fp, "None");
1517         Py_END_ALLOW_THREADS
1518     } else {
1519         PyObject_Print(dd->default_factory, fp, 0);
1520     }
1521     Py_BEGIN_ALLOW_THREADS
1522     fprintf(fp, ", ");
1523     Py_END_ALLOW_THREADS
1524     sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);
1525     Py_BEGIN_ALLOW_THREADS
1526     fprintf(fp, ")");
1527     Py_END_ALLOW_THREADS
1528     return sts;
1529 }
1530 
1531 static PyObject *
defdict_repr(defdictobject * dd)1532 defdict_repr(defdictobject *dd)
1533 {
1534     PyObject *defrepr;
1535     PyObject *baserepr;
1536     PyObject *result;
1537     baserepr = PyDict_Type.tp_repr((PyObject *)dd);
1538     if (baserepr == NULL)
1539         return NULL;
1540     if (dd->default_factory == NULL)
1541         defrepr = PyString_FromString("None");
1542     else
1543     {
1544         int status = Py_ReprEnter(dd->default_factory);
1545         if (status != 0) {
1546             if (status < 0) {
1547                 Py_DECREF(baserepr);
1548                 return NULL;
1549             }
1550             defrepr = PyString_FromString("...");
1551         }
1552         else
1553             defrepr = PyObject_Repr(dd->default_factory);
1554         Py_ReprLeave(dd->default_factory);
1555     }
1556     if (defrepr == NULL) {
1557         Py_DECREF(baserepr);
1558         return NULL;
1559     }
1560     result = PyString_FromFormat("defaultdict(%s, %s)",
1561                                  PyString_AS_STRING(defrepr),
1562                                  PyString_AS_STRING(baserepr));
1563     Py_DECREF(defrepr);
1564     Py_DECREF(baserepr);
1565     return result;
1566 }
1567 
1568 static int
defdict_traverse(PyObject * self,visitproc visit,void * arg)1569 defdict_traverse(PyObject *self, visitproc visit, void *arg)
1570 {
1571     Py_VISIT(((defdictobject *)self)->default_factory);
1572     return PyDict_Type.tp_traverse(self, visit, arg);
1573 }
1574 
1575 static int
defdict_tp_clear(defdictobject * dd)1576 defdict_tp_clear(defdictobject *dd)
1577 {
1578     Py_CLEAR(dd->default_factory);
1579     return PyDict_Type.tp_clear((PyObject *)dd);
1580 }
1581 
1582 static int
defdict_init(PyObject * self,PyObject * args,PyObject * kwds)1583 defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
1584 {
1585     defdictobject *dd = (defdictobject *)self;
1586     PyObject *olddefault = dd->default_factory;
1587     PyObject *newdefault = NULL;
1588     PyObject *newargs;
1589     int result;
1590     if (args == NULL || !PyTuple_Check(args))
1591         newargs = PyTuple_New(0);
1592     else {
1593         Py_ssize_t n = PyTuple_GET_SIZE(args);
1594         if (n > 0) {
1595             newdefault = PyTuple_GET_ITEM(args, 0);
1596             if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
1597                 PyErr_SetString(PyExc_TypeError,
1598                     "first argument must be callable");
1599                 return -1;
1600             }
1601         }
1602         newargs = PySequence_GetSlice(args, 1, n);
1603     }
1604     if (newargs == NULL)
1605         return -1;
1606     Py_XINCREF(newdefault);
1607     dd->default_factory = newdefault;
1608     result = PyDict_Type.tp_init(self, newargs, kwds);
1609     Py_DECREF(newargs);
1610     Py_XDECREF(olddefault);
1611     return result;
1612 }
1613 
1614 PyDoc_STRVAR(defdict_doc,
1615 "defaultdict(default_factory[, ...]) --> dict with default factory\n\
1616 \n\
1617 The default factory is called without arguments to produce\n\
1618 a new value when a key is not present, in __getitem__ only.\n\
1619 A defaultdict compares equal to a dict with the same items.\n\
1620 All remaining arguments are treated the same as if they were\n\
1621 passed to the dict constructor, including keyword arguments.\n\
1622 ");
1623 
1624 /* See comment in xxsubtype.c */
1625 #define DEFERRED_ADDRESS(ADDR) 0
1626 
1627 static PyTypeObject defdict_type = {
1628     PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
1629     "collections.defaultdict",          /* tp_name */
1630     sizeof(defdictobject),              /* tp_basicsize */
1631     0,                                  /* tp_itemsize */
1632     /* methods */
1633     (destructor)defdict_dealloc,        /* tp_dealloc */
1634     (printfunc)defdict_print,           /* tp_print */
1635     0,                                  /* tp_getattr */
1636     0,                                  /* tp_setattr */
1637     0,                                  /* tp_compare */
1638     (reprfunc)defdict_repr,             /* tp_repr */
1639     0,                                  /* tp_as_number */
1640     0,                                  /* tp_as_sequence */
1641     0,                                  /* tp_as_mapping */
1642     0,                                  /* tp_hash */
1643     0,                                  /* tp_call */
1644     0,                                  /* tp_str */
1645     PyObject_GenericGetAttr,            /* tp_getattro */
1646     0,                                  /* tp_setattro */
1647     0,                                  /* tp_as_buffer */
1648     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
1649         Py_TPFLAGS_HAVE_WEAKREFS,               /* tp_flags */
1650     defdict_doc,                        /* tp_doc */
1651     defdict_traverse,                   /* tp_traverse */
1652     (inquiry)defdict_tp_clear,          /* tp_clear */
1653     0,                                  /* tp_richcompare */
1654     0,                                  /* tp_weaklistoffset*/
1655     0,                                  /* tp_iter */
1656     0,                                  /* tp_iternext */
1657     defdict_methods,                    /* tp_methods */
1658     defdict_members,                    /* tp_members */
1659     0,                                  /* tp_getset */
1660     DEFERRED_ADDRESS(&PyDict_Type),     /* tp_base */
1661     0,                                  /* tp_dict */
1662     0,                                  /* tp_descr_get */
1663     0,                                  /* tp_descr_set */
1664     0,                                  /* tp_dictoffset */
1665     defdict_init,                       /* tp_init */
1666     PyType_GenericAlloc,                /* tp_alloc */
1667     0,                                  /* tp_new */
1668     PyObject_GC_Del,                    /* tp_free */
1669 };
1670 
1671 /* module level code ********************************************************/
1672 
1673 PyDoc_STRVAR(module_doc,
1674 "High performance data structures.\n\
1675 - deque:        ordered collection accessible from endpoints only\n\
1676 - defaultdict:  dict subclass with a default value factory\n\
1677 ");
1678 
1679 PyMODINIT_FUNC
init_collections(void)1680 init_collections(void)
1681 {
1682     PyObject *m;
1683 
1684     m = Py_InitModule3("_collections", NULL, module_doc);
1685     if (m == NULL)
1686         return;
1687 
1688     if (PyType_Ready(&deque_type) < 0)
1689         return;
1690     Py_INCREF(&deque_type);
1691     PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
1692 
1693     defdict_type.tp_base = &PyDict_Type;
1694     if (PyType_Ready(&defdict_type) < 0)
1695         return;
1696     Py_INCREF(&defdict_type);
1697     PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
1698 
1699     if (PyType_Ready(&dequeiter_type) < 0)
1700         return;
1701 
1702     if (PyType_Ready(&dequereviter_type) < 0)
1703         return;
1704 
1705     return;
1706 }
1707