blob: 44e9e119ae26e3f05b6750618f1d2af3675cb98f [file] [log] [blame]
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001#include "Python.h"
Raymond Hettinger691d8052004-05-30 07:26:47 +00002#include "structmember.h"
Raymond Hettinger756b3f32004-01-29 06:37:52 +00003
Raymond Hettingerc2083082015-02-28 23:29:16 -08004#ifdef STDC_HEADERS
5#include <stddef.h>
6#else
7#include <sys/types.h> /* For size_t */
8#endif
9
Raymond Hettinger756b3f32004-01-29 06:37:52 +000010/* collections module implementation of a deque() datatype
11 Written and maintained by Raymond D. Hettinger <python@rcn.com>
Raymond Hettinger756b3f32004-01-29 06:37:52 +000012*/
13
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000014/* The block length may be set to any number over 1. Larger numbers
Raymond Hettinger20b0f872013-06-23 15:44:33 -070015 * reduce the number of calls to the memory allocator, give faster
Raymond Hettinger30c90742015-03-02 22:31:35 -080016 * indexing and rotation, and reduce the link to data overhead ratio.
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080017 * Making the block length a power of two speeds-up the modulo
Raymond Hettinger30c90742015-03-02 22:31:35 -080018 * and division calculations in deque_item() and deque_ass_item().
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000019 */
20
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080021#define BLOCKLEN 64
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000022#define CENTER ((BLOCKLEN - 1) / 2)
Raymond Hettinger756b3f32004-01-29 06:37:52 +000023
Raymond Hettinger551350a2015-03-24 00:19:53 -070024/* Data for deque objects is stored in a doubly-linked list of fixed
25 * length blocks. This assures that appends or pops never move any
26 * other data elements besides the one being appended or popped.
27 *
28 * Another advantage is that it completely avoids use of realloc(),
29 * resulting in more predictable performance.
30 *
31 * Textbook implementations of doubly-linked lists store one datum
32 * per link, but that gives them a 200% memory overhead (a prev and
33 * next link for each datum) and it costs one malloc() call per data
34 * element. By using fixed-length blocks, the link to data ratio is
35 * significantly improved and there are proportionally fewer calls
36 * to malloc() and free(). The data blocks of consecutive pointers
37 * also improve cache locality.
38 *
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000039 * The list of blocks is never empty, so d.leftblock and d.rightblock
Raymond Hettinger82df9252013-07-07 01:43:42 -100040 * are never equal to NULL. The list is not circular.
41 *
42 * A deque d's first element is at d.leftblock[leftindex]
43 * and its last element is at d.rightblock[rightindex].
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000044 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070045 * Unlike Python slice indices, these indices are inclusive on both
46 * ends. This makes the algorithms for left and right operations
47 * more symmetrical and it simplifies the design.
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000048 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070049 * The indices, d.leftindex and d.rightindex are always in the range:
50 * 0 <= index < BLOCKLEN
51 *
52 * And their exact relationship is:
53 * (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000054 *
Raymond Hettinger8dbbae22015-03-24 21:01:50 -070055 * Whenever d.leftblock == d.rightblock, then:
Raymond Hettinger551350a2015-03-24 00:19:53 -070056 * d.leftindex + d.len - 1 == d.rightindex
Thomas Wouters0e3f5912006-08-11 14:57:12 +000057 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070058 * However, when d.leftblock != d.rightblock, the d.leftindex and
59 * d.rightindex become indices into distinct blocks and either may
60 * be larger than the other.
61 *
62 * Empty deques have:
63 * d.len == 0
64 * d.leftblock == d.rightblock
65 * d.leftindex == CENTER + 1
66 * d.rightindex == CENTER
67 *
68 * Checking for d.len == 0 is the intended way to see whether d is empty.
Tim Petersd8768d32004-10-01 01:32:53 +000069 */
70
Raymond Hettinger756b3f32004-01-29 06:37:52 +000071typedef struct BLOCK {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 struct BLOCK *leftlink;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 PyObject *data[BLOCKLEN];
Raymond Hettinger20b0f872013-06-23 15:44:33 -070074 struct BLOCK *rightlink;
Raymond Hettinger756b3f32004-01-29 06:37:52 +000075} block;
76
Raymond Hettinger30c90742015-03-02 22:31:35 -080077typedef struct {
78 PyObject_VAR_HEAD
79 block *leftblock;
80 block *rightblock;
Raymond Hettinger551350a2015-03-24 00:19:53 -070081 Py_ssize_t leftindex; /* 0 <= leftindex < BLOCKLEN */
82 Py_ssize_t rightindex; /* 0 <= rightindex < BLOCKLEN */
Raymond Hettingerf9d9c792015-03-02 22:47:46 -080083 size_t state; /* incremented whenever the indices move */
Raymond Hettingerd84ec222016-01-24 09:12:06 -080084 Py_ssize_t maxlen; /* maxlen is -1 for unbounded deques */
Raymond Hettinger0f6f9472015-03-21 01:42:10 -070085 PyObject *weakreflist;
Raymond Hettinger30c90742015-03-02 22:31:35 -080086} dequeobject;
87
88static PyTypeObject deque_type;
89
Raymond Hettinger82df9252013-07-07 01:43:42 -100090/* For debug builds, add error checking to track the endpoints
91 * in the chain of links. The goal is to make sure that link
92 * assignments only take place at endpoints so that links already
93 * in use do not get overwritten.
94 *
95 * CHECK_END should happen before each assignment to a block's link field.
96 * MARK_END should happen whenever a link field becomes a new endpoint.
97 * This happens when new blocks are added or whenever an existing
98 * block is freed leaving another existing block as the new endpoint.
99 */
100
Raymond Hettinger3223dd52013-07-26 23:14:22 -0700101#ifndef NDEBUG
Raymond Hettinger82df9252013-07-07 01:43:42 -1000102#define MARK_END(link) link = NULL;
103#define CHECK_END(link) assert(link == NULL);
104#define CHECK_NOT_END(link) assert(link != NULL);
105#else
106#define MARK_END(link)
107#define CHECK_END(link)
108#define CHECK_NOT_END(link)
109#endif
110
111/* A simple freelisting scheme is used to minimize calls to the memory
Raymond Hettinger551350a2015-03-24 00:19:53 -0700112 allocator. It accommodates common use cases where new blocks are being
Raymond Hettinger82df9252013-07-07 01:43:42 -1000113 added at about the same rate as old blocks are being freed.
114 */
115
Raymond Hettingerf2b02ce2015-09-26 17:47:02 -0700116#define MAXFREEBLOCKS 16
Benjamin Petersond6313712008-07-31 16:23:04 +0000117static Py_ssize_t numfreeblocks = 0;
Guido van Rossum58da9312007-11-10 23:39:45 +0000118static block *freeblocks[MAXFREEBLOCKS];
119
Tim Peters6f853562004-10-01 01:04:50 +0000120static block *
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700121newblock(void) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 block *b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 if (numfreeblocks) {
Raymond Hettinger59cf23a2013-02-07 00:57:19 -0500124 numfreeblocks--;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000125 return freeblocks[numfreeblocks];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000127 b = PyMem_Malloc(sizeof(block));
128 if (b != NULL) {
129 return b;
130 }
131 PyErr_NoMemory();
132 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000133}
134
Martin v. Löwis59683e82008-06-13 07:50:45 +0000135static void
Guido van Rossum58da9312007-11-10 23:39:45 +0000136freeblock(block *b)
137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 if (numfreeblocks < MAXFREEBLOCKS) {
139 freeblocks[numfreeblocks] = b;
140 numfreeblocks++;
141 } else {
142 PyMem_Free(b);
143 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000144}
145
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000146static PyObject *
147deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 dequeobject *deque;
150 block *b;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 /* create dequeobject structure */
153 deque = (dequeobject *)type->tp_alloc(type, 0);
154 if (deque == NULL)
155 return NULL;
Tim Peters1065f752004-10-01 01:03:29 +0000156
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700157 b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 if (b == NULL) {
159 Py_DECREF(deque);
160 return NULL;
161 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000162 MARK_END(b->leftlink);
163 MARK_END(b->rightlink);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 assert(BLOCKLEN >= 2);
Raymond Hettinger87e69122015-03-02 23:32:02 -0800166 Py_SIZE(deque) = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 deque->leftblock = b;
168 deque->rightblock = b;
169 deque->leftindex = CENTER + 1;
170 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 deque->state = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 deque->maxlen = -1;
Raymond Hettinger87e69122015-03-02 23:32:02 -0800173 deque->weakreflist = NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 return (PyObject *)deque;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000176}
177
178static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000179deque_pop(dequeobject *deque, PyObject *unused)
180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyObject *item;
182 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000183
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000184 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
186 return NULL;
187 }
188 item = deque->rightblock->data[deque->rightindex];
189 deque->rightindex--;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000190 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000192
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700193 if (deque->rightindex < 0) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700194 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 prevblock = deque->rightblock->leftlink;
196 assert(deque->leftblock != deque->rightblock);
197 freeblock(deque->rightblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000198 CHECK_NOT_END(prevblock);
199 MARK_END(prevblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 deque->rightblock = prevblock;
201 deque->rightindex = BLOCKLEN - 1;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700202 } else {
203 assert(deque->leftblock == deque->rightblock);
204 assert(deque->leftindex == deque->rightindex+1);
205 /* re-center instead of freeing a block */
206 deque->leftindex = CENTER + 1;
207 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 }
209 }
210 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000211}
212
213PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
214
215static PyObject *
216deque_popleft(dequeobject *deque, PyObject *unused)
217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 PyObject *item;
219 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000220
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000221 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
223 return NULL;
224 }
225 assert(deque->leftblock != NULL);
226 item = deque->leftblock->data[deque->leftindex];
227 deque->leftindex++;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000228 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 if (deque->leftindex == BLOCKLEN) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700232 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 assert(deque->leftblock != deque->rightblock);
234 prevblock = deque->leftblock->rightlink;
235 freeblock(deque->leftblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000236 CHECK_NOT_END(prevblock);
237 MARK_END(prevblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 deque->leftblock = prevblock;
239 deque->leftindex = 0;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700240 } else {
241 assert(deque->leftblock == deque->rightblock);
242 assert(deque->leftindex == deque->rightindex+1);
243 /* re-center instead of freeing a block */
244 deque->leftindex = CENTER + 1;
245 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 }
247 }
248 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000249}
250
251PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
252
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800253/* The deque's size limit is d.maxlen. The limit can be zero or positive.
254 * If there is no limit, then d.maxlen == -1.
255 *
Raymond Hettingera4b13d02015-10-15 08:05:31 -0700256 * After an item is added to a deque, we check to see if the size has
257 * grown past the limit. If it has, we get the size back down to the limit
258 * by popping an item off of the opposite end. The methods that can
259 * trigger this are append(), appendleft(), extend(), and extendleft().
Raymond Hettingerd96db092015-10-11 22:34:48 -0700260 *
261 * The macro to check whether a deque needs to be trimmed uses a single
262 * unsigned test that returns true whenever 0 <= maxlen < Py_SIZE(deque).
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800263 */
264
Raymond Hettingerd96db092015-10-11 22:34:48 -0700265#define NEEDS_TRIM(deque, maxlen) ((size_t)(maxlen) < (size_t)(Py_SIZE(deque)))
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800266
doko@ubuntu.combc731502016-05-18 01:06:01 +0200267static int
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800268deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000269{
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700270 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700271 block *b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (b == NULL)
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800273 return -1;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000274 b->leftlink = deque->rightblock;
275 CHECK_END(deque->rightblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 deque->rightblock->rightlink = b;
277 deque->rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000278 MARK_END(b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 deque->rightindex = -1;
280 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000281 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 deque->rightindex++;
283 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800284 if (NEEDS_TRIM(deque, maxlen)) {
Raymond Hettinger1286d142015-10-14 23:16:57 -0700285 PyObject *olditem = deque_popleft(deque, NULL);
286 Py_DECREF(olditem);
Raymond Hettinger0f43bb12015-10-20 00:03:33 -0700287 } else {
288 deque->state++;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700289 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800290 return 0;
291}
292
293static PyObject *
294deque_append(dequeobject *deque, PyObject *item)
295{
296 Py_INCREF(item);
297 if (deque_append_internal(deque, item, deque->maxlen) < 0)
298 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000300}
301
302PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
303
doko@ubuntu.com17f0e612016-06-14 07:27:58 +0200304static int
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800305deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 if (deque->leftindex == 0) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700308 block *b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 if (b == NULL)
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800310 return -1;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000311 b->rightlink = deque->leftblock;
312 CHECK_END(deque->leftblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 deque->leftblock->leftlink = b;
314 deque->leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000315 MARK_END(b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 deque->leftindex = BLOCKLEN;
317 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000318 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 deque->leftindex--;
320 deque->leftblock->data[deque->leftindex] = item;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700321 if (NEEDS_TRIM(deque, deque->maxlen)) {
Raymond Hettinger1286d142015-10-14 23:16:57 -0700322 PyObject *olditem = deque_pop(deque, NULL);
323 Py_DECREF(olditem);
Raymond Hettinger0f43bb12015-10-20 00:03:33 -0700324 } else {
325 deque->state++;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700326 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800327 return 0;
328}
329
330static PyObject *
331deque_appendleft(dequeobject *deque, PyObject *item)
332{
333 Py_INCREF(item);
334 if (deque_appendleft_internal(deque, item, deque->maxlen) < 0)
335 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000337}
338
339PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
340
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700341static PyObject*
342finalize_iterator(PyObject *it)
343{
344 if (PyErr_Occurred()) {
345 if (PyErr_ExceptionMatches(PyExc_StopIteration))
346 PyErr_Clear();
347 else {
348 Py_DECREF(it);
349 return NULL;
350 }
351 }
352 Py_DECREF(it);
353 Py_RETURN_NONE;
354}
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356/* Run an iterator to exhaustion. Shortcut for
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000357 the extend/extendleft methods when maxlen == 0. */
358static PyObject*
359consume_iterator(PyObject *it)
360{
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700361 PyObject *(*iternext)(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 PyObject *item;
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000363
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700364 iternext = *Py_TYPE(it)->tp_iternext;
365 while ((item = iternext(it)) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 Py_DECREF(item);
367 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700368 return finalize_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000369}
370
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000371static PyObject *
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000372deque_extend(dequeobject *deque, PyObject *iterable)
373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 PyObject *it, *item;
Raymond Hettinger7a845522015-09-26 01:30:51 -0700375 PyObject *(*iternext)(PyObject *);
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700376 Py_ssize_t maxlen = deque->maxlen;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 /* Handle case where id(deque) == id(iterable) */
379 if ((PyObject *)deque == iterable) {
380 PyObject *result;
381 PyObject *s = PySequence_List(iterable);
382 if (s == NULL)
383 return NULL;
384 result = deque_extend(deque, s);
385 Py_DECREF(s);
386 return result;
387 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000388
Raymond Hettingerd79d5b12016-03-04 09:55:07 -0800389 it = PyObject_GetIter(iterable);
390 if (it == NULL)
391 return NULL;
392
393 if (maxlen == 0)
394 return consume_iterator(it);
395
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700396 /* Space saving heuristic. Start filling from the left */
397 if (Py_SIZE(deque) == 0) {
398 assert(deque->leftblock == deque->rightblock);
399 assert(deque->leftindex == deque->rightindex+1);
400 deque->leftindex = 1;
401 deque->rightindex = 0;
402 }
403
Raymond Hettinger7a845522015-09-26 01:30:51 -0700404 iternext = *Py_TYPE(it)->tp_iternext;
405 while ((item = iternext(it)) != NULL) {
Raymond Hettinger88057172016-09-11 22:45:53 -0700406 if (deque->rightindex == BLOCKLEN - 1) {
407 block *b = newblock();
408 if (b == NULL) {
409 Py_DECREF(item);
410 Py_DECREF(it);
411 return NULL;
412 }
413 b->leftlink = deque->rightblock;
414 CHECK_END(deque->rightblock->rightlink);
415 deque->rightblock->rightlink = b;
416 deque->rightblock = b;
417 MARK_END(b->rightlink);
418 deque->rightindex = -1;
419 }
420 Py_SIZE(deque)++;
421 deque->rightindex++;
422 deque->rightblock->data[deque->rightindex] = item;
423 if (NEEDS_TRIM(deque, maxlen)) {
424 PyObject *olditem = deque_popleft(deque, NULL);
425 Py_DECREF(olditem);
426 } else {
427 deque->state++;
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700428 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700430 return finalize_iterator(it);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000431}
432
Tim Peters1065f752004-10-01 01:03:29 +0000433PyDoc_STRVAR(extend_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000434"Extend the right side of the deque with elements from the iterable");
435
436static PyObject *
437deque_extendleft(dequeobject *deque, PyObject *iterable)
438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 PyObject *it, *item;
Raymond Hettinger7a845522015-09-26 01:30:51 -0700440 PyObject *(*iternext)(PyObject *);
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700441 Py_ssize_t maxlen = deque->maxlen;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 /* Handle case where id(deque) == id(iterable) */
444 if ((PyObject *)deque == iterable) {
445 PyObject *result;
446 PyObject *s = PySequence_List(iterable);
447 if (s == NULL)
448 return NULL;
449 result = deque_extendleft(deque, s);
450 Py_DECREF(s);
451 return result;
452 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000453
Raymond Hettingerd79d5b12016-03-04 09:55:07 -0800454 it = PyObject_GetIter(iterable);
455 if (it == NULL)
456 return NULL;
457
458 if (maxlen == 0)
459 return consume_iterator(it);
460
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700461 /* Space saving heuristic. Start filling from the right */
462 if (Py_SIZE(deque) == 0) {
463 assert(deque->leftblock == deque->rightblock);
464 assert(deque->leftindex == deque->rightindex+1);
465 deque->leftindex = BLOCKLEN - 1;
466 deque->rightindex = BLOCKLEN - 2;
467 }
468
Raymond Hettinger7a845522015-09-26 01:30:51 -0700469 iternext = *Py_TYPE(it)->tp_iternext;
470 while ((item = iternext(it)) != NULL) {
Raymond Hettinger88057172016-09-11 22:45:53 -0700471 if (deque->leftindex == 0) {
472 block *b = newblock();
473 if (b == NULL) {
474 Py_DECREF(item);
475 Py_DECREF(it);
476 return NULL;
477 }
478 b->rightlink = deque->leftblock;
479 CHECK_END(deque->leftblock->leftlink);
480 deque->leftblock->leftlink = b;
481 deque->leftblock = b;
482 MARK_END(b->leftlink);
483 deque->leftindex = BLOCKLEN;
484 }
485 Py_SIZE(deque)++;
486 deque->leftindex--;
487 deque->leftblock->data[deque->leftindex] = item;
488 if (NEEDS_TRIM(deque, maxlen)) {
489 PyObject *olditem = deque_pop(deque, NULL);
490 Py_DECREF(olditem);
491 } else {
492 deque->state++;
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700495 return finalize_iterator(it);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000496}
497
Tim Peters1065f752004-10-01 01:03:29 +0000498PyDoc_STRVAR(extendleft_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000499"Extend the left side of the deque with elements from the iterable");
500
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000501static PyObject *
502deque_inplace_concat(dequeobject *deque, PyObject *other)
503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 PyObject *result;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 result = deque_extend(deque, other);
507 if (result == NULL)
508 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 Py_INCREF(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700510 Py_DECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 return (PyObject *)deque;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000512}
513
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700514static PyObject *
515deque_copy(PyObject *deque)
516{
517 dequeobject *old_deque = (dequeobject *)deque;
518 if (Py_TYPE(deque) == &deque_type) {
519 dequeobject *new_deque;
520 PyObject *rv;
521
522 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
523 if (new_deque == NULL)
524 return NULL;
525 new_deque->maxlen = old_deque->maxlen;
526 /* Fast path for the deque_repeat() common case where len(deque) == 1 */
Raymond Hettinger0443ac22015-10-05 22:52:37 -0400527 if (Py_SIZE(deque) == 1) {
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700528 PyObject *item = old_deque->leftblock->data[old_deque->leftindex];
529 rv = deque_append(new_deque, item);
530 } else {
531 rv = deque_extend(new_deque, deque);
532 }
533 if (rv != NULL) {
534 Py_DECREF(rv);
535 return (PyObject *)new_deque;
536 }
537 Py_DECREF(new_deque);
538 return NULL;
539 }
540 if (old_deque->maxlen < 0)
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100541 return PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)),
542 deque, NULL);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700543 else
544 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
545 deque, old_deque->maxlen, NULL);
546}
547
548PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700549
550static PyObject *
551deque_concat(dequeobject *deque, PyObject *other)
552{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400553 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700554 int rv;
555
556 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
557 if (rv <= 0) {
558 if (rv == 0) {
559 PyErr_Format(PyExc_TypeError,
560 "can only concatenate deque (not \"%.200s\") to deque",
561 other->ob_type->tp_name);
562 }
563 return NULL;
564 }
565
566 new_deque = deque_copy((PyObject *)deque);
567 if (new_deque == NULL)
568 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400569 result = deque_extend((dequeobject *)new_deque, other);
570 if (result == NULL) {
571 Py_DECREF(new_deque);
572 return NULL;
573 }
574 Py_DECREF(result);
575 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700576}
577
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700578static void
579deque_clear(dequeobject *deque)
580{
581 block *b;
582 block *prevblock;
583 block *leftblock;
584 Py_ssize_t leftindex;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800585 Py_ssize_t n, m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700586 PyObject *item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800587 PyObject **itemptr, **limit;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700588
Raymond Hettinger38031142015-09-29 22:45:05 -0700589 if (Py_SIZE(deque) == 0)
590 return;
591
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700592 /* During the process of clearing a deque, decrefs can cause the
593 deque to mutate. To avoid fatal confusion, we have to make the
594 deque empty before clearing the blocks and never refer to
595 anything via deque->ref while clearing. (This is the same
596 technique used for clearing lists, sets, and dicts.)
597
598 Making the deque empty requires allocating a new empty block. In
599 the unlikely event that memory is full, we fall back to an
600 alternate method that doesn't require a new block. Repeating
601 pops in a while-loop is slower, possibly re-entrant (and a clever
602 adversary could cause it to never terminate).
603 */
604
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700605 b = newblock();
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700606 if (b == NULL) {
607 PyErr_Clear();
608 goto alternate_method;
609 }
610
611 /* Remember the old size, leftblock, and leftindex */
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800612 n = Py_SIZE(deque);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700613 leftblock = deque->leftblock;
614 leftindex = deque->leftindex;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700615
616 /* Set the deque to be empty using the newly allocated block */
617 MARK_END(b->leftlink);
618 MARK_END(b->rightlink);
619 Py_SIZE(deque) = 0;
620 deque->leftblock = b;
621 deque->rightblock = b;
622 deque->leftindex = CENTER + 1;
623 deque->rightindex = CENTER;
624 deque->state++;
625
626 /* Now the old size, leftblock, and leftindex are disconnected from
627 the empty deque and we can use them to decref the pointers.
628 */
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800629 m = (BLOCKLEN - leftindex > n) ? n : BLOCKLEN - leftindex;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800630 itemptr = &leftblock->data[leftindex];
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800631 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800632 n -= m;
633 while (1) {
634 if (itemptr == limit) {
635 if (n == 0)
636 break;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700637 CHECK_NOT_END(leftblock->rightlink);
638 prevblock = leftblock;
639 leftblock = leftblock->rightlink;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800640 m = (n > BLOCKLEN) ? BLOCKLEN : n;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800641 itemptr = leftblock->data;
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800642 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800643 n -= m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700644 freeblock(prevblock);
645 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800646 item = *(itemptr++);
647 Py_DECREF(item);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700648 }
649 CHECK_END(leftblock->rightlink);
650 freeblock(leftblock);
651 return;
652
653 alternate_method:
654 while (Py_SIZE(deque)) {
655 item = deque_pop(deque, NULL);
656 assert (item != NULL);
657 Py_DECREF(item);
658 }
659}
660
661static PyObject *
662deque_clearmethod(dequeobject *deque)
663{
664 deque_clear(deque);
665 Py_RETURN_NONE;
666}
667
668PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700669
670static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700671deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
672{
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700673 Py_ssize_t i, m, size;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700674 PyObject *seq;
675 PyObject *rv;
676
677 size = Py_SIZE(deque);
678 if (size == 0 || n == 1) {
679 Py_INCREF(deque);
680 return (PyObject *)deque;
681 }
682
683 if (n <= 0) {
684 deque_clear(deque);
685 Py_INCREF(deque);
686 return (PyObject *)deque;
687 }
688
Raymond Hettinger41290a62015-03-31 08:12:23 -0700689 if (size == 1) {
690 /* common case, repeating a single element */
691 PyObject *item = deque->leftblock->data[deque->leftindex];
692
Raymond Hettingera7f630092015-10-10 23:56:02 -0400693 if (deque->maxlen >= 0 && n > deque->maxlen)
Raymond Hettinger41290a62015-03-31 08:12:23 -0700694 n = deque->maxlen;
695
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400696 deque->state++;
Raymond Hettingerad262252015-09-14 01:03:04 -0400697 for (i = 0 ; i < n-1 ; ) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400698 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700699 block *b = newblock();
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400700 if (b == NULL) {
701 Py_SIZE(deque) += i;
702 return NULL;
703 }
704 b->leftlink = deque->rightblock;
705 CHECK_END(deque->rightblock->rightlink);
706 deque->rightblock->rightlink = b;
707 deque->rightblock = b;
708 MARK_END(b->rightlink);
709 deque->rightindex = -1;
710 }
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700711 m = n - 1 - i;
712 if (m > BLOCKLEN - 1 - deque->rightindex)
713 m = BLOCKLEN - 1 - deque->rightindex;
714 i += m;
715 while (m--) {
Raymond Hettingerad262252015-09-14 01:03:04 -0400716 deque->rightindex++;
717 Py_INCREF(item);
718 deque->rightblock->data[deque->rightindex] = item;
719 }
Raymond Hettinger41290a62015-03-31 08:12:23 -0700720 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400721 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700722 Py_INCREF(deque);
723 return (PyObject *)deque;
724 }
725
Raymond Hettinger20151f52015-10-16 22:47:29 -0700726 if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400727 return PyErr_NoMemory();
728 }
729
Raymond Hettinger41290a62015-03-31 08:12:23 -0700730 seq = PySequence_List((PyObject *)deque);
731 if (seq == NULL)
732 return seq;
733
Louie Lu357bad72017-02-24 11:59:49 +0800734 /* Reduce the number of repetitions when maxlen would be exceeded */
735 if (deque->maxlen >= 0 && n * size > deque->maxlen)
736 n = (deque->maxlen + size - 1) / size;
737
Raymond Hettinger41290a62015-03-31 08:12:23 -0700738 for (i = 0 ; i < n-1 ; i++) {
739 rv = deque_extend(deque, seq);
740 if (rv == NULL) {
741 Py_DECREF(seq);
742 return NULL;
743 }
744 Py_DECREF(rv);
745 }
746 Py_INCREF(deque);
747 Py_DECREF(seq);
748 return (PyObject *)deque;
749}
750
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400751static PyObject *
752deque_repeat(dequeobject *deque, Py_ssize_t n)
753{
754 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400755 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400756
757 new_deque = (dequeobject *)deque_copy((PyObject *) deque);
758 if (new_deque == NULL)
759 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400760 rv = deque_inplace_repeat(new_deque, n);
761 Py_DECREF(new_deque);
762 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400763}
764
Raymond Hettinger54023152014-04-23 00:58:48 -0700765/* The rotate() method is part of the public API and is used internally
766as a primitive for other methods.
767
768Rotation by 1 or -1 is a common case, so any optimizations for high
769volume rotations should take care not to penalize the common case.
770
771Conceptually, a rotate by one is equivalent to a pop on one side and an
772append on the other. However, a pop/append pair is unnecessarily slow
Martin Panterd2ad5712015-11-02 04:20:33 +0000773because it requires an incref/decref pair for an object located randomly
Raymond Hettinger54023152014-04-23 00:58:48 -0700774in memory. It is better to just move the object pointer from one block
775to the next without changing the reference count.
776
777When moving batches of pointers, it is tempting to use memcpy() but that
778proved to be slower than a simple loop for a variety of reasons.
779Memcpy() cannot know in advance that we're copying pointers instead of
780bytes, that the source and destination are pointer aligned and
781non-overlapping, that moving just one pointer is a common case, that we
782never need to move more than BLOCKLEN pointers, and that at least one
783pointer is always moved.
784
785For high volume rotations, newblock() and freeblock() are never called
786more than once. Previously emptied blocks are immediately reused as a
787destination block. If a block is left-over at the end, it is freed.
788*/
789
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000790static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000791_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000792{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700793 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700794 block *leftblock = deque->leftblock;
795 block *rightblock = deque->rightblock;
796 Py_ssize_t leftindex = deque->leftindex;
797 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000798 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700799 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000800
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800801 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 return 0;
803 if (n > halflen || n < -halflen) {
804 n %= len;
805 if (n > halflen)
806 n -= len;
807 else if (n < -halflen)
808 n += len;
809 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500810 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500811 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800812
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800813 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500814 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700815 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700816 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700817 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700818 if (b == NULL)
819 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700820 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000821 b->rightlink = leftblock;
822 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700823 leftblock->leftlink = b;
824 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000825 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700826 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700827 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800828 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700829 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700830 {
831 PyObject **src, **dest;
832 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800833
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700834 if (m > rightindex + 1)
835 m = rightindex + 1;
836 if (m > leftindex)
837 m = leftindex;
838 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700839 rightindex -= m;
840 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800841 src = &rightblock->data[rightindex + 1];
842 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700843 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700844 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800845 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700846 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700847 }
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700848 if (rightindex < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700849 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700850 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700851 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700852 CHECK_NOT_END(rightblock->leftlink);
853 rightblock = rightblock->leftlink;
854 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700855 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800856 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800857 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500858 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700859 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700860 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700861 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700862 if (b == NULL)
863 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700864 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000865 b->leftlink = rightblock;
866 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700867 rightblock->rightlink = b;
868 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000869 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700870 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700871 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800872 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700873 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700874 {
875 PyObject **src, **dest;
876 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800877
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700878 if (m > BLOCKLEN - leftindex)
879 m = BLOCKLEN - leftindex;
880 if (m > BLOCKLEN - 1 - rightindex)
881 m = BLOCKLEN - 1 - rightindex;
882 assert (m > 0 && m <= len);
883 src = &leftblock->data[leftindex];
884 dest = &rightblock->data[rightindex + 1];
885 leftindex += m;
886 rightindex += m;
887 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700888 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700889 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700890 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700891 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700892 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700893 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700894 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700895 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700896 CHECK_NOT_END(leftblock->rightlink);
897 leftblock = leftblock->rightlink;
898 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700899 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800900 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700902 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700903done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700904 if (b != NULL)
905 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700906 deque->leftblock = leftblock;
907 deque->rightblock = rightblock;
908 deque->leftindex = leftindex;
909 deque->rightindex = rightindex;
910
911 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000912}
913
914static PyObject *
Victor Stinnerdd407d52017-02-06 16:06:49 +0100915deque_rotate(dequeobject *deque, PyObject **args, Py_ssize_t nargs,
916 PyObject *kwnames)
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000919
Victor Stinnerdd407d52017-02-06 16:06:49 +0100920 if (!_PyArg_NoStackKeywords("rotate", kwnames)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 return NULL;
Victor Stinnerdd407d52017-02-06 16:06:49 +0100922 }
923 if (!_PyArg_ParseStack(args, nargs, "|n:rotate", &n)) {
924 return NULL;
925 }
926
Raymond Hettinger6921c132015-03-21 02:03:40 -0700927 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 Py_RETURN_NONE;
929 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000930}
931
Tim Peters1065f752004-10-01 01:03:29 +0000932PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000933"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000934
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000935static PyObject *
936deque_reverse(dequeobject *deque, PyObject *unused)
937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 block *leftblock = deque->leftblock;
939 block *rightblock = deque->rightblock;
940 Py_ssize_t leftindex = deque->leftindex;
941 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400942 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000944
Raymond Hettinger306d6b12016-01-24 12:40:42 -0800945 n++;
946 while (--n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 /* Validate that pointers haven't met in the middle */
948 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000949 CHECK_NOT_END(leftblock);
950 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 /* Swap */
953 tmp = leftblock->data[leftindex];
954 leftblock->data[leftindex] = rightblock->data[rightindex];
955 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 /* Advance left block/index pair */
958 leftindex++;
959 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 leftblock = leftblock->rightlink;
961 leftindex = 0;
962 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 /* Step backwards with the right block/index pair */
965 rightindex--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700966 if (rightindex < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 rightblock = rightblock->leftlink;
968 rightindex = BLOCKLEN - 1;
969 }
970 }
971 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000972}
973
974PyDoc_STRVAR(reverse_doc,
975"D.reverse() -- reverse *IN PLACE*");
976
Raymond Hettinger44459de2010-04-03 23:20:46 +0000977static PyObject *
978deque_count(dequeobject *deque, PyObject *v)
979{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000980 block *b = deque->leftblock;
981 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000982 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800984 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000987
Raymond Hettinger165eee22016-01-24 11:32:07 -0800988 n++;
989 while (--n) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000990 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000991 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700993 if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 return NULL;
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700995 count += cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 if (start_state != deque->state) {
998 PyErr_SetString(PyExc_RuntimeError,
999 "deque mutated during iteration");
1000 return NULL;
1001 }
Raymond Hettinger44459de2010-04-03 23:20:46 +00001002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -10001004 index++;
1005 if (index == BLOCKLEN) {
1006 b = b->rightlink;
1007 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 }
1009 }
1010 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +00001011}
1012
1013PyDoc_STRVAR(count_doc,
1014"D.count(value) -> integer -- return number of occurrences of value");
1015
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001016static int
1017deque_contains(dequeobject *deque, PyObject *v)
1018{
1019 block *b = deque->leftblock;
1020 Py_ssize_t index = deque->leftindex;
1021 Py_ssize_t n = Py_SIZE(deque);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001022 size_t start_state = deque->state;
1023 PyObject *item;
1024 int cmp;
1025
Raymond Hettinger165eee22016-01-24 11:32:07 -08001026 n++;
1027 while (--n) {
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001028 CHECK_NOT_END(b);
1029 item = b->data[index];
1030 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1031 if (cmp) {
1032 return cmp;
1033 }
1034 if (start_state != deque->state) {
1035 PyErr_SetString(PyExc_RuntimeError,
1036 "deque mutated during iteration");
1037 return -1;
1038 }
1039 index++;
1040 if (index == BLOCKLEN) {
1041 b = b->rightlink;
1042 index = 0;
1043 }
1044 }
1045 return 0;
1046}
1047
Martin v. Löwis18e16552006-02-15 17:27:45 +00001048static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001049deque_len(dequeobject *deque)
1050{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001051 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001052}
1053
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001054static PyObject *
Victor Stinnerdd407d52017-02-06 16:06:49 +01001055deque_index(dequeobject *deque, PyObject **args, Py_ssize_t nargs,
1056 PyObject *kwnames)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001057{
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001058 Py_ssize_t i, n, start=0, stop=Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001059 PyObject *v, *item;
1060 block *b = deque->leftblock;
1061 Py_ssize_t index = deque->leftindex;
1062 size_t start_state = deque->state;
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001063 int cmp;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001064
Victor Stinnerdd407d52017-02-06 16:06:49 +01001065 if (!_PyArg_NoStackKeywords("index", kwnames)) {
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001066 return NULL;
Victor Stinnerdd407d52017-02-06 16:06:49 +01001067 }
1068 if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index", &v,
1069 _PyEval_SliceIndex, &start,
1070 _PyEval_SliceIndex, &stop)) {
1071 return NULL;
1072 }
1073
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001074 if (start < 0) {
1075 start += Py_SIZE(deque);
1076 if (start < 0)
1077 start = 0;
1078 }
1079 if (stop < 0) {
1080 stop += Py_SIZE(deque);
1081 if (stop < 0)
1082 stop = 0;
1083 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -07001084 if (stop > Py_SIZE(deque))
1085 stop = Py_SIZE(deque);
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001086 if (start > stop)
1087 start = stop;
1088 assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001089
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001090 /* XXX Replace this loop with faster code from deque_item() */
1091 for (i=0 ; i<start ; i++) {
1092 index++;
1093 if (index == BLOCKLEN) {
1094 b = b->rightlink;
1095 index = 0;
1096 }
1097 }
1098
Raymond Hettinger4a91d212015-11-03 22:00:26 -05001099 n = stop - i + 1;
1100 while (--n) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001101 CHECK_NOT_END(b);
1102 item = b->data[index];
1103 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1104 if (cmp > 0)
Raymond Hettinger4a91d212015-11-03 22:00:26 -05001105 return PyLong_FromSsize_t(stop - n);
Raymond Hettingerdf8f5b52015-11-02 07:27:40 -05001106 if (cmp < 0)
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001107 return NULL;
1108 if (start_state != deque->state) {
1109 PyErr_SetString(PyExc_RuntimeError,
1110 "deque mutated during iteration");
1111 return NULL;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001112 }
1113 index++;
1114 if (index == BLOCKLEN) {
1115 b = b->rightlink;
1116 index = 0;
1117 }
1118 }
1119 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
1120 return NULL;
1121}
1122
1123PyDoc_STRVAR(index_doc,
1124"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
1125"Raises ValueError if the value is not present.");
1126
Raymond Hettinger551350a2015-03-24 00:19:53 -07001127/* insert(), remove(), and delitem() are implemented in terms of
1128 rotate() for simplicity and reasonable performance near the end
1129 points. If for some reason these methods become popular, it is not
1130 hard to re-implement this using direct data movement (similar to
1131 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -07001132 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -07001133*/
1134
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001135static PyObject *
Victor Stinnerdd407d52017-02-06 16:06:49 +01001136deque_insert(dequeobject *deque, PyObject **args, Py_ssize_t nargs,
1137 PyObject *kwnames)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001138{
1139 Py_ssize_t index;
1140 Py_ssize_t n = Py_SIZE(deque);
1141 PyObject *value;
1142 PyObject *rv;
1143
Victor Stinnerdd407d52017-02-06 16:06:49 +01001144 if (!_PyArg_NoStackKeywords("insert", kwnames)) {
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001145 return NULL;
Victor Stinnerdd407d52017-02-06 16:06:49 +01001146 }
1147 if (!_PyArg_ParseStack(args, nargs, "nO:insert", &index, &value)) {
1148 return NULL;
1149 }
1150
Raymond Hettinger37434322016-01-26 21:44:16 -08001151 if (deque->maxlen == Py_SIZE(deque)) {
Raymond Hettingera6389712016-02-01 21:21:19 -08001152 PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1153 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001154 }
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001155 if (index >= n)
1156 return deque_append(deque, value);
1157 if (index <= -n || index == 0)
1158 return deque_appendleft(deque, value);
1159 if (_deque_rotate(deque, -index))
1160 return NULL;
1161 if (index < 0)
1162 rv = deque_append(deque, value);
1163 else
1164 rv = deque_appendleft(deque, value);
1165 if (rv == NULL)
1166 return NULL;
1167 Py_DECREF(rv);
1168 if (_deque_rotate(deque, index))
1169 return NULL;
1170 Py_RETURN_NONE;
1171}
1172
1173PyDoc_STRVAR(insert_doc,
1174"D.insert(index, object) -- insert object before index");
1175
1176static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001177deque_remove(dequeobject *deque, PyObject *value)
1178{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001179 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 for (i=0 ; i<n ; i++) {
1182 PyObject *item = deque->leftblock->data[deque->leftindex];
1183 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001184
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001185 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 PyErr_SetString(PyExc_IndexError,
1187 "deque mutated during remove().");
1188 return NULL;
1189 }
1190 if (cmp > 0) {
1191 PyObject *tgt = deque_popleft(deque, NULL);
1192 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001193 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001195 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 Py_RETURN_NONE;
1197 }
1198 else if (cmp < 0) {
1199 _deque_rotate(deque, i);
1200 return NULL;
1201 }
1202 _deque_rotate(deque, -1);
1203 }
1204 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1205 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001206}
1207
1208PyDoc_STRVAR(remove_doc,
1209"D.remove(value) -- remove first occurrence of value.");
1210
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001211static int
1212valid_index(Py_ssize_t i, Py_ssize_t limit)
1213{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001214 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001215 to check whether i is in the range: 0 <= i < limit */
1216 return (size_t) i < (size_t) limit;
1217}
1218
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001219static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001220deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 block *b;
1223 PyObject *item;
1224 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001225
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001226 if (!valid_index(i, Py_SIZE(deque))) {
1227 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 return NULL;
1229 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 if (i == 0) {
1232 i = deque->leftindex;
1233 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001234 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 i = deque->rightindex;
1236 b = deque->rightblock;
1237 } else {
1238 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001239 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1240 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001241 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 b = deque->leftblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001243 n++;
1244 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 b = b->rightlink;
1246 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001247 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001248 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001249 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 b = deque->rightblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001251 n++;
1252 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 b = b->leftlink;
1254 }
1255 }
1256 item = b->data[i];
1257 Py_INCREF(item);
1258 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001259}
1260
1261static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001262deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001265 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001266
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001267 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001268 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001271 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 assert (item != NULL);
1273 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001274 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001275}
1276
1277static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001278deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001279{
Raymond Hettinger38418662016-02-08 20:34:49 -08001280 PyObject *old_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001282 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001283
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001284 if (!valid_index(i, len)) {
1285 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 return -1;
1287 }
1288 if (v == NULL)
1289 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001292 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1293 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 if (index <= halflen) {
1295 b = deque->leftblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001296 n++;
1297 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 b = b->rightlink;
1299 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001300 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001301 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001302 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 b = deque->rightblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001304 n++;
1305 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 b = b->leftlink;
1307 }
1308 Py_INCREF(v);
Raymond Hettinger38418662016-02-08 20:34:49 -08001309 old_value = b->data[i];
1310 b->data[i] = v;
1311 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001313}
1314
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001315static void
1316deque_dealloc(dequeobject *deque)
1317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 PyObject_GC_UnTrack(deque);
1319 if (deque->weakreflist != NULL)
1320 PyObject_ClearWeakRefs((PyObject *) deque);
1321 if (deque->leftblock != NULL) {
1322 deque_clear(deque);
1323 assert(deque->leftblock != NULL);
1324 freeblock(deque->leftblock);
1325 }
1326 deque->leftblock = NULL;
1327 deque->rightblock = NULL;
1328 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001329}
1330
1331static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001332deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 block *b;
1335 PyObject *item;
1336 Py_ssize_t index;
1337 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger1286d142015-10-14 23:16:57 -07001338 Py_ssize_t indexhigh;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001339
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001340 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1341 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 item = b->data[index];
1343 Py_VISIT(item);
1344 }
1345 indexlo = 0;
1346 }
Raymond Hettinger1286d142015-10-14 23:16:57 -07001347 indexhigh = deque->rightindex;
1348 for (index = indexlo; index <= indexhigh; index++) {
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001349 item = b->data[index];
1350 Py_VISIT(item);
1351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001353}
1354
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001355static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001356deque_reduce(dequeobject *deque)
1357{
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001358 PyObject *dict, *it;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001359 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001360
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001361 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001362 if (dict == NULL) {
1363 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1364 return NULL;
1365 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 PyErr_Clear();
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001367 dict = Py_None;
1368 Py_INCREF(dict);
1369 }
1370
1371 it = PyObject_GetIter((PyObject *)deque);
1372 if (it == NULL) {
1373 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 return NULL;
1375 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001376
1377 if (deque->maxlen < 0) {
1378 return Py_BuildValue("O()NN", Py_TYPE(deque), dict, it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001380 else {
1381 return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, dict, it);
1382 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001383}
1384
1385PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1386
1387static PyObject *
1388deque_repr(PyObject *deque)
1389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 PyObject *aslist, *result;
1391 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 i = Py_ReprEnter(deque);
1394 if (i != 0) {
1395 if (i < 0)
1396 return NULL;
1397 return PyUnicode_FromString("[...]");
1398 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 aslist = PySequence_List(deque);
1401 if (aslist == NULL) {
1402 Py_ReprLeave(deque);
1403 return NULL;
1404 }
Raymond Hettingera7f630092015-10-10 23:56:02 -04001405 if (((dequeobject *)deque)->maxlen >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1407 aslist, ((dequeobject *)deque)->maxlen);
1408 else
1409 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001411 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001413}
1414
Raymond Hettinger738ec902004-02-29 02:15:56 +00001415static PyObject *
1416deque_richcompare(PyObject *v, PyObject *w, int op)
1417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 PyObject *it1=NULL, *it2=NULL, *x, *y;
1419 Py_ssize_t vs, ws;
1420 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 if (!PyObject_TypeCheck(v, &deque_type) ||
1423 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001424 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001428 vs = Py_SIZE((dequeobject *)v);
1429 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 if (op == Py_EQ) {
1431 if (v == w)
1432 Py_RETURN_TRUE;
1433 if (vs != ws)
1434 Py_RETURN_FALSE;
1435 }
1436 if (op == Py_NE) {
1437 if (v == w)
1438 Py_RETURN_FALSE;
1439 if (vs != ws)
1440 Py_RETURN_TRUE;
1441 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 /* Search for the first index where items are different */
1444 it1 = PyObject_GetIter(v);
1445 if (it1 == NULL)
1446 goto done;
1447 it2 = PyObject_GetIter(w);
1448 if (it2 == NULL)
1449 goto done;
1450 for (;;) {
1451 x = PyIter_Next(it1);
1452 if (x == NULL && PyErr_Occurred())
1453 goto done;
1454 y = PyIter_Next(it2);
1455 if (x == NULL || y == NULL)
1456 break;
1457 b = PyObject_RichCompareBool(x, y, Py_EQ);
1458 if (b == 0) {
1459 cmp = PyObject_RichCompareBool(x, y, op);
1460 Py_DECREF(x);
1461 Py_DECREF(y);
1462 goto done;
1463 }
1464 Py_DECREF(x);
1465 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001466 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 goto done;
1468 }
1469 /* We reached the end of one deque or both */
1470 Py_XDECREF(x);
1471 Py_XDECREF(y);
1472 if (PyErr_Occurred())
1473 goto done;
1474 switch (op) {
1475 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1476 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1477 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1478 case Py_NE: cmp = x != y; break; /* if one deque continues */
1479 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1480 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1481 }
Tim Peters1065f752004-10-01 01:03:29 +00001482
Raymond Hettinger738ec902004-02-29 02:15:56 +00001483done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 Py_XDECREF(it1);
1485 Py_XDECREF(it2);
1486 if (cmp == 1)
1487 Py_RETURN_TRUE;
1488 if (cmp == 0)
1489 Py_RETURN_FALSE;
1490 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001491}
1492
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001493static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001494deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 PyObject *iterable = NULL;
1497 PyObject *maxlenobj = NULL;
1498 Py_ssize_t maxlen = -1;
1499 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001500
Raymond Hettinger0d309402015-09-30 23:15:02 -07001501 if (kwdargs == NULL) {
1502 if (!PyArg_UnpackTuple(args, "deque()", 0, 2, &iterable, &maxlenobj))
1503 return -1;
1504 } else {
1505 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist,
1506 &iterable, &maxlenobj))
1507 return -1;
1508 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 if (maxlenobj != NULL && maxlenobj != Py_None) {
1510 maxlen = PyLong_AsSsize_t(maxlenobj);
1511 if (maxlen == -1 && PyErr_Occurred())
1512 return -1;
1513 if (maxlen < 0) {
1514 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1515 return -1;
1516 }
1517 }
1518 deque->maxlen = maxlen;
Raymond Hettinger0d309402015-09-30 23:15:02 -07001519 if (Py_SIZE(deque) > 0)
1520 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 if (iterable != NULL) {
1522 PyObject *rv = deque_extend(deque, iterable);
1523 if (rv == NULL)
1524 return -1;
1525 Py_DECREF(rv);
1526 }
1527 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001528}
1529
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001530static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001531deque_sizeof(dequeobject *deque, void *unused)
1532{
1533 Py_ssize_t res;
1534 Py_ssize_t blocks;
1535
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001536 res = _PyObject_SIZE(Py_TYPE(deque));
Raymond Hettingerbc003412015-10-14 23:33:23 -07001537 blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001538 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001539 (blocks - 1) * BLOCKLEN + deque->rightindex);
1540 res += blocks * sizeof(block);
1541 return PyLong_FromSsize_t(res);
1542}
1543
1544PyDoc_STRVAR(sizeof_doc,
1545"D.__sizeof__() -- size of D in memory, in bytes");
1546
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001547static int
1548deque_bool(dequeobject *deque)
1549{
1550 return Py_SIZE(deque) != 0;
1551}
1552
Jesus Cea16e2fca2012-08-03 14:49:42 +02001553static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001554deque_get_maxlen(dequeobject *deque)
1555{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001556 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 Py_RETURN_NONE;
1558 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001559}
1560
Raymond Hettinger41290a62015-03-31 08:12:23 -07001561
1562/* deque object ********************************************************/
1563
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001564static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1566 "maximum size of a deque or None if unbounded"},
1567 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001568};
1569
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001570static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001572 (binaryfunc)deque_concat, /* sq_concat */
1573 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 (ssizeargfunc)deque_item, /* sq_item */
1575 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001576 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001578 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001579 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001580 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001581};
1582
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001583static PyNumberMethods deque_as_number = {
1584 0, /* nb_add */
1585 0, /* nb_subtract */
1586 0, /* nb_multiply */
1587 0, /* nb_remainder */
1588 0, /* nb_divmod */
1589 0, /* nb_power */
1590 0, /* nb_negative */
1591 0, /* nb_positive */
1592 0, /* nb_absolute */
1593 (inquiry)deque_bool, /* nb_bool */
1594 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001595 };
1596
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001597static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001598static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001599PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001601
1602static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 {"append", (PyCFunction)deque_append,
1604 METH_O, append_doc},
1605 {"appendleft", (PyCFunction)deque_appendleft,
1606 METH_O, appendleft_doc},
1607 {"clear", (PyCFunction)deque_clearmethod,
1608 METH_NOARGS, clear_doc},
1609 {"__copy__", (PyCFunction)deque_copy,
1610 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001611 {"copy", (PyCFunction)deque_copy,
1612 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001614 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 {"extend", (PyCFunction)deque_extend,
1616 METH_O, extend_doc},
1617 {"extendleft", (PyCFunction)deque_extendleft,
1618 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001619 {"index", (PyCFunction)deque_index,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001620 METH_FASTCALL, index_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001621 {"insert", (PyCFunction)deque_insert,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001622 METH_FASTCALL, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 {"pop", (PyCFunction)deque_pop,
1624 METH_NOARGS, pop_doc},
1625 {"popleft", (PyCFunction)deque_popleft,
1626 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001627 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 METH_NOARGS, reduce_doc},
1629 {"remove", (PyCFunction)deque_remove,
1630 METH_O, remove_doc},
1631 {"__reversed__", (PyCFunction)deque_reviter,
1632 METH_NOARGS, reversed_doc},
1633 {"reverse", (PyCFunction)deque_reverse,
1634 METH_NOARGS, reverse_doc},
1635 {"rotate", (PyCFunction)deque_rotate,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001636 METH_FASTCALL, rotate_doc},
Jesus Cea16e2fca2012-08-03 14:49:42 +02001637 {"__sizeof__", (PyCFunction)deque_sizeof,
1638 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001640};
1641
1642PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001643"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001644\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001645A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001646
Neal Norwitz87f10132004-02-29 15:40:53 +00001647static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 PyVarObject_HEAD_INIT(NULL, 0)
1649 "collections.deque", /* tp_name */
1650 sizeof(dequeobject), /* tp_basicsize */
1651 0, /* tp_itemsize */
1652 /* methods */
1653 (destructor)deque_dealloc, /* tp_dealloc */
1654 0, /* tp_print */
1655 0, /* tp_getattr */
1656 0, /* tp_setattr */
1657 0, /* tp_reserved */
1658 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001659 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 &deque_as_sequence, /* tp_as_sequence */
1661 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001662 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 0, /* tp_call */
1664 0, /* tp_str */
1665 PyObject_GenericGetAttr, /* tp_getattro */
1666 0, /* tp_setattro */
1667 0, /* tp_as_buffer */
1668 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001669 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 deque_doc, /* tp_doc */
1671 (traverseproc)deque_traverse, /* tp_traverse */
1672 (inquiry)deque_clear, /* tp_clear */
1673 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001674 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 (getiterfunc)deque_iter, /* tp_iter */
1676 0, /* tp_iternext */
1677 deque_methods, /* tp_methods */
1678 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001679 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 0, /* tp_base */
1681 0, /* tp_dict */
1682 0, /* tp_descr_get */
1683 0, /* tp_descr_set */
1684 0, /* tp_dictoffset */
1685 (initproc)deque_init, /* tp_init */
1686 PyType_GenericAlloc, /* tp_alloc */
1687 deque_new, /* tp_new */
1688 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001689};
1690
1691/*********************** Deque Iterator **************************/
1692
1693typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001696 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001698 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001700} dequeiterobject;
1701
Martin v. Löwis59683e82008-06-13 07:50:45 +00001702static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001703
1704static PyObject *
1705deque_iter(dequeobject *deque)
1706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1710 if (it == NULL)
1711 return NULL;
1712 it->b = deque->leftblock;
1713 it->index = deque->leftindex;
1714 Py_INCREF(deque);
1715 it->deque = deque;
1716 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001717 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 PyObject_GC_Track(it);
1719 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001720}
1721
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001722static int
1723dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 Py_VISIT(dio->deque);
1726 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001727}
1728
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001729static void
1730dequeiter_dealloc(dequeiterobject *dio)
1731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 Py_XDECREF(dio->deque);
1733 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001734}
1735
1736static PyObject *
1737dequeiter_next(dequeiterobject *it)
1738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 if (it->deque->state != it->state) {
1742 it->counter = 0;
1743 PyErr_SetString(PyExc_RuntimeError,
1744 "deque mutated during iteration");
1745 return NULL;
1746 }
1747 if (it->counter == 0)
1748 return NULL;
1749 assert (!(it->b == it->deque->rightblock &&
1750 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 item = it->b->data[it->index];
1753 it->index++;
1754 it->counter--;
1755 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001756 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 it->b = it->b->rightlink;
1758 it->index = 0;
1759 }
1760 Py_INCREF(item);
1761 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001762}
1763
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001764static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001765dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1766{
1767 Py_ssize_t i, index=0;
1768 PyObject *deque;
1769 dequeiterobject *it;
1770 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1771 return NULL;
1772 assert(type == &dequeiter_type);
1773
1774 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1775 if (!it)
1776 return NULL;
1777 /* consume items from the queue */
1778 for(i=0; i<index; i++) {
1779 PyObject *item = dequeiter_next(it);
1780 if (item) {
1781 Py_DECREF(item);
1782 } else {
1783 if (it->counter) {
1784 Py_DECREF(it);
1785 return NULL;
1786 } else
1787 break;
1788 }
1789 }
1790 return (PyObject*)it;
1791}
1792
1793static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001794dequeiter_len(dequeiterobject *it)
1795{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001796 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001797}
1798
Armin Rigof5b3e362006-02-11 21:32:43 +00001799PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001800
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001801static PyObject *
1802dequeiter_reduce(dequeiterobject *it)
1803{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001804 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 +00001805}
1806
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001807static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001809 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001811};
1812
Martin v. Löwis59683e82008-06-13 07:50:45 +00001813static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001815 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 sizeof(dequeiterobject), /* tp_basicsize */
1817 0, /* tp_itemsize */
1818 /* methods */
1819 (destructor)dequeiter_dealloc, /* tp_dealloc */
1820 0, /* tp_print */
1821 0, /* tp_getattr */
1822 0, /* tp_setattr */
1823 0, /* tp_reserved */
1824 0, /* tp_repr */
1825 0, /* tp_as_number */
1826 0, /* tp_as_sequence */
1827 0, /* tp_as_mapping */
1828 0, /* tp_hash */
1829 0, /* tp_call */
1830 0, /* tp_str */
1831 PyObject_GenericGetAttr, /* tp_getattro */
1832 0, /* tp_setattro */
1833 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001834 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 0, /* tp_doc */
1836 (traverseproc)dequeiter_traverse, /* tp_traverse */
1837 0, /* tp_clear */
1838 0, /* tp_richcompare */
1839 0, /* tp_weaklistoffset */
1840 PyObject_SelfIter, /* tp_iter */
1841 (iternextfunc)dequeiter_next, /* tp_iternext */
1842 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001843 0, /* tp_members */
1844 0, /* tp_getset */
1845 0, /* tp_base */
1846 0, /* tp_dict */
1847 0, /* tp_descr_get */
1848 0, /* tp_descr_set */
1849 0, /* tp_dictoffset */
1850 0, /* tp_init */
1851 0, /* tp_alloc */
1852 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001854};
1855
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001856/*********************** Deque Reverse Iterator **************************/
1857
Martin v. Löwis59683e82008-06-13 07:50:45 +00001858static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001859
1860static PyObject *
1861deque_reviter(dequeobject *deque)
1862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1866 if (it == NULL)
1867 return NULL;
1868 it->b = deque->rightblock;
1869 it->index = deque->rightindex;
1870 Py_INCREF(deque);
1871 it->deque = deque;
1872 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001873 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 PyObject_GC_Track(it);
1875 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001876}
1877
1878static PyObject *
1879dequereviter_next(dequeiterobject *it)
1880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 PyObject *item;
1882 if (it->counter == 0)
1883 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 if (it->deque->state != it->state) {
1886 it->counter = 0;
1887 PyErr_SetString(PyExc_RuntimeError,
1888 "deque mutated during iteration");
1889 return NULL;
1890 }
1891 assert (!(it->b == it->deque->leftblock &&
1892 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 item = it->b->data[it->index];
1895 it->index--;
1896 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001897 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001898 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 it->b = it->b->leftlink;
1900 it->index = BLOCKLEN - 1;
1901 }
1902 Py_INCREF(item);
1903 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001904}
1905
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001906static PyObject *
1907dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1908{
1909 Py_ssize_t i, index=0;
1910 PyObject *deque;
1911 dequeiterobject *it;
1912 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1913 return NULL;
1914 assert(type == &dequereviter_type);
1915
1916 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1917 if (!it)
1918 return NULL;
1919 /* consume items from the queue */
1920 for(i=0; i<index; i++) {
1921 PyObject *item = dequereviter_next(it);
1922 if (item) {
1923 Py_DECREF(item);
1924 } else {
1925 if (it->counter) {
1926 Py_DECREF(it);
1927 return NULL;
1928 } else
1929 break;
1930 }
1931 }
1932 return (PyObject*)it;
1933}
1934
Martin v. Löwis59683e82008-06-13 07:50:45 +00001935static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001937 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 sizeof(dequeiterobject), /* tp_basicsize */
1939 0, /* tp_itemsize */
1940 /* methods */
1941 (destructor)dequeiter_dealloc, /* tp_dealloc */
1942 0, /* tp_print */
1943 0, /* tp_getattr */
1944 0, /* tp_setattr */
1945 0, /* tp_reserved */
1946 0, /* tp_repr */
1947 0, /* tp_as_number */
1948 0, /* tp_as_sequence */
1949 0, /* tp_as_mapping */
1950 0, /* tp_hash */
1951 0, /* tp_call */
1952 0, /* tp_str */
1953 PyObject_GenericGetAttr, /* tp_getattro */
1954 0, /* tp_setattro */
1955 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001956 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 0, /* tp_doc */
1958 (traverseproc)dequeiter_traverse, /* tp_traverse */
1959 0, /* tp_clear */
1960 0, /* tp_richcompare */
1961 0, /* tp_weaklistoffset */
1962 PyObject_SelfIter, /* tp_iter */
1963 (iternextfunc)dequereviter_next, /* tp_iternext */
1964 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001965 0, /* tp_members */
1966 0, /* tp_getset */
1967 0, /* tp_base */
1968 0, /* tp_dict */
1969 0, /* tp_descr_get */
1970 0, /* tp_descr_set */
1971 0, /* tp_dictoffset */
1972 0, /* tp_init */
1973 0, /* tp_alloc */
1974 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001976};
1977
Guido van Rossum1968ad32006-02-25 22:38:04 +00001978/* defaultdict type *********************************************************/
1979
1980typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 PyDictObject dict;
1982 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001983} defdictobject;
1984
1985static PyTypeObject defdict_type; /* Forward */
1986
1987PyDoc_STRVAR(defdict_missing_doc,
1988"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001989 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001990 self[key] = value = self.default_factory()\n\
1991 return value\n\
1992");
1993
1994static PyObject *
1995defdict_missing(defdictobject *dd, PyObject *key)
1996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 PyObject *factory = dd->default_factory;
1998 PyObject *value;
1999 if (factory == NULL || factory == Py_None) {
2000 /* XXX Call dict.__missing__(key) */
2001 PyObject *tup;
2002 tup = PyTuple_Pack(1, key);
2003 if (!tup) return NULL;
2004 PyErr_SetObject(PyExc_KeyError, tup);
2005 Py_DECREF(tup);
2006 return NULL;
2007 }
2008 value = PyEval_CallObject(factory, NULL);
2009 if (value == NULL)
2010 return value;
2011 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
2012 Py_DECREF(value);
2013 return NULL;
2014 }
2015 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002016}
2017
2018PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
2019
2020static PyObject *
2021defdict_copy(defdictobject *dd)
2022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 /* This calls the object's class. That only works for subclasses
2024 whose class constructor has the same signature. Subclasses that
2025 define a different constructor signature must override copy().
2026 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00002027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 if (dd->default_factory == NULL)
2029 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
2030 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2031 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002032}
2033
2034static PyObject *
2035defdict_reduce(defdictobject *dd)
2036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00002038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 - factory function
2040 - tuple of args for the factory function
2041 - additional state (here None)
2042 - sequence iterator (here None)
2043 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00002044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 For this to be useful with pickle.py, the default_factory
2048 must be picklable; e.g., None, a built-in, or a global
2049 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 Both shallow and deep copying are supported, but for deep
2052 copying, the default_factory must be deep-copyable; e.g. None,
2053 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00002054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 This only works for subclasses as long as their constructor
2056 signature is compatible; the first argument must be the
2057 optional default_factory, defaulting to None.
2058 */
2059 PyObject *args;
2060 PyObject *items;
2061 PyObject *iter;
2062 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002063 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 if (dd->default_factory == NULL || dd->default_factory == Py_None)
2066 args = PyTuple_New(0);
2067 else
2068 args = PyTuple_Pack(1, dd->default_factory);
2069 if (args == NULL)
2070 return NULL;
Victor Stinnerad8c83a2016-09-05 17:53:15 -07002071 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 if (items == NULL) {
2073 Py_DECREF(args);
2074 return NULL;
2075 }
2076 iter = PyObject_GetIter(items);
2077 if (iter == NULL) {
2078 Py_DECREF(items);
2079 Py_DECREF(args);
2080 return NULL;
2081 }
2082 result = PyTuple_Pack(5, Py_TYPE(dd), args,
2083 Py_None, Py_None, iter);
2084 Py_DECREF(iter);
2085 Py_DECREF(items);
2086 Py_DECREF(args);
2087 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002088}
2089
2090static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 {"__missing__", (PyCFunction)defdict_missing, METH_O,
2092 defdict_missing_doc},
2093 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
2094 defdict_copy_doc},
2095 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
2096 defdict_copy_doc},
2097 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
2098 reduce_doc},
2099 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002100};
2101
2102static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 {"default_factory", T_OBJECT,
2104 offsetof(defdictobject, default_factory), 0,
2105 PyDoc_STR("Factory for default value called by __missing__().")},
2106 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002107};
2108
2109static void
2110defdict_dealloc(defdictobject *dd)
2111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 Py_CLEAR(dd->default_factory);
2113 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002114}
2115
Guido van Rossum1968ad32006-02-25 22:38:04 +00002116static PyObject *
2117defdict_repr(defdictobject *dd)
2118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 PyObject *baserepr;
2120 PyObject *defrepr;
2121 PyObject *result;
2122 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2123 if (baserepr == NULL)
2124 return NULL;
2125 if (dd->default_factory == NULL)
2126 defrepr = PyUnicode_FromString("None");
2127 else
2128 {
2129 int status = Py_ReprEnter(dd->default_factory);
2130 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002131 if (status < 0) {
2132 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002134 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 defrepr = PyUnicode_FromString("...");
2136 }
2137 else
2138 defrepr = PyObject_Repr(dd->default_factory);
2139 Py_ReprLeave(dd->default_factory);
2140 }
2141 if (defrepr == NULL) {
2142 Py_DECREF(baserepr);
2143 return NULL;
2144 }
2145 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2146 defrepr, baserepr);
2147 Py_DECREF(defrepr);
2148 Py_DECREF(baserepr);
2149 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002150}
2151
2152static int
2153defdict_traverse(PyObject *self, visitproc visit, void *arg)
2154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 Py_VISIT(((defdictobject *)self)->default_factory);
2156 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002157}
2158
2159static int
2160defdict_tp_clear(defdictobject *dd)
2161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 Py_CLEAR(dd->default_factory);
2163 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002164}
2165
2166static int
2167defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 defdictobject *dd = (defdictobject *)self;
2170 PyObject *olddefault = dd->default_factory;
2171 PyObject *newdefault = NULL;
2172 PyObject *newargs;
2173 int result;
2174 if (args == NULL || !PyTuple_Check(args))
2175 newargs = PyTuple_New(0);
2176 else {
2177 Py_ssize_t n = PyTuple_GET_SIZE(args);
2178 if (n > 0) {
2179 newdefault = PyTuple_GET_ITEM(args, 0);
2180 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2181 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002182 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 return -1;
2184 }
2185 }
2186 newargs = PySequence_GetSlice(args, 1, n);
2187 }
2188 if (newargs == NULL)
2189 return -1;
2190 Py_XINCREF(newdefault);
2191 dd->default_factory = newdefault;
2192 result = PyDict_Type.tp_init(self, newargs, kwds);
2193 Py_DECREF(newargs);
2194 Py_XDECREF(olddefault);
2195 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002196}
2197
2198PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002199"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002200\n\
2201The default factory is called without arguments to produce\n\
2202a new value when a key is not present, in __getitem__ only.\n\
2203A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002204All remaining arguments are treated the same as if they were\n\
2205passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002206");
2207
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002208/* See comment in xxsubtype.c */
2209#define DEFERRED_ADDRESS(ADDR) 0
2210
Guido van Rossum1968ad32006-02-25 22:38:04 +00002211static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2213 "collections.defaultdict", /* tp_name */
2214 sizeof(defdictobject), /* tp_basicsize */
2215 0, /* tp_itemsize */
2216 /* methods */
2217 (destructor)defdict_dealloc, /* tp_dealloc */
2218 0, /* tp_print */
2219 0, /* tp_getattr */
2220 0, /* tp_setattr */
2221 0, /* tp_reserved */
2222 (reprfunc)defdict_repr, /* tp_repr */
2223 0, /* tp_as_number */
2224 0, /* tp_as_sequence */
2225 0, /* tp_as_mapping */
2226 0, /* tp_hash */
2227 0, /* tp_call */
2228 0, /* tp_str */
2229 PyObject_GenericGetAttr, /* tp_getattro */
2230 0, /* tp_setattro */
2231 0, /* tp_as_buffer */
2232 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2233 /* tp_flags */
2234 defdict_doc, /* tp_doc */
2235 defdict_traverse, /* tp_traverse */
2236 (inquiry)defdict_tp_clear, /* tp_clear */
2237 0, /* tp_richcompare */
2238 0, /* tp_weaklistoffset*/
2239 0, /* tp_iter */
2240 0, /* tp_iternext */
2241 defdict_methods, /* tp_methods */
2242 defdict_members, /* tp_members */
2243 0, /* tp_getset */
2244 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2245 0, /* tp_dict */
2246 0, /* tp_descr_get */
2247 0, /* tp_descr_set */
2248 0, /* tp_dictoffset */
2249 defdict_init, /* tp_init */
2250 PyType_GenericAlloc, /* tp_alloc */
2251 0, /* tp_new */
2252 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002253};
2254
Raymond Hettinger96f34102010-12-15 16:30:37 +00002255/* helper function for Counter *********************************************/
2256
2257PyDoc_STRVAR(_count_elements_doc,
2258"_count_elements(mapping, iterable) -> None\n\
2259\n\
Raymond Hettingera24dca62017-01-12 22:25:25 -08002260Count elements in the iterable, updating the mapping");
Raymond Hettinger96f34102010-12-15 16:30:37 +00002261
2262static PyObject *
2263_count_elements(PyObject *self, PyObject *args)
2264{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002265 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002266 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002267 PyObject *it, *iterable, *mapping, *oldval;
2268 PyObject *newval = NULL;
2269 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002270 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002271 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002272 PyObject *bound_get = NULL;
2273 PyObject *mapping_get;
2274 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002275 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002276 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002277
2278 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2279 return NULL;
2280
Raymond Hettinger96f34102010-12-15 16:30:37 +00002281 it = PyObject_GetIter(iterable);
2282 if (it == NULL)
2283 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002284
Raymond Hettinger96f34102010-12-15 16:30:37 +00002285 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002286 if (one == NULL)
2287 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002288
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002289 /* Only take the fast path when get() and __setitem__()
2290 * have not been overridden.
2291 */
2292 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2293 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002294 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2295 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2296
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002297 if (mapping_get != NULL && mapping_get == dict_get &&
2298 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002299 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002300 /* Fast path advantages:
2301 1. Eliminate double hashing
2302 (by re-using the same hash for both the get and set)
2303 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2304 (argument tuple creation and parsing)
2305 3. Avoid indirection through a bound method object
2306 (creates another argument tuple)
2307 4. Avoid initial increment from zero
2308 (reuse an existing one-object instead)
2309 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002310 Py_hash_t hash;
2311
Raymond Hettinger426e0522011-01-03 02:12:02 +00002312 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002313 if (key == NULL)
2314 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002315
2316 if (!PyUnicode_CheckExact(key) ||
2317 (hash = ((PyASCIIObject *) key)->hash) == -1)
2318 {
2319 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002320 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002321 goto done;
2322 }
2323
2324 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002325 if (oldval == NULL) {
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002326 if (PyErr_Occurred())
2327 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002328 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002329 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002330 } else {
2331 newval = PyNumber_Add(oldval, one);
2332 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002333 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002334 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002335 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002336 Py_CLEAR(newval);
2337 }
2338 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002339 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002340 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002341 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002342 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002343 goto done;
2344
2345 zero = PyLong_FromLong(0);
2346 if (zero == NULL)
2347 goto done;
2348
Raymond Hettinger426e0522011-01-03 02:12:02 +00002349 while (1) {
2350 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002351 if (key == NULL)
2352 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002353 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002354 if (oldval == NULL)
2355 break;
2356 newval = PyNumber_Add(oldval, one);
2357 Py_DECREF(oldval);
2358 if (newval == NULL)
2359 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002360 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002361 break;
2362 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002363 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002364 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002365 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002366
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002367done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002368 Py_DECREF(it);
2369 Py_XDECREF(key);
2370 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002371 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002372 Py_XDECREF(zero);
2373 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002374 if (PyErr_Occurred())
2375 return NULL;
2376 Py_RETURN_NONE;
2377}
2378
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002379/* module level code ********************************************************/
2380
2381PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002382"High performance data structures.\n\
2383- deque: ordered collection accessible from endpoints only\n\
2384- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002385");
2386
Raymond Hettinger96f34102010-12-15 16:30:37 +00002387static struct PyMethodDef module_functions[] = {
2388 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2389 {NULL, NULL} /* sentinel */
2390};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002391
2392static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 PyModuleDef_HEAD_INIT,
2394 "_collections",
2395 module_doc,
2396 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002397 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 NULL,
2399 NULL,
2400 NULL,
2401 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002402};
2403
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002404PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002405PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 m = PyModule_Create(&_collectionsmodule);
2410 if (m == NULL)
2411 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 if (PyType_Ready(&deque_type) < 0)
2414 return NULL;
2415 Py_INCREF(&deque_type);
2416 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 defdict_type.tp_base = &PyDict_Type;
2419 if (PyType_Ready(&defdict_type) < 0)
2420 return NULL;
2421 Py_INCREF(&defdict_type);
2422 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002423
Eric Snow47db7172015-05-29 22:21:39 -06002424 Py_INCREF(&PyODict_Type);
2425 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 if (PyType_Ready(&dequeiter_type) < 0)
2428 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002429 Py_INCREF(&dequeiter_type);
2430 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (PyType_Ready(&dequereviter_type) < 0)
2433 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002434 Py_INCREF(&dequereviter_type);
2435 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002438}