blob: b8b7584282ad9051ca9b148a83810f763f42d157 [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
Raymond Hettingerc2083082015-02-28 23:29:16 -08004#ifdef STDC_HEADERS
5#include <stddef.h>
6#else
7#include <sys/types.h> /* For size_t */
8#endif
9
Raymond Hettinger756b3f32004-01-29 06:37:52 +000010/* collections module implementation of a deque() datatype
11 Written and maintained by Raymond D. Hettinger <python@rcn.com>
Raymond Hettinger756b3f32004-01-29 06:37:52 +000012*/
13
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000014/* The block length may be set to any number over 1. Larger numbers
Raymond Hettinger20b0f872013-06-23 15:44:33 -070015 * reduce the number of calls to the memory allocator, give faster
Raymond Hettinger30c90742015-03-02 22:31:35 -080016 * indexing and rotation, and reduce the link to data overhead ratio.
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080017 * Making the block length a power of two speeds-up the modulo
Raymond Hettinger30c90742015-03-02 22:31:35 -080018 * and division calculations in deque_item() and deque_ass_item().
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000019 */
20
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080021#define BLOCKLEN 64
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000022#define CENTER ((BLOCKLEN - 1) / 2)
Raymond Hettinger756b3f32004-01-29 06:37:52 +000023
Raymond Hettinger551350a2015-03-24 00:19:53 -070024/* Data for deque objects is stored in a doubly-linked list of fixed
25 * length blocks. This assures that appends or pops never move any
26 * other data elements besides the one being appended or popped.
27 *
28 * Another advantage is that it completely avoids use of realloc(),
29 * resulting in more predictable performance.
30 *
31 * Textbook implementations of doubly-linked lists store one datum
32 * per link, but that gives them a 200% memory overhead (a prev and
33 * next link for each datum) and it costs one malloc() call per data
34 * element. By using fixed-length blocks, the link to data ratio is
35 * significantly improved and there are proportionally fewer calls
36 * to malloc() and free(). The data blocks of consecutive pointers
37 * also improve cache locality.
38 *
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000039 * The list of blocks is never empty, so d.leftblock and d.rightblock
Raymond Hettinger82df9252013-07-07 01:43:42 -100040 * are never equal to NULL. The list is not circular.
41 *
42 * A deque d's first element is at d.leftblock[leftindex]
43 * and its last element is at d.rightblock[rightindex].
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000044 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070045 * Unlike Python slice indices, these indices are inclusive on both
46 * ends. This makes the algorithms for left and right operations
47 * more symmetrical and it simplifies the design.
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000048 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070049 * The indices, d.leftindex and d.rightindex are always in the range:
50 * 0 <= index < BLOCKLEN
51 *
52 * And their exact relationship is:
53 * (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000054 *
Raymond Hettinger8dbbae22015-03-24 21:01:50 -070055 * Whenever d.leftblock == d.rightblock, then:
Raymond Hettinger551350a2015-03-24 00:19:53 -070056 * d.leftindex + d.len - 1 == d.rightindex
Thomas Wouters0e3f5912006-08-11 14:57:12 +000057 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070058 * However, when d.leftblock != d.rightblock, the d.leftindex and
59 * d.rightindex become indices into distinct blocks and either may
60 * be larger than the other.
61 *
62 * Empty deques have:
63 * d.len == 0
64 * d.leftblock == d.rightblock
65 * d.leftindex == CENTER + 1
66 * d.rightindex == CENTER
67 *
68 * Checking for d.len == 0 is the intended way to see whether d is empty.
Tim Petersd8768d32004-10-01 01:32:53 +000069 */
70
Raymond Hettinger756b3f32004-01-29 06:37:52 +000071typedef struct BLOCK {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 struct BLOCK *leftlink;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 PyObject *data[BLOCKLEN];
Raymond Hettinger20b0f872013-06-23 15:44:33 -070074 struct BLOCK *rightlink;
Raymond Hettinger756b3f32004-01-29 06:37:52 +000075} block;
76
Raymond Hettinger30c90742015-03-02 22:31:35 -080077typedef struct {
78 PyObject_VAR_HEAD
79 block *leftblock;
80 block *rightblock;
Raymond Hettinger551350a2015-03-24 00:19:53 -070081 Py_ssize_t leftindex; /* 0 <= leftindex < BLOCKLEN */
82 Py_ssize_t rightindex; /* 0 <= rightindex < BLOCKLEN */
Raymond Hettingerf9d9c792015-03-02 22:47:46 -080083 size_t state; /* incremented whenever the indices move */
Raymond Hettingerd84ec222016-01-24 09:12:06 -080084 Py_ssize_t maxlen; /* maxlen is -1 for unbounded deques */
Raymond Hettinger0f6f9472015-03-21 01:42:10 -070085 PyObject *weakreflist;
Raymond Hettinger30c90742015-03-02 22:31:35 -080086} dequeobject;
87
88static PyTypeObject deque_type;
89
Raymond Hettinger82df9252013-07-07 01:43:42 -100090/* For debug builds, add error checking to track the endpoints
91 * in the chain of links. The goal is to make sure that link
92 * assignments only take place at endpoints so that links already
93 * in use do not get overwritten.
94 *
95 * CHECK_END should happen before each assignment to a block's link field.
96 * MARK_END should happen whenever a link field becomes a new endpoint.
97 * This happens when new blocks are added or whenever an existing
98 * block is freed leaving another existing block as the new endpoint.
99 */
100
Raymond Hettinger3223dd52013-07-26 23:14:22 -0700101#ifndef NDEBUG
Raymond Hettinger82df9252013-07-07 01:43:42 -1000102#define MARK_END(link) link = NULL;
103#define CHECK_END(link) assert(link == NULL);
104#define CHECK_NOT_END(link) assert(link != NULL);
105#else
106#define MARK_END(link)
107#define CHECK_END(link)
108#define CHECK_NOT_END(link)
109#endif
110
111/* A simple freelisting scheme is used to minimize calls to the memory
Raymond Hettinger551350a2015-03-24 00:19:53 -0700112 allocator. It accommodates common use cases where new blocks are being
Raymond Hettinger82df9252013-07-07 01:43:42 -1000113 added at about the same rate as old blocks are being freed.
114 */
115
Raymond Hettingerf2b02ce2015-09-26 17:47:02 -0700116#define MAXFREEBLOCKS 16
Benjamin Petersond6313712008-07-31 16:23:04 +0000117static Py_ssize_t numfreeblocks = 0;
Guido van Rossum58da9312007-11-10 23:39:45 +0000118static block *freeblocks[MAXFREEBLOCKS];
119
Tim Peters6f853562004-10-01 01:04:50 +0000120static block *
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700121newblock(void) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 block *b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 if (numfreeblocks) {
Raymond Hettinger59cf23a2013-02-07 00:57:19 -0500124 numfreeblocks--;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000125 return freeblocks[numfreeblocks];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000127 b = PyMem_Malloc(sizeof(block));
128 if (b != NULL) {
129 return b;
130 }
131 PyErr_NoMemory();
132 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000133}
134
Martin v. Löwis59683e82008-06-13 07:50:45 +0000135static void
Guido van Rossum58da9312007-11-10 23:39:45 +0000136freeblock(block *b)
137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 if (numfreeblocks < MAXFREEBLOCKS) {
139 freeblocks[numfreeblocks] = b;
140 numfreeblocks++;
141 } else {
142 PyMem_Free(b);
143 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000144}
145
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000146static PyObject *
147deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 dequeobject *deque;
150 block *b;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 /* create dequeobject structure */
153 deque = (dequeobject *)type->tp_alloc(type, 0);
154 if (deque == NULL)
155 return NULL;
Tim Peters1065f752004-10-01 01:03:29 +0000156
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700157 b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 if (b == NULL) {
159 Py_DECREF(deque);
160 return NULL;
161 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000162 MARK_END(b->leftlink);
163 MARK_END(b->rightlink);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 assert(BLOCKLEN >= 2);
Raymond Hettinger87e69122015-03-02 23:32:02 -0800166 Py_SIZE(deque) = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 deque->leftblock = b;
168 deque->rightblock = b;
169 deque->leftindex = CENTER + 1;
170 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 deque->state = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 deque->maxlen = -1;
Raymond Hettinger87e69122015-03-02 23:32:02 -0800173 deque->weakreflist = NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 return (PyObject *)deque;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000176}
177
178static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000179deque_pop(dequeobject *deque, PyObject *unused)
180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyObject *item;
182 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000183
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000184 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
186 return NULL;
187 }
188 item = deque->rightblock->data[deque->rightindex];
189 deque->rightindex--;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000190 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000192
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700193 if (deque->rightindex < 0) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700194 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 prevblock = deque->rightblock->leftlink;
196 assert(deque->leftblock != deque->rightblock);
197 freeblock(deque->rightblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000198 CHECK_NOT_END(prevblock);
199 MARK_END(prevblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 deque->rightblock = prevblock;
201 deque->rightindex = BLOCKLEN - 1;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700202 } else {
203 assert(deque->leftblock == deque->rightblock);
204 assert(deque->leftindex == deque->rightindex+1);
205 /* re-center instead of freeing a block */
206 deque->leftindex = CENTER + 1;
207 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 }
209 }
210 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000211}
212
213PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
214
215static PyObject *
216deque_popleft(dequeobject *deque, PyObject *unused)
217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 PyObject *item;
219 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000220
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000221 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
223 return NULL;
224 }
225 assert(deque->leftblock != NULL);
226 item = deque->leftblock->data[deque->leftindex];
227 deque->leftindex++;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000228 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 if (deque->leftindex == BLOCKLEN) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700232 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 assert(deque->leftblock != deque->rightblock);
234 prevblock = deque->leftblock->rightlink;
235 freeblock(deque->leftblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000236 CHECK_NOT_END(prevblock);
237 MARK_END(prevblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 deque->leftblock = prevblock;
239 deque->leftindex = 0;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700240 } else {
241 assert(deque->leftblock == deque->rightblock);
242 assert(deque->leftindex == deque->rightindex+1);
243 /* re-center instead of freeing a block */
244 deque->leftindex = CENTER + 1;
245 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 }
247 }
248 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000249}
250
251PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
252
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800253/* The deque's size limit is d.maxlen. The limit can be zero or positive.
254 * If there is no limit, then d.maxlen == -1.
255 *
Raymond Hettingera4b13d02015-10-15 08:05:31 -0700256 * After an item is added to a deque, we check to see if the size has
257 * grown past the limit. If it has, we get the size back down to the limit
258 * by popping an item off of the opposite end. The methods that can
259 * trigger this are append(), appendleft(), extend(), and extendleft().
Raymond Hettingerd96db092015-10-11 22:34:48 -0700260 *
261 * The macro to check whether a deque needs to be trimmed uses a single
262 * unsigned test that returns true whenever 0 <= maxlen < Py_SIZE(deque).
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800263 */
264
Raymond Hettingerd96db092015-10-11 22:34:48 -0700265#define NEEDS_TRIM(deque, maxlen) ((size_t)(maxlen) < (size_t)(Py_SIZE(deque)))
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800266
doko@ubuntu.combc731502016-05-18 01:06:01 +0200267static int
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800268deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000269{
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700270 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700271 block *b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (b == NULL)
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800273 return -1;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000274 b->leftlink = deque->rightblock;
275 CHECK_END(deque->rightblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 deque->rightblock->rightlink = b;
277 deque->rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000278 MARK_END(b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 deque->rightindex = -1;
280 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000281 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 deque->rightindex++;
283 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800284 if (NEEDS_TRIM(deque, maxlen)) {
Raymond Hettinger1286d142015-10-14 23:16:57 -0700285 PyObject *olditem = deque_popleft(deque, NULL);
286 Py_DECREF(olditem);
Raymond Hettinger0f43bb12015-10-20 00:03:33 -0700287 } else {
288 deque->state++;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700289 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800290 return 0;
291}
292
293static PyObject *
294deque_append(dequeobject *deque, PyObject *item)
295{
296 Py_INCREF(item);
297 if (deque_append_internal(deque, item, deque->maxlen) < 0)
298 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000300}
301
302PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
303
doko@ubuntu.com17f0e612016-06-14 07:27:58 +0200304static int
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800305deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 if (deque->leftindex == 0) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700308 block *b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 if (b == NULL)
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800310 return -1;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000311 b->rightlink = deque->leftblock;
312 CHECK_END(deque->leftblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 deque->leftblock->leftlink = b;
314 deque->leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000315 MARK_END(b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 deque->leftindex = BLOCKLEN;
317 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000318 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 deque->leftindex--;
320 deque->leftblock->data[deque->leftindex] = item;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700321 if (NEEDS_TRIM(deque, deque->maxlen)) {
Raymond Hettinger1286d142015-10-14 23:16:57 -0700322 PyObject *olditem = deque_pop(deque, NULL);
323 Py_DECREF(olditem);
Raymond Hettinger0f43bb12015-10-20 00:03:33 -0700324 } else {
325 deque->state++;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700326 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800327 return 0;
328}
329
330static PyObject *
331deque_appendleft(dequeobject *deque, PyObject *item)
332{
333 Py_INCREF(item);
334 if (deque_appendleft_internal(deque, item, deque->maxlen) < 0)
335 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000337}
338
339PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
340
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700341static PyObject*
342finalize_iterator(PyObject *it)
343{
344 if (PyErr_Occurred()) {
345 if (PyErr_ExceptionMatches(PyExc_StopIteration))
346 PyErr_Clear();
347 else {
348 Py_DECREF(it);
349 return NULL;
350 }
351 }
352 Py_DECREF(it);
353 Py_RETURN_NONE;
354}
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356/* Run an iterator to exhaustion. Shortcut for
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000357 the extend/extendleft methods when maxlen == 0. */
358static PyObject*
359consume_iterator(PyObject *it)
360{
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700361 PyObject *(*iternext)(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 PyObject *item;
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000363
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700364 iternext = *Py_TYPE(it)->tp_iternext;
365 while ((item = iternext(it)) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 Py_DECREF(item);
367 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700368 return finalize_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000369}
370
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000371static PyObject *
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000372deque_extend(dequeobject *deque, PyObject *iterable)
373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 PyObject *it, *item;
Raymond Hettinger7a845522015-09-26 01:30:51 -0700375 PyObject *(*iternext)(PyObject *);
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700376 Py_ssize_t maxlen = deque->maxlen;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 /* Handle case where id(deque) == id(iterable) */
379 if ((PyObject *)deque == iterable) {
380 PyObject *result;
381 PyObject *s = PySequence_List(iterable);
382 if (s == NULL)
383 return NULL;
384 result = deque_extend(deque, s);
385 Py_DECREF(s);
386 return result;
387 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000388
Raymond Hettingerd79d5b12016-03-04 09:55:07 -0800389 it = PyObject_GetIter(iterable);
390 if (it == NULL)
391 return NULL;
392
393 if (maxlen == 0)
394 return consume_iterator(it);
395
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700396 /* Space saving heuristic. Start filling from the left */
397 if (Py_SIZE(deque) == 0) {
398 assert(deque->leftblock == deque->rightblock);
399 assert(deque->leftindex == deque->rightindex+1);
400 deque->leftindex = 1;
401 deque->rightindex = 0;
402 }
403
Raymond Hettinger7a845522015-09-26 01:30:51 -0700404 iternext = *Py_TYPE(it)->tp_iternext;
405 while ((item = iternext(it)) != NULL) {
Raymond Hettinger88057172016-09-11 22:45:53 -0700406 if (deque->rightindex == BLOCKLEN - 1) {
407 block *b = newblock();
408 if (b == NULL) {
409 Py_DECREF(item);
410 Py_DECREF(it);
411 return NULL;
412 }
413 b->leftlink = deque->rightblock;
414 CHECK_END(deque->rightblock->rightlink);
415 deque->rightblock->rightlink = b;
416 deque->rightblock = b;
417 MARK_END(b->rightlink);
418 deque->rightindex = -1;
419 }
420 Py_SIZE(deque)++;
421 deque->rightindex++;
422 deque->rightblock->data[deque->rightindex] = item;
423 if (NEEDS_TRIM(deque, maxlen)) {
424 PyObject *olditem = deque_popleft(deque, NULL);
425 Py_DECREF(olditem);
426 } else {
427 deque->state++;
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700428 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700430 return finalize_iterator(it);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000431}
432
Tim Peters1065f752004-10-01 01:03:29 +0000433PyDoc_STRVAR(extend_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000434"Extend the right side of the deque with elements from the iterable");
435
436static PyObject *
437deque_extendleft(dequeobject *deque, PyObject *iterable)
438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 PyObject *it, *item;
Raymond Hettinger7a845522015-09-26 01:30:51 -0700440 PyObject *(*iternext)(PyObject *);
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700441 Py_ssize_t maxlen = deque->maxlen;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 /* Handle case where id(deque) == id(iterable) */
444 if ((PyObject *)deque == iterable) {
445 PyObject *result;
446 PyObject *s = PySequence_List(iterable);
447 if (s == NULL)
448 return NULL;
449 result = deque_extendleft(deque, s);
450 Py_DECREF(s);
451 return result;
452 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000453
Raymond Hettingerd79d5b12016-03-04 09:55:07 -0800454 it = PyObject_GetIter(iterable);
455 if (it == NULL)
456 return NULL;
457
458 if (maxlen == 0)
459 return consume_iterator(it);
460
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700461 /* Space saving heuristic. Start filling from the right */
462 if (Py_SIZE(deque) == 0) {
463 assert(deque->leftblock == deque->rightblock);
464 assert(deque->leftindex == deque->rightindex+1);
465 deque->leftindex = BLOCKLEN - 1;
466 deque->rightindex = BLOCKLEN - 2;
467 }
468
Raymond Hettinger7a845522015-09-26 01:30:51 -0700469 iternext = *Py_TYPE(it)->tp_iternext;
470 while ((item = iternext(it)) != NULL) {
Raymond Hettinger88057172016-09-11 22:45:53 -0700471 if (deque->leftindex == 0) {
472 block *b = newblock();
473 if (b == NULL) {
474 Py_DECREF(item);
475 Py_DECREF(it);
476 return NULL;
477 }
478 b->rightlink = deque->leftblock;
479 CHECK_END(deque->leftblock->leftlink);
480 deque->leftblock->leftlink = b;
481 deque->leftblock = b;
482 MARK_END(b->leftlink);
483 deque->leftindex = BLOCKLEN;
484 }
485 Py_SIZE(deque)++;
486 deque->leftindex--;
487 deque->leftblock->data[deque->leftindex] = item;
488 if (NEEDS_TRIM(deque, maxlen)) {
489 PyObject *olditem = deque_pop(deque, NULL);
490 Py_DECREF(olditem);
491 } else {
492 deque->state++;
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700495 return finalize_iterator(it);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000496}
497
Tim Peters1065f752004-10-01 01:03:29 +0000498PyDoc_STRVAR(extendleft_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000499"Extend the left side of the deque with elements from the iterable");
500
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000501static PyObject *
502deque_inplace_concat(dequeobject *deque, PyObject *other)
503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 PyObject *result;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 result = deque_extend(deque, other);
507 if (result == NULL)
508 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 Py_INCREF(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700510 Py_DECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 return (PyObject *)deque;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000512}
513
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700514static PyObject *
515deque_copy(PyObject *deque)
516{
517 dequeobject *old_deque = (dequeobject *)deque;
518 if (Py_TYPE(deque) == &deque_type) {
519 dequeobject *new_deque;
520 PyObject *rv;
521
522 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
523 if (new_deque == NULL)
524 return NULL;
525 new_deque->maxlen = old_deque->maxlen;
526 /* Fast path for the deque_repeat() common case where len(deque) == 1 */
Raymond Hettinger0443ac22015-10-05 22:52:37 -0400527 if (Py_SIZE(deque) == 1) {
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700528 PyObject *item = old_deque->leftblock->data[old_deque->leftindex];
529 rv = deque_append(new_deque, item);
530 } else {
531 rv = deque_extend(new_deque, deque);
532 }
533 if (rv != NULL) {
534 Py_DECREF(rv);
535 return (PyObject *)new_deque;
536 }
537 Py_DECREF(new_deque);
538 return NULL;
539 }
540 if (old_deque->maxlen < 0)
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100541 return PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)),
542 deque, NULL);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700543 else
544 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
545 deque, old_deque->maxlen, NULL);
546}
547
548PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700549
550static PyObject *
551deque_concat(dequeobject *deque, PyObject *other)
552{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400553 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700554 int rv;
555
556 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
557 if (rv <= 0) {
558 if (rv == 0) {
559 PyErr_Format(PyExc_TypeError,
560 "can only concatenate deque (not \"%.200s\") to deque",
561 other->ob_type->tp_name);
562 }
563 return NULL;
564 }
565
566 new_deque = deque_copy((PyObject *)deque);
567 if (new_deque == NULL)
568 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400569 result = deque_extend((dequeobject *)new_deque, other);
570 if (result == NULL) {
571 Py_DECREF(new_deque);
572 return NULL;
573 }
574 Py_DECREF(result);
575 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700576}
577
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700578static void
579deque_clear(dequeobject *deque)
580{
581 block *b;
582 block *prevblock;
583 block *leftblock;
584 Py_ssize_t leftindex;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800585 Py_ssize_t n, m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700586 PyObject *item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800587 PyObject **itemptr, **limit;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700588
Raymond Hettinger38031142015-09-29 22:45:05 -0700589 if (Py_SIZE(deque) == 0)
590 return;
591
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700592 /* During the process of clearing a deque, decrefs can cause the
593 deque to mutate. To avoid fatal confusion, we have to make the
594 deque empty before clearing the blocks and never refer to
595 anything via deque->ref while clearing. (This is the same
596 technique used for clearing lists, sets, and dicts.)
597
598 Making the deque empty requires allocating a new empty block. In
599 the unlikely event that memory is full, we fall back to an
600 alternate method that doesn't require a new block. Repeating
601 pops in a while-loop is slower, possibly re-entrant (and a clever
602 adversary could cause it to never terminate).
603 */
604
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700605 b = newblock();
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700606 if (b == NULL) {
607 PyErr_Clear();
608 goto alternate_method;
609 }
610
611 /* Remember the old size, leftblock, and leftindex */
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800612 n = Py_SIZE(deque);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700613 leftblock = deque->leftblock;
614 leftindex = deque->leftindex;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700615
616 /* Set the deque to be empty using the newly allocated block */
617 MARK_END(b->leftlink);
618 MARK_END(b->rightlink);
619 Py_SIZE(deque) = 0;
620 deque->leftblock = b;
621 deque->rightblock = b;
622 deque->leftindex = CENTER + 1;
623 deque->rightindex = CENTER;
624 deque->state++;
625
626 /* Now the old size, leftblock, and leftindex are disconnected from
627 the empty deque and we can use them to decref the pointers.
628 */
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800629 m = (BLOCKLEN - leftindex > n) ? n : BLOCKLEN - leftindex;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800630 itemptr = &leftblock->data[leftindex];
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800631 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800632 n -= m;
633 while (1) {
634 if (itemptr == limit) {
635 if (n == 0)
636 break;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700637 CHECK_NOT_END(leftblock->rightlink);
638 prevblock = leftblock;
639 leftblock = leftblock->rightlink;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800640 m = (n > BLOCKLEN) ? BLOCKLEN : n;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800641 itemptr = leftblock->data;
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800642 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800643 n -= m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700644 freeblock(prevblock);
645 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800646 item = *(itemptr++);
647 Py_DECREF(item);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700648 }
649 CHECK_END(leftblock->rightlink);
650 freeblock(leftblock);
651 return;
652
653 alternate_method:
654 while (Py_SIZE(deque)) {
655 item = deque_pop(deque, NULL);
656 assert (item != NULL);
657 Py_DECREF(item);
658 }
659}
660
661static PyObject *
662deque_clearmethod(dequeobject *deque)
663{
664 deque_clear(deque);
665 Py_RETURN_NONE;
666}
667
668PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700669
670static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700671deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
672{
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700673 Py_ssize_t i, m, size;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700674 PyObject *seq;
675 PyObject *rv;
676
677 size = Py_SIZE(deque);
678 if (size == 0 || n == 1) {
679 Py_INCREF(deque);
680 return (PyObject *)deque;
681 }
682
683 if (n <= 0) {
684 deque_clear(deque);
685 Py_INCREF(deque);
686 return (PyObject *)deque;
687 }
688
Raymond Hettinger41290a62015-03-31 08:12:23 -0700689 if (size == 1) {
690 /* common case, repeating a single element */
691 PyObject *item = deque->leftblock->data[deque->leftindex];
692
Raymond Hettingera7f630092015-10-10 23:56:02 -0400693 if (deque->maxlen >= 0 && n > deque->maxlen)
Raymond Hettinger41290a62015-03-31 08:12:23 -0700694 n = deque->maxlen;
695
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400696 deque->state++;
Raymond Hettingerad262252015-09-14 01:03:04 -0400697 for (i = 0 ; i < n-1 ; ) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400698 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700699 block *b = newblock();
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400700 if (b == NULL) {
701 Py_SIZE(deque) += i;
702 return NULL;
703 }
704 b->leftlink = deque->rightblock;
705 CHECK_END(deque->rightblock->rightlink);
706 deque->rightblock->rightlink = b;
707 deque->rightblock = b;
708 MARK_END(b->rightlink);
709 deque->rightindex = -1;
710 }
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700711 m = n - 1 - i;
712 if (m > BLOCKLEN - 1 - deque->rightindex)
713 m = BLOCKLEN - 1 - deque->rightindex;
714 i += m;
715 while (m--) {
Raymond Hettingerad262252015-09-14 01:03:04 -0400716 deque->rightindex++;
717 Py_INCREF(item);
718 deque->rightblock->data[deque->rightindex] = item;
719 }
Raymond Hettinger41290a62015-03-31 08:12:23 -0700720 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400721 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700722 Py_INCREF(deque);
723 return (PyObject *)deque;
724 }
725
Raymond Hettinger20151f52015-10-16 22:47:29 -0700726 if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400727 return PyErr_NoMemory();
728 }
729
Raymond Hettinger41290a62015-03-31 08:12:23 -0700730 seq = PySequence_List((PyObject *)deque);
731 if (seq == NULL)
732 return seq;
733
734 for (i = 0 ; i < n-1 ; i++) {
735 rv = deque_extend(deque, seq);
736 if (rv == NULL) {
737 Py_DECREF(seq);
738 return NULL;
739 }
740 Py_DECREF(rv);
741 }
742 Py_INCREF(deque);
743 Py_DECREF(seq);
744 return (PyObject *)deque;
745}
746
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400747static PyObject *
748deque_repeat(dequeobject *deque, Py_ssize_t n)
749{
750 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400751 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400752
753 new_deque = (dequeobject *)deque_copy((PyObject *) deque);
754 if (new_deque == NULL)
755 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400756 rv = deque_inplace_repeat(new_deque, n);
757 Py_DECREF(new_deque);
758 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400759}
760
Raymond Hettinger54023152014-04-23 00:58:48 -0700761/* The rotate() method is part of the public API and is used internally
762as a primitive for other methods.
763
764Rotation by 1 or -1 is a common case, so any optimizations for high
765volume rotations should take care not to penalize the common case.
766
767Conceptually, a rotate by one is equivalent to a pop on one side and an
768append on the other. However, a pop/append pair is unnecessarily slow
Martin Panterd2ad5712015-11-02 04:20:33 +0000769because it requires an incref/decref pair for an object located randomly
Raymond Hettinger54023152014-04-23 00:58:48 -0700770in memory. It is better to just move the object pointer from one block
771to the next without changing the reference count.
772
773When moving batches of pointers, it is tempting to use memcpy() but that
774proved to be slower than a simple loop for a variety of reasons.
775Memcpy() cannot know in advance that we're copying pointers instead of
776bytes, that the source and destination are pointer aligned and
777non-overlapping, that moving just one pointer is a common case, that we
778never need to move more than BLOCKLEN pointers, and that at least one
779pointer is always moved.
780
781For high volume rotations, newblock() and freeblock() are never called
782more than once. Previously emptied blocks are immediately reused as a
783destination block. If a block is left-over at the end, it is freed.
784*/
785
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000786static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000787_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000788{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700789 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700790 block *leftblock = deque->leftblock;
791 block *rightblock = deque->rightblock;
792 Py_ssize_t leftindex = deque->leftindex;
793 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000794 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700795 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000796
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800797 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 return 0;
799 if (n > halflen || n < -halflen) {
800 n %= len;
801 if (n > halflen)
802 n -= len;
803 else if (n < -halflen)
804 n += len;
805 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500806 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500807 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800808
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800809 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500810 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700811 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700812 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700813 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700814 if (b == NULL)
815 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700816 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000817 b->rightlink = leftblock;
818 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700819 leftblock->leftlink = b;
820 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000821 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700822 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700823 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800824 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700825 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700826 {
827 PyObject **src, **dest;
828 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800829
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700830 if (m > rightindex + 1)
831 m = rightindex + 1;
832 if (m > leftindex)
833 m = leftindex;
834 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700835 rightindex -= m;
836 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800837 src = &rightblock->data[rightindex + 1];
838 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700839 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700840 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800841 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700842 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700843 }
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700844 if (rightindex < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700845 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700846 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700847 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700848 CHECK_NOT_END(rightblock->leftlink);
849 rightblock = rightblock->leftlink;
850 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700851 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800852 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800853 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500854 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700855 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700856 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700857 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700858 if (b == NULL)
859 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700860 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000861 b->leftlink = rightblock;
862 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700863 rightblock->rightlink = b;
864 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000865 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700866 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700867 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800868 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700869 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700870 {
871 PyObject **src, **dest;
872 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800873
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700874 if (m > BLOCKLEN - leftindex)
875 m = BLOCKLEN - leftindex;
876 if (m > BLOCKLEN - 1 - rightindex)
877 m = BLOCKLEN - 1 - rightindex;
878 assert (m > 0 && m <= len);
879 src = &leftblock->data[leftindex];
880 dest = &rightblock->data[rightindex + 1];
881 leftindex += m;
882 rightindex += m;
883 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700884 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700885 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700886 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700887 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700888 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700889 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700890 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700891 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700892 CHECK_NOT_END(leftblock->rightlink);
893 leftblock = leftblock->rightlink;
894 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700895 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800896 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700898 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700899done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700900 if (b != NULL)
901 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700902 deque->leftblock = leftblock;
903 deque->rightblock = rightblock;
904 deque->leftindex = leftindex;
905 deque->rightindex = rightindex;
906
907 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000908}
909
910static PyObject *
911deque_rotate(dequeobject *deque, PyObject *args)
912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 if (!PyArg_ParseTuple(args, "|n:rotate", &n))
916 return NULL;
Raymond Hettinger6921c132015-03-21 02:03:40 -0700917 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 Py_RETURN_NONE;
919 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000920}
921
Tim Peters1065f752004-10-01 01:03:29 +0000922PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000923"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000924
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000925static PyObject *
926deque_reverse(dequeobject *deque, PyObject *unused)
927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 block *leftblock = deque->leftblock;
929 block *rightblock = deque->rightblock;
930 Py_ssize_t leftindex = deque->leftindex;
931 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400932 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000934
Raymond Hettinger306d6b12016-01-24 12:40:42 -0800935 n++;
936 while (--n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 /* Validate that pointers haven't met in the middle */
938 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000939 CHECK_NOT_END(leftblock);
940 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 /* Swap */
943 tmp = leftblock->data[leftindex];
944 leftblock->data[leftindex] = rightblock->data[rightindex];
945 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 /* Advance left block/index pair */
948 leftindex++;
949 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 leftblock = leftblock->rightlink;
951 leftindex = 0;
952 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 /* Step backwards with the right block/index pair */
955 rightindex--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700956 if (rightindex < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 rightblock = rightblock->leftlink;
958 rightindex = BLOCKLEN - 1;
959 }
960 }
961 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000962}
963
964PyDoc_STRVAR(reverse_doc,
965"D.reverse() -- reverse *IN PLACE*");
966
Raymond Hettinger44459de2010-04-03 23:20:46 +0000967static PyObject *
968deque_count(dequeobject *deque, PyObject *v)
969{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000970 block *b = deque->leftblock;
971 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000972 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800974 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000977
Raymond Hettinger165eee22016-01-24 11:32:07 -0800978 n++;
979 while (--n) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000980 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000981 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700983 if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 return NULL;
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700985 count += cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 if (start_state != deque->state) {
988 PyErr_SetString(PyExc_RuntimeError,
989 "deque mutated during iteration");
990 return NULL;
991 }
Raymond Hettinger44459de2010-04-03 23:20:46 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000994 index++;
995 if (index == BLOCKLEN) {
996 b = b->rightlink;
997 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 }
999 }
1000 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +00001001}
1002
1003PyDoc_STRVAR(count_doc,
1004"D.count(value) -> integer -- return number of occurrences of value");
1005
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001006static int
1007deque_contains(dequeobject *deque, PyObject *v)
1008{
1009 block *b = deque->leftblock;
1010 Py_ssize_t index = deque->leftindex;
1011 Py_ssize_t n = Py_SIZE(deque);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001012 size_t start_state = deque->state;
1013 PyObject *item;
1014 int cmp;
1015
Raymond Hettinger165eee22016-01-24 11:32:07 -08001016 n++;
1017 while (--n) {
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001018 CHECK_NOT_END(b);
1019 item = b->data[index];
1020 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1021 if (cmp) {
1022 return cmp;
1023 }
1024 if (start_state != deque->state) {
1025 PyErr_SetString(PyExc_RuntimeError,
1026 "deque mutated during iteration");
1027 return -1;
1028 }
1029 index++;
1030 if (index == BLOCKLEN) {
1031 b = b->rightlink;
1032 index = 0;
1033 }
1034 }
1035 return 0;
1036}
1037
Martin v. Löwis18e16552006-02-15 17:27:45 +00001038static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001039deque_len(dequeobject *deque)
1040{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001041 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001042}
1043
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001044static PyObject *
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001045deque_index(dequeobject *deque, PyObject *args)
1046{
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001047 Py_ssize_t i, n, start=0, stop=Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001048 PyObject *v, *item;
1049 block *b = deque->leftblock;
1050 Py_ssize_t index = deque->leftindex;
1051 size_t start_state = deque->state;
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001052 int cmp;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001053
1054 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
1055 _PyEval_SliceIndex, &start,
1056 _PyEval_SliceIndex, &stop))
1057 return NULL;
1058 if (start < 0) {
1059 start += Py_SIZE(deque);
1060 if (start < 0)
1061 start = 0;
1062 }
1063 if (stop < 0) {
1064 stop += Py_SIZE(deque);
1065 if (stop < 0)
1066 stop = 0;
1067 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -07001068 if (stop > Py_SIZE(deque))
1069 stop = Py_SIZE(deque);
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001070 if (start > stop)
1071 start = stop;
1072 assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001073
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001074 /* XXX Replace this loop with faster code from deque_item() */
1075 for (i=0 ; i<start ; i++) {
1076 index++;
1077 if (index == BLOCKLEN) {
1078 b = b->rightlink;
1079 index = 0;
1080 }
1081 }
1082
Raymond Hettinger4a91d212015-11-03 22:00:26 -05001083 n = stop - i + 1;
1084 while (--n) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001085 CHECK_NOT_END(b);
1086 item = b->data[index];
1087 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1088 if (cmp > 0)
Raymond Hettinger4a91d212015-11-03 22:00:26 -05001089 return PyLong_FromSsize_t(stop - n);
Raymond Hettingerdf8f5b52015-11-02 07:27:40 -05001090 if (cmp < 0)
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001091 return NULL;
1092 if (start_state != deque->state) {
1093 PyErr_SetString(PyExc_RuntimeError,
1094 "deque mutated during iteration");
1095 return NULL;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001096 }
1097 index++;
1098 if (index == BLOCKLEN) {
1099 b = b->rightlink;
1100 index = 0;
1101 }
1102 }
1103 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
1104 return NULL;
1105}
1106
1107PyDoc_STRVAR(index_doc,
1108"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
1109"Raises ValueError if the value is not present.");
1110
Raymond Hettinger551350a2015-03-24 00:19:53 -07001111/* insert(), remove(), and delitem() are implemented in terms of
1112 rotate() for simplicity and reasonable performance near the end
1113 points. If for some reason these methods become popular, it is not
1114 hard to re-implement this using direct data movement (similar to
1115 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -07001116 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -07001117*/
1118
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001119static PyObject *
1120deque_insert(dequeobject *deque, PyObject *args)
1121{
1122 Py_ssize_t index;
1123 Py_ssize_t n = Py_SIZE(deque);
1124 PyObject *value;
1125 PyObject *rv;
1126
1127 if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
1128 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001129 if (deque->maxlen == Py_SIZE(deque)) {
Raymond Hettingera6389712016-02-01 21:21:19 -08001130 PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1131 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001132 }
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001133 if (index >= n)
1134 return deque_append(deque, value);
1135 if (index <= -n || index == 0)
1136 return deque_appendleft(deque, value);
1137 if (_deque_rotate(deque, -index))
1138 return NULL;
1139 if (index < 0)
1140 rv = deque_append(deque, value);
1141 else
1142 rv = deque_appendleft(deque, value);
1143 if (rv == NULL)
1144 return NULL;
1145 Py_DECREF(rv);
1146 if (_deque_rotate(deque, index))
1147 return NULL;
1148 Py_RETURN_NONE;
1149}
1150
1151PyDoc_STRVAR(insert_doc,
1152"D.insert(index, object) -- insert object before index");
1153
1154static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001155deque_remove(dequeobject *deque, PyObject *value)
1156{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001157 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 for (i=0 ; i<n ; i++) {
1160 PyObject *item = deque->leftblock->data[deque->leftindex];
1161 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001162
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001163 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 PyErr_SetString(PyExc_IndexError,
1165 "deque mutated during remove().");
1166 return NULL;
1167 }
1168 if (cmp > 0) {
1169 PyObject *tgt = deque_popleft(deque, NULL);
1170 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001171 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001173 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 Py_RETURN_NONE;
1175 }
1176 else if (cmp < 0) {
1177 _deque_rotate(deque, i);
1178 return NULL;
1179 }
1180 _deque_rotate(deque, -1);
1181 }
1182 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1183 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001184}
1185
1186PyDoc_STRVAR(remove_doc,
1187"D.remove(value) -- remove first occurrence of value.");
1188
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001189static int
1190valid_index(Py_ssize_t i, Py_ssize_t limit)
1191{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001192 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001193 to check whether i is in the range: 0 <= i < limit */
1194 return (size_t) i < (size_t) limit;
1195}
1196
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001197static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001198deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 block *b;
1201 PyObject *item;
1202 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001203
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001204 if (!valid_index(i, Py_SIZE(deque))) {
1205 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 return NULL;
1207 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 if (i == 0) {
1210 i = deque->leftindex;
1211 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001212 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 i = deque->rightindex;
1214 b = deque->rightblock;
1215 } else {
1216 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001217 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1218 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001219 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 b = deque->leftblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001221 n++;
1222 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 b = b->rightlink;
1224 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001225 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001226 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001227 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 b = deque->rightblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001229 n++;
1230 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 b = b->leftlink;
1232 }
1233 }
1234 item = b->data[i];
1235 Py_INCREF(item);
1236 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001237}
1238
1239static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001240deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001243 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001244
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001245 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001246 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001249 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 assert (item != NULL);
1251 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001252 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001253}
1254
1255static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001256deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001257{
Raymond Hettinger38418662016-02-08 20:34:49 -08001258 PyObject *old_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001260 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001261
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001262 if (!valid_index(i, len)) {
1263 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 return -1;
1265 }
1266 if (v == NULL)
1267 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001270 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1271 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 if (index <= halflen) {
1273 b = deque->leftblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001274 n++;
1275 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 b = b->rightlink;
1277 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001278 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001279 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001280 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 b = deque->rightblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001282 n++;
1283 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 b = b->leftlink;
1285 }
1286 Py_INCREF(v);
Raymond Hettinger38418662016-02-08 20:34:49 -08001287 old_value = b->data[i];
1288 b->data[i] = v;
1289 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001291}
1292
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001293static void
1294deque_dealloc(dequeobject *deque)
1295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyObject_GC_UnTrack(deque);
1297 if (deque->weakreflist != NULL)
1298 PyObject_ClearWeakRefs((PyObject *) deque);
1299 if (deque->leftblock != NULL) {
1300 deque_clear(deque);
1301 assert(deque->leftblock != NULL);
1302 freeblock(deque->leftblock);
1303 }
1304 deque->leftblock = NULL;
1305 deque->rightblock = NULL;
1306 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001307}
1308
1309static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001310deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 block *b;
1313 PyObject *item;
1314 Py_ssize_t index;
1315 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger1286d142015-10-14 23:16:57 -07001316 Py_ssize_t indexhigh;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001317
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001318 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1319 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 item = b->data[index];
1321 Py_VISIT(item);
1322 }
1323 indexlo = 0;
1324 }
Raymond Hettinger1286d142015-10-14 23:16:57 -07001325 indexhigh = deque->rightindex;
1326 for (index = indexlo; index <= indexhigh; index++) {
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001327 item = b->data[index];
1328 Py_VISIT(item);
1329 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001331}
1332
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001333static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001334deque_reduce(dequeobject *deque)
1335{
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001336 PyObject *dict, *it;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001337 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001338
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001339 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001340 if (dict == NULL) {
1341 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1342 return NULL;
1343 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 PyErr_Clear();
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001345 dict = Py_None;
1346 Py_INCREF(dict);
1347 }
1348
1349 it = PyObject_GetIter((PyObject *)deque);
1350 if (it == NULL) {
1351 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 return NULL;
1353 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001354
1355 if (deque->maxlen < 0) {
1356 return Py_BuildValue("O()NN", Py_TYPE(deque), dict, it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001358 else {
1359 return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, dict, it);
1360 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001361}
1362
1363PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1364
1365static PyObject *
1366deque_repr(PyObject *deque)
1367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 PyObject *aslist, *result;
1369 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 i = Py_ReprEnter(deque);
1372 if (i != 0) {
1373 if (i < 0)
1374 return NULL;
1375 return PyUnicode_FromString("[...]");
1376 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 aslist = PySequence_List(deque);
1379 if (aslist == NULL) {
1380 Py_ReprLeave(deque);
1381 return NULL;
1382 }
Raymond Hettingera7f630092015-10-10 23:56:02 -04001383 if (((dequeobject *)deque)->maxlen >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1385 aslist, ((dequeobject *)deque)->maxlen);
1386 else
1387 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001389 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001391}
1392
Raymond Hettinger738ec902004-02-29 02:15:56 +00001393static PyObject *
1394deque_richcompare(PyObject *v, PyObject *w, int op)
1395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 PyObject *it1=NULL, *it2=NULL, *x, *y;
1397 Py_ssize_t vs, ws;
1398 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 if (!PyObject_TypeCheck(v, &deque_type) ||
1401 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001402 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001406 vs = Py_SIZE((dequeobject *)v);
1407 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 if (op == Py_EQ) {
1409 if (v == w)
1410 Py_RETURN_TRUE;
1411 if (vs != ws)
1412 Py_RETURN_FALSE;
1413 }
1414 if (op == Py_NE) {
1415 if (v == w)
1416 Py_RETURN_FALSE;
1417 if (vs != ws)
1418 Py_RETURN_TRUE;
1419 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 /* Search for the first index where items are different */
1422 it1 = PyObject_GetIter(v);
1423 if (it1 == NULL)
1424 goto done;
1425 it2 = PyObject_GetIter(w);
1426 if (it2 == NULL)
1427 goto done;
1428 for (;;) {
1429 x = PyIter_Next(it1);
1430 if (x == NULL && PyErr_Occurred())
1431 goto done;
1432 y = PyIter_Next(it2);
1433 if (x == NULL || y == NULL)
1434 break;
1435 b = PyObject_RichCompareBool(x, y, Py_EQ);
1436 if (b == 0) {
1437 cmp = PyObject_RichCompareBool(x, y, op);
1438 Py_DECREF(x);
1439 Py_DECREF(y);
1440 goto done;
1441 }
1442 Py_DECREF(x);
1443 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001444 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 goto done;
1446 }
1447 /* We reached the end of one deque or both */
1448 Py_XDECREF(x);
1449 Py_XDECREF(y);
1450 if (PyErr_Occurred())
1451 goto done;
1452 switch (op) {
1453 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1454 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1455 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1456 case Py_NE: cmp = x != y; break; /* if one deque continues */
1457 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1458 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1459 }
Tim Peters1065f752004-10-01 01:03:29 +00001460
Raymond Hettinger738ec902004-02-29 02:15:56 +00001461done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 Py_XDECREF(it1);
1463 Py_XDECREF(it2);
1464 if (cmp == 1)
1465 Py_RETURN_TRUE;
1466 if (cmp == 0)
1467 Py_RETURN_FALSE;
1468 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001469}
1470
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001471static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001472deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 PyObject *iterable = NULL;
1475 PyObject *maxlenobj = NULL;
1476 Py_ssize_t maxlen = -1;
1477 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001478
Raymond Hettinger0d309402015-09-30 23:15:02 -07001479 if (kwdargs == NULL) {
1480 if (!PyArg_UnpackTuple(args, "deque()", 0, 2, &iterable, &maxlenobj))
1481 return -1;
1482 } else {
1483 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist,
1484 &iterable, &maxlenobj))
1485 return -1;
1486 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 if (maxlenobj != NULL && maxlenobj != Py_None) {
1488 maxlen = PyLong_AsSsize_t(maxlenobj);
1489 if (maxlen == -1 && PyErr_Occurred())
1490 return -1;
1491 if (maxlen < 0) {
1492 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1493 return -1;
1494 }
1495 }
1496 deque->maxlen = maxlen;
Raymond Hettinger0d309402015-09-30 23:15:02 -07001497 if (Py_SIZE(deque) > 0)
1498 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 if (iterable != NULL) {
1500 PyObject *rv = deque_extend(deque, iterable);
1501 if (rv == NULL)
1502 return -1;
1503 Py_DECREF(rv);
1504 }
1505 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001506}
1507
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001508static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001509deque_sizeof(dequeobject *deque, void *unused)
1510{
1511 Py_ssize_t res;
1512 Py_ssize_t blocks;
1513
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001514 res = _PyObject_SIZE(Py_TYPE(deque));
Raymond Hettingerbc003412015-10-14 23:33:23 -07001515 blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001516 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001517 (blocks - 1) * BLOCKLEN + deque->rightindex);
1518 res += blocks * sizeof(block);
1519 return PyLong_FromSsize_t(res);
1520}
1521
1522PyDoc_STRVAR(sizeof_doc,
1523"D.__sizeof__() -- size of D in memory, in bytes");
1524
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001525static int
1526deque_bool(dequeobject *deque)
1527{
1528 return Py_SIZE(deque) != 0;
1529}
1530
Jesus Cea16e2fca2012-08-03 14:49:42 +02001531static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001532deque_get_maxlen(dequeobject *deque)
1533{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001534 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 Py_RETURN_NONE;
1536 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001537}
1538
Raymond Hettinger41290a62015-03-31 08:12:23 -07001539
1540/* deque object ********************************************************/
1541
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001542static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1544 "maximum size of a deque or None if unbounded"},
1545 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001546};
1547
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001548static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001550 (binaryfunc)deque_concat, /* sq_concat */
1551 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 (ssizeargfunc)deque_item, /* sq_item */
1553 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001554 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001556 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001557 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001558 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001559};
1560
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001561static PyNumberMethods deque_as_number = {
1562 0, /* nb_add */
1563 0, /* nb_subtract */
1564 0, /* nb_multiply */
1565 0, /* nb_remainder */
1566 0, /* nb_divmod */
1567 0, /* nb_power */
1568 0, /* nb_negative */
1569 0, /* nb_positive */
1570 0, /* nb_absolute */
1571 (inquiry)deque_bool, /* nb_bool */
1572 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001573 };
1574
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001575static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001576static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001577PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001579
1580static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 {"append", (PyCFunction)deque_append,
1582 METH_O, append_doc},
1583 {"appendleft", (PyCFunction)deque_appendleft,
1584 METH_O, appendleft_doc},
1585 {"clear", (PyCFunction)deque_clearmethod,
1586 METH_NOARGS, clear_doc},
1587 {"__copy__", (PyCFunction)deque_copy,
1588 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001589 {"copy", (PyCFunction)deque_copy,
1590 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001592 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 {"extend", (PyCFunction)deque_extend,
1594 METH_O, extend_doc},
1595 {"extendleft", (PyCFunction)deque_extendleft,
1596 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001597 {"index", (PyCFunction)deque_index,
1598 METH_VARARGS, index_doc},
1599 {"insert", (PyCFunction)deque_insert,
1600 METH_VARARGS, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 {"pop", (PyCFunction)deque_pop,
1602 METH_NOARGS, pop_doc},
1603 {"popleft", (PyCFunction)deque_popleft,
1604 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001605 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 METH_NOARGS, reduce_doc},
1607 {"remove", (PyCFunction)deque_remove,
1608 METH_O, remove_doc},
1609 {"__reversed__", (PyCFunction)deque_reviter,
1610 METH_NOARGS, reversed_doc},
1611 {"reverse", (PyCFunction)deque_reverse,
1612 METH_NOARGS, reverse_doc},
1613 {"rotate", (PyCFunction)deque_rotate,
Jesus Cea16e2fca2012-08-03 14:49:42 +02001614 METH_VARARGS, rotate_doc},
1615 {"__sizeof__", (PyCFunction)deque_sizeof,
1616 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001618};
1619
1620PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001621"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001622\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001623A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001624
Neal Norwitz87f10132004-02-29 15:40:53 +00001625static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 PyVarObject_HEAD_INIT(NULL, 0)
1627 "collections.deque", /* tp_name */
1628 sizeof(dequeobject), /* tp_basicsize */
1629 0, /* tp_itemsize */
1630 /* methods */
1631 (destructor)deque_dealloc, /* tp_dealloc */
1632 0, /* tp_print */
1633 0, /* tp_getattr */
1634 0, /* tp_setattr */
1635 0, /* tp_reserved */
1636 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001637 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 &deque_as_sequence, /* tp_as_sequence */
1639 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001640 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 0, /* tp_call */
1642 0, /* tp_str */
1643 PyObject_GenericGetAttr, /* tp_getattro */
1644 0, /* tp_setattro */
1645 0, /* tp_as_buffer */
1646 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001647 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 deque_doc, /* tp_doc */
1649 (traverseproc)deque_traverse, /* tp_traverse */
1650 (inquiry)deque_clear, /* tp_clear */
1651 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001652 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 (getiterfunc)deque_iter, /* tp_iter */
1654 0, /* tp_iternext */
1655 deque_methods, /* tp_methods */
1656 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001657 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 0, /* tp_base */
1659 0, /* tp_dict */
1660 0, /* tp_descr_get */
1661 0, /* tp_descr_set */
1662 0, /* tp_dictoffset */
1663 (initproc)deque_init, /* tp_init */
1664 PyType_GenericAlloc, /* tp_alloc */
1665 deque_new, /* tp_new */
1666 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001667};
1668
1669/*********************** Deque Iterator **************************/
1670
1671typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001674 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001676 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001678} dequeiterobject;
1679
Martin v. Löwis59683e82008-06-13 07:50:45 +00001680static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001681
1682static PyObject *
1683deque_iter(dequeobject *deque)
1684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1688 if (it == NULL)
1689 return NULL;
1690 it->b = deque->leftblock;
1691 it->index = deque->leftindex;
1692 Py_INCREF(deque);
1693 it->deque = deque;
1694 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001695 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 PyObject_GC_Track(it);
1697 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001698}
1699
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001700static int
1701dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 Py_VISIT(dio->deque);
1704 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001705}
1706
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001707static void
1708dequeiter_dealloc(dequeiterobject *dio)
1709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 Py_XDECREF(dio->deque);
1711 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001712}
1713
1714static PyObject *
1715dequeiter_next(dequeiterobject *it)
1716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 if (it->deque->state != it->state) {
1720 it->counter = 0;
1721 PyErr_SetString(PyExc_RuntimeError,
1722 "deque mutated during iteration");
1723 return NULL;
1724 }
1725 if (it->counter == 0)
1726 return NULL;
1727 assert (!(it->b == it->deque->rightblock &&
1728 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 item = it->b->data[it->index];
1731 it->index++;
1732 it->counter--;
1733 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001734 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 it->b = it->b->rightlink;
1736 it->index = 0;
1737 }
1738 Py_INCREF(item);
1739 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001740}
1741
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001742static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001743dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1744{
1745 Py_ssize_t i, index=0;
1746 PyObject *deque;
1747 dequeiterobject *it;
1748 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1749 return NULL;
1750 assert(type == &dequeiter_type);
1751
1752 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1753 if (!it)
1754 return NULL;
1755 /* consume items from the queue */
1756 for(i=0; i<index; i++) {
1757 PyObject *item = dequeiter_next(it);
1758 if (item) {
1759 Py_DECREF(item);
1760 } else {
1761 if (it->counter) {
1762 Py_DECREF(it);
1763 return NULL;
1764 } else
1765 break;
1766 }
1767 }
1768 return (PyObject*)it;
1769}
1770
1771static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001772dequeiter_len(dequeiterobject *it)
1773{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001774 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001775}
1776
Armin Rigof5b3e362006-02-11 21:32:43 +00001777PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001778
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001779static PyObject *
1780dequeiter_reduce(dequeiterobject *it)
1781{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001782 return Py_BuildValue("O(On)", Py_TYPE(it), it->deque, Py_SIZE(it->deque) - it->counter);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001783}
1784
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001785static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001787 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001789};
1790
Martin v. Löwis59683e82008-06-13 07:50:45 +00001791static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001793 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 sizeof(dequeiterobject), /* tp_basicsize */
1795 0, /* tp_itemsize */
1796 /* methods */
1797 (destructor)dequeiter_dealloc, /* tp_dealloc */
1798 0, /* tp_print */
1799 0, /* tp_getattr */
1800 0, /* tp_setattr */
1801 0, /* tp_reserved */
1802 0, /* tp_repr */
1803 0, /* tp_as_number */
1804 0, /* tp_as_sequence */
1805 0, /* tp_as_mapping */
1806 0, /* tp_hash */
1807 0, /* tp_call */
1808 0, /* tp_str */
1809 PyObject_GenericGetAttr, /* tp_getattro */
1810 0, /* tp_setattro */
1811 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001812 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 0, /* tp_doc */
1814 (traverseproc)dequeiter_traverse, /* tp_traverse */
1815 0, /* tp_clear */
1816 0, /* tp_richcompare */
1817 0, /* tp_weaklistoffset */
1818 PyObject_SelfIter, /* tp_iter */
1819 (iternextfunc)dequeiter_next, /* tp_iternext */
1820 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001821 0, /* tp_members */
1822 0, /* tp_getset */
1823 0, /* tp_base */
1824 0, /* tp_dict */
1825 0, /* tp_descr_get */
1826 0, /* tp_descr_set */
1827 0, /* tp_dictoffset */
1828 0, /* tp_init */
1829 0, /* tp_alloc */
1830 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001832};
1833
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001834/*********************** Deque Reverse Iterator **************************/
1835
Martin v. Löwis59683e82008-06-13 07:50:45 +00001836static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001837
1838static PyObject *
1839deque_reviter(dequeobject *deque)
1840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1844 if (it == NULL)
1845 return NULL;
1846 it->b = deque->rightblock;
1847 it->index = deque->rightindex;
1848 Py_INCREF(deque);
1849 it->deque = deque;
1850 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001851 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 PyObject_GC_Track(it);
1853 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001854}
1855
1856static PyObject *
1857dequereviter_next(dequeiterobject *it)
1858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 PyObject *item;
1860 if (it->counter == 0)
1861 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 if (it->deque->state != it->state) {
1864 it->counter = 0;
1865 PyErr_SetString(PyExc_RuntimeError,
1866 "deque mutated during iteration");
1867 return NULL;
1868 }
1869 assert (!(it->b == it->deque->leftblock &&
1870 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 item = it->b->data[it->index];
1873 it->index--;
1874 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001875 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001876 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 it->b = it->b->leftlink;
1878 it->index = BLOCKLEN - 1;
1879 }
1880 Py_INCREF(item);
1881 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001882}
1883
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001884static PyObject *
1885dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1886{
1887 Py_ssize_t i, index=0;
1888 PyObject *deque;
1889 dequeiterobject *it;
1890 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1891 return NULL;
1892 assert(type == &dequereviter_type);
1893
1894 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1895 if (!it)
1896 return NULL;
1897 /* consume items from the queue */
1898 for(i=0; i<index; i++) {
1899 PyObject *item = dequereviter_next(it);
1900 if (item) {
1901 Py_DECREF(item);
1902 } else {
1903 if (it->counter) {
1904 Py_DECREF(it);
1905 return NULL;
1906 } else
1907 break;
1908 }
1909 }
1910 return (PyObject*)it;
1911}
1912
Martin v. Löwis59683e82008-06-13 07:50:45 +00001913static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001915 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 sizeof(dequeiterobject), /* tp_basicsize */
1917 0, /* tp_itemsize */
1918 /* methods */
1919 (destructor)dequeiter_dealloc, /* tp_dealloc */
1920 0, /* tp_print */
1921 0, /* tp_getattr */
1922 0, /* tp_setattr */
1923 0, /* tp_reserved */
1924 0, /* tp_repr */
1925 0, /* tp_as_number */
1926 0, /* tp_as_sequence */
1927 0, /* tp_as_mapping */
1928 0, /* tp_hash */
1929 0, /* tp_call */
1930 0, /* tp_str */
1931 PyObject_GenericGetAttr, /* tp_getattro */
1932 0, /* tp_setattro */
1933 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001934 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 0, /* tp_doc */
1936 (traverseproc)dequeiter_traverse, /* tp_traverse */
1937 0, /* tp_clear */
1938 0, /* tp_richcompare */
1939 0, /* tp_weaklistoffset */
1940 PyObject_SelfIter, /* tp_iter */
1941 (iternextfunc)dequereviter_next, /* tp_iternext */
1942 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001943 0, /* tp_members */
1944 0, /* tp_getset */
1945 0, /* tp_base */
1946 0, /* tp_dict */
1947 0, /* tp_descr_get */
1948 0, /* tp_descr_set */
1949 0, /* tp_dictoffset */
1950 0, /* tp_init */
1951 0, /* tp_alloc */
1952 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001954};
1955
Guido van Rossum1968ad32006-02-25 22:38:04 +00001956/* defaultdict type *********************************************************/
1957
1958typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 PyDictObject dict;
1960 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001961} defdictobject;
1962
1963static PyTypeObject defdict_type; /* Forward */
1964
1965PyDoc_STRVAR(defdict_missing_doc,
1966"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001967 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001968 self[key] = value = self.default_factory()\n\
1969 return value\n\
1970");
1971
1972static PyObject *
1973defdict_missing(defdictobject *dd, PyObject *key)
1974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 PyObject *factory = dd->default_factory;
1976 PyObject *value;
1977 if (factory == NULL || factory == Py_None) {
1978 /* XXX Call dict.__missing__(key) */
1979 PyObject *tup;
1980 tup = PyTuple_Pack(1, key);
1981 if (!tup) return NULL;
1982 PyErr_SetObject(PyExc_KeyError, tup);
1983 Py_DECREF(tup);
1984 return NULL;
1985 }
1986 value = PyEval_CallObject(factory, NULL);
1987 if (value == NULL)
1988 return value;
1989 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1990 Py_DECREF(value);
1991 return NULL;
1992 }
1993 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001994}
1995
1996PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1997
1998static PyObject *
1999defdict_copy(defdictobject *dd)
2000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 /* This calls the object's class. That only works for subclasses
2002 whose class constructor has the same signature. Subclasses that
2003 define a different constructor signature must override copy().
2004 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 if (dd->default_factory == NULL)
2007 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
2008 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2009 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002010}
2011
2012static PyObject *
2013defdict_reduce(defdictobject *dd)
2014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 - factory function
2018 - tuple of args for the factory function
2019 - additional state (here None)
2020 - sequence iterator (here None)
2021 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 For this to be useful with pickle.py, the default_factory
2026 must be picklable; e.g., None, a built-in, or a global
2027 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 Both shallow and deep copying are supported, but for deep
2030 copying, the default_factory must be deep-copyable; e.g. None,
2031 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 This only works for subclasses as long as their constructor
2034 signature is compatible; the first argument must be the
2035 optional default_factory, defaulting to None.
2036 */
2037 PyObject *args;
2038 PyObject *items;
2039 PyObject *iter;
2040 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002041 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 if (dd->default_factory == NULL || dd->default_factory == Py_None)
2044 args = PyTuple_New(0);
2045 else
2046 args = PyTuple_Pack(1, dd->default_factory);
2047 if (args == NULL)
2048 return NULL;
Victor Stinnerad8c83a2016-09-05 17:53:15 -07002049 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 if (items == NULL) {
2051 Py_DECREF(args);
2052 return NULL;
2053 }
2054 iter = PyObject_GetIter(items);
2055 if (iter == NULL) {
2056 Py_DECREF(items);
2057 Py_DECREF(args);
2058 return NULL;
2059 }
2060 result = PyTuple_Pack(5, Py_TYPE(dd), args,
2061 Py_None, Py_None, iter);
2062 Py_DECREF(iter);
2063 Py_DECREF(items);
2064 Py_DECREF(args);
2065 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002066}
2067
2068static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 {"__missing__", (PyCFunction)defdict_missing, METH_O,
2070 defdict_missing_doc},
2071 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
2072 defdict_copy_doc},
2073 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
2074 defdict_copy_doc},
2075 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
2076 reduce_doc},
2077 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002078};
2079
2080static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 {"default_factory", T_OBJECT,
2082 offsetof(defdictobject, default_factory), 0,
2083 PyDoc_STR("Factory for default value called by __missing__().")},
2084 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002085};
2086
2087static void
2088defdict_dealloc(defdictobject *dd)
2089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 Py_CLEAR(dd->default_factory);
2091 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002092}
2093
Guido van Rossum1968ad32006-02-25 22:38:04 +00002094static PyObject *
2095defdict_repr(defdictobject *dd)
2096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 PyObject *baserepr;
2098 PyObject *defrepr;
2099 PyObject *result;
2100 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2101 if (baserepr == NULL)
2102 return NULL;
2103 if (dd->default_factory == NULL)
2104 defrepr = PyUnicode_FromString("None");
2105 else
2106 {
2107 int status = Py_ReprEnter(dd->default_factory);
2108 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002109 if (status < 0) {
2110 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002112 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 defrepr = PyUnicode_FromString("...");
2114 }
2115 else
2116 defrepr = PyObject_Repr(dd->default_factory);
2117 Py_ReprLeave(dd->default_factory);
2118 }
2119 if (defrepr == NULL) {
2120 Py_DECREF(baserepr);
2121 return NULL;
2122 }
2123 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2124 defrepr, baserepr);
2125 Py_DECREF(defrepr);
2126 Py_DECREF(baserepr);
2127 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002128}
2129
2130static int
2131defdict_traverse(PyObject *self, visitproc visit, void *arg)
2132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 Py_VISIT(((defdictobject *)self)->default_factory);
2134 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002135}
2136
2137static int
2138defdict_tp_clear(defdictobject *dd)
2139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 Py_CLEAR(dd->default_factory);
2141 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002142}
2143
2144static int
2145defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 defdictobject *dd = (defdictobject *)self;
2148 PyObject *olddefault = dd->default_factory;
2149 PyObject *newdefault = NULL;
2150 PyObject *newargs;
2151 int result;
2152 if (args == NULL || !PyTuple_Check(args))
2153 newargs = PyTuple_New(0);
2154 else {
2155 Py_ssize_t n = PyTuple_GET_SIZE(args);
2156 if (n > 0) {
2157 newdefault = PyTuple_GET_ITEM(args, 0);
2158 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2159 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002160 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 return -1;
2162 }
2163 }
2164 newargs = PySequence_GetSlice(args, 1, n);
2165 }
2166 if (newargs == NULL)
2167 return -1;
2168 Py_XINCREF(newdefault);
2169 dd->default_factory = newdefault;
2170 result = PyDict_Type.tp_init(self, newargs, kwds);
2171 Py_DECREF(newargs);
2172 Py_XDECREF(olddefault);
2173 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002174}
2175
2176PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002177"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002178\n\
2179The default factory is called without arguments to produce\n\
2180a new value when a key is not present, in __getitem__ only.\n\
2181A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002182All remaining arguments are treated the same as if they were\n\
2183passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002184");
2185
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002186/* See comment in xxsubtype.c */
2187#define DEFERRED_ADDRESS(ADDR) 0
2188
Guido van Rossum1968ad32006-02-25 22:38:04 +00002189static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2191 "collections.defaultdict", /* tp_name */
2192 sizeof(defdictobject), /* tp_basicsize */
2193 0, /* tp_itemsize */
2194 /* methods */
2195 (destructor)defdict_dealloc, /* tp_dealloc */
2196 0, /* tp_print */
2197 0, /* tp_getattr */
2198 0, /* tp_setattr */
2199 0, /* tp_reserved */
2200 (reprfunc)defdict_repr, /* tp_repr */
2201 0, /* tp_as_number */
2202 0, /* tp_as_sequence */
2203 0, /* tp_as_mapping */
2204 0, /* tp_hash */
2205 0, /* tp_call */
2206 0, /* tp_str */
2207 PyObject_GenericGetAttr, /* tp_getattro */
2208 0, /* tp_setattro */
2209 0, /* tp_as_buffer */
2210 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2211 /* tp_flags */
2212 defdict_doc, /* tp_doc */
2213 defdict_traverse, /* tp_traverse */
2214 (inquiry)defdict_tp_clear, /* tp_clear */
2215 0, /* tp_richcompare */
2216 0, /* tp_weaklistoffset*/
2217 0, /* tp_iter */
2218 0, /* tp_iternext */
2219 defdict_methods, /* tp_methods */
2220 defdict_members, /* tp_members */
2221 0, /* tp_getset */
2222 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2223 0, /* tp_dict */
2224 0, /* tp_descr_get */
2225 0, /* tp_descr_set */
2226 0, /* tp_dictoffset */
2227 defdict_init, /* tp_init */
2228 PyType_GenericAlloc, /* tp_alloc */
2229 0, /* tp_new */
2230 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002231};
2232
Raymond Hettinger96f34102010-12-15 16:30:37 +00002233/* helper function for Counter *********************************************/
2234
2235PyDoc_STRVAR(_count_elements_doc,
2236"_count_elements(mapping, iterable) -> None\n\
2237\n\
2238Count elements in the iterable, updating the mappping");
2239
2240static PyObject *
2241_count_elements(PyObject *self, PyObject *args)
2242{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002243 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002244 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002245 PyObject *it, *iterable, *mapping, *oldval;
2246 PyObject *newval = NULL;
2247 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002248 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002249 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002250 PyObject *bound_get = NULL;
2251 PyObject *mapping_get;
2252 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002253 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002254 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002255
2256 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2257 return NULL;
2258
Raymond Hettinger96f34102010-12-15 16:30:37 +00002259 it = PyObject_GetIter(iterable);
2260 if (it == NULL)
2261 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002262
Raymond Hettinger96f34102010-12-15 16:30:37 +00002263 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002264 if (one == NULL)
2265 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002266
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002267 /* Only take the fast path when get() and __setitem__()
2268 * have not been overridden.
2269 */
2270 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2271 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002272 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2273 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2274
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002275 if (mapping_get != NULL && mapping_get == dict_get &&
2276 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002277 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002278 /* Fast path advantages:
2279 1. Eliminate double hashing
2280 (by re-using the same hash for both the get and set)
2281 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2282 (argument tuple creation and parsing)
2283 3. Avoid indirection through a bound method object
2284 (creates another argument tuple)
2285 4. Avoid initial increment from zero
2286 (reuse an existing one-object instead)
2287 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002288 Py_hash_t hash;
2289
Raymond Hettinger426e0522011-01-03 02:12:02 +00002290 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002291 if (key == NULL)
2292 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002293
2294 if (!PyUnicode_CheckExact(key) ||
2295 (hash = ((PyASCIIObject *) key)->hash) == -1)
2296 {
2297 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002298 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002299 goto done;
2300 }
2301
2302 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002303 if (oldval == NULL) {
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002304 if (PyErr_Occurred())
2305 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002306 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002307 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002308 } else {
2309 newval = PyNumber_Add(oldval, one);
2310 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002311 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002312 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002313 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002314 Py_CLEAR(newval);
2315 }
2316 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002317 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002318 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002319 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002320 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002321 goto done;
2322
2323 zero = PyLong_FromLong(0);
2324 if (zero == NULL)
2325 goto done;
2326
Raymond Hettinger426e0522011-01-03 02:12:02 +00002327 while (1) {
2328 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002329 if (key == NULL)
2330 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002331 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002332 if (oldval == NULL)
2333 break;
2334 newval = PyNumber_Add(oldval, one);
2335 Py_DECREF(oldval);
2336 if (newval == NULL)
2337 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002338 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002339 break;
2340 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002341 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002342 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002343 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002344
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002345done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002346 Py_DECREF(it);
2347 Py_XDECREF(key);
2348 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002349 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002350 Py_XDECREF(zero);
2351 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002352 if (PyErr_Occurred())
2353 return NULL;
2354 Py_RETURN_NONE;
2355}
2356
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002357/* module level code ********************************************************/
2358
2359PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002360"High performance data structures.\n\
2361- deque: ordered collection accessible from endpoints only\n\
2362- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002363");
2364
Raymond Hettinger96f34102010-12-15 16:30:37 +00002365static struct PyMethodDef module_functions[] = {
2366 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2367 {NULL, NULL} /* sentinel */
2368};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002369
2370static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 PyModuleDef_HEAD_INIT,
2372 "_collections",
2373 module_doc,
2374 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002375 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 NULL,
2377 NULL,
2378 NULL,
2379 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002380};
2381
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002382PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002383PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 m = PyModule_Create(&_collectionsmodule);
2388 if (m == NULL)
2389 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 if (PyType_Ready(&deque_type) < 0)
2392 return NULL;
2393 Py_INCREF(&deque_type);
2394 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 defdict_type.tp_base = &PyDict_Type;
2397 if (PyType_Ready(&defdict_type) < 0)
2398 return NULL;
2399 Py_INCREF(&defdict_type);
2400 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002401
Eric Snow47db7172015-05-29 22:21:39 -06002402 Py_INCREF(&PyODict_Type);
2403 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 if (PyType_Ready(&dequeiter_type) < 0)
2406 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002407 Py_INCREF(&dequeiter_type);
2408 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 if (PyType_Ready(&dequereviter_type) < 0)
2411 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002412 Py_INCREF(&dequereviter_type);
2413 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002416}