blob: cfd8905edeb32e1d738156ac68d2480676cf8db5 [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{
Miss Islington (bot)536e45a2018-09-11 12:08:10 -0700517 PyObject *result;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700518 dequeobject *old_deque = (dequeobject *)deque;
519 if (Py_TYPE(deque) == &deque_type) {
520 dequeobject *new_deque;
521 PyObject *rv;
522
523 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
524 if (new_deque == NULL)
525 return NULL;
526 new_deque->maxlen = old_deque->maxlen;
527 /* Fast path for the deque_repeat() common case where len(deque) == 1 */
Raymond Hettinger0443ac22015-10-05 22:52:37 -0400528 if (Py_SIZE(deque) == 1) {
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700529 PyObject *item = old_deque->leftblock->data[old_deque->leftindex];
530 rv = deque_append(new_deque, item);
531 } else {
532 rv = deque_extend(new_deque, deque);
533 }
534 if (rv != NULL) {
535 Py_DECREF(rv);
536 return (PyObject *)new_deque;
537 }
538 Py_DECREF(new_deque);
539 return NULL;
540 }
541 if (old_deque->maxlen < 0)
Miss Islington (bot)536e45a2018-09-11 12:08:10 -0700542 result = PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)),
543 deque, NULL);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700544 else
Miss Islington (bot)536e45a2018-09-11 12:08:10 -0700545 result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
546 deque, old_deque->maxlen, NULL);
547 if (result != NULL && !PyObject_TypeCheck(result, &deque_type)) {
548 PyErr_Format(PyExc_TypeError,
549 "%.200s() must return a deque, not %.200s",
550 Py_TYPE(deque)->tp_name, Py_TYPE(result)->tp_name);
551 Py_DECREF(result);
552 return NULL;
553 }
554 return result;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700555}
556
557PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700558
559static PyObject *
560deque_concat(dequeobject *deque, PyObject *other)
561{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400562 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700563 int rv;
564
565 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
566 if (rv <= 0) {
567 if (rv == 0) {
568 PyErr_Format(PyExc_TypeError,
569 "can only concatenate deque (not \"%.200s\") to deque",
570 other->ob_type->tp_name);
571 }
572 return NULL;
573 }
574
575 new_deque = deque_copy((PyObject *)deque);
576 if (new_deque == NULL)
577 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400578 result = deque_extend((dequeobject *)new_deque, other);
579 if (result == NULL) {
580 Py_DECREF(new_deque);
581 return NULL;
582 }
583 Py_DECREF(result);
584 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700585}
586
Miss Islington (bot)a4dd46a2018-05-30 22:31:21 -0700587static int
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700588deque_clear(dequeobject *deque)
589{
590 block *b;
591 block *prevblock;
592 block *leftblock;
593 Py_ssize_t leftindex;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800594 Py_ssize_t n, m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700595 PyObject *item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800596 PyObject **itemptr, **limit;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700597
Raymond Hettinger38031142015-09-29 22:45:05 -0700598 if (Py_SIZE(deque) == 0)
Miss Islington (bot)a4dd46a2018-05-30 22:31:21 -0700599 return 0;
Raymond Hettinger38031142015-09-29 22:45:05 -0700600
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700601 /* During the process of clearing a deque, decrefs can cause the
602 deque to mutate. To avoid fatal confusion, we have to make the
603 deque empty before clearing the blocks and never refer to
604 anything via deque->ref while clearing. (This is the same
605 technique used for clearing lists, sets, and dicts.)
606
607 Making the deque empty requires allocating a new empty block. In
608 the unlikely event that memory is full, we fall back to an
609 alternate method that doesn't require a new block. Repeating
610 pops in a while-loop is slower, possibly re-entrant (and a clever
611 adversary could cause it to never terminate).
612 */
613
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700614 b = newblock();
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700615 if (b == NULL) {
616 PyErr_Clear();
617 goto alternate_method;
618 }
619
620 /* Remember the old size, leftblock, and leftindex */
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800621 n = Py_SIZE(deque);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700622 leftblock = deque->leftblock;
623 leftindex = deque->leftindex;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700624
625 /* Set the deque to be empty using the newly allocated block */
626 MARK_END(b->leftlink);
627 MARK_END(b->rightlink);
628 Py_SIZE(deque) = 0;
629 deque->leftblock = b;
630 deque->rightblock = b;
631 deque->leftindex = CENTER + 1;
632 deque->rightindex = CENTER;
633 deque->state++;
634
635 /* Now the old size, leftblock, and leftindex are disconnected from
636 the empty deque and we can use them to decref the pointers.
637 */
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800638 m = (BLOCKLEN - leftindex > n) ? n : BLOCKLEN - leftindex;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800639 itemptr = &leftblock->data[leftindex];
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800640 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800641 n -= m;
642 while (1) {
643 if (itemptr == limit) {
644 if (n == 0)
645 break;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700646 CHECK_NOT_END(leftblock->rightlink);
647 prevblock = leftblock;
648 leftblock = leftblock->rightlink;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800649 m = (n > BLOCKLEN) ? BLOCKLEN : n;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800650 itemptr = leftblock->data;
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800651 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800652 n -= m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700653 freeblock(prevblock);
654 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800655 item = *(itemptr++);
656 Py_DECREF(item);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700657 }
658 CHECK_END(leftblock->rightlink);
659 freeblock(leftblock);
Miss Islington (bot)a4dd46a2018-05-30 22:31:21 -0700660 return 0;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700661
662 alternate_method:
663 while (Py_SIZE(deque)) {
664 item = deque_pop(deque, NULL);
665 assert (item != NULL);
666 Py_DECREF(item);
667 }
Miss Islington (bot)a4dd46a2018-05-30 22:31:21 -0700668 return 0;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700669}
670
671static PyObject *
672deque_clearmethod(dequeobject *deque)
673{
674 deque_clear(deque);
675 Py_RETURN_NONE;
676}
677
678PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700679
680static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700681deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
682{
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700683 Py_ssize_t i, m, size;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700684 PyObject *seq;
685 PyObject *rv;
686
687 size = Py_SIZE(deque);
688 if (size == 0 || n == 1) {
689 Py_INCREF(deque);
690 return (PyObject *)deque;
691 }
692
693 if (n <= 0) {
694 deque_clear(deque);
695 Py_INCREF(deque);
696 return (PyObject *)deque;
697 }
698
Raymond Hettinger41290a62015-03-31 08:12:23 -0700699 if (size == 1) {
700 /* common case, repeating a single element */
701 PyObject *item = deque->leftblock->data[deque->leftindex];
702
Raymond Hettingera7f630092015-10-10 23:56:02 -0400703 if (deque->maxlen >= 0 && n > deque->maxlen)
Raymond Hettinger41290a62015-03-31 08:12:23 -0700704 n = deque->maxlen;
705
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400706 deque->state++;
Raymond Hettingerad262252015-09-14 01:03:04 -0400707 for (i = 0 ; i < n-1 ; ) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400708 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700709 block *b = newblock();
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400710 if (b == NULL) {
711 Py_SIZE(deque) += i;
712 return NULL;
713 }
714 b->leftlink = deque->rightblock;
715 CHECK_END(deque->rightblock->rightlink);
716 deque->rightblock->rightlink = b;
717 deque->rightblock = b;
718 MARK_END(b->rightlink);
719 deque->rightindex = -1;
720 }
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700721 m = n - 1 - i;
722 if (m > BLOCKLEN - 1 - deque->rightindex)
723 m = BLOCKLEN - 1 - deque->rightindex;
724 i += m;
725 while (m--) {
Raymond Hettingerad262252015-09-14 01:03:04 -0400726 deque->rightindex++;
727 Py_INCREF(item);
728 deque->rightblock->data[deque->rightindex] = item;
729 }
Raymond Hettinger41290a62015-03-31 08:12:23 -0700730 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400731 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700732 Py_INCREF(deque);
733 return (PyObject *)deque;
734 }
735
Raymond Hettinger20151f52015-10-16 22:47:29 -0700736 if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400737 return PyErr_NoMemory();
738 }
739
Raymond Hettinger41290a62015-03-31 08:12:23 -0700740 seq = PySequence_List((PyObject *)deque);
741 if (seq == NULL)
742 return seq;
743
Louie Lu357bad72017-02-24 11:59:49 +0800744 /* Reduce the number of repetitions when maxlen would be exceeded */
745 if (deque->maxlen >= 0 && n * size > deque->maxlen)
746 n = (deque->maxlen + size - 1) / size;
747
Raymond Hettinger41290a62015-03-31 08:12:23 -0700748 for (i = 0 ; i < n-1 ; i++) {
749 rv = deque_extend(deque, seq);
750 if (rv == NULL) {
751 Py_DECREF(seq);
752 return NULL;
753 }
754 Py_DECREF(rv);
755 }
756 Py_INCREF(deque);
757 Py_DECREF(seq);
758 return (PyObject *)deque;
759}
760
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400761static PyObject *
762deque_repeat(dequeobject *deque, Py_ssize_t n)
763{
764 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400765 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400766
767 new_deque = (dequeobject *)deque_copy((PyObject *) deque);
768 if (new_deque == NULL)
769 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400770 rv = deque_inplace_repeat(new_deque, n);
771 Py_DECREF(new_deque);
772 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400773}
774
Raymond Hettinger54023152014-04-23 00:58:48 -0700775/* The rotate() method is part of the public API and is used internally
776as a primitive for other methods.
777
778Rotation by 1 or -1 is a common case, so any optimizations for high
779volume rotations should take care not to penalize the common case.
780
781Conceptually, a rotate by one is equivalent to a pop on one side and an
782append on the other. However, a pop/append pair is unnecessarily slow
Martin Panterd2ad5712015-11-02 04:20:33 +0000783because it requires an incref/decref pair for an object located randomly
Raymond Hettinger54023152014-04-23 00:58:48 -0700784in memory. It is better to just move the object pointer from one block
785to the next without changing the reference count.
786
787When moving batches of pointers, it is tempting to use memcpy() but that
788proved to be slower than a simple loop for a variety of reasons.
789Memcpy() cannot know in advance that we're copying pointers instead of
790bytes, that the source and destination are pointer aligned and
791non-overlapping, that moving just one pointer is a common case, that we
792never need to move more than BLOCKLEN pointers, and that at least one
793pointer is always moved.
794
795For high volume rotations, newblock() and freeblock() are never called
796more than once. Previously emptied blocks are immediately reused as a
797destination block. If a block is left-over at the end, it is freed.
798*/
799
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000800static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000801_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000802{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700803 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700804 block *leftblock = deque->leftblock;
805 block *rightblock = deque->rightblock;
806 Py_ssize_t leftindex = deque->leftindex;
807 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000808 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700809 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000810
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800811 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 return 0;
813 if (n > halflen || n < -halflen) {
814 n %= len;
815 if (n > halflen)
816 n -= len;
817 else if (n < -halflen)
818 n += len;
819 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500820 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500821 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800822
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800823 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500824 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700825 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700826 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700827 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700828 if (b == NULL)
829 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700830 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000831 b->rightlink = leftblock;
832 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700833 leftblock->leftlink = b;
834 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000835 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700836 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700837 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800838 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700839 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700840 {
841 PyObject **src, **dest;
842 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800843
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700844 if (m > rightindex + 1)
845 m = rightindex + 1;
846 if (m > leftindex)
847 m = leftindex;
848 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700849 rightindex -= m;
850 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800851 src = &rightblock->data[rightindex + 1];
852 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700853 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700854 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800855 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700856 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700857 }
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700858 if (rightindex < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700859 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700860 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700861 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700862 CHECK_NOT_END(rightblock->leftlink);
863 rightblock = rightblock->leftlink;
864 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700865 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800866 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800867 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500868 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700869 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700870 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700871 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700872 if (b == NULL)
873 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700874 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000875 b->leftlink = rightblock;
876 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700877 rightblock->rightlink = b;
878 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000879 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700880 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700881 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800882 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700883 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700884 {
885 PyObject **src, **dest;
886 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800887
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700888 if (m > BLOCKLEN - leftindex)
889 m = BLOCKLEN - leftindex;
890 if (m > BLOCKLEN - 1 - rightindex)
891 m = BLOCKLEN - 1 - rightindex;
892 assert (m > 0 && m <= len);
893 src = &leftblock->data[leftindex];
894 dest = &rightblock->data[rightindex + 1];
895 leftindex += m;
896 rightindex += m;
897 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700898 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700899 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700900 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700901 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700902 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700903 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700904 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700905 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700906 CHECK_NOT_END(leftblock->rightlink);
907 leftblock = leftblock->rightlink;
908 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700909 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800910 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700912 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700913done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700914 if (b != NULL)
915 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700916 deque->leftblock = leftblock;
917 deque->rightblock = rightblock;
918 deque->leftindex = leftindex;
919 deque->rightindex = rightindex;
920
921 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000922}
923
924static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200925deque_rotate(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000928
Victor Stinnerdd407d52017-02-06 16:06:49 +0100929 if (!_PyArg_ParseStack(args, nargs, "|n:rotate", &n)) {
930 return NULL;
931 }
932
Raymond Hettinger6921c132015-03-21 02:03:40 -0700933 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 Py_RETURN_NONE;
935 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000936}
937
Tim Peters1065f752004-10-01 01:03:29 +0000938PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000939"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000940
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000941static PyObject *
942deque_reverse(dequeobject *deque, PyObject *unused)
943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 block *leftblock = deque->leftblock;
945 block *rightblock = deque->rightblock;
946 Py_ssize_t leftindex = deque->leftindex;
947 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400948 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000950
Raymond Hettingere1b02872017-09-04 16:07:06 -0700951 while (--n >= 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 /* Validate that pointers haven't met in the middle */
953 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000954 CHECK_NOT_END(leftblock);
955 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 /* Swap */
958 tmp = leftblock->data[leftindex];
959 leftblock->data[leftindex] = rightblock->data[rightindex];
960 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 /* Advance left block/index pair */
963 leftindex++;
964 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 leftblock = leftblock->rightlink;
966 leftindex = 0;
967 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 /* Step backwards with the right block/index pair */
970 rightindex--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700971 if (rightindex < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 rightblock = rightblock->leftlink;
973 rightindex = BLOCKLEN - 1;
974 }
975 }
976 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000977}
978
979PyDoc_STRVAR(reverse_doc,
980"D.reverse() -- reverse *IN PLACE*");
981
Raymond Hettinger44459de2010-04-03 23:20:46 +0000982static PyObject *
983deque_count(dequeobject *deque, PyObject *v)
984{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000985 block *b = deque->leftblock;
986 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000987 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800989 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000992
Raymond Hettingere1b02872017-09-04 16:07:06 -0700993 while (--n >= 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000994 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000995 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700997 if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 return NULL;
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700999 count += cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 if (start_state != deque->state) {
1002 PyErr_SetString(PyExc_RuntimeError,
1003 "deque mutated during iteration");
1004 return NULL;
1005 }
Raymond Hettinger44459de2010-04-03 23:20:46 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -10001008 index++;
1009 if (index == BLOCKLEN) {
1010 b = b->rightlink;
1011 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 }
1013 }
1014 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +00001015}
1016
1017PyDoc_STRVAR(count_doc,
1018"D.count(value) -> integer -- return number of occurrences of value");
1019
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001020static int
1021deque_contains(dequeobject *deque, PyObject *v)
1022{
1023 block *b = deque->leftblock;
1024 Py_ssize_t index = deque->leftindex;
1025 Py_ssize_t n = Py_SIZE(deque);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001026 size_t start_state = deque->state;
1027 PyObject *item;
1028 int cmp;
1029
Raymond Hettingere1b02872017-09-04 16:07:06 -07001030 while (--n >= 0) {
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001031 CHECK_NOT_END(b);
1032 item = b->data[index];
1033 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1034 if (cmp) {
1035 return cmp;
1036 }
1037 if (start_state != deque->state) {
1038 PyErr_SetString(PyExc_RuntimeError,
1039 "deque mutated during iteration");
1040 return -1;
1041 }
1042 index++;
1043 if (index == BLOCKLEN) {
1044 b = b->rightlink;
1045 index = 0;
1046 }
1047 }
1048 return 0;
1049}
1050
Martin v. Löwis18e16552006-02-15 17:27:45 +00001051static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001052deque_len(dequeobject *deque)
1053{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001054 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001055}
1056
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001057static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001058deque_index(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001059{
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001060 Py_ssize_t i, n, start=0, stop=Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001061 PyObject *v, *item;
1062 block *b = deque->leftblock;
1063 Py_ssize_t index = deque->leftindex;
1064 size_t start_state = deque->state;
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001065 int cmp;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001066
Victor Stinnerdd407d52017-02-06 16:06:49 +01001067 if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index", &v,
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03001068 _PyEval_SliceIndexNotNone, &start,
1069 _PyEval_SliceIndexNotNone, &stop)) {
Victor Stinnerdd407d52017-02-06 16:06:49 +01001070 return NULL;
1071 }
1072
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001073 if (start < 0) {
1074 start += Py_SIZE(deque);
1075 if (start < 0)
1076 start = 0;
1077 }
1078 if (stop < 0) {
1079 stop += Py_SIZE(deque);
1080 if (stop < 0)
1081 stop = 0;
1082 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -07001083 if (stop > Py_SIZE(deque))
1084 stop = Py_SIZE(deque);
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001085 if (start > stop)
1086 start = stop;
1087 assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001088
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001089 /* XXX Replace this loop with faster code from deque_item() */
1090 for (i=0 ; i<start ; i++) {
1091 index++;
1092 if (index == BLOCKLEN) {
1093 b = b->rightlink;
1094 index = 0;
1095 }
1096 }
1097
Raymond Hettingere1b02872017-09-04 16:07:06 -07001098 n = stop - i;
1099 while (--n >= 0) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001100 CHECK_NOT_END(b);
1101 item = b->data[index];
1102 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1103 if (cmp > 0)
Raymond Hettingere1b02872017-09-04 16:07:06 -07001104 return PyLong_FromSsize_t(stop - n - 1);
Raymond Hettingerdf8f5b52015-11-02 07:27:40 -05001105 if (cmp < 0)
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001106 return NULL;
1107 if (start_state != deque->state) {
1108 PyErr_SetString(PyExc_RuntimeError,
1109 "deque mutated during iteration");
1110 return NULL;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001111 }
1112 index++;
1113 if (index == BLOCKLEN) {
1114 b = b->rightlink;
1115 index = 0;
1116 }
1117 }
1118 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
1119 return NULL;
1120}
1121
1122PyDoc_STRVAR(index_doc,
1123"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
1124"Raises ValueError if the value is not present.");
1125
Raymond Hettinger551350a2015-03-24 00:19:53 -07001126/* insert(), remove(), and delitem() are implemented in terms of
1127 rotate() for simplicity and reasonable performance near the end
1128 points. If for some reason these methods become popular, it is not
1129 hard to re-implement this using direct data movement (similar to
1130 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -07001131 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -07001132*/
1133
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001134static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001135deque_insert(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001136{
1137 Py_ssize_t index;
1138 Py_ssize_t n = Py_SIZE(deque);
1139 PyObject *value;
1140 PyObject *rv;
1141
Victor Stinnerdd407d52017-02-06 16:06:49 +01001142 if (!_PyArg_ParseStack(args, nargs, "nO:insert", &index, &value)) {
1143 return NULL;
1144 }
1145
Raymond Hettinger37434322016-01-26 21:44:16 -08001146 if (deque->maxlen == Py_SIZE(deque)) {
Raymond Hettingera6389712016-02-01 21:21:19 -08001147 PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1148 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001149 }
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001150 if (index >= n)
1151 return deque_append(deque, value);
1152 if (index <= -n || index == 0)
1153 return deque_appendleft(deque, value);
1154 if (_deque_rotate(deque, -index))
1155 return NULL;
1156 if (index < 0)
1157 rv = deque_append(deque, value);
1158 else
1159 rv = deque_appendleft(deque, value);
1160 if (rv == NULL)
1161 return NULL;
1162 Py_DECREF(rv);
1163 if (_deque_rotate(deque, index))
1164 return NULL;
1165 Py_RETURN_NONE;
1166}
1167
1168PyDoc_STRVAR(insert_doc,
1169"D.insert(index, object) -- insert object before index");
1170
1171static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001172deque_remove(dequeobject *deque, PyObject *value)
1173{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001174 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 for (i=0 ; i<n ; i++) {
1177 PyObject *item = deque->leftblock->data[deque->leftindex];
1178 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001179
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001180 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 PyErr_SetString(PyExc_IndexError,
1182 "deque mutated during remove().");
1183 return NULL;
1184 }
1185 if (cmp > 0) {
1186 PyObject *tgt = deque_popleft(deque, NULL);
1187 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001188 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001190 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 Py_RETURN_NONE;
1192 }
1193 else if (cmp < 0) {
1194 _deque_rotate(deque, i);
1195 return NULL;
1196 }
1197 _deque_rotate(deque, -1);
1198 }
1199 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1200 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001201}
1202
1203PyDoc_STRVAR(remove_doc,
1204"D.remove(value) -- remove first occurrence of value.");
1205
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001206static int
1207valid_index(Py_ssize_t i, Py_ssize_t limit)
1208{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001209 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001210 to check whether i is in the range: 0 <= i < limit */
1211 return (size_t) i < (size_t) limit;
1212}
1213
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001214static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001215deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 block *b;
1218 PyObject *item;
1219 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001220
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001221 if (!valid_index(i, Py_SIZE(deque))) {
1222 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 return NULL;
1224 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 if (i == 0) {
1227 i = deque->leftindex;
1228 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001229 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 i = deque->rightindex;
1231 b = deque->rightblock;
1232 } else {
1233 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001234 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1235 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001236 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 b = deque->leftblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001238 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 b = b->rightlink;
1240 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001241 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001242 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001243 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 b = deque->rightblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001245 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 b = b->leftlink;
1247 }
1248 }
1249 item = b->data[i];
1250 Py_INCREF(item);
1251 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001252}
1253
1254static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001255deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001258 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001259
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001260 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001261 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001264 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 assert (item != NULL);
1266 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001267 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001268}
1269
1270static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001271deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001272{
Raymond Hettinger38418662016-02-08 20:34:49 -08001273 PyObject *old_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001275 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001276
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001277 if (!valid_index(i, len)) {
1278 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 return -1;
1280 }
1281 if (v == NULL)
1282 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001285 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1286 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 if (index <= halflen) {
1288 b = deque->leftblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001289 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 b = b->rightlink;
1291 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001292 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001293 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001294 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 b = deque->rightblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001296 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 b = b->leftlink;
1298 }
1299 Py_INCREF(v);
Raymond Hettinger38418662016-02-08 20:34:49 -08001300 old_value = b->data[i];
1301 b->data[i] = v;
1302 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001304}
1305
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001306static void
1307deque_dealloc(dequeobject *deque)
1308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 PyObject_GC_UnTrack(deque);
1310 if (deque->weakreflist != NULL)
1311 PyObject_ClearWeakRefs((PyObject *) deque);
1312 if (deque->leftblock != NULL) {
1313 deque_clear(deque);
1314 assert(deque->leftblock != NULL);
1315 freeblock(deque->leftblock);
1316 }
1317 deque->leftblock = NULL;
1318 deque->rightblock = NULL;
1319 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001320}
1321
1322static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001323deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 block *b;
1326 PyObject *item;
1327 Py_ssize_t index;
1328 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger1286d142015-10-14 23:16:57 -07001329 Py_ssize_t indexhigh;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001330
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001331 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1332 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 item = b->data[index];
1334 Py_VISIT(item);
1335 }
1336 indexlo = 0;
1337 }
Raymond Hettinger1286d142015-10-14 23:16:57 -07001338 indexhigh = deque->rightindex;
1339 for (index = indexlo; index <= indexhigh; index++) {
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001340 item = b->data[index];
1341 Py_VISIT(item);
1342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001344}
1345
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001346static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001347deque_reduce(dequeobject *deque)
1348{
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001349 PyObject *dict, *it;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001350 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001351
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001352 if (_PyObject_LookupAttrId((PyObject *)deque, &PyId___dict__, &dict) < 0) {
1353 return NULL;
1354 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001355 if (dict == NULL) {
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001356 dict = Py_None;
1357 Py_INCREF(dict);
1358 }
1359
1360 it = PyObject_GetIter((PyObject *)deque);
1361 if (it == NULL) {
1362 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 return NULL;
1364 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001365
1366 if (deque->maxlen < 0) {
1367 return Py_BuildValue("O()NN", Py_TYPE(deque), dict, it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001369 else {
1370 return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, dict, it);
1371 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001372}
1373
1374PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1375
1376static PyObject *
1377deque_repr(PyObject *deque)
1378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 PyObject *aslist, *result;
1380 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 i = Py_ReprEnter(deque);
1383 if (i != 0) {
1384 if (i < 0)
1385 return NULL;
1386 return PyUnicode_FromString("[...]");
1387 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 aslist = PySequence_List(deque);
1390 if (aslist == NULL) {
1391 Py_ReprLeave(deque);
1392 return NULL;
1393 }
Raymond Hettingera7f630092015-10-10 23:56:02 -04001394 if (((dequeobject *)deque)->maxlen >= 0)
Serhiy Storchakab3a77962017-09-21 14:24:13 +03001395 result = PyUnicode_FromFormat("%s(%R, maxlen=%zd)",
1396 _PyType_Name(Py_TYPE(deque)), aslist,
1397 ((dequeobject *)deque)->maxlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 else
Serhiy Storchakab3a77962017-09-21 14:24:13 +03001399 result = PyUnicode_FromFormat("%s(%R)",
1400 _PyType_Name(Py_TYPE(deque)), aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001402 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001404}
1405
Raymond Hettinger738ec902004-02-29 02:15:56 +00001406static PyObject *
1407deque_richcompare(PyObject *v, PyObject *w, int op)
1408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 PyObject *it1=NULL, *it2=NULL, *x, *y;
1410 Py_ssize_t vs, ws;
1411 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 if (!PyObject_TypeCheck(v, &deque_type) ||
1414 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001415 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001419 vs = Py_SIZE((dequeobject *)v);
1420 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 if (op == Py_EQ) {
1422 if (v == w)
1423 Py_RETURN_TRUE;
1424 if (vs != ws)
1425 Py_RETURN_FALSE;
1426 }
1427 if (op == Py_NE) {
1428 if (v == w)
1429 Py_RETURN_FALSE;
1430 if (vs != ws)
1431 Py_RETURN_TRUE;
1432 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 /* Search for the first index where items are different */
1435 it1 = PyObject_GetIter(v);
1436 if (it1 == NULL)
1437 goto done;
1438 it2 = PyObject_GetIter(w);
1439 if (it2 == NULL)
1440 goto done;
1441 for (;;) {
1442 x = PyIter_Next(it1);
1443 if (x == NULL && PyErr_Occurred())
1444 goto done;
1445 y = PyIter_Next(it2);
1446 if (x == NULL || y == NULL)
1447 break;
1448 b = PyObject_RichCompareBool(x, y, Py_EQ);
1449 if (b == 0) {
1450 cmp = PyObject_RichCompareBool(x, y, op);
1451 Py_DECREF(x);
1452 Py_DECREF(y);
1453 goto done;
1454 }
1455 Py_DECREF(x);
1456 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001457 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 goto done;
1459 }
1460 /* We reached the end of one deque or both */
1461 Py_XDECREF(x);
1462 Py_XDECREF(y);
1463 if (PyErr_Occurred())
1464 goto done;
1465 switch (op) {
1466 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1467 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1468 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1469 case Py_NE: cmp = x != y; break; /* if one deque continues */
1470 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1471 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1472 }
Tim Peters1065f752004-10-01 01:03:29 +00001473
Raymond Hettinger738ec902004-02-29 02:15:56 +00001474done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 Py_XDECREF(it1);
1476 Py_XDECREF(it2);
1477 if (cmp == 1)
1478 Py_RETURN_TRUE;
1479 if (cmp == 0)
1480 Py_RETURN_FALSE;
1481 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001482}
1483
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001484static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001485deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 PyObject *iterable = NULL;
1488 PyObject *maxlenobj = NULL;
1489 Py_ssize_t maxlen = -1;
1490 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001491
Raymond Hettinger0d309402015-09-30 23:15:02 -07001492 if (kwdargs == NULL) {
1493 if (!PyArg_UnpackTuple(args, "deque()", 0, 2, &iterable, &maxlenobj))
1494 return -1;
1495 } else {
1496 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist,
1497 &iterable, &maxlenobj))
1498 return -1;
1499 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (maxlenobj != NULL && maxlenobj != Py_None) {
1501 maxlen = PyLong_AsSsize_t(maxlenobj);
1502 if (maxlen == -1 && PyErr_Occurred())
1503 return -1;
1504 if (maxlen < 0) {
1505 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1506 return -1;
1507 }
1508 }
1509 deque->maxlen = maxlen;
Raymond Hettinger0d309402015-09-30 23:15:02 -07001510 if (Py_SIZE(deque) > 0)
1511 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 if (iterable != NULL) {
1513 PyObject *rv = deque_extend(deque, iterable);
1514 if (rv == NULL)
1515 return -1;
1516 Py_DECREF(rv);
1517 }
1518 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001519}
1520
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001521static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001522deque_sizeof(dequeobject *deque, void *unused)
1523{
1524 Py_ssize_t res;
1525 Py_ssize_t blocks;
1526
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001527 res = _PyObject_SIZE(Py_TYPE(deque));
Raymond Hettingerbc003412015-10-14 23:33:23 -07001528 blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001529 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001530 (blocks - 1) * BLOCKLEN + deque->rightindex);
1531 res += blocks * sizeof(block);
1532 return PyLong_FromSsize_t(res);
1533}
1534
1535PyDoc_STRVAR(sizeof_doc,
1536"D.__sizeof__() -- size of D in memory, in bytes");
1537
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001538static int
1539deque_bool(dequeobject *deque)
1540{
1541 return Py_SIZE(deque) != 0;
1542}
1543
Jesus Cea16e2fca2012-08-03 14:49:42 +02001544static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001545deque_get_maxlen(dequeobject *deque)
1546{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001547 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 Py_RETURN_NONE;
1549 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001550}
1551
Raymond Hettinger41290a62015-03-31 08:12:23 -07001552
1553/* deque object ********************************************************/
1554
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001555static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1557 "maximum size of a deque or None if unbounded"},
1558 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001559};
1560
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001561static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001563 (binaryfunc)deque_concat, /* sq_concat */
1564 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 (ssizeargfunc)deque_item, /* sq_item */
1566 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001567 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001569 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001570 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001571 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001572};
1573
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001574static PyNumberMethods deque_as_number = {
1575 0, /* nb_add */
1576 0, /* nb_subtract */
1577 0, /* nb_multiply */
1578 0, /* nb_remainder */
1579 0, /* nb_divmod */
1580 0, /* nb_power */
1581 0, /* nb_negative */
1582 0, /* nb_positive */
1583 0, /* nb_absolute */
1584 (inquiry)deque_bool, /* nb_bool */
1585 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001586 };
1587
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001588static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001589static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001590PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001592
1593static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 {"append", (PyCFunction)deque_append,
1595 METH_O, append_doc},
1596 {"appendleft", (PyCFunction)deque_appendleft,
1597 METH_O, appendleft_doc},
1598 {"clear", (PyCFunction)deque_clearmethod,
1599 METH_NOARGS, clear_doc},
1600 {"__copy__", (PyCFunction)deque_copy,
1601 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001602 {"copy", (PyCFunction)deque_copy,
1603 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001605 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 {"extend", (PyCFunction)deque_extend,
1607 METH_O, extend_doc},
1608 {"extendleft", (PyCFunction)deque_extendleft,
1609 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001610 {"index", (PyCFunction)deque_index,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001611 METH_FASTCALL, index_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001612 {"insert", (PyCFunction)deque_insert,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001613 METH_FASTCALL, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 {"pop", (PyCFunction)deque_pop,
1615 METH_NOARGS, pop_doc},
1616 {"popleft", (PyCFunction)deque_popleft,
1617 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001618 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 METH_NOARGS, reduce_doc},
1620 {"remove", (PyCFunction)deque_remove,
1621 METH_O, remove_doc},
1622 {"__reversed__", (PyCFunction)deque_reviter,
1623 METH_NOARGS, reversed_doc},
1624 {"reverse", (PyCFunction)deque_reverse,
1625 METH_NOARGS, reverse_doc},
1626 {"rotate", (PyCFunction)deque_rotate,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001627 METH_FASTCALL, rotate_doc},
Jesus Cea16e2fca2012-08-03 14:49:42 +02001628 {"__sizeof__", (PyCFunction)deque_sizeof,
1629 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001631};
1632
1633PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001634"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001635\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001636A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001637
Neal Norwitz87f10132004-02-29 15:40:53 +00001638static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 PyVarObject_HEAD_INIT(NULL, 0)
1640 "collections.deque", /* tp_name */
1641 sizeof(dequeobject), /* tp_basicsize */
1642 0, /* tp_itemsize */
1643 /* methods */
1644 (destructor)deque_dealloc, /* tp_dealloc */
1645 0, /* tp_print */
1646 0, /* tp_getattr */
1647 0, /* tp_setattr */
1648 0, /* tp_reserved */
1649 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001650 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 &deque_as_sequence, /* tp_as_sequence */
1652 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001653 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 0, /* tp_call */
1655 0, /* tp_str */
1656 PyObject_GenericGetAttr, /* tp_getattro */
1657 0, /* tp_setattro */
1658 0, /* tp_as_buffer */
1659 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001660 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 deque_doc, /* tp_doc */
1662 (traverseproc)deque_traverse, /* tp_traverse */
1663 (inquiry)deque_clear, /* tp_clear */
1664 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001665 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 (getiterfunc)deque_iter, /* tp_iter */
1667 0, /* tp_iternext */
1668 deque_methods, /* tp_methods */
1669 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001670 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 0, /* tp_base */
1672 0, /* tp_dict */
1673 0, /* tp_descr_get */
1674 0, /* tp_descr_set */
1675 0, /* tp_dictoffset */
1676 (initproc)deque_init, /* tp_init */
1677 PyType_GenericAlloc, /* tp_alloc */
1678 deque_new, /* tp_new */
1679 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001680};
1681
1682/*********************** Deque Iterator **************************/
1683
1684typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001687 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001689 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001691} dequeiterobject;
1692
Martin v. Löwis59683e82008-06-13 07:50:45 +00001693static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001694
1695static PyObject *
1696deque_iter(dequeobject *deque)
1697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1701 if (it == NULL)
1702 return NULL;
1703 it->b = deque->leftblock;
1704 it->index = deque->leftindex;
1705 Py_INCREF(deque);
1706 it->deque = deque;
1707 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001708 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 PyObject_GC_Track(it);
1710 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001711}
1712
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001713static int
1714dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 Py_VISIT(dio->deque);
1717 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001718}
1719
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001720static void
1721dequeiter_dealloc(dequeiterobject *dio)
1722{
INADA Naokia6296d32017-08-24 14:55:17 +09001723 /* bpo-31095: UnTrack is needed before calling any callbacks */
1724 PyObject_GC_UnTrack(dio);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 Py_XDECREF(dio->deque);
1726 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001727}
1728
1729static PyObject *
1730dequeiter_next(dequeiterobject *it)
1731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 if (it->deque->state != it->state) {
1735 it->counter = 0;
1736 PyErr_SetString(PyExc_RuntimeError,
1737 "deque mutated during iteration");
1738 return NULL;
1739 }
1740 if (it->counter == 0)
1741 return NULL;
1742 assert (!(it->b == it->deque->rightblock &&
1743 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 item = it->b->data[it->index];
1746 it->index++;
1747 it->counter--;
1748 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001749 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 it->b = it->b->rightlink;
1751 it->index = 0;
1752 }
1753 Py_INCREF(item);
1754 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001755}
1756
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001757static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001758dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1759{
1760 Py_ssize_t i, index=0;
1761 PyObject *deque;
1762 dequeiterobject *it;
1763 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1764 return NULL;
1765 assert(type == &dequeiter_type);
1766
1767 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1768 if (!it)
1769 return NULL;
1770 /* consume items from the queue */
1771 for(i=0; i<index; i++) {
1772 PyObject *item = dequeiter_next(it);
1773 if (item) {
1774 Py_DECREF(item);
1775 } else {
1776 if (it->counter) {
1777 Py_DECREF(it);
1778 return NULL;
1779 } else
1780 break;
1781 }
1782 }
1783 return (PyObject*)it;
1784}
1785
1786static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001787dequeiter_len(dequeiterobject *it)
1788{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001789 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001790}
1791
Armin Rigof5b3e362006-02-11 21:32:43 +00001792PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001793
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001794static PyObject *
1795dequeiter_reduce(dequeiterobject *it)
1796{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001797 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 +00001798}
1799
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001800static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001802 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001804};
1805
Martin v. Löwis59683e82008-06-13 07:50:45 +00001806static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001808 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 sizeof(dequeiterobject), /* tp_basicsize */
1810 0, /* tp_itemsize */
1811 /* methods */
1812 (destructor)dequeiter_dealloc, /* tp_dealloc */
1813 0, /* tp_print */
1814 0, /* tp_getattr */
1815 0, /* tp_setattr */
1816 0, /* tp_reserved */
1817 0, /* tp_repr */
1818 0, /* tp_as_number */
1819 0, /* tp_as_sequence */
1820 0, /* tp_as_mapping */
1821 0, /* tp_hash */
1822 0, /* tp_call */
1823 0, /* tp_str */
1824 PyObject_GenericGetAttr, /* tp_getattro */
1825 0, /* tp_setattro */
1826 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001827 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 0, /* tp_doc */
1829 (traverseproc)dequeiter_traverse, /* tp_traverse */
1830 0, /* tp_clear */
1831 0, /* tp_richcompare */
1832 0, /* tp_weaklistoffset */
1833 PyObject_SelfIter, /* tp_iter */
1834 (iternextfunc)dequeiter_next, /* tp_iternext */
1835 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001836 0, /* tp_members */
1837 0, /* tp_getset */
1838 0, /* tp_base */
1839 0, /* tp_dict */
1840 0, /* tp_descr_get */
1841 0, /* tp_descr_set */
1842 0, /* tp_dictoffset */
1843 0, /* tp_init */
1844 0, /* tp_alloc */
1845 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001847};
1848
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001849/*********************** Deque Reverse Iterator **************************/
1850
Martin v. Löwis59683e82008-06-13 07:50:45 +00001851static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001852
1853static PyObject *
1854deque_reviter(dequeobject *deque)
1855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1859 if (it == NULL)
1860 return NULL;
1861 it->b = deque->rightblock;
1862 it->index = deque->rightindex;
1863 Py_INCREF(deque);
1864 it->deque = deque;
1865 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001866 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 PyObject_GC_Track(it);
1868 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001869}
1870
1871static PyObject *
1872dequereviter_next(dequeiterobject *it)
1873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 PyObject *item;
1875 if (it->counter == 0)
1876 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 if (it->deque->state != it->state) {
1879 it->counter = 0;
1880 PyErr_SetString(PyExc_RuntimeError,
1881 "deque mutated during iteration");
1882 return NULL;
1883 }
1884 assert (!(it->b == it->deque->leftblock &&
1885 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 item = it->b->data[it->index];
1888 it->index--;
1889 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001890 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001891 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 it->b = it->b->leftlink;
1893 it->index = BLOCKLEN - 1;
1894 }
1895 Py_INCREF(item);
1896 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001897}
1898
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001899static PyObject *
1900dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1901{
1902 Py_ssize_t i, index=0;
1903 PyObject *deque;
1904 dequeiterobject *it;
1905 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1906 return NULL;
1907 assert(type == &dequereviter_type);
1908
1909 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1910 if (!it)
1911 return NULL;
1912 /* consume items from the queue */
1913 for(i=0; i<index; i++) {
1914 PyObject *item = dequereviter_next(it);
1915 if (item) {
1916 Py_DECREF(item);
1917 } else {
1918 if (it->counter) {
1919 Py_DECREF(it);
1920 return NULL;
1921 } else
1922 break;
1923 }
1924 }
1925 return (PyObject*)it;
1926}
1927
Martin v. Löwis59683e82008-06-13 07:50:45 +00001928static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001930 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 sizeof(dequeiterobject), /* tp_basicsize */
1932 0, /* tp_itemsize */
1933 /* methods */
1934 (destructor)dequeiter_dealloc, /* tp_dealloc */
1935 0, /* tp_print */
1936 0, /* tp_getattr */
1937 0, /* tp_setattr */
1938 0, /* tp_reserved */
1939 0, /* tp_repr */
1940 0, /* tp_as_number */
1941 0, /* tp_as_sequence */
1942 0, /* tp_as_mapping */
1943 0, /* tp_hash */
1944 0, /* tp_call */
1945 0, /* tp_str */
1946 PyObject_GenericGetAttr, /* tp_getattro */
1947 0, /* tp_setattro */
1948 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001949 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 0, /* tp_doc */
1951 (traverseproc)dequeiter_traverse, /* tp_traverse */
1952 0, /* tp_clear */
1953 0, /* tp_richcompare */
1954 0, /* tp_weaklistoffset */
1955 PyObject_SelfIter, /* tp_iter */
1956 (iternextfunc)dequereviter_next, /* tp_iternext */
1957 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001958 0, /* tp_members */
1959 0, /* tp_getset */
1960 0, /* tp_base */
1961 0, /* tp_dict */
1962 0, /* tp_descr_get */
1963 0, /* tp_descr_set */
1964 0, /* tp_dictoffset */
1965 0, /* tp_init */
1966 0, /* tp_alloc */
1967 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001969};
1970
Guido van Rossum1968ad32006-02-25 22:38:04 +00001971/* defaultdict type *********************************************************/
1972
1973typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 PyDictObject dict;
1975 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001976} defdictobject;
1977
1978static PyTypeObject defdict_type; /* Forward */
1979
1980PyDoc_STRVAR(defdict_missing_doc,
1981"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001982 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001983 self[key] = value = self.default_factory()\n\
1984 return value\n\
1985");
1986
1987static PyObject *
1988defdict_missing(defdictobject *dd, PyObject *key)
1989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 PyObject *factory = dd->default_factory;
1991 PyObject *value;
1992 if (factory == NULL || factory == Py_None) {
1993 /* XXX Call dict.__missing__(key) */
1994 PyObject *tup;
1995 tup = PyTuple_Pack(1, key);
1996 if (!tup) return NULL;
1997 PyErr_SetObject(PyExc_KeyError, tup);
1998 Py_DECREF(tup);
1999 return NULL;
2000 }
2001 value = PyEval_CallObject(factory, NULL);
2002 if (value == NULL)
2003 return value;
2004 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
2005 Py_DECREF(value);
2006 return NULL;
2007 }
2008 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002009}
2010
2011PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
2012
2013static PyObject *
2014defdict_copy(defdictobject *dd)
2015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 /* This calls the object's class. That only works for subclasses
2017 whose class constructor has the same signature. Subclasses that
2018 define a different constructor signature must override copy().
2019 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (dd->default_factory == NULL)
2022 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
2023 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2024 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002025}
2026
2027static PyObject *
2028defdict_reduce(defdictobject *dd)
2029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00002031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 - factory function
2033 - tuple of args for the factory function
2034 - additional state (here None)
2035 - sequence iterator (here None)
2036 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00002037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 For this to be useful with pickle.py, the default_factory
2041 must be picklable; e.g., None, a built-in, or a global
2042 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 Both shallow and deep copying are supported, but for deep
2045 copying, the default_factory must be deep-copyable; e.g. None,
2046 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 This only works for subclasses as long as their constructor
2049 signature is compatible; the first argument must be the
2050 optional default_factory, defaulting to None.
2051 */
2052 PyObject *args;
2053 PyObject *items;
2054 PyObject *iter;
2055 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002056 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (dd->default_factory == NULL || dd->default_factory == Py_None)
2059 args = PyTuple_New(0);
2060 else
2061 args = PyTuple_Pack(1, dd->default_factory);
2062 if (args == NULL)
2063 return NULL;
Victor Stinnerad8c83a2016-09-05 17:53:15 -07002064 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 if (items == NULL) {
2066 Py_DECREF(args);
2067 return NULL;
2068 }
2069 iter = PyObject_GetIter(items);
2070 if (iter == NULL) {
2071 Py_DECREF(items);
2072 Py_DECREF(args);
2073 return NULL;
2074 }
2075 result = PyTuple_Pack(5, Py_TYPE(dd), args,
2076 Py_None, Py_None, iter);
2077 Py_DECREF(iter);
2078 Py_DECREF(items);
2079 Py_DECREF(args);
2080 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002081}
2082
2083static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 {"__missing__", (PyCFunction)defdict_missing, METH_O,
2085 defdict_missing_doc},
2086 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
2087 defdict_copy_doc},
2088 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
2089 defdict_copy_doc},
2090 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
2091 reduce_doc},
2092 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002093};
2094
2095static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 {"default_factory", T_OBJECT,
2097 offsetof(defdictobject, default_factory), 0,
2098 PyDoc_STR("Factory for default value called by __missing__().")},
2099 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002100};
2101
2102static void
2103defdict_dealloc(defdictobject *dd)
2104{
INADA Naokia6296d32017-08-24 14:55:17 +09002105 /* bpo-31095: UnTrack is needed before calling any callbacks */
2106 PyObject_GC_UnTrack(dd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 Py_CLEAR(dd->default_factory);
2108 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002109}
2110
Guido van Rossum1968ad32006-02-25 22:38:04 +00002111static PyObject *
2112defdict_repr(defdictobject *dd)
2113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 PyObject *baserepr;
2115 PyObject *defrepr;
2116 PyObject *result;
2117 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2118 if (baserepr == NULL)
2119 return NULL;
2120 if (dd->default_factory == NULL)
2121 defrepr = PyUnicode_FromString("None");
2122 else
2123 {
2124 int status = Py_ReprEnter(dd->default_factory);
2125 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002126 if (status < 0) {
2127 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002129 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 defrepr = PyUnicode_FromString("...");
2131 }
2132 else
2133 defrepr = PyObject_Repr(dd->default_factory);
2134 Py_ReprLeave(dd->default_factory);
2135 }
2136 if (defrepr == NULL) {
2137 Py_DECREF(baserepr);
2138 return NULL;
2139 }
Serhiy Storchakab3a77962017-09-21 14:24:13 +03002140 result = PyUnicode_FromFormat("%s(%U, %U)",
2141 _PyType_Name(Py_TYPE(dd)),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 defrepr, baserepr);
2143 Py_DECREF(defrepr);
2144 Py_DECREF(baserepr);
2145 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002146}
2147
2148static int
2149defdict_traverse(PyObject *self, visitproc visit, void *arg)
2150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 Py_VISIT(((defdictobject *)self)->default_factory);
2152 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002153}
2154
2155static int
2156defdict_tp_clear(defdictobject *dd)
2157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 Py_CLEAR(dd->default_factory);
2159 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002160}
2161
2162static int
2163defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 defdictobject *dd = (defdictobject *)self;
2166 PyObject *olddefault = dd->default_factory;
2167 PyObject *newdefault = NULL;
2168 PyObject *newargs;
2169 int result;
2170 if (args == NULL || !PyTuple_Check(args))
2171 newargs = PyTuple_New(0);
2172 else {
2173 Py_ssize_t n = PyTuple_GET_SIZE(args);
2174 if (n > 0) {
2175 newdefault = PyTuple_GET_ITEM(args, 0);
2176 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2177 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002178 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 return -1;
2180 }
2181 }
2182 newargs = PySequence_GetSlice(args, 1, n);
2183 }
2184 if (newargs == NULL)
2185 return -1;
2186 Py_XINCREF(newdefault);
2187 dd->default_factory = newdefault;
2188 result = PyDict_Type.tp_init(self, newargs, kwds);
2189 Py_DECREF(newargs);
2190 Py_XDECREF(olddefault);
2191 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002192}
2193
2194PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002195"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002196\n\
2197The default factory is called without arguments to produce\n\
2198a new value when a key is not present, in __getitem__ only.\n\
2199A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002200All remaining arguments are treated the same as if they were\n\
2201passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002202");
2203
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002204/* See comment in xxsubtype.c */
2205#define DEFERRED_ADDRESS(ADDR) 0
2206
Guido van Rossum1968ad32006-02-25 22:38:04 +00002207static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2209 "collections.defaultdict", /* tp_name */
2210 sizeof(defdictobject), /* tp_basicsize */
2211 0, /* tp_itemsize */
2212 /* methods */
2213 (destructor)defdict_dealloc, /* tp_dealloc */
2214 0, /* tp_print */
2215 0, /* tp_getattr */
2216 0, /* tp_setattr */
2217 0, /* tp_reserved */
2218 (reprfunc)defdict_repr, /* tp_repr */
2219 0, /* tp_as_number */
2220 0, /* tp_as_sequence */
2221 0, /* tp_as_mapping */
2222 0, /* tp_hash */
2223 0, /* tp_call */
2224 0, /* tp_str */
2225 PyObject_GenericGetAttr, /* tp_getattro */
2226 0, /* tp_setattro */
2227 0, /* tp_as_buffer */
2228 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2229 /* tp_flags */
2230 defdict_doc, /* tp_doc */
2231 defdict_traverse, /* tp_traverse */
2232 (inquiry)defdict_tp_clear, /* tp_clear */
2233 0, /* tp_richcompare */
2234 0, /* tp_weaklistoffset*/
2235 0, /* tp_iter */
2236 0, /* tp_iternext */
2237 defdict_methods, /* tp_methods */
2238 defdict_members, /* tp_members */
2239 0, /* tp_getset */
2240 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2241 0, /* tp_dict */
2242 0, /* tp_descr_get */
2243 0, /* tp_descr_set */
2244 0, /* tp_dictoffset */
2245 defdict_init, /* tp_init */
2246 PyType_GenericAlloc, /* tp_alloc */
2247 0, /* tp_new */
2248 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002249};
2250
Raymond Hettinger96f34102010-12-15 16:30:37 +00002251/* helper function for Counter *********************************************/
2252
2253PyDoc_STRVAR(_count_elements_doc,
2254"_count_elements(mapping, iterable) -> None\n\
2255\n\
Raymond Hettingera24dca62017-01-12 22:25:25 -08002256Count elements in the iterable, updating the mapping");
Raymond Hettinger96f34102010-12-15 16:30:37 +00002257
2258static PyObject *
2259_count_elements(PyObject *self, PyObject *args)
2260{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002261 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002262 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002263 PyObject *it, *iterable, *mapping, *oldval;
2264 PyObject *newval = NULL;
2265 PyObject *key = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002266 PyObject *bound_get = NULL;
2267 PyObject *mapping_get;
2268 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002269 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002270 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002271
2272 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2273 return NULL;
2274
Raymond Hettinger96f34102010-12-15 16:30:37 +00002275 it = PyObject_GetIter(iterable);
2276 if (it == NULL)
2277 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002278
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002279 /* Only take the fast path when get() and __setitem__()
2280 * have not been overridden.
2281 */
2282 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2283 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002284 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2285 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2286
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002287 if (mapping_get != NULL && mapping_get == dict_get &&
Oren Milman31aca4b2017-09-27 06:18:21 +03002288 mapping_setitem != NULL && mapping_setitem == dict_setitem &&
2289 PyDict_Check(mapping))
2290 {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002291 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002292 /* Fast path advantages:
2293 1. Eliminate double hashing
2294 (by re-using the same hash for both the get and set)
2295 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2296 (argument tuple creation and parsing)
2297 3. Avoid indirection through a bound method object
2298 (creates another argument tuple)
2299 4. Avoid initial increment from zero
2300 (reuse an existing one-object instead)
2301 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002302 Py_hash_t hash;
2303
Raymond Hettinger426e0522011-01-03 02:12:02 +00002304 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002305 if (key == NULL)
2306 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002307
2308 if (!PyUnicode_CheckExact(key) ||
2309 (hash = ((PyASCIIObject *) key)->hash) == -1)
2310 {
2311 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002312 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002313 goto done;
2314 }
2315
2316 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002317 if (oldval == NULL) {
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002318 if (PyErr_Occurred())
2319 goto done;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002320 if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_One, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002321 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002322 } else {
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002323 newval = PyNumber_Add(oldval, _PyLong_One);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002324 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002325 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002326 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002327 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002328 Py_CLEAR(newval);
2329 }
2330 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002331 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002332 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002333 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002334 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002335 goto done;
2336
Raymond Hettinger426e0522011-01-03 02:12:02 +00002337 while (1) {
2338 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002339 if (key == NULL)
2340 break;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002341 oldval = PyObject_CallFunctionObjArgs(bound_get, key, _PyLong_Zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002342 if (oldval == NULL)
2343 break;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002344 newval = PyNumber_Add(oldval, _PyLong_One);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002345 Py_DECREF(oldval);
2346 if (newval == NULL)
2347 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002348 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002349 break;
2350 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002351 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002352 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002353 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002354
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002355done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002356 Py_DECREF(it);
2357 Py_XDECREF(key);
2358 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002359 Py_XDECREF(bound_get);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002360 if (PyErr_Occurred())
2361 return NULL;
2362 Py_RETURN_NONE;
2363}
2364
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002365/* module level code ********************************************************/
2366
2367PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002368"High performance data structures.\n\
2369- deque: ordered collection accessible from endpoints only\n\
2370- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002371");
2372
Raymond Hettinger96f34102010-12-15 16:30:37 +00002373static struct PyMethodDef module_functions[] = {
2374 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2375 {NULL, NULL} /* sentinel */
2376};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002377
2378static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 PyModuleDef_HEAD_INIT,
2380 "_collections",
2381 module_doc,
2382 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002383 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 NULL,
2385 NULL,
2386 NULL,
2387 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002388};
2389
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002390PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002391PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 m = PyModule_Create(&_collectionsmodule);
2396 if (m == NULL)
2397 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 if (PyType_Ready(&deque_type) < 0)
2400 return NULL;
2401 Py_INCREF(&deque_type);
2402 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 defdict_type.tp_base = &PyDict_Type;
2405 if (PyType_Ready(&defdict_type) < 0)
2406 return NULL;
2407 Py_INCREF(&defdict_type);
2408 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002409
Eric Snow47db7172015-05-29 22:21:39 -06002410 Py_INCREF(&PyODict_Type);
2411 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 if (PyType_Ready(&dequeiter_type) < 0)
2414 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002415 Py_INCREF(&dequeiter_type);
2416 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 if (PyType_Ready(&dequereviter_type) < 0)
2419 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002420 Py_INCREF(&dequereviter_type);
2421 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002424}