blob: e6111c64e77de2d55d109a85ed1dc84117375f59 [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)
541 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
542 else
543 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
544 deque, old_deque->maxlen, NULL);
545}
546
547PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700548
549static PyObject *
550deque_concat(dequeobject *deque, PyObject *other)
551{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400552 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700553 int rv;
554
555 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
556 if (rv <= 0) {
557 if (rv == 0) {
558 PyErr_Format(PyExc_TypeError,
559 "can only concatenate deque (not \"%.200s\") to deque",
560 other->ob_type->tp_name);
561 }
562 return NULL;
563 }
564
565 new_deque = deque_copy((PyObject *)deque);
566 if (new_deque == NULL)
567 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400568 result = deque_extend((dequeobject *)new_deque, other);
569 if (result == NULL) {
570 Py_DECREF(new_deque);
571 return NULL;
572 }
573 Py_DECREF(result);
574 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700575}
576
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700577static void
578deque_clear(dequeobject *deque)
579{
580 block *b;
581 block *prevblock;
582 block *leftblock;
583 Py_ssize_t leftindex;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800584 Py_ssize_t n, m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700585 PyObject *item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800586 PyObject **itemptr, **limit;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700587
Raymond Hettinger38031142015-09-29 22:45:05 -0700588 if (Py_SIZE(deque) == 0)
589 return;
590
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700591 /* During the process of clearing a deque, decrefs can cause the
592 deque to mutate. To avoid fatal confusion, we have to make the
593 deque empty before clearing the blocks and never refer to
594 anything via deque->ref while clearing. (This is the same
595 technique used for clearing lists, sets, and dicts.)
596
597 Making the deque empty requires allocating a new empty block. In
598 the unlikely event that memory is full, we fall back to an
599 alternate method that doesn't require a new block. Repeating
600 pops in a while-loop is slower, possibly re-entrant (and a clever
601 adversary could cause it to never terminate).
602 */
603
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700604 b = newblock();
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700605 if (b == NULL) {
606 PyErr_Clear();
607 goto alternate_method;
608 }
609
610 /* Remember the old size, leftblock, and leftindex */
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800611 n = Py_SIZE(deque);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700612 leftblock = deque->leftblock;
613 leftindex = deque->leftindex;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700614
615 /* Set the deque to be empty using the newly allocated block */
616 MARK_END(b->leftlink);
617 MARK_END(b->rightlink);
618 Py_SIZE(deque) = 0;
619 deque->leftblock = b;
620 deque->rightblock = b;
621 deque->leftindex = CENTER + 1;
622 deque->rightindex = CENTER;
623 deque->state++;
624
625 /* Now the old size, leftblock, and leftindex are disconnected from
626 the empty deque and we can use them to decref the pointers.
627 */
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800628 m = (BLOCKLEN - leftindex > n) ? n : BLOCKLEN - leftindex;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800629 itemptr = &leftblock->data[leftindex];
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800630 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800631 n -= m;
632 while (1) {
633 if (itemptr == limit) {
634 if (n == 0)
635 break;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700636 CHECK_NOT_END(leftblock->rightlink);
637 prevblock = leftblock;
638 leftblock = leftblock->rightlink;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800639 m = (n > BLOCKLEN) ? BLOCKLEN : n;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800640 itemptr = leftblock->data;
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800641 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800642 n -= m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700643 freeblock(prevblock);
644 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800645 item = *(itemptr++);
646 Py_DECREF(item);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700647 }
648 CHECK_END(leftblock->rightlink);
649 freeblock(leftblock);
650 return;
651
652 alternate_method:
653 while (Py_SIZE(deque)) {
654 item = deque_pop(deque, NULL);
655 assert (item != NULL);
656 Py_DECREF(item);
657 }
658}
659
660static PyObject *
661deque_clearmethod(dequeobject *deque)
662{
663 deque_clear(deque);
664 Py_RETURN_NONE;
665}
666
667PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700668
669static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700670deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
671{
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700672 Py_ssize_t i, m, size;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700673 PyObject *seq;
674 PyObject *rv;
675
676 size = Py_SIZE(deque);
677 if (size == 0 || n == 1) {
678 Py_INCREF(deque);
679 return (PyObject *)deque;
680 }
681
682 if (n <= 0) {
683 deque_clear(deque);
684 Py_INCREF(deque);
685 return (PyObject *)deque;
686 }
687
Raymond Hettinger41290a62015-03-31 08:12:23 -0700688 if (size == 1) {
689 /* common case, repeating a single element */
690 PyObject *item = deque->leftblock->data[deque->leftindex];
691
Raymond Hettingera7f630092015-10-10 23:56:02 -0400692 if (deque->maxlen >= 0 && n > deque->maxlen)
Raymond Hettinger41290a62015-03-31 08:12:23 -0700693 n = deque->maxlen;
694
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400695 deque->state++;
Raymond Hettingerad262252015-09-14 01:03:04 -0400696 for (i = 0 ; i < n-1 ; ) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400697 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700698 block *b = newblock();
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400699 if (b == NULL) {
700 Py_SIZE(deque) += i;
701 return NULL;
702 }
703 b->leftlink = deque->rightblock;
704 CHECK_END(deque->rightblock->rightlink);
705 deque->rightblock->rightlink = b;
706 deque->rightblock = b;
707 MARK_END(b->rightlink);
708 deque->rightindex = -1;
709 }
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700710 m = n - 1 - i;
711 if (m > BLOCKLEN - 1 - deque->rightindex)
712 m = BLOCKLEN - 1 - deque->rightindex;
713 i += m;
714 while (m--) {
Raymond Hettingerad262252015-09-14 01:03:04 -0400715 deque->rightindex++;
716 Py_INCREF(item);
717 deque->rightblock->data[deque->rightindex] = item;
718 }
Raymond Hettinger41290a62015-03-31 08:12:23 -0700719 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400720 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700721 Py_INCREF(deque);
722 return (PyObject *)deque;
723 }
724
Raymond Hettinger20151f52015-10-16 22:47:29 -0700725 if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400726 return PyErr_NoMemory();
727 }
728
Raymond Hettinger41290a62015-03-31 08:12:23 -0700729 seq = PySequence_List((PyObject *)deque);
730 if (seq == NULL)
731 return seq;
732
733 for (i = 0 ; i < n-1 ; i++) {
734 rv = deque_extend(deque, seq);
735 if (rv == NULL) {
736 Py_DECREF(seq);
737 return NULL;
738 }
739 Py_DECREF(rv);
740 }
741 Py_INCREF(deque);
742 Py_DECREF(seq);
743 return (PyObject *)deque;
744}
745
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400746static PyObject *
747deque_repeat(dequeobject *deque, Py_ssize_t n)
748{
749 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400750 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400751
752 new_deque = (dequeobject *)deque_copy((PyObject *) deque);
753 if (new_deque == NULL)
754 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400755 rv = deque_inplace_repeat(new_deque, n);
756 Py_DECREF(new_deque);
757 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400758}
759
Raymond Hettinger54023152014-04-23 00:58:48 -0700760/* The rotate() method is part of the public API and is used internally
761as a primitive for other methods.
762
763Rotation by 1 or -1 is a common case, so any optimizations for high
764volume rotations should take care not to penalize the common case.
765
766Conceptually, a rotate by one is equivalent to a pop on one side and an
767append on the other. However, a pop/append pair is unnecessarily slow
Martin Panterd2ad5712015-11-02 04:20:33 +0000768because it requires an incref/decref pair for an object located randomly
Raymond Hettinger54023152014-04-23 00:58:48 -0700769in memory. It is better to just move the object pointer from one block
770to the next without changing the reference count.
771
772When moving batches of pointers, it is tempting to use memcpy() but that
773proved to be slower than a simple loop for a variety of reasons.
774Memcpy() cannot know in advance that we're copying pointers instead of
775bytes, that the source and destination are pointer aligned and
776non-overlapping, that moving just one pointer is a common case, that we
777never need to move more than BLOCKLEN pointers, and that at least one
778pointer is always moved.
779
780For high volume rotations, newblock() and freeblock() are never called
781more than once. Previously emptied blocks are immediately reused as a
782destination block. If a block is left-over at the end, it is freed.
783*/
784
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000785static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000786_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000787{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700788 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700789 block *leftblock = deque->leftblock;
790 block *rightblock = deque->rightblock;
791 Py_ssize_t leftindex = deque->leftindex;
792 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000793 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700794 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000795
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800796 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 return 0;
798 if (n > halflen || n < -halflen) {
799 n %= len;
800 if (n > halflen)
801 n -= len;
802 else if (n < -halflen)
803 n += len;
804 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500805 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500806 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800807
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800808 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500809 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700810 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700811 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700812 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700813 if (b == NULL)
814 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700815 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000816 b->rightlink = leftblock;
817 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700818 leftblock->leftlink = b;
819 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000820 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700821 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700822 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800823 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700824 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700825 {
826 PyObject **src, **dest;
827 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800828
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700829 if (m > rightindex + 1)
830 m = rightindex + 1;
831 if (m > leftindex)
832 m = leftindex;
833 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700834 rightindex -= m;
835 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800836 src = &rightblock->data[rightindex + 1];
837 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700838 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700839 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800840 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700841 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700842 }
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700843 if (rightindex < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700844 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700845 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700846 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700847 CHECK_NOT_END(rightblock->leftlink);
848 rightblock = rightblock->leftlink;
849 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700850 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800851 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800852 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500853 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700854 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700855 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700856 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700857 if (b == NULL)
858 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700859 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000860 b->leftlink = rightblock;
861 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700862 rightblock->rightlink = b;
863 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000864 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700865 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700866 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800867 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700868 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700869 {
870 PyObject **src, **dest;
871 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800872
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700873 if (m > BLOCKLEN - leftindex)
874 m = BLOCKLEN - leftindex;
875 if (m > BLOCKLEN - 1 - rightindex)
876 m = BLOCKLEN - 1 - rightindex;
877 assert (m > 0 && m <= len);
878 src = &leftblock->data[leftindex];
879 dest = &rightblock->data[rightindex + 1];
880 leftindex += m;
881 rightindex += m;
882 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700883 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700884 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700885 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700886 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700887 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700888 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700889 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700890 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700891 CHECK_NOT_END(leftblock->rightlink);
892 leftblock = leftblock->rightlink;
893 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700894 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800895 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700897 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700898done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700899 if (b != NULL)
900 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700901 deque->leftblock = leftblock;
902 deque->rightblock = rightblock;
903 deque->leftindex = leftindex;
904 deque->rightindex = rightindex;
905
906 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000907}
908
909static PyObject *
910deque_rotate(dequeobject *deque, PyObject *args)
911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 if (!PyArg_ParseTuple(args, "|n:rotate", &n))
915 return NULL;
Raymond Hettinger6921c132015-03-21 02:03:40 -0700916 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 Py_RETURN_NONE;
918 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000919}
920
Tim Peters1065f752004-10-01 01:03:29 +0000921PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000922"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000923
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000924static PyObject *
925deque_reverse(dequeobject *deque, PyObject *unused)
926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 block *leftblock = deque->leftblock;
928 block *rightblock = deque->rightblock;
929 Py_ssize_t leftindex = deque->leftindex;
930 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400931 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000933
Raymond Hettinger306d6b12016-01-24 12:40:42 -0800934 n++;
935 while (--n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 /* Validate that pointers haven't met in the middle */
937 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000938 CHECK_NOT_END(leftblock);
939 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 /* Swap */
942 tmp = leftblock->data[leftindex];
943 leftblock->data[leftindex] = rightblock->data[rightindex];
944 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 /* Advance left block/index pair */
947 leftindex++;
948 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 leftblock = leftblock->rightlink;
950 leftindex = 0;
951 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 /* Step backwards with the right block/index pair */
954 rightindex--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700955 if (rightindex < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 rightblock = rightblock->leftlink;
957 rightindex = BLOCKLEN - 1;
958 }
959 }
960 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000961}
962
963PyDoc_STRVAR(reverse_doc,
964"D.reverse() -- reverse *IN PLACE*");
965
Raymond Hettinger44459de2010-04-03 23:20:46 +0000966static PyObject *
967deque_count(dequeobject *deque, PyObject *v)
968{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000969 block *b = deque->leftblock;
970 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000971 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800973 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000976
Raymond Hettinger165eee22016-01-24 11:32:07 -0800977 n++;
978 while (--n) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000979 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000980 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700982 if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 return NULL;
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700984 count += cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 if (start_state != deque->state) {
987 PyErr_SetString(PyExc_RuntimeError,
988 "deque mutated during iteration");
989 return NULL;
990 }
Raymond Hettinger44459de2010-04-03 23:20:46 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000993 index++;
994 if (index == BLOCKLEN) {
995 b = b->rightlink;
996 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 }
998 }
999 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +00001000}
1001
1002PyDoc_STRVAR(count_doc,
1003"D.count(value) -> integer -- return number of occurrences of value");
1004
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001005static int
1006deque_contains(dequeobject *deque, PyObject *v)
1007{
1008 block *b = deque->leftblock;
1009 Py_ssize_t index = deque->leftindex;
1010 Py_ssize_t n = Py_SIZE(deque);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001011 size_t start_state = deque->state;
1012 PyObject *item;
1013 int cmp;
1014
Raymond Hettinger165eee22016-01-24 11:32:07 -08001015 n++;
1016 while (--n) {
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001017 CHECK_NOT_END(b);
1018 item = b->data[index];
1019 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1020 if (cmp) {
1021 return cmp;
1022 }
1023 if (start_state != deque->state) {
1024 PyErr_SetString(PyExc_RuntimeError,
1025 "deque mutated during iteration");
1026 return -1;
1027 }
1028 index++;
1029 if (index == BLOCKLEN) {
1030 b = b->rightlink;
1031 index = 0;
1032 }
1033 }
1034 return 0;
1035}
1036
Martin v. Löwis18e16552006-02-15 17:27:45 +00001037static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001038deque_len(dequeobject *deque)
1039{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001040 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001041}
1042
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001043static PyObject *
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001044deque_index(dequeobject *deque, PyObject *args)
1045{
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001046 Py_ssize_t i, n, start=0, stop=Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001047 PyObject *v, *item;
1048 block *b = deque->leftblock;
1049 Py_ssize_t index = deque->leftindex;
1050 size_t start_state = deque->state;
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001051 int cmp;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001052
1053 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
1054 _PyEval_SliceIndex, &start,
1055 _PyEval_SliceIndex, &stop))
1056 return NULL;
1057 if (start < 0) {
1058 start += Py_SIZE(deque);
1059 if (start < 0)
1060 start = 0;
1061 }
1062 if (stop < 0) {
1063 stop += Py_SIZE(deque);
1064 if (stop < 0)
1065 stop = 0;
1066 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -07001067 if (stop > Py_SIZE(deque))
1068 stop = Py_SIZE(deque);
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001069 if (start > stop)
1070 start = stop;
1071 assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001072
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001073 /* XXX Replace this loop with faster code from deque_item() */
1074 for (i=0 ; i<start ; i++) {
1075 index++;
1076 if (index == BLOCKLEN) {
1077 b = b->rightlink;
1078 index = 0;
1079 }
1080 }
1081
Raymond Hettinger4a91d212015-11-03 22:00:26 -05001082 n = stop - i + 1;
1083 while (--n) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001084 CHECK_NOT_END(b);
1085 item = b->data[index];
1086 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1087 if (cmp > 0)
Raymond Hettinger4a91d212015-11-03 22:00:26 -05001088 return PyLong_FromSsize_t(stop - n);
Raymond Hettingerdf8f5b52015-11-02 07:27:40 -05001089 if (cmp < 0)
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001090 return NULL;
1091 if (start_state != deque->state) {
1092 PyErr_SetString(PyExc_RuntimeError,
1093 "deque mutated during iteration");
1094 return NULL;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001095 }
1096 index++;
1097 if (index == BLOCKLEN) {
1098 b = b->rightlink;
1099 index = 0;
1100 }
1101 }
1102 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
1103 return NULL;
1104}
1105
1106PyDoc_STRVAR(index_doc,
1107"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
1108"Raises ValueError if the value is not present.");
1109
Raymond Hettinger551350a2015-03-24 00:19:53 -07001110/* insert(), remove(), and delitem() are implemented in terms of
1111 rotate() for simplicity and reasonable performance near the end
1112 points. If for some reason these methods become popular, it is not
1113 hard to re-implement this using direct data movement (similar to
1114 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -07001115 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -07001116*/
1117
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001118static PyObject *
1119deque_insert(dequeobject *deque, PyObject *args)
1120{
1121 Py_ssize_t index;
1122 Py_ssize_t n = Py_SIZE(deque);
1123 PyObject *value;
1124 PyObject *rv;
1125
1126 if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
1127 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001128 if (deque->maxlen == Py_SIZE(deque)) {
Raymond Hettingera6389712016-02-01 21:21:19 -08001129 PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1130 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001131 }
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001132 if (index >= n)
1133 return deque_append(deque, value);
1134 if (index <= -n || index == 0)
1135 return deque_appendleft(deque, value);
1136 if (_deque_rotate(deque, -index))
1137 return NULL;
1138 if (index < 0)
1139 rv = deque_append(deque, value);
1140 else
1141 rv = deque_appendleft(deque, value);
1142 if (rv == NULL)
1143 return NULL;
1144 Py_DECREF(rv);
1145 if (_deque_rotate(deque, index))
1146 return NULL;
1147 Py_RETURN_NONE;
1148}
1149
1150PyDoc_STRVAR(insert_doc,
1151"D.insert(index, object) -- insert object before index");
1152
1153static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001154deque_remove(dequeobject *deque, PyObject *value)
1155{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001156 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 for (i=0 ; i<n ; i++) {
1159 PyObject *item = deque->leftblock->data[deque->leftindex];
1160 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001161
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001162 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 PyErr_SetString(PyExc_IndexError,
1164 "deque mutated during remove().");
1165 return NULL;
1166 }
1167 if (cmp > 0) {
1168 PyObject *tgt = deque_popleft(deque, NULL);
1169 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001170 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001172 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 Py_RETURN_NONE;
1174 }
1175 else if (cmp < 0) {
1176 _deque_rotate(deque, i);
1177 return NULL;
1178 }
1179 _deque_rotate(deque, -1);
1180 }
1181 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1182 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001183}
1184
1185PyDoc_STRVAR(remove_doc,
1186"D.remove(value) -- remove first occurrence of value.");
1187
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001188static int
1189valid_index(Py_ssize_t i, Py_ssize_t limit)
1190{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001191 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001192 to check whether i is in the range: 0 <= i < limit */
1193 return (size_t) i < (size_t) limit;
1194}
1195
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001196static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001197deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 block *b;
1200 PyObject *item;
1201 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001202
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001203 if (!valid_index(i, Py_SIZE(deque))) {
1204 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 return NULL;
1206 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 if (i == 0) {
1209 i = deque->leftindex;
1210 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001211 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 i = deque->rightindex;
1213 b = deque->rightblock;
1214 } else {
1215 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001216 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1217 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001218 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 b = deque->leftblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001220 n++;
1221 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 b = b->rightlink;
1223 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001224 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001225 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001226 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 b = deque->rightblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001228 n++;
1229 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 b = b->leftlink;
1231 }
1232 }
1233 item = b->data[i];
1234 Py_INCREF(item);
1235 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001236}
1237
1238static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001239deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001242 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001243
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001244 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001245 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001248 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 assert (item != NULL);
1250 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001251 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001252}
1253
1254static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001255deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001256{
Raymond Hettinger38418662016-02-08 20:34:49 -08001257 PyObject *old_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001259 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001260
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001261 if (!valid_index(i, len)) {
1262 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 return -1;
1264 }
1265 if (v == NULL)
1266 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001269 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1270 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 if (index <= halflen) {
1272 b = deque->leftblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001273 n++;
1274 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 b = b->rightlink;
1276 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001277 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001278 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001279 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 b = deque->rightblock;
Raymond Hettingerd84ec222016-01-24 09:12:06 -08001281 n++;
1282 while (--n)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 b = b->leftlink;
1284 }
1285 Py_INCREF(v);
Raymond Hettinger38418662016-02-08 20:34:49 -08001286 old_value = b->data[i];
1287 b->data[i] = v;
1288 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001290}
1291
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001292static void
1293deque_dealloc(dequeobject *deque)
1294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 PyObject_GC_UnTrack(deque);
1296 if (deque->weakreflist != NULL)
1297 PyObject_ClearWeakRefs((PyObject *) deque);
1298 if (deque->leftblock != NULL) {
1299 deque_clear(deque);
1300 assert(deque->leftblock != NULL);
1301 freeblock(deque->leftblock);
1302 }
1303 deque->leftblock = NULL;
1304 deque->rightblock = NULL;
1305 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001306}
1307
1308static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001309deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001310{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 block *b;
1312 PyObject *item;
1313 Py_ssize_t index;
1314 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger1286d142015-10-14 23:16:57 -07001315 Py_ssize_t indexhigh;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001316
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001317 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1318 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 item = b->data[index];
1320 Py_VISIT(item);
1321 }
1322 indexlo = 0;
1323 }
Raymond Hettinger1286d142015-10-14 23:16:57 -07001324 indexhigh = deque->rightindex;
1325 for (index = indexlo; index <= indexhigh; index++) {
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001326 item = b->data[index];
1327 Py_VISIT(item);
1328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001330}
1331
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001332static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001333deque_reduce(dequeobject *deque)
1334{
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001335 PyObject *dict, *it;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001336 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001337
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001338 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001339 if (dict == NULL) {
1340 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1341 return NULL;
1342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 PyErr_Clear();
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001344 dict = Py_None;
1345 Py_INCREF(dict);
1346 }
1347
1348 it = PyObject_GetIter((PyObject *)deque);
1349 if (it == NULL) {
1350 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 return NULL;
1352 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001353
1354 if (deque->maxlen < 0) {
1355 return Py_BuildValue("O()NN", Py_TYPE(deque), dict, it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001357 else {
1358 return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, dict, it);
1359 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001360}
1361
1362PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1363
1364static PyObject *
1365deque_repr(PyObject *deque)
1366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 PyObject *aslist, *result;
1368 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 i = Py_ReprEnter(deque);
1371 if (i != 0) {
1372 if (i < 0)
1373 return NULL;
1374 return PyUnicode_FromString("[...]");
1375 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 aslist = PySequence_List(deque);
1378 if (aslist == NULL) {
1379 Py_ReprLeave(deque);
1380 return NULL;
1381 }
Raymond Hettingera7f630092015-10-10 23:56:02 -04001382 if (((dequeobject *)deque)->maxlen >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1384 aslist, ((dequeobject *)deque)->maxlen);
1385 else
1386 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001388 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001390}
1391
Raymond Hettinger738ec902004-02-29 02:15:56 +00001392static PyObject *
1393deque_richcompare(PyObject *v, PyObject *w, int op)
1394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 PyObject *it1=NULL, *it2=NULL, *x, *y;
1396 Py_ssize_t vs, ws;
1397 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 if (!PyObject_TypeCheck(v, &deque_type) ||
1400 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001401 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001405 vs = Py_SIZE((dequeobject *)v);
1406 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 if (op == Py_EQ) {
1408 if (v == w)
1409 Py_RETURN_TRUE;
1410 if (vs != ws)
1411 Py_RETURN_FALSE;
1412 }
1413 if (op == Py_NE) {
1414 if (v == w)
1415 Py_RETURN_FALSE;
1416 if (vs != ws)
1417 Py_RETURN_TRUE;
1418 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 /* Search for the first index where items are different */
1421 it1 = PyObject_GetIter(v);
1422 if (it1 == NULL)
1423 goto done;
1424 it2 = PyObject_GetIter(w);
1425 if (it2 == NULL)
1426 goto done;
1427 for (;;) {
1428 x = PyIter_Next(it1);
1429 if (x == NULL && PyErr_Occurred())
1430 goto done;
1431 y = PyIter_Next(it2);
1432 if (x == NULL || y == NULL)
1433 break;
1434 b = PyObject_RichCompareBool(x, y, Py_EQ);
1435 if (b == 0) {
1436 cmp = PyObject_RichCompareBool(x, y, op);
1437 Py_DECREF(x);
1438 Py_DECREF(y);
1439 goto done;
1440 }
1441 Py_DECREF(x);
1442 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001443 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 goto done;
1445 }
1446 /* We reached the end of one deque or both */
1447 Py_XDECREF(x);
1448 Py_XDECREF(y);
1449 if (PyErr_Occurred())
1450 goto done;
1451 switch (op) {
1452 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1453 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1454 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1455 case Py_NE: cmp = x != y; break; /* if one deque continues */
1456 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1457 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1458 }
Tim Peters1065f752004-10-01 01:03:29 +00001459
Raymond Hettinger738ec902004-02-29 02:15:56 +00001460done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 Py_XDECREF(it1);
1462 Py_XDECREF(it2);
1463 if (cmp == 1)
1464 Py_RETURN_TRUE;
1465 if (cmp == 0)
1466 Py_RETURN_FALSE;
1467 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001468}
1469
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001470static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001471deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 PyObject *iterable = NULL;
1474 PyObject *maxlenobj = NULL;
1475 Py_ssize_t maxlen = -1;
1476 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001477
Raymond Hettinger0d309402015-09-30 23:15:02 -07001478 if (kwdargs == NULL) {
1479 if (!PyArg_UnpackTuple(args, "deque()", 0, 2, &iterable, &maxlenobj))
1480 return -1;
1481 } else {
1482 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist,
1483 &iterable, &maxlenobj))
1484 return -1;
1485 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 if (maxlenobj != NULL && maxlenobj != Py_None) {
1487 maxlen = PyLong_AsSsize_t(maxlenobj);
1488 if (maxlen == -1 && PyErr_Occurred())
1489 return -1;
1490 if (maxlen < 0) {
1491 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1492 return -1;
1493 }
1494 }
1495 deque->maxlen = maxlen;
Raymond Hettinger0d309402015-09-30 23:15:02 -07001496 if (Py_SIZE(deque) > 0)
1497 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (iterable != NULL) {
1499 PyObject *rv = deque_extend(deque, iterable);
1500 if (rv == NULL)
1501 return -1;
1502 Py_DECREF(rv);
1503 }
1504 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001505}
1506
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001507static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001508deque_sizeof(dequeobject *deque, void *unused)
1509{
1510 Py_ssize_t res;
1511 Py_ssize_t blocks;
1512
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001513 res = _PyObject_SIZE(Py_TYPE(deque));
Raymond Hettingerbc003412015-10-14 23:33:23 -07001514 blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001515 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001516 (blocks - 1) * BLOCKLEN + deque->rightindex);
1517 res += blocks * sizeof(block);
1518 return PyLong_FromSsize_t(res);
1519}
1520
1521PyDoc_STRVAR(sizeof_doc,
1522"D.__sizeof__() -- size of D in memory, in bytes");
1523
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001524static int
1525deque_bool(dequeobject *deque)
1526{
1527 return Py_SIZE(deque) != 0;
1528}
1529
Jesus Cea16e2fca2012-08-03 14:49:42 +02001530static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001531deque_get_maxlen(dequeobject *deque)
1532{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001533 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 Py_RETURN_NONE;
1535 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001536}
1537
Raymond Hettinger41290a62015-03-31 08:12:23 -07001538
1539/* deque object ********************************************************/
1540
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001541static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1543 "maximum size of a deque or None if unbounded"},
1544 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001545};
1546
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001547static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001549 (binaryfunc)deque_concat, /* sq_concat */
1550 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 (ssizeargfunc)deque_item, /* sq_item */
1552 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001553 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001555 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001556 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001557 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001558};
1559
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001560static PyNumberMethods deque_as_number = {
1561 0, /* nb_add */
1562 0, /* nb_subtract */
1563 0, /* nb_multiply */
1564 0, /* nb_remainder */
1565 0, /* nb_divmod */
1566 0, /* nb_power */
1567 0, /* nb_negative */
1568 0, /* nb_positive */
1569 0, /* nb_absolute */
1570 (inquiry)deque_bool, /* nb_bool */
1571 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001572 };
1573
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001574static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001575static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001576PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001578
1579static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 {"append", (PyCFunction)deque_append,
1581 METH_O, append_doc},
1582 {"appendleft", (PyCFunction)deque_appendleft,
1583 METH_O, appendleft_doc},
1584 {"clear", (PyCFunction)deque_clearmethod,
1585 METH_NOARGS, clear_doc},
1586 {"__copy__", (PyCFunction)deque_copy,
1587 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001588 {"copy", (PyCFunction)deque_copy,
1589 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001591 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 {"extend", (PyCFunction)deque_extend,
1593 METH_O, extend_doc},
1594 {"extendleft", (PyCFunction)deque_extendleft,
1595 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001596 {"index", (PyCFunction)deque_index,
1597 METH_VARARGS, index_doc},
1598 {"insert", (PyCFunction)deque_insert,
1599 METH_VARARGS, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 {"pop", (PyCFunction)deque_pop,
1601 METH_NOARGS, pop_doc},
1602 {"popleft", (PyCFunction)deque_popleft,
1603 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001604 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 METH_NOARGS, reduce_doc},
1606 {"remove", (PyCFunction)deque_remove,
1607 METH_O, remove_doc},
1608 {"__reversed__", (PyCFunction)deque_reviter,
1609 METH_NOARGS, reversed_doc},
1610 {"reverse", (PyCFunction)deque_reverse,
1611 METH_NOARGS, reverse_doc},
1612 {"rotate", (PyCFunction)deque_rotate,
Jesus Cea16e2fca2012-08-03 14:49:42 +02001613 METH_VARARGS, rotate_doc},
1614 {"__sizeof__", (PyCFunction)deque_sizeof,
1615 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001617};
1618
1619PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001620"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001621\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001622A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001623
Neal Norwitz87f10132004-02-29 15:40:53 +00001624static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 PyVarObject_HEAD_INIT(NULL, 0)
1626 "collections.deque", /* tp_name */
1627 sizeof(dequeobject), /* tp_basicsize */
1628 0, /* tp_itemsize */
1629 /* methods */
1630 (destructor)deque_dealloc, /* tp_dealloc */
1631 0, /* tp_print */
1632 0, /* tp_getattr */
1633 0, /* tp_setattr */
1634 0, /* tp_reserved */
1635 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001636 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 &deque_as_sequence, /* tp_as_sequence */
1638 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001639 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 0, /* tp_call */
1641 0, /* tp_str */
1642 PyObject_GenericGetAttr, /* tp_getattro */
1643 0, /* tp_setattro */
1644 0, /* tp_as_buffer */
1645 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001646 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 deque_doc, /* tp_doc */
1648 (traverseproc)deque_traverse, /* tp_traverse */
1649 (inquiry)deque_clear, /* tp_clear */
1650 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001651 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 (getiterfunc)deque_iter, /* tp_iter */
1653 0, /* tp_iternext */
1654 deque_methods, /* tp_methods */
1655 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001656 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 0, /* tp_base */
1658 0, /* tp_dict */
1659 0, /* tp_descr_get */
1660 0, /* tp_descr_set */
1661 0, /* tp_dictoffset */
1662 (initproc)deque_init, /* tp_init */
1663 PyType_GenericAlloc, /* tp_alloc */
1664 deque_new, /* tp_new */
1665 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001666};
1667
1668/*********************** Deque Iterator **************************/
1669
1670typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001673 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001675 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001677} dequeiterobject;
1678
Martin v. Löwis59683e82008-06-13 07:50:45 +00001679static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001680
1681static PyObject *
1682deque_iter(dequeobject *deque)
1683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1687 if (it == NULL)
1688 return NULL;
1689 it->b = deque->leftblock;
1690 it->index = deque->leftindex;
1691 Py_INCREF(deque);
1692 it->deque = deque;
1693 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001694 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 PyObject_GC_Track(it);
1696 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001697}
1698
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001699static int
1700dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 Py_VISIT(dio->deque);
1703 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001704}
1705
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001706static void
1707dequeiter_dealloc(dequeiterobject *dio)
1708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 Py_XDECREF(dio->deque);
1710 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001711}
1712
1713static PyObject *
1714dequeiter_next(dequeiterobject *it)
1715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (it->deque->state != it->state) {
1719 it->counter = 0;
1720 PyErr_SetString(PyExc_RuntimeError,
1721 "deque mutated during iteration");
1722 return NULL;
1723 }
1724 if (it->counter == 0)
1725 return NULL;
1726 assert (!(it->b == it->deque->rightblock &&
1727 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 item = it->b->data[it->index];
1730 it->index++;
1731 it->counter--;
1732 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001733 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 it->b = it->b->rightlink;
1735 it->index = 0;
1736 }
1737 Py_INCREF(item);
1738 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001739}
1740
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001741static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001742dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1743{
1744 Py_ssize_t i, index=0;
1745 PyObject *deque;
1746 dequeiterobject *it;
1747 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1748 return NULL;
1749 assert(type == &dequeiter_type);
1750
1751 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1752 if (!it)
1753 return NULL;
1754 /* consume items from the queue */
1755 for(i=0; i<index; i++) {
1756 PyObject *item = dequeiter_next(it);
1757 if (item) {
1758 Py_DECREF(item);
1759 } else {
1760 if (it->counter) {
1761 Py_DECREF(it);
1762 return NULL;
1763 } else
1764 break;
1765 }
1766 }
1767 return (PyObject*)it;
1768}
1769
1770static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001771dequeiter_len(dequeiterobject *it)
1772{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001773 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001774}
1775
Armin Rigof5b3e362006-02-11 21:32:43 +00001776PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001777
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001778static PyObject *
1779dequeiter_reduce(dequeiterobject *it)
1780{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001781 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 +00001782}
1783
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001784static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001786 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001788};
1789
Martin v. Löwis59683e82008-06-13 07:50:45 +00001790static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001792 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 sizeof(dequeiterobject), /* tp_basicsize */
1794 0, /* tp_itemsize */
1795 /* methods */
1796 (destructor)dequeiter_dealloc, /* tp_dealloc */
1797 0, /* tp_print */
1798 0, /* tp_getattr */
1799 0, /* tp_setattr */
1800 0, /* tp_reserved */
1801 0, /* tp_repr */
1802 0, /* tp_as_number */
1803 0, /* tp_as_sequence */
1804 0, /* tp_as_mapping */
1805 0, /* tp_hash */
1806 0, /* tp_call */
1807 0, /* tp_str */
1808 PyObject_GenericGetAttr, /* tp_getattro */
1809 0, /* tp_setattro */
1810 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001811 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 0, /* tp_doc */
1813 (traverseproc)dequeiter_traverse, /* tp_traverse */
1814 0, /* tp_clear */
1815 0, /* tp_richcompare */
1816 0, /* tp_weaklistoffset */
1817 PyObject_SelfIter, /* tp_iter */
1818 (iternextfunc)dequeiter_next, /* tp_iternext */
1819 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001820 0, /* tp_members */
1821 0, /* tp_getset */
1822 0, /* tp_base */
1823 0, /* tp_dict */
1824 0, /* tp_descr_get */
1825 0, /* tp_descr_set */
1826 0, /* tp_dictoffset */
1827 0, /* tp_init */
1828 0, /* tp_alloc */
1829 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001831};
1832
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001833/*********************** Deque Reverse Iterator **************************/
1834
Martin v. Löwis59683e82008-06-13 07:50:45 +00001835static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001836
1837static PyObject *
1838deque_reviter(dequeobject *deque)
1839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1843 if (it == NULL)
1844 return NULL;
1845 it->b = deque->rightblock;
1846 it->index = deque->rightindex;
1847 Py_INCREF(deque);
1848 it->deque = deque;
1849 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001850 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 PyObject_GC_Track(it);
1852 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001853}
1854
1855static PyObject *
1856dequereviter_next(dequeiterobject *it)
1857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 PyObject *item;
1859 if (it->counter == 0)
1860 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 if (it->deque->state != it->state) {
1863 it->counter = 0;
1864 PyErr_SetString(PyExc_RuntimeError,
1865 "deque mutated during iteration");
1866 return NULL;
1867 }
1868 assert (!(it->b == it->deque->leftblock &&
1869 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 item = it->b->data[it->index];
1872 it->index--;
1873 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001874 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001875 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 it->b = it->b->leftlink;
1877 it->index = BLOCKLEN - 1;
1878 }
1879 Py_INCREF(item);
1880 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001881}
1882
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001883static PyObject *
1884dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1885{
1886 Py_ssize_t i, index=0;
1887 PyObject *deque;
1888 dequeiterobject *it;
1889 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1890 return NULL;
1891 assert(type == &dequereviter_type);
1892
1893 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1894 if (!it)
1895 return NULL;
1896 /* consume items from the queue */
1897 for(i=0; i<index; i++) {
1898 PyObject *item = dequereviter_next(it);
1899 if (item) {
1900 Py_DECREF(item);
1901 } else {
1902 if (it->counter) {
1903 Py_DECREF(it);
1904 return NULL;
1905 } else
1906 break;
1907 }
1908 }
1909 return (PyObject*)it;
1910}
1911
Martin v. Löwis59683e82008-06-13 07:50:45 +00001912static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001914 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 sizeof(dequeiterobject), /* tp_basicsize */
1916 0, /* tp_itemsize */
1917 /* methods */
1918 (destructor)dequeiter_dealloc, /* tp_dealloc */
1919 0, /* tp_print */
1920 0, /* tp_getattr */
1921 0, /* tp_setattr */
1922 0, /* tp_reserved */
1923 0, /* tp_repr */
1924 0, /* tp_as_number */
1925 0, /* tp_as_sequence */
1926 0, /* tp_as_mapping */
1927 0, /* tp_hash */
1928 0, /* tp_call */
1929 0, /* tp_str */
1930 PyObject_GenericGetAttr, /* tp_getattro */
1931 0, /* tp_setattro */
1932 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001933 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 0, /* tp_doc */
1935 (traverseproc)dequeiter_traverse, /* tp_traverse */
1936 0, /* tp_clear */
1937 0, /* tp_richcompare */
1938 0, /* tp_weaklistoffset */
1939 PyObject_SelfIter, /* tp_iter */
1940 (iternextfunc)dequereviter_next, /* tp_iternext */
1941 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001942 0, /* tp_members */
1943 0, /* tp_getset */
1944 0, /* tp_base */
1945 0, /* tp_dict */
1946 0, /* tp_descr_get */
1947 0, /* tp_descr_set */
1948 0, /* tp_dictoffset */
1949 0, /* tp_init */
1950 0, /* tp_alloc */
1951 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001953};
1954
Guido van Rossum1968ad32006-02-25 22:38:04 +00001955/* defaultdict type *********************************************************/
1956
1957typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 PyDictObject dict;
1959 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001960} defdictobject;
1961
1962static PyTypeObject defdict_type; /* Forward */
1963
1964PyDoc_STRVAR(defdict_missing_doc,
1965"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001966 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001967 self[key] = value = self.default_factory()\n\
1968 return value\n\
1969");
1970
1971static PyObject *
1972defdict_missing(defdictobject *dd, PyObject *key)
1973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 PyObject *factory = dd->default_factory;
1975 PyObject *value;
1976 if (factory == NULL || factory == Py_None) {
1977 /* XXX Call dict.__missing__(key) */
1978 PyObject *tup;
1979 tup = PyTuple_Pack(1, key);
1980 if (!tup) return NULL;
1981 PyErr_SetObject(PyExc_KeyError, tup);
1982 Py_DECREF(tup);
1983 return NULL;
1984 }
1985 value = PyEval_CallObject(factory, NULL);
1986 if (value == NULL)
1987 return value;
1988 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1989 Py_DECREF(value);
1990 return NULL;
1991 }
1992 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001993}
1994
1995PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1996
1997static PyObject *
1998defdict_copy(defdictobject *dd)
1999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 /* This calls the object's class. That only works for subclasses
2001 whose class constructor has the same signature. Subclasses that
2002 define a different constructor signature must override copy().
2003 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 if (dd->default_factory == NULL)
2006 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
2007 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2008 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002009}
2010
2011static PyObject *
2012defdict_reduce(defdictobject *dd)
2013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 - factory function
2017 - tuple of args for the factory function
2018 - additional state (here None)
2019 - sequence iterator (here None)
2020 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 For this to be useful with pickle.py, the default_factory
2025 must be picklable; e.g., None, a built-in, or a global
2026 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 Both shallow and deep copying are supported, but for deep
2029 copying, the default_factory must be deep-copyable; e.g. None,
2030 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00002031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 This only works for subclasses as long as their constructor
2033 signature is compatible; the first argument must be the
2034 optional default_factory, defaulting to None.
2035 */
2036 PyObject *args;
2037 PyObject *items;
2038 PyObject *iter;
2039 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002040 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (dd->default_factory == NULL || dd->default_factory == Py_None)
2043 args = PyTuple_New(0);
2044 else
2045 args = PyTuple_Pack(1, dd->default_factory);
2046 if (args == NULL)
2047 return NULL;
Victor Stinnerad8c83a2016-09-05 17:53:15 -07002048 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 if (items == NULL) {
2050 Py_DECREF(args);
2051 return NULL;
2052 }
2053 iter = PyObject_GetIter(items);
2054 if (iter == NULL) {
2055 Py_DECREF(items);
2056 Py_DECREF(args);
2057 return NULL;
2058 }
2059 result = PyTuple_Pack(5, Py_TYPE(dd), args,
2060 Py_None, Py_None, iter);
2061 Py_DECREF(iter);
2062 Py_DECREF(items);
2063 Py_DECREF(args);
2064 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002065}
2066
2067static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 {"__missing__", (PyCFunction)defdict_missing, METH_O,
2069 defdict_missing_doc},
2070 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
2071 defdict_copy_doc},
2072 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
2073 defdict_copy_doc},
2074 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
2075 reduce_doc},
2076 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002077};
2078
2079static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 {"default_factory", T_OBJECT,
2081 offsetof(defdictobject, default_factory), 0,
2082 PyDoc_STR("Factory for default value called by __missing__().")},
2083 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002084};
2085
2086static void
2087defdict_dealloc(defdictobject *dd)
2088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 Py_CLEAR(dd->default_factory);
2090 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002091}
2092
Guido van Rossum1968ad32006-02-25 22:38:04 +00002093static PyObject *
2094defdict_repr(defdictobject *dd)
2095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 PyObject *baserepr;
2097 PyObject *defrepr;
2098 PyObject *result;
2099 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2100 if (baserepr == NULL)
2101 return NULL;
2102 if (dd->default_factory == NULL)
2103 defrepr = PyUnicode_FromString("None");
2104 else
2105 {
2106 int status = Py_ReprEnter(dd->default_factory);
2107 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002108 if (status < 0) {
2109 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002111 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 defrepr = PyUnicode_FromString("...");
2113 }
2114 else
2115 defrepr = PyObject_Repr(dd->default_factory);
2116 Py_ReprLeave(dd->default_factory);
2117 }
2118 if (defrepr == NULL) {
2119 Py_DECREF(baserepr);
2120 return NULL;
2121 }
2122 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2123 defrepr, baserepr);
2124 Py_DECREF(defrepr);
2125 Py_DECREF(baserepr);
2126 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002127}
2128
2129static int
2130defdict_traverse(PyObject *self, visitproc visit, void *arg)
2131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 Py_VISIT(((defdictobject *)self)->default_factory);
2133 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002134}
2135
2136static int
2137defdict_tp_clear(defdictobject *dd)
2138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 Py_CLEAR(dd->default_factory);
2140 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002141}
2142
2143static int
2144defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 defdictobject *dd = (defdictobject *)self;
2147 PyObject *olddefault = dd->default_factory;
2148 PyObject *newdefault = NULL;
2149 PyObject *newargs;
2150 int result;
2151 if (args == NULL || !PyTuple_Check(args))
2152 newargs = PyTuple_New(0);
2153 else {
2154 Py_ssize_t n = PyTuple_GET_SIZE(args);
2155 if (n > 0) {
2156 newdefault = PyTuple_GET_ITEM(args, 0);
2157 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2158 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002159 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 return -1;
2161 }
2162 }
2163 newargs = PySequence_GetSlice(args, 1, n);
2164 }
2165 if (newargs == NULL)
2166 return -1;
2167 Py_XINCREF(newdefault);
2168 dd->default_factory = newdefault;
2169 result = PyDict_Type.tp_init(self, newargs, kwds);
2170 Py_DECREF(newargs);
2171 Py_XDECREF(olddefault);
2172 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002173}
2174
2175PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002176"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002177\n\
2178The default factory is called without arguments to produce\n\
2179a new value when a key is not present, in __getitem__ only.\n\
2180A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002181All remaining arguments are treated the same as if they were\n\
2182passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002183");
2184
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002185/* See comment in xxsubtype.c */
2186#define DEFERRED_ADDRESS(ADDR) 0
2187
Guido van Rossum1968ad32006-02-25 22:38:04 +00002188static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2190 "collections.defaultdict", /* tp_name */
2191 sizeof(defdictobject), /* tp_basicsize */
2192 0, /* tp_itemsize */
2193 /* methods */
2194 (destructor)defdict_dealloc, /* tp_dealloc */
2195 0, /* tp_print */
2196 0, /* tp_getattr */
2197 0, /* tp_setattr */
2198 0, /* tp_reserved */
2199 (reprfunc)defdict_repr, /* tp_repr */
2200 0, /* tp_as_number */
2201 0, /* tp_as_sequence */
2202 0, /* tp_as_mapping */
2203 0, /* tp_hash */
2204 0, /* tp_call */
2205 0, /* tp_str */
2206 PyObject_GenericGetAttr, /* tp_getattro */
2207 0, /* tp_setattro */
2208 0, /* tp_as_buffer */
2209 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2210 /* tp_flags */
2211 defdict_doc, /* tp_doc */
2212 defdict_traverse, /* tp_traverse */
2213 (inquiry)defdict_tp_clear, /* tp_clear */
2214 0, /* tp_richcompare */
2215 0, /* tp_weaklistoffset*/
2216 0, /* tp_iter */
2217 0, /* tp_iternext */
2218 defdict_methods, /* tp_methods */
2219 defdict_members, /* tp_members */
2220 0, /* tp_getset */
2221 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2222 0, /* tp_dict */
2223 0, /* tp_descr_get */
2224 0, /* tp_descr_set */
2225 0, /* tp_dictoffset */
2226 defdict_init, /* tp_init */
2227 PyType_GenericAlloc, /* tp_alloc */
2228 0, /* tp_new */
2229 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002230};
2231
Raymond Hettinger96f34102010-12-15 16:30:37 +00002232/* helper function for Counter *********************************************/
2233
2234PyDoc_STRVAR(_count_elements_doc,
2235"_count_elements(mapping, iterable) -> None\n\
2236\n\
Martin Panter536d70e2017-01-14 08:23:08 +00002237Count elements in the iterable, updating the mapping");
Raymond Hettinger96f34102010-12-15 16:30:37 +00002238
2239static PyObject *
2240_count_elements(PyObject *self, PyObject *args)
2241{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002242 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002243 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002244 PyObject *it, *iterable, *mapping, *oldval;
2245 PyObject *newval = NULL;
2246 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002247 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002248 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002249 PyObject *bound_get = NULL;
2250 PyObject *mapping_get;
2251 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002252 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002253 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002254
2255 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2256 return NULL;
2257
Raymond Hettinger96f34102010-12-15 16:30:37 +00002258 it = PyObject_GetIter(iterable);
2259 if (it == NULL)
2260 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002261
Raymond Hettinger96f34102010-12-15 16:30:37 +00002262 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002263 if (one == NULL)
2264 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002265
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002266 /* Only take the fast path when get() and __setitem__()
2267 * have not been overridden.
2268 */
2269 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2270 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002271 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2272 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2273
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002274 if (mapping_get != NULL && mapping_get == dict_get &&
2275 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002276 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002277 /* Fast path advantages:
2278 1. Eliminate double hashing
2279 (by re-using the same hash for both the get and set)
2280 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2281 (argument tuple creation and parsing)
2282 3. Avoid indirection through a bound method object
2283 (creates another argument tuple)
2284 4. Avoid initial increment from zero
2285 (reuse an existing one-object instead)
2286 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002287 Py_hash_t hash;
2288
Raymond Hettinger426e0522011-01-03 02:12:02 +00002289 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002290 if (key == NULL)
2291 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002292
2293 if (!PyUnicode_CheckExact(key) ||
2294 (hash = ((PyASCIIObject *) key)->hash) == -1)
2295 {
2296 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002297 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002298 goto done;
2299 }
2300
2301 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002302 if (oldval == NULL) {
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002303 if (PyErr_Occurred())
2304 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002305 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002306 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002307 } else {
2308 newval = PyNumber_Add(oldval, one);
2309 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002310 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002311 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002312 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002313 Py_CLEAR(newval);
2314 }
2315 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002316 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002317 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002318 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002319 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002320 goto done;
2321
2322 zero = PyLong_FromLong(0);
2323 if (zero == NULL)
2324 goto done;
2325
Raymond Hettinger426e0522011-01-03 02:12:02 +00002326 while (1) {
2327 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002328 if (key == NULL)
2329 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002330 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002331 if (oldval == NULL)
2332 break;
2333 newval = PyNumber_Add(oldval, one);
2334 Py_DECREF(oldval);
2335 if (newval == NULL)
2336 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002337 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002338 break;
2339 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002340 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002341 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002342 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002343
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002344done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002345 Py_DECREF(it);
2346 Py_XDECREF(key);
2347 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002348 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002349 Py_XDECREF(zero);
2350 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002351 if (PyErr_Occurred())
2352 return NULL;
2353 Py_RETURN_NONE;
2354}
2355
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002356/* module level code ********************************************************/
2357
2358PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002359"High performance data structures.\n\
2360- deque: ordered collection accessible from endpoints only\n\
2361- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002362");
2363
Raymond Hettinger96f34102010-12-15 16:30:37 +00002364static struct PyMethodDef module_functions[] = {
2365 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2366 {NULL, NULL} /* sentinel */
2367};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002368
2369static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 PyModuleDef_HEAD_INIT,
2371 "_collections",
2372 module_doc,
2373 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002374 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 NULL,
2376 NULL,
2377 NULL,
2378 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002379};
2380
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002381PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002382PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 m = PyModule_Create(&_collectionsmodule);
2387 if (m == NULL)
2388 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 if (PyType_Ready(&deque_type) < 0)
2391 return NULL;
2392 Py_INCREF(&deque_type);
2393 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 defdict_type.tp_base = &PyDict_Type;
2396 if (PyType_Ready(&defdict_type) < 0)
2397 return NULL;
2398 Py_INCREF(&defdict_type);
2399 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002400
Eric Snow47db7172015-05-29 22:21:39 -06002401 Py_INCREF(&PyODict_Type);
2402 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 if (PyType_Ready(&dequeiter_type) < 0)
2405 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002406 Py_INCREF(&dequeiter_type);
2407 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 if (PyType_Ready(&dequereviter_type) < 0)
2410 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002411 Py_INCREF(&dequereviter_type);
2412 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002415}