blob: 45169ecd11af00dbde01528981a040f25d2b8f12 [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
Pablo Galindo3f5fc702018-12-30 09:24:03 +000010/*[clinic input]
Miss Islington (bot)21ce2452019-06-05 16:20:58 -070011module _collections
Pablo Galindo3f5fc702018-12-30 09:24:03 +000012class _tuplegetter "_tuplegetterobject *" "&tuplegetter_type"
13[clinic start generated code]*/
Miss Islington (bot)21ce2452019-06-05 16:20:58 -070014/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a8ece4ccad7e30ac]*/
Pablo Galindo3f5fc702018-12-30 09:24:03 +000015
16static PyTypeObject tuplegetter_type;
17#include "clinic/_collectionsmodule.c.h"
18
Raymond Hettinger756b3f32004-01-29 06:37:52 +000019/* collections module implementation of a deque() datatype
20 Written and maintained by Raymond D. Hettinger <python@rcn.com>
Raymond Hettinger756b3f32004-01-29 06:37:52 +000021*/
22
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000023/* The block length may be set to any number over 1. Larger numbers
Raymond Hettinger20b0f872013-06-23 15:44:33 -070024 * reduce the number of calls to the memory allocator, give faster
Raymond Hettinger30c90742015-03-02 22:31:35 -080025 * indexing and rotation, and reduce the link to data overhead ratio.
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080026 * Making the block length a power of two speeds-up the modulo
Raymond Hettinger30c90742015-03-02 22:31:35 -080027 * and division calculations in deque_item() and deque_ass_item().
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000028 */
29
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080030#define BLOCKLEN 64
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000031#define CENTER ((BLOCKLEN - 1) / 2)
Raymond Hettinger756b3f32004-01-29 06:37:52 +000032
Raymond Hettinger551350a2015-03-24 00:19:53 -070033/* Data for deque objects is stored in a doubly-linked list of fixed
34 * length blocks. This assures that appends or pops never move any
35 * other data elements besides the one being appended or popped.
36 *
37 * Another advantage is that it completely avoids use of realloc(),
38 * resulting in more predictable performance.
39 *
40 * Textbook implementations of doubly-linked lists store one datum
41 * per link, but that gives them a 200% memory overhead (a prev and
42 * next link for each datum) and it costs one malloc() call per data
43 * element. By using fixed-length blocks, the link to data ratio is
44 * significantly improved and there are proportionally fewer calls
45 * to malloc() and free(). The data blocks of consecutive pointers
46 * also improve cache locality.
47 *
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000048 * The list of blocks is never empty, so d.leftblock and d.rightblock
Raymond Hettinger82df9252013-07-07 01:43:42 -100049 * are never equal to NULL. The list is not circular.
50 *
51 * A deque d's first element is at d.leftblock[leftindex]
52 * and its last element is at d.rightblock[rightindex].
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000053 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070054 * Unlike Python slice indices, these indices are inclusive on both
55 * ends. This makes the algorithms for left and right operations
56 * more symmetrical and it simplifies the design.
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000057 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070058 * The indices, d.leftindex and d.rightindex are always in the range:
59 * 0 <= index < BLOCKLEN
60 *
61 * And their exact relationship is:
62 * (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000063 *
Raymond Hettinger8dbbae22015-03-24 21:01:50 -070064 * Whenever d.leftblock == d.rightblock, then:
Raymond Hettinger551350a2015-03-24 00:19:53 -070065 * d.leftindex + d.len - 1 == d.rightindex
Thomas Wouters0e3f5912006-08-11 14:57:12 +000066 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070067 * However, when d.leftblock != d.rightblock, the d.leftindex and
68 * d.rightindex become indices into distinct blocks and either may
69 * be larger than the other.
70 *
71 * Empty deques have:
72 * d.len == 0
73 * d.leftblock == d.rightblock
74 * d.leftindex == CENTER + 1
75 * d.rightindex == CENTER
76 *
77 * Checking for d.len == 0 is the intended way to see whether d is empty.
Tim Petersd8768d32004-10-01 01:32:53 +000078 */
79
Raymond Hettinger756b3f32004-01-29 06:37:52 +000080typedef struct BLOCK {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 struct BLOCK *leftlink;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 PyObject *data[BLOCKLEN];
Raymond Hettinger20b0f872013-06-23 15:44:33 -070083 struct BLOCK *rightlink;
Raymond Hettinger756b3f32004-01-29 06:37:52 +000084} block;
85
Raymond Hettinger30c90742015-03-02 22:31:35 -080086typedef struct {
87 PyObject_VAR_HEAD
88 block *leftblock;
89 block *rightblock;
Raymond Hettinger551350a2015-03-24 00:19:53 -070090 Py_ssize_t leftindex; /* 0 <= leftindex < BLOCKLEN */
91 Py_ssize_t rightindex; /* 0 <= rightindex < BLOCKLEN */
Raymond Hettingerf9d9c792015-03-02 22:47:46 -080092 size_t state; /* incremented whenever the indices move */
Raymond Hettingerd84ec222016-01-24 09:12:06 -080093 Py_ssize_t maxlen; /* maxlen is -1 for unbounded deques */
Raymond Hettinger0f6f9472015-03-21 01:42:10 -070094 PyObject *weakreflist;
Raymond Hettinger30c90742015-03-02 22:31:35 -080095} dequeobject;
96
97static PyTypeObject deque_type;
98
Raymond Hettinger82df9252013-07-07 01:43:42 -100099/* For debug builds, add error checking to track the endpoints
100 * in the chain of links. The goal is to make sure that link
101 * assignments only take place at endpoints so that links already
102 * in use do not get overwritten.
103 *
104 * CHECK_END should happen before each assignment to a block's link field.
105 * MARK_END should happen whenever a link field becomes a new endpoint.
106 * This happens when new blocks are added or whenever an existing
107 * block is freed leaving another existing block as the new endpoint.
108 */
109
Raymond Hettinger3223dd52013-07-26 23:14:22 -0700110#ifndef NDEBUG
Raymond Hettinger82df9252013-07-07 01:43:42 -1000111#define MARK_END(link) link = NULL;
112#define CHECK_END(link) assert(link == NULL);
113#define CHECK_NOT_END(link) assert(link != NULL);
114#else
115#define MARK_END(link)
116#define CHECK_END(link)
117#define CHECK_NOT_END(link)
118#endif
119
120/* A simple freelisting scheme is used to minimize calls to the memory
Raymond Hettinger551350a2015-03-24 00:19:53 -0700121 allocator. It accommodates common use cases where new blocks are being
Raymond Hettinger82df9252013-07-07 01:43:42 -1000122 added at about the same rate as old blocks are being freed.
123 */
124
Raymond Hettingerf2b02ce2015-09-26 17:47:02 -0700125#define MAXFREEBLOCKS 16
Benjamin Petersond6313712008-07-31 16:23:04 +0000126static Py_ssize_t numfreeblocks = 0;
Guido van Rossum58da9312007-11-10 23:39:45 +0000127static block *freeblocks[MAXFREEBLOCKS];
128
Tim Peters6f853562004-10-01 01:04:50 +0000129static block *
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700130newblock(void) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 block *b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 if (numfreeblocks) {
Raymond Hettinger59cf23a2013-02-07 00:57:19 -0500133 numfreeblocks--;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000134 return freeblocks[numfreeblocks];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000136 b = PyMem_Malloc(sizeof(block));
137 if (b != NULL) {
138 return b;
139 }
140 PyErr_NoMemory();
141 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000142}
143
Martin v. Löwis59683e82008-06-13 07:50:45 +0000144static void
Guido van Rossum58da9312007-11-10 23:39:45 +0000145freeblock(block *b)
146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 if (numfreeblocks < MAXFREEBLOCKS) {
148 freeblocks[numfreeblocks] = b;
149 numfreeblocks++;
150 } else {
151 PyMem_Free(b);
152 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000153}
154
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000155static PyObject *
156deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 dequeobject *deque;
159 block *b;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 /* create dequeobject structure */
162 deque = (dequeobject *)type->tp_alloc(type, 0);
163 if (deque == NULL)
164 return NULL;
Tim Peters1065f752004-10-01 01:03:29 +0000165
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700166 b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 if (b == NULL) {
168 Py_DECREF(deque);
169 return NULL;
170 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000171 MARK_END(b->leftlink);
172 MARK_END(b->rightlink);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 assert(BLOCKLEN >= 2);
Raymond Hettinger87e69122015-03-02 23:32:02 -0800175 Py_SIZE(deque) = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 deque->leftblock = b;
177 deque->rightblock = b;
178 deque->leftindex = CENTER + 1;
179 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 deque->state = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 deque->maxlen = -1;
Raymond Hettinger87e69122015-03-02 23:32:02 -0800182 deque->weakreflist = NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 return (PyObject *)deque;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000185}
186
187static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000188deque_pop(dequeobject *deque, PyObject *unused)
189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 PyObject *item;
191 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000192
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000193 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
195 return NULL;
196 }
197 item = deque->rightblock->data[deque->rightindex];
198 deque->rightindex--;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000199 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000201
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700202 if (deque->rightindex < 0) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700203 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 prevblock = deque->rightblock->leftlink;
205 assert(deque->leftblock != deque->rightblock);
206 freeblock(deque->rightblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000207 CHECK_NOT_END(prevblock);
208 MARK_END(prevblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 deque->rightblock = prevblock;
210 deque->rightindex = BLOCKLEN - 1;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700211 } else {
212 assert(deque->leftblock == deque->rightblock);
213 assert(deque->leftindex == deque->rightindex+1);
214 /* re-center instead of freeing a block */
215 deque->leftindex = CENTER + 1;
216 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 }
218 }
219 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000220}
221
222PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
223
224static PyObject *
225deque_popleft(dequeobject *deque, PyObject *unused)
226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 PyObject *item;
228 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000229
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000230 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
232 return NULL;
233 }
234 assert(deque->leftblock != NULL);
235 item = deque->leftblock->data[deque->leftindex];
236 deque->leftindex++;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000237 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 if (deque->leftindex == BLOCKLEN) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700241 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 assert(deque->leftblock != deque->rightblock);
243 prevblock = deque->leftblock->rightlink;
244 freeblock(deque->leftblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000245 CHECK_NOT_END(prevblock);
246 MARK_END(prevblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 deque->leftblock = prevblock;
248 deque->leftindex = 0;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700249 } else {
250 assert(deque->leftblock == deque->rightblock);
251 assert(deque->leftindex == deque->rightindex+1);
252 /* re-center instead of freeing a block */
253 deque->leftindex = CENTER + 1;
254 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 }
256 }
257 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000258}
259
260PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
261
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800262/* The deque's size limit is d.maxlen. The limit can be zero or positive.
263 * If there is no limit, then d.maxlen == -1.
264 *
Raymond Hettingera4b13d02015-10-15 08:05:31 -0700265 * After an item is added to a deque, we check to see if the size has
266 * grown past the limit. If it has, we get the size back down to the limit
267 * by popping an item off of the opposite end. The methods that can
268 * trigger this are append(), appendleft(), extend(), and extendleft().
Raymond Hettingerd96db092015-10-11 22:34:48 -0700269 *
270 * The macro to check whether a deque needs to be trimmed uses a single
271 * unsigned test that returns true whenever 0 <= maxlen < Py_SIZE(deque).
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800272 */
273
Raymond Hettingerd96db092015-10-11 22:34:48 -0700274#define NEEDS_TRIM(deque, maxlen) ((size_t)(maxlen) < (size_t)(Py_SIZE(deque)))
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800275
Raymond Hettinger66953f02018-07-10 04:17:40 -0700276static inline int
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800277deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000278{
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700279 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700280 block *b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 if (b == NULL)
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800282 return -1;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000283 b->leftlink = deque->rightblock;
284 CHECK_END(deque->rightblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 deque->rightblock->rightlink = b;
286 deque->rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000287 MARK_END(b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 deque->rightindex = -1;
289 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000290 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 deque->rightindex++;
292 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800293 if (NEEDS_TRIM(deque, maxlen)) {
Raymond Hettinger1286d142015-10-14 23:16:57 -0700294 PyObject *olditem = deque_popleft(deque, NULL);
295 Py_DECREF(olditem);
Raymond Hettinger0f43bb12015-10-20 00:03:33 -0700296 } else {
297 deque->state++;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700298 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800299 return 0;
300}
301
302static PyObject *
303deque_append(dequeobject *deque, PyObject *item)
304{
305 Py_INCREF(item);
306 if (deque_append_internal(deque, item, deque->maxlen) < 0)
307 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000309}
310
311PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
312
Raymond Hettinger66953f02018-07-10 04:17:40 -0700313static inline int
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800314deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 if (deque->leftindex == 0) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700317 block *b = newblock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 if (b == NULL)
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800319 return -1;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000320 b->rightlink = deque->leftblock;
321 CHECK_END(deque->leftblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 deque->leftblock->leftlink = b;
323 deque->leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000324 MARK_END(b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 deque->leftindex = BLOCKLEN;
326 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000327 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 deque->leftindex--;
329 deque->leftblock->data[deque->leftindex] = item;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700330 if (NEEDS_TRIM(deque, deque->maxlen)) {
Raymond Hettinger1286d142015-10-14 23:16:57 -0700331 PyObject *olditem = deque_pop(deque, NULL);
332 Py_DECREF(olditem);
Raymond Hettinger0f43bb12015-10-20 00:03:33 -0700333 } else {
334 deque->state++;
Raymond Hettingerd96db092015-10-11 22:34:48 -0700335 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800336 return 0;
337}
338
339static PyObject *
340deque_appendleft(dequeobject *deque, PyObject *item)
341{
342 Py_INCREF(item);
343 if (deque_appendleft_internal(deque, item, deque->maxlen) < 0)
344 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000346}
347
348PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
349
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700350static PyObject*
351finalize_iterator(PyObject *it)
352{
353 if (PyErr_Occurred()) {
354 if (PyErr_ExceptionMatches(PyExc_StopIteration))
355 PyErr_Clear();
356 else {
357 Py_DECREF(it);
358 return NULL;
359 }
360 }
361 Py_DECREF(it);
362 Py_RETURN_NONE;
363}
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365/* Run an iterator to exhaustion. Shortcut for
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000366 the extend/extendleft methods when maxlen == 0. */
367static PyObject*
368consume_iterator(PyObject *it)
369{
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700370 PyObject *(*iternext)(PyObject *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 PyObject *item;
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000372
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700373 iternext = *Py_TYPE(it)->tp_iternext;
374 while ((item = iternext(it)) != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 Py_DECREF(item);
376 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700377 return finalize_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000378}
379
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000380static PyObject *
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000381deque_extend(dequeobject *deque, PyObject *iterable)
382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 PyObject *it, *item;
Raymond Hettinger7a845522015-09-26 01:30:51 -0700384 PyObject *(*iternext)(PyObject *);
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700385 Py_ssize_t maxlen = deque->maxlen;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 /* Handle case where id(deque) == id(iterable) */
388 if ((PyObject *)deque == iterable) {
389 PyObject *result;
390 PyObject *s = PySequence_List(iterable);
391 if (s == NULL)
392 return NULL;
393 result = deque_extend(deque, s);
394 Py_DECREF(s);
395 return result;
396 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000397
Raymond Hettingerd79d5b12016-03-04 09:55:07 -0800398 it = PyObject_GetIter(iterable);
399 if (it == NULL)
400 return NULL;
401
402 if (maxlen == 0)
403 return consume_iterator(it);
404
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700405 /* Space saving heuristic. Start filling from the left */
406 if (Py_SIZE(deque) == 0) {
407 assert(deque->leftblock == deque->rightblock);
408 assert(deque->leftindex == deque->rightindex+1);
409 deque->leftindex = 1;
410 deque->rightindex = 0;
411 }
412
Raymond Hettinger7a845522015-09-26 01:30:51 -0700413 iternext = *Py_TYPE(it)->tp_iternext;
414 while ((item = iternext(it)) != NULL) {
Raymond Hettinger66953f02018-07-10 04:17:40 -0700415 if (deque_append_internal(deque, item, maxlen) == -1) {
416 Py_DECREF(item);
417 Py_DECREF(it);
418 return NULL;
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700419 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700421 return finalize_iterator(it);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000422}
423
Tim Peters1065f752004-10-01 01:03:29 +0000424PyDoc_STRVAR(extend_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000425"Extend the right side of the deque with elements from the iterable");
426
427static PyObject *
428deque_extendleft(dequeobject *deque, PyObject *iterable)
429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 PyObject *it, *item;
Raymond Hettinger7a845522015-09-26 01:30:51 -0700431 PyObject *(*iternext)(PyObject *);
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700432 Py_ssize_t maxlen = deque->maxlen;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 /* Handle case where id(deque) == id(iterable) */
435 if ((PyObject *)deque == iterable) {
436 PyObject *result;
437 PyObject *s = PySequence_List(iterable);
438 if (s == NULL)
439 return NULL;
440 result = deque_extendleft(deque, s);
441 Py_DECREF(s);
442 return result;
443 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000444
Raymond Hettingerd79d5b12016-03-04 09:55:07 -0800445 it = PyObject_GetIter(iterable);
446 if (it == NULL)
447 return NULL;
448
449 if (maxlen == 0)
450 return consume_iterator(it);
451
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700452 /* Space saving heuristic. Start filling from the right */
453 if (Py_SIZE(deque) == 0) {
454 assert(deque->leftblock == deque->rightblock);
455 assert(deque->leftindex == deque->rightindex+1);
456 deque->leftindex = BLOCKLEN - 1;
457 deque->rightindex = BLOCKLEN - 2;
458 }
459
Raymond Hettinger7a845522015-09-26 01:30:51 -0700460 iternext = *Py_TYPE(it)->tp_iternext;
461 while ((item = iternext(it)) != NULL) {
Raymond Hettinger66953f02018-07-10 04:17:40 -0700462 if (deque_appendleft_internal(deque, item, maxlen) == -1) {
463 Py_DECREF(item);
464 Py_DECREF(it);
465 return NULL;
Raymond Hettinger6b1e1132015-10-11 09:43:50 -0700466 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 }
Raymond Hettingerfd265f42015-10-02 23:17:33 -0700468 return finalize_iterator(it);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000469}
470
Tim Peters1065f752004-10-01 01:03:29 +0000471PyDoc_STRVAR(extendleft_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000472"Extend the left side of the deque with elements from the iterable");
473
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000474static PyObject *
475deque_inplace_concat(dequeobject *deque, PyObject *other)
476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 PyObject *result;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 result = deque_extend(deque, other);
480 if (result == NULL)
481 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 Py_INCREF(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700483 Py_DECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 return (PyObject *)deque;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000485}
486
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700487static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530488deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored))
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700489{
Oren Milman24bd50b2018-09-11 21:46:55 +0300490 PyObject *result;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700491 dequeobject *old_deque = (dequeobject *)deque;
492 if (Py_TYPE(deque) == &deque_type) {
493 dequeobject *new_deque;
494 PyObject *rv;
495
496 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
497 if (new_deque == NULL)
498 return NULL;
499 new_deque->maxlen = old_deque->maxlen;
500 /* Fast path for the deque_repeat() common case where len(deque) == 1 */
Raymond Hettinger0443ac22015-10-05 22:52:37 -0400501 if (Py_SIZE(deque) == 1) {
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700502 PyObject *item = old_deque->leftblock->data[old_deque->leftindex];
503 rv = deque_append(new_deque, item);
504 } else {
505 rv = deque_extend(new_deque, deque);
506 }
507 if (rv != NULL) {
508 Py_DECREF(rv);
509 return (PyObject *)new_deque;
510 }
511 Py_DECREF(new_deque);
512 return NULL;
513 }
514 if (old_deque->maxlen < 0)
Oren Milman24bd50b2018-09-11 21:46:55 +0300515 result = PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)),
516 deque, NULL);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700517 else
Oren Milman24bd50b2018-09-11 21:46:55 +0300518 result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
519 deque, old_deque->maxlen, NULL);
520 if (result != NULL && !PyObject_TypeCheck(result, &deque_type)) {
521 PyErr_Format(PyExc_TypeError,
522 "%.200s() must return a deque, not %.200s",
523 Py_TYPE(deque)->tp_name, Py_TYPE(result)->tp_name);
524 Py_DECREF(result);
525 return NULL;
526 }
527 return result;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700528}
529
530PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700531
532static PyObject *
533deque_concat(dequeobject *deque, PyObject *other)
534{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400535 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700536 int rv;
537
538 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
539 if (rv <= 0) {
540 if (rv == 0) {
541 PyErr_Format(PyExc_TypeError,
542 "can only concatenate deque (not \"%.200s\") to deque",
543 other->ob_type->tp_name);
544 }
545 return NULL;
546 }
547
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530548 new_deque = deque_copy((PyObject *)deque, NULL);
Raymond Hettinger41290a62015-03-31 08:12:23 -0700549 if (new_deque == NULL)
550 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400551 result = deque_extend((dequeobject *)new_deque, other);
552 if (result == NULL) {
553 Py_DECREF(new_deque);
554 return NULL;
555 }
556 Py_DECREF(result);
557 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700558}
559
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300560static int
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700561deque_clear(dequeobject *deque)
562{
563 block *b;
564 block *prevblock;
565 block *leftblock;
566 Py_ssize_t leftindex;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800567 Py_ssize_t n, m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700568 PyObject *item;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800569 PyObject **itemptr, **limit;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700570
Raymond Hettinger38031142015-09-29 22:45:05 -0700571 if (Py_SIZE(deque) == 0)
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300572 return 0;
Raymond Hettinger38031142015-09-29 22:45:05 -0700573
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700574 /* During the process of clearing a deque, decrefs can cause the
575 deque to mutate. To avoid fatal confusion, we have to make the
576 deque empty before clearing the blocks and never refer to
577 anything via deque->ref while clearing. (This is the same
578 technique used for clearing lists, sets, and dicts.)
579
580 Making the deque empty requires allocating a new empty block. In
581 the unlikely event that memory is full, we fall back to an
582 alternate method that doesn't require a new block. Repeating
583 pops in a while-loop is slower, possibly re-entrant (and a clever
584 adversary could cause it to never terminate).
585 */
586
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700587 b = newblock();
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700588 if (b == NULL) {
589 PyErr_Clear();
590 goto alternate_method;
591 }
592
593 /* Remember the old size, leftblock, and leftindex */
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800594 n = Py_SIZE(deque);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700595 leftblock = deque->leftblock;
596 leftindex = deque->leftindex;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700597
598 /* Set the deque to be empty using the newly allocated block */
599 MARK_END(b->leftlink);
600 MARK_END(b->rightlink);
601 Py_SIZE(deque) = 0;
602 deque->leftblock = b;
603 deque->rightblock = b;
604 deque->leftindex = CENTER + 1;
605 deque->rightindex = CENTER;
606 deque->state++;
607
608 /* Now the old size, leftblock, and leftindex are disconnected from
609 the empty deque and we can use them to decref the pointers.
610 */
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800611 m = (BLOCKLEN - leftindex > n) ? n : BLOCKLEN - leftindex;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800612 itemptr = &leftblock->data[leftindex];
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800613 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800614 n -= m;
615 while (1) {
616 if (itemptr == limit) {
617 if (n == 0)
618 break;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700619 CHECK_NOT_END(leftblock->rightlink);
620 prevblock = leftblock;
621 leftblock = leftblock->rightlink;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800622 m = (n > BLOCKLEN) ? BLOCKLEN : n;
Raymond Hettinger589106b2016-03-02 00:06:21 -0800623 itemptr = leftblock->data;
Raymond Hettinger6f86a332016-03-02 00:30:58 -0800624 limit = itemptr + m;
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800625 n -= m;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700626 freeblock(prevblock);
627 }
Raymond Hettingerd84ec222016-01-24 09:12:06 -0800628 item = *(itemptr++);
629 Py_DECREF(item);
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700630 }
631 CHECK_END(leftblock->rightlink);
632 freeblock(leftblock);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300633 return 0;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700634
635 alternate_method:
636 while (Py_SIZE(deque)) {
637 item = deque_pop(deque, NULL);
638 assert (item != NULL);
639 Py_DECREF(item);
640 }
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300641 return 0;
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700642}
643
644static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530645deque_clearmethod(dequeobject *deque, PyObject *Py_UNUSED(ignored))
Raymond Hettinger8299e9b2015-09-26 21:31:23 -0700646{
647 deque_clear(deque);
648 Py_RETURN_NONE;
649}
650
651PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
Raymond Hettinger41290a62015-03-31 08:12:23 -0700652
653static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700654deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
655{
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700656 Py_ssize_t i, m, size;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700657 PyObject *seq;
658 PyObject *rv;
659
660 size = Py_SIZE(deque);
661 if (size == 0 || n == 1) {
662 Py_INCREF(deque);
663 return (PyObject *)deque;
664 }
665
666 if (n <= 0) {
667 deque_clear(deque);
668 Py_INCREF(deque);
669 return (PyObject *)deque;
670 }
671
Raymond Hettinger41290a62015-03-31 08:12:23 -0700672 if (size == 1) {
673 /* common case, repeating a single element */
674 PyObject *item = deque->leftblock->data[deque->leftindex];
675
Raymond Hettingera7f630092015-10-10 23:56:02 -0400676 if (deque->maxlen >= 0 && n > deque->maxlen)
Raymond Hettinger41290a62015-03-31 08:12:23 -0700677 n = deque->maxlen;
678
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400679 deque->state++;
Raymond Hettingerad262252015-09-14 01:03:04 -0400680 for (i = 0 ; i < n-1 ; ) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400681 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700682 block *b = newblock();
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400683 if (b == NULL) {
684 Py_SIZE(deque) += i;
685 return NULL;
686 }
687 b->leftlink = deque->rightblock;
688 CHECK_END(deque->rightblock->rightlink);
689 deque->rightblock->rightlink = b;
690 deque->rightblock = b;
691 MARK_END(b->rightlink);
692 deque->rightindex = -1;
693 }
Raymond Hettingerc22eee62015-09-26 02:14:50 -0700694 m = n - 1 - i;
695 if (m > BLOCKLEN - 1 - deque->rightindex)
696 m = BLOCKLEN - 1 - deque->rightindex;
697 i += m;
698 while (m--) {
Raymond Hettingerad262252015-09-14 01:03:04 -0400699 deque->rightindex++;
700 Py_INCREF(item);
701 deque->rightblock->data[deque->rightindex] = item;
702 }
Raymond Hettinger41290a62015-03-31 08:12:23 -0700703 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400704 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700705 Py_INCREF(deque);
706 return (PyObject *)deque;
707 }
708
Raymond Hettinger20151f52015-10-16 22:47:29 -0700709 if ((size_t)size > PY_SSIZE_T_MAX / (size_t)n) {
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400710 return PyErr_NoMemory();
711 }
712
Raymond Hettinger41290a62015-03-31 08:12:23 -0700713 seq = PySequence_List((PyObject *)deque);
714 if (seq == NULL)
715 return seq;
716
Louie Lu357bad72017-02-24 11:59:49 +0800717 /* Reduce the number of repetitions when maxlen would be exceeded */
718 if (deque->maxlen >= 0 && n * size > deque->maxlen)
719 n = (deque->maxlen + size - 1) / size;
720
Raymond Hettinger41290a62015-03-31 08:12:23 -0700721 for (i = 0 ; i < n-1 ; i++) {
722 rv = deque_extend(deque, seq);
723 if (rv == NULL) {
724 Py_DECREF(seq);
725 return NULL;
726 }
727 Py_DECREF(rv);
728 }
729 Py_INCREF(deque);
730 Py_DECREF(seq);
731 return (PyObject *)deque;
732}
733
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400734static PyObject *
735deque_repeat(dequeobject *deque, Py_ssize_t n)
736{
737 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400738 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400739
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530740 new_deque = (dequeobject *)deque_copy((PyObject *) deque, NULL);
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400741 if (new_deque == NULL)
742 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400743 rv = deque_inplace_repeat(new_deque, n);
744 Py_DECREF(new_deque);
745 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400746}
747
Raymond Hettinger54023152014-04-23 00:58:48 -0700748/* The rotate() method is part of the public API and is used internally
749as a primitive for other methods.
750
751Rotation by 1 or -1 is a common case, so any optimizations for high
752volume rotations should take care not to penalize the common case.
753
754Conceptually, a rotate by one is equivalent to a pop on one side and an
755append on the other. However, a pop/append pair is unnecessarily slow
Martin Panterd2ad5712015-11-02 04:20:33 +0000756because it requires an incref/decref pair for an object located randomly
Raymond Hettinger54023152014-04-23 00:58:48 -0700757in memory. It is better to just move the object pointer from one block
758to the next without changing the reference count.
759
760When moving batches of pointers, it is tempting to use memcpy() but that
761proved to be slower than a simple loop for a variety of reasons.
762Memcpy() cannot know in advance that we're copying pointers instead of
763bytes, that the source and destination are pointer aligned and
764non-overlapping, that moving just one pointer is a common case, that we
765never need to move more than BLOCKLEN pointers, and that at least one
766pointer is always moved.
767
768For high volume rotations, newblock() and freeblock() are never called
769more than once. Previously emptied blocks are immediately reused as a
770destination block. If a block is left-over at the end, it is freed.
771*/
772
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000773static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000774_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000775{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700776 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700777 block *leftblock = deque->leftblock;
778 block *rightblock = deque->rightblock;
779 Py_ssize_t leftindex = deque->leftindex;
780 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000781 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700782 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000783
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800784 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 return 0;
786 if (n > halflen || n < -halflen) {
787 n %= len;
788 if (n > halflen)
789 n -= len;
790 else if (n < -halflen)
791 n += len;
792 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500793 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500794 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800795
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800796 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500797 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700798 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700799 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700800 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700801 if (b == NULL)
802 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700803 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000804 b->rightlink = leftblock;
805 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700806 leftblock->leftlink = b;
807 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000808 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700809 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700810 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800811 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700812 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700813 {
814 PyObject **src, **dest;
815 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800816
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700817 if (m > rightindex + 1)
818 m = rightindex + 1;
819 if (m > leftindex)
820 m = leftindex;
821 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700822 rightindex -= m;
823 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800824 src = &rightblock->data[rightindex + 1];
825 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700826 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700827 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800828 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700829 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700830 }
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700831 if (rightindex < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700832 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700833 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700834 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700835 CHECK_NOT_END(rightblock->leftlink);
836 rightblock = rightblock->leftlink;
837 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700838 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800839 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800840 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500841 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700842 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700843 if (b == NULL) {
Raymond Hettingerdb41fd42015-10-22 22:48:16 -0700844 b = newblock();
Raymond Hettinger3959af92013-07-13 02:34:08 -0700845 if (b == NULL)
846 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700847 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000848 b->leftlink = rightblock;
849 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700850 rightblock->rightlink = b;
851 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000852 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700853 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700854 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800855 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700856 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700857 {
858 PyObject **src, **dest;
859 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800860
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700861 if (m > BLOCKLEN - leftindex)
862 m = BLOCKLEN - leftindex;
863 if (m > BLOCKLEN - 1 - rightindex)
864 m = BLOCKLEN - 1 - rightindex;
865 assert (m > 0 && m <= len);
866 src = &leftblock->data[leftindex];
867 dest = &rightblock->data[rightindex + 1];
868 leftindex += m;
869 rightindex += m;
870 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700871 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700872 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700873 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700874 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700875 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700876 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700877 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700878 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700879 CHECK_NOT_END(leftblock->rightlink);
880 leftblock = leftblock->rightlink;
881 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700882 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800883 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700885 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700886done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700887 if (b != NULL)
888 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700889 deque->leftblock = leftblock;
890 deque->rightblock = rightblock;
891 deque->leftindex = leftindex;
892 deque->rightindex = rightindex;
893
894 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000895}
896
897static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200898deque_rotate(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000901
Victor Stinnerdd407d52017-02-06 16:06:49 +0100902 if (!_PyArg_ParseStack(args, nargs, "|n:rotate", &n)) {
903 return NULL;
904 }
905
Raymond Hettinger6921c132015-03-21 02:03:40 -0700906 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 Py_RETURN_NONE;
908 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000909}
910
Tim Peters1065f752004-10-01 01:03:29 +0000911PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000912"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000913
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000914static PyObject *
915deque_reverse(dequeobject *deque, PyObject *unused)
916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 block *leftblock = deque->leftblock;
918 block *rightblock = deque->rightblock;
919 Py_ssize_t leftindex = deque->leftindex;
920 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400921 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000923
Raymond Hettingere1b02872017-09-04 16:07:06 -0700924 while (--n >= 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 /* Validate that pointers haven't met in the middle */
926 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000927 CHECK_NOT_END(leftblock);
928 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 /* Swap */
931 tmp = leftblock->data[leftindex];
932 leftblock->data[leftindex] = rightblock->data[rightindex];
933 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 /* Advance left block/index pair */
936 leftindex++;
937 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 leftblock = leftblock->rightlink;
939 leftindex = 0;
940 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 /* Step backwards with the right block/index pair */
943 rightindex--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700944 if (rightindex < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 rightblock = rightblock->leftlink;
946 rightindex = BLOCKLEN - 1;
947 }
948 }
949 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000950}
951
952PyDoc_STRVAR(reverse_doc,
953"D.reverse() -- reverse *IN PLACE*");
954
Raymond Hettinger44459de2010-04-03 23:20:46 +0000955static PyObject *
956deque_count(dequeobject *deque, PyObject *v)
957{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000958 block *b = deque->leftblock;
959 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000960 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800962 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000965
Raymond Hettingere1b02872017-09-04 16:07:06 -0700966 while (--n >= 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000967 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000968 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700970 if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 return NULL;
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700972 count += cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 if (start_state != deque->state) {
975 PyErr_SetString(PyExc_RuntimeError,
976 "deque mutated during iteration");
977 return NULL;
978 }
Raymond Hettinger44459de2010-04-03 23:20:46 +0000979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000981 index++;
982 if (index == BLOCKLEN) {
983 b = b->rightlink;
984 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 }
986 }
987 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +0000988}
989
990PyDoc_STRVAR(count_doc,
991"D.count(value) -> integer -- return number of occurrences of value");
992
Raymond Hettinger39dadf72015-03-20 16:38:56 -0700993static int
994deque_contains(dequeobject *deque, PyObject *v)
995{
996 block *b = deque->leftblock;
997 Py_ssize_t index = deque->leftindex;
998 Py_ssize_t n = Py_SIZE(deque);
Raymond Hettinger39dadf72015-03-20 16:38:56 -0700999 size_t start_state = deque->state;
1000 PyObject *item;
1001 int cmp;
1002
Raymond Hettingere1b02872017-09-04 16:07:06 -07001003 while (--n >= 0) {
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001004 CHECK_NOT_END(b);
1005 item = b->data[index];
1006 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1007 if (cmp) {
1008 return cmp;
1009 }
1010 if (start_state != deque->state) {
1011 PyErr_SetString(PyExc_RuntimeError,
1012 "deque mutated during iteration");
1013 return -1;
1014 }
1015 index++;
1016 if (index == BLOCKLEN) {
1017 b = b->rightlink;
1018 index = 0;
1019 }
1020 }
1021 return 0;
1022}
1023
Martin v. Löwis18e16552006-02-15 17:27:45 +00001024static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001025deque_len(dequeobject *deque)
1026{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001027 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001028}
1029
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001030static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001031deque_index(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001032{
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001033 Py_ssize_t i, n, start=0, stop=Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001034 PyObject *v, *item;
1035 block *b = deque->leftblock;
1036 Py_ssize_t index = deque->leftindex;
1037 size_t start_state = deque->state;
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001038 int cmp;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001039
Victor Stinnerdd407d52017-02-06 16:06:49 +01001040 if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index", &v,
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03001041 _PyEval_SliceIndexNotNone, &start,
1042 _PyEval_SliceIndexNotNone, &stop)) {
Victor Stinnerdd407d52017-02-06 16:06:49 +01001043 return NULL;
1044 }
1045
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001046 if (start < 0) {
1047 start += Py_SIZE(deque);
1048 if (start < 0)
1049 start = 0;
1050 }
1051 if (stop < 0) {
1052 stop += Py_SIZE(deque);
1053 if (stop < 0)
1054 stop = 0;
1055 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -07001056 if (stop > Py_SIZE(deque))
1057 stop = Py_SIZE(deque);
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001058 if (start > stop)
1059 start = stop;
1060 assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001061
Raymond Hettingerb46ad542018-09-21 01:46:41 -07001062 for (i=0 ; i < start - BLOCKLEN ; i += BLOCKLEN) {
1063 b = b->rightlink;
1064 }
1065 for ( ; i < start ; i++) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001066 index++;
1067 if (index == BLOCKLEN) {
1068 b = b->rightlink;
1069 index = 0;
1070 }
1071 }
1072
Raymond Hettingere1b02872017-09-04 16:07:06 -07001073 n = stop - i;
1074 while (--n >= 0) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001075 CHECK_NOT_END(b);
1076 item = b->data[index];
1077 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1078 if (cmp > 0)
Raymond Hettingere1b02872017-09-04 16:07:06 -07001079 return PyLong_FromSsize_t(stop - n - 1);
Raymond Hettingerdf8f5b52015-11-02 07:27:40 -05001080 if (cmp < 0)
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001081 return NULL;
1082 if (start_state != deque->state) {
1083 PyErr_SetString(PyExc_RuntimeError,
1084 "deque mutated during iteration");
1085 return NULL;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001086 }
1087 index++;
1088 if (index == BLOCKLEN) {
1089 b = b->rightlink;
1090 index = 0;
1091 }
1092 }
1093 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
1094 return NULL;
1095}
1096
1097PyDoc_STRVAR(index_doc,
1098"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
1099"Raises ValueError if the value is not present.");
1100
Raymond Hettinger551350a2015-03-24 00:19:53 -07001101/* insert(), remove(), and delitem() are implemented in terms of
1102 rotate() for simplicity and reasonable performance near the end
1103 points. If for some reason these methods become popular, it is not
1104 hard to re-implement this using direct data movement (similar to
1105 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -07001106 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -07001107*/
1108
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001109static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001110deque_insert(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001111{
1112 Py_ssize_t index;
1113 Py_ssize_t n = Py_SIZE(deque);
1114 PyObject *value;
1115 PyObject *rv;
1116
Victor Stinnerdd407d52017-02-06 16:06:49 +01001117 if (!_PyArg_ParseStack(args, nargs, "nO:insert", &index, &value)) {
1118 return NULL;
1119 }
1120
Raymond Hettinger37434322016-01-26 21:44:16 -08001121 if (deque->maxlen == Py_SIZE(deque)) {
Raymond Hettingera6389712016-02-01 21:21:19 -08001122 PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1123 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001124 }
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001125 if (index >= n)
1126 return deque_append(deque, value);
1127 if (index <= -n || index == 0)
1128 return deque_appendleft(deque, value);
1129 if (_deque_rotate(deque, -index))
1130 return NULL;
1131 if (index < 0)
1132 rv = deque_append(deque, value);
1133 else
1134 rv = deque_appendleft(deque, value);
1135 if (rv == NULL)
1136 return NULL;
1137 Py_DECREF(rv);
1138 if (_deque_rotate(deque, index))
1139 return NULL;
1140 Py_RETURN_NONE;
1141}
1142
1143PyDoc_STRVAR(insert_doc,
1144"D.insert(index, object) -- insert object before index");
1145
1146static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001147deque_remove(dequeobject *deque, PyObject *value)
1148{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001149 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 for (i=0 ; i<n ; i++) {
1152 PyObject *item = deque->leftblock->data[deque->leftindex];
1153 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001154
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001155 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 PyErr_SetString(PyExc_IndexError,
1157 "deque mutated during remove().");
1158 return NULL;
1159 }
1160 if (cmp > 0) {
1161 PyObject *tgt = deque_popleft(deque, NULL);
1162 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001163 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001165 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 Py_RETURN_NONE;
1167 }
1168 else if (cmp < 0) {
1169 _deque_rotate(deque, i);
1170 return NULL;
1171 }
1172 _deque_rotate(deque, -1);
1173 }
1174 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1175 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001176}
1177
1178PyDoc_STRVAR(remove_doc,
1179"D.remove(value) -- remove first occurrence of value.");
1180
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001181static int
1182valid_index(Py_ssize_t i, Py_ssize_t limit)
1183{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001184 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001185 to check whether i is in the range: 0 <= i < limit */
1186 return (size_t) i < (size_t) limit;
1187}
1188
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001189static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001190deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 block *b;
1193 PyObject *item;
1194 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001195
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001196 if (!valid_index(i, Py_SIZE(deque))) {
1197 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 return NULL;
1199 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 if (i == 0) {
1202 i = deque->leftindex;
1203 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001204 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 i = deque->rightindex;
1206 b = deque->rightblock;
1207 } else {
1208 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001209 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1210 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001211 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 b = deque->leftblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001213 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 b = b->rightlink;
1215 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001216 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001217 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001218 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 b = deque->rightblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001220 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 b = b->leftlink;
1222 }
1223 }
1224 item = b->data[i];
1225 Py_INCREF(item);
1226 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001227}
1228
1229static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001230deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001233 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001234
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001235 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001236 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001239 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 assert (item != NULL);
1241 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001242 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001243}
1244
1245static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001246deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001247{
Raymond Hettinger38418662016-02-08 20:34:49 -08001248 PyObject *old_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001250 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001251
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001252 if (!valid_index(i, len)) {
1253 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 return -1;
1255 }
1256 if (v == NULL)
1257 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001260 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1261 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 if (index <= halflen) {
1263 b = deque->leftblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001264 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 b = b->rightlink;
1266 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001267 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001268 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001269 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 b = deque->rightblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001271 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 b = b->leftlink;
1273 }
1274 Py_INCREF(v);
Raymond Hettinger38418662016-02-08 20:34:49 -08001275 old_value = b->data[i];
1276 b->data[i] = v;
1277 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001279}
1280
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001281static void
1282deque_dealloc(dequeobject *deque)
1283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 PyObject_GC_UnTrack(deque);
1285 if (deque->weakreflist != NULL)
1286 PyObject_ClearWeakRefs((PyObject *) deque);
1287 if (deque->leftblock != NULL) {
1288 deque_clear(deque);
1289 assert(deque->leftblock != NULL);
1290 freeblock(deque->leftblock);
1291 }
1292 deque->leftblock = NULL;
1293 deque->rightblock = NULL;
1294 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001295}
1296
1297static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001298deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 block *b;
1301 PyObject *item;
1302 Py_ssize_t index;
1303 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger1286d142015-10-14 23:16:57 -07001304 Py_ssize_t indexhigh;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001305
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001306 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1307 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 item = b->data[index];
1309 Py_VISIT(item);
1310 }
1311 indexlo = 0;
1312 }
Raymond Hettinger1286d142015-10-14 23:16:57 -07001313 indexhigh = deque->rightindex;
1314 for (index = indexlo; index <= indexhigh; index++) {
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001315 item = b->data[index];
1316 Py_VISIT(item);
1317 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001319}
1320
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001321static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02001322deque_reduce(dequeobject *deque, PyObject *Py_UNUSED(ignored))
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001323{
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001324 PyObject *dict, *it;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001325 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001326
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001327 if (_PyObject_LookupAttrId((PyObject *)deque, &PyId___dict__, &dict) < 0) {
1328 return NULL;
1329 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001330 if (dict == NULL) {
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001331 dict = Py_None;
1332 Py_INCREF(dict);
1333 }
1334
1335 it = PyObject_GetIter((PyObject *)deque);
1336 if (it == NULL) {
1337 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 return NULL;
1339 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001340
1341 if (deque->maxlen < 0) {
1342 return Py_BuildValue("O()NN", Py_TYPE(deque), dict, it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001344 else {
1345 return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, dict, it);
1346 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001347}
1348
1349PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1350
1351static PyObject *
1352deque_repr(PyObject *deque)
1353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 PyObject *aslist, *result;
1355 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 i = Py_ReprEnter(deque);
1358 if (i != 0) {
1359 if (i < 0)
1360 return NULL;
1361 return PyUnicode_FromString("[...]");
1362 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 aslist = PySequence_List(deque);
1365 if (aslist == NULL) {
1366 Py_ReprLeave(deque);
1367 return NULL;
1368 }
Raymond Hettingera7f630092015-10-10 23:56:02 -04001369 if (((dequeobject *)deque)->maxlen >= 0)
Serhiy Storchakab3a77962017-09-21 14:24:13 +03001370 result = PyUnicode_FromFormat("%s(%R, maxlen=%zd)",
1371 _PyType_Name(Py_TYPE(deque)), aslist,
1372 ((dequeobject *)deque)->maxlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 else
Serhiy Storchakab3a77962017-09-21 14:24:13 +03001374 result = PyUnicode_FromFormat("%s(%R)",
1375 _PyType_Name(Py_TYPE(deque)), aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001377 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001379}
1380
Raymond Hettinger738ec902004-02-29 02:15:56 +00001381static PyObject *
1382deque_richcompare(PyObject *v, PyObject *w, int op)
1383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 PyObject *it1=NULL, *it2=NULL, *x, *y;
1385 Py_ssize_t vs, ws;
1386 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 if (!PyObject_TypeCheck(v, &deque_type) ||
1389 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001390 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001394 vs = Py_SIZE((dequeobject *)v);
1395 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 if (op == Py_EQ) {
1397 if (v == w)
1398 Py_RETURN_TRUE;
1399 if (vs != ws)
1400 Py_RETURN_FALSE;
1401 }
1402 if (op == Py_NE) {
1403 if (v == w)
1404 Py_RETURN_FALSE;
1405 if (vs != ws)
1406 Py_RETURN_TRUE;
1407 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 /* Search for the first index where items are different */
1410 it1 = PyObject_GetIter(v);
1411 if (it1 == NULL)
1412 goto done;
1413 it2 = PyObject_GetIter(w);
1414 if (it2 == NULL)
1415 goto done;
1416 for (;;) {
1417 x = PyIter_Next(it1);
1418 if (x == NULL && PyErr_Occurred())
1419 goto done;
1420 y = PyIter_Next(it2);
1421 if (x == NULL || y == NULL)
1422 break;
1423 b = PyObject_RichCompareBool(x, y, Py_EQ);
1424 if (b == 0) {
1425 cmp = PyObject_RichCompareBool(x, y, op);
1426 Py_DECREF(x);
1427 Py_DECREF(y);
1428 goto done;
1429 }
1430 Py_DECREF(x);
1431 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001432 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 goto done;
1434 }
1435 /* We reached the end of one deque or both */
1436 Py_XDECREF(x);
1437 Py_XDECREF(y);
1438 if (PyErr_Occurred())
1439 goto done;
1440 switch (op) {
1441 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1442 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1443 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1444 case Py_NE: cmp = x != y; break; /* if one deque continues */
1445 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1446 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1447 }
Tim Peters1065f752004-10-01 01:03:29 +00001448
Raymond Hettinger738ec902004-02-29 02:15:56 +00001449done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 Py_XDECREF(it1);
1451 Py_XDECREF(it2);
1452 if (cmp == 1)
1453 Py_RETURN_TRUE;
1454 if (cmp == 0)
1455 Py_RETURN_FALSE;
1456 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001457}
1458
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001459static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001460deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 PyObject *iterable = NULL;
1463 PyObject *maxlenobj = NULL;
1464 Py_ssize_t maxlen = -1;
1465 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001466
Raymond Hettinger05f1b932019-01-31 22:13:43 -08001467 if (kwdargs == NULL && PyTuple_GET_SIZE(args) <= 2) {
1468 if (PyTuple_GET_SIZE(args) > 0) {
1469 iterable = PyTuple_GET_ITEM(args, 0);
1470 }
1471 if (PyTuple_GET_SIZE(args) > 1) {
1472 maxlenobj = PyTuple_GET_ITEM(args, 1);
1473 }
Raymond Hettinger0d309402015-09-30 23:15:02 -07001474 } else {
1475 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist,
1476 &iterable, &maxlenobj))
1477 return -1;
1478 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 if (maxlenobj != NULL && maxlenobj != Py_None) {
1480 maxlen = PyLong_AsSsize_t(maxlenobj);
1481 if (maxlen == -1 && PyErr_Occurred())
1482 return -1;
1483 if (maxlen < 0) {
1484 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1485 return -1;
1486 }
1487 }
1488 deque->maxlen = maxlen;
Raymond Hettinger0d309402015-09-30 23:15:02 -07001489 if (Py_SIZE(deque) > 0)
1490 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 if (iterable != NULL) {
1492 PyObject *rv = deque_extend(deque, iterable);
1493 if (rv == NULL)
1494 return -1;
1495 Py_DECREF(rv);
1496 }
1497 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001498}
1499
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001500static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001501deque_sizeof(dequeobject *deque, void *unused)
1502{
1503 Py_ssize_t res;
1504 Py_ssize_t blocks;
1505
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001506 res = _PyObject_SIZE(Py_TYPE(deque));
Raymond Hettingerbc003412015-10-14 23:33:23 -07001507 blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001508 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001509 (blocks - 1) * BLOCKLEN + deque->rightindex);
1510 res += blocks * sizeof(block);
1511 return PyLong_FromSsize_t(res);
1512}
1513
1514PyDoc_STRVAR(sizeof_doc,
1515"D.__sizeof__() -- size of D in memory, in bytes");
1516
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001517static int
1518deque_bool(dequeobject *deque)
1519{
1520 return Py_SIZE(deque) != 0;
1521}
1522
Jesus Cea16e2fca2012-08-03 14:49:42 +02001523static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02001524deque_get_maxlen(dequeobject *deque, void *Py_UNUSED(ignored))
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001525{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001526 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 Py_RETURN_NONE;
1528 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001529}
1530
Raymond Hettinger41290a62015-03-31 08:12:23 -07001531
1532/* deque object ********************************************************/
1533
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001534static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1536 "maximum size of a deque or None if unbounded"},
1537 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001538};
1539
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001540static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001542 (binaryfunc)deque_concat, /* sq_concat */
1543 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 (ssizeargfunc)deque_item, /* sq_item */
1545 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001546 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001548 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001549 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001550 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001551};
1552
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001553static PyNumberMethods deque_as_number = {
1554 0, /* nb_add */
1555 0, /* nb_subtract */
1556 0, /* nb_multiply */
1557 0, /* nb_remainder */
1558 0, /* nb_divmod */
1559 0, /* nb_power */
1560 0, /* nb_negative */
1561 0, /* nb_positive */
1562 0, /* nb_absolute */
1563 (inquiry)deque_bool, /* nb_bool */
1564 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001565 };
1566
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001567static PyObject *deque_iter(dequeobject *deque);
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301568static PyObject *deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored));
Tim Peters1065f752004-10-01 01:03:29 +00001569PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001571
1572static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 {"append", (PyCFunction)deque_append,
1574 METH_O, append_doc},
1575 {"appendleft", (PyCFunction)deque_appendleft,
1576 METH_O, appendleft_doc},
1577 {"clear", (PyCFunction)deque_clearmethod,
1578 METH_NOARGS, clear_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301579 {"__copy__", deque_copy,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 METH_NOARGS, copy_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301581 {"copy", deque_copy,
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001582 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001584 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 {"extend", (PyCFunction)deque_extend,
1586 METH_O, extend_doc},
1587 {"extendleft", (PyCFunction)deque_extendleft,
1588 METH_O, extendleft_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001589 {"index", (PyCFunction)(void(*)(void))deque_index,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001590 METH_FASTCALL, index_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001591 {"insert", (PyCFunction)(void(*)(void))deque_insert,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001592 METH_FASTCALL, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 {"pop", (PyCFunction)deque_pop,
1594 METH_NOARGS, pop_doc},
1595 {"popleft", (PyCFunction)deque_popleft,
1596 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001597 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 METH_NOARGS, reduce_doc},
1599 {"remove", (PyCFunction)deque_remove,
1600 METH_O, remove_doc},
1601 {"__reversed__", (PyCFunction)deque_reviter,
1602 METH_NOARGS, reversed_doc},
1603 {"reverse", (PyCFunction)deque_reverse,
1604 METH_NOARGS, reverse_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001605 {"rotate", (PyCFunction)(void(*)(void))deque_rotate,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001606 METH_FASTCALL, rotate_doc},
Jesus Cea16e2fca2012-08-03 14:49:42 +02001607 {"__sizeof__", (PyCFunction)deque_sizeof,
1608 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001610};
1611
1612PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001613"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001614\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001615A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001616
Neal Norwitz87f10132004-02-29 15:40:53 +00001617static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 PyVarObject_HEAD_INIT(NULL, 0)
1619 "collections.deque", /* tp_name */
1620 sizeof(dequeobject), /* tp_basicsize */
1621 0, /* tp_itemsize */
1622 /* methods */
1623 (destructor)deque_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001624 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 0, /* tp_getattr */
1626 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001627 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001629 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 &deque_as_sequence, /* tp_as_sequence */
1631 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001632 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 0, /* tp_call */
1634 0, /* tp_str */
1635 PyObject_GenericGetAttr, /* tp_getattro */
1636 0, /* tp_setattro */
1637 0, /* tp_as_buffer */
1638 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001639 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 deque_doc, /* tp_doc */
1641 (traverseproc)deque_traverse, /* tp_traverse */
1642 (inquiry)deque_clear, /* tp_clear */
1643 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001644 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 (getiterfunc)deque_iter, /* tp_iter */
1646 0, /* tp_iternext */
1647 deque_methods, /* tp_methods */
1648 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001649 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 0, /* tp_base */
1651 0, /* tp_dict */
1652 0, /* tp_descr_get */
1653 0, /* tp_descr_set */
1654 0, /* tp_dictoffset */
1655 (initproc)deque_init, /* tp_init */
1656 PyType_GenericAlloc, /* tp_alloc */
1657 deque_new, /* tp_new */
1658 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001659};
1660
1661/*********************** Deque Iterator **************************/
1662
1663typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001666 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001668 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001670} dequeiterobject;
1671
Martin v. Löwis59683e82008-06-13 07:50:45 +00001672static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001673
1674static PyObject *
1675deque_iter(dequeobject *deque)
1676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1680 if (it == NULL)
1681 return NULL;
1682 it->b = deque->leftblock;
1683 it->index = deque->leftindex;
1684 Py_INCREF(deque);
1685 it->deque = deque;
1686 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001687 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject_GC_Track(it);
1689 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001690}
1691
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001692static int
1693dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 Py_VISIT(dio->deque);
1696 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001697}
1698
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001699static void
1700dequeiter_dealloc(dequeiterobject *dio)
1701{
INADA Naokia6296d32017-08-24 14:55:17 +09001702 /* bpo-31095: UnTrack is needed before calling any callbacks */
1703 PyObject_GC_UnTrack(dio);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 Py_XDECREF(dio->deque);
1705 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001706}
1707
1708static PyObject *
1709dequeiter_next(dequeiterobject *it)
1710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 if (it->deque->state != it->state) {
1714 it->counter = 0;
1715 PyErr_SetString(PyExc_RuntimeError,
1716 "deque mutated during iteration");
1717 return NULL;
1718 }
1719 if (it->counter == 0)
1720 return NULL;
1721 assert (!(it->b == it->deque->rightblock &&
1722 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 item = it->b->data[it->index];
1725 it->index++;
1726 it->counter--;
1727 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001728 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 it->b = it->b->rightlink;
1730 it->index = 0;
1731 }
1732 Py_INCREF(item);
1733 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001734}
1735
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001736static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001737dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1738{
1739 Py_ssize_t i, index=0;
1740 PyObject *deque;
1741 dequeiterobject *it;
1742 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1743 return NULL;
1744 assert(type == &dequeiter_type);
1745
1746 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1747 if (!it)
1748 return NULL;
1749 /* consume items from the queue */
1750 for(i=0; i<index; i++) {
1751 PyObject *item = dequeiter_next(it);
1752 if (item) {
1753 Py_DECREF(item);
1754 } else {
1755 if (it->counter) {
1756 Py_DECREF(it);
1757 return NULL;
1758 } else
1759 break;
1760 }
1761 }
1762 return (PyObject*)it;
1763}
1764
1765static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301766dequeiter_len(dequeiterobject *it, PyObject *Py_UNUSED(ignored))
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001767{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001768 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001769}
1770
Armin Rigof5b3e362006-02-11 21:32:43 +00001771PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001772
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001773static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301774dequeiter_reduce(dequeiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001775{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001776 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 +00001777}
1778
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001779static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001781 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001783};
1784
Martin v. Löwis59683e82008-06-13 07:50:45 +00001785static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001787 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 sizeof(dequeiterobject), /* tp_basicsize */
1789 0, /* tp_itemsize */
1790 /* methods */
1791 (destructor)dequeiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001792 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 0, /* tp_getattr */
1794 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001795 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 0, /* tp_repr */
1797 0, /* tp_as_number */
1798 0, /* tp_as_sequence */
1799 0, /* tp_as_mapping */
1800 0, /* tp_hash */
1801 0, /* tp_call */
1802 0, /* tp_str */
1803 PyObject_GenericGetAttr, /* tp_getattro */
1804 0, /* tp_setattro */
1805 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001806 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 0, /* tp_doc */
1808 (traverseproc)dequeiter_traverse, /* tp_traverse */
1809 0, /* tp_clear */
1810 0, /* tp_richcompare */
1811 0, /* tp_weaklistoffset */
1812 PyObject_SelfIter, /* tp_iter */
1813 (iternextfunc)dequeiter_next, /* tp_iternext */
1814 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001815 0, /* tp_members */
1816 0, /* tp_getset */
1817 0, /* tp_base */
1818 0, /* tp_dict */
1819 0, /* tp_descr_get */
1820 0, /* tp_descr_set */
1821 0, /* tp_dictoffset */
1822 0, /* tp_init */
1823 0, /* tp_alloc */
1824 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001826};
1827
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001828/*********************** Deque Reverse Iterator **************************/
1829
Martin v. Löwis59683e82008-06-13 07:50:45 +00001830static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001831
1832static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301833deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored))
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1838 if (it == NULL)
1839 return NULL;
1840 it->b = deque->rightblock;
1841 it->index = deque->rightindex;
1842 Py_INCREF(deque);
1843 it->deque = deque;
1844 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001845 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 PyObject_GC_Track(it);
1847 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001848}
1849
1850static PyObject *
1851dequereviter_next(dequeiterobject *it)
1852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 PyObject *item;
1854 if (it->counter == 0)
1855 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 if (it->deque->state != it->state) {
1858 it->counter = 0;
1859 PyErr_SetString(PyExc_RuntimeError,
1860 "deque mutated during iteration");
1861 return NULL;
1862 }
1863 assert (!(it->b == it->deque->leftblock &&
1864 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 item = it->b->data[it->index];
1867 it->index--;
1868 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001869 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001870 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 it->b = it->b->leftlink;
1872 it->index = BLOCKLEN - 1;
1873 }
1874 Py_INCREF(item);
1875 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001876}
1877
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001878static PyObject *
1879dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1880{
1881 Py_ssize_t i, index=0;
1882 PyObject *deque;
1883 dequeiterobject *it;
1884 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1885 return NULL;
1886 assert(type == &dequereviter_type);
1887
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301888 it = (dequeiterobject*)deque_reviter((dequeobject *)deque, NULL);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001889 if (!it)
1890 return NULL;
1891 /* consume items from the queue */
1892 for(i=0; i<index; i++) {
1893 PyObject *item = dequereviter_next(it);
1894 if (item) {
1895 Py_DECREF(item);
1896 } else {
1897 if (it->counter) {
1898 Py_DECREF(it);
1899 return NULL;
1900 } else
1901 break;
1902 }
1903 }
1904 return (PyObject*)it;
1905}
1906
Martin v. Löwis59683e82008-06-13 07:50:45 +00001907static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001909 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 sizeof(dequeiterobject), /* tp_basicsize */
1911 0, /* tp_itemsize */
1912 /* methods */
1913 (destructor)dequeiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001914 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 0, /* tp_getattr */
1916 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001917 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 0, /* tp_repr */
1919 0, /* tp_as_number */
1920 0, /* tp_as_sequence */
1921 0, /* tp_as_mapping */
1922 0, /* tp_hash */
1923 0, /* tp_call */
1924 0, /* tp_str */
1925 PyObject_GenericGetAttr, /* tp_getattro */
1926 0, /* tp_setattro */
1927 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001928 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 0, /* tp_doc */
1930 (traverseproc)dequeiter_traverse, /* tp_traverse */
1931 0, /* tp_clear */
1932 0, /* tp_richcompare */
1933 0, /* tp_weaklistoffset */
1934 PyObject_SelfIter, /* tp_iter */
1935 (iternextfunc)dequereviter_next, /* tp_iternext */
1936 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001937 0, /* tp_members */
1938 0, /* tp_getset */
1939 0, /* tp_base */
1940 0, /* tp_dict */
1941 0, /* tp_descr_get */
1942 0, /* tp_descr_set */
1943 0, /* tp_dictoffset */
1944 0, /* tp_init */
1945 0, /* tp_alloc */
1946 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001948};
1949
Guido van Rossum1968ad32006-02-25 22:38:04 +00001950/* defaultdict type *********************************************************/
1951
1952typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 PyDictObject dict;
1954 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001955} defdictobject;
1956
1957static PyTypeObject defdict_type; /* Forward */
1958
1959PyDoc_STRVAR(defdict_missing_doc,
1960"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001961 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001962 self[key] = value = self.default_factory()\n\
1963 return value\n\
1964");
1965
1966static PyObject *
1967defdict_missing(defdictobject *dd, PyObject *key)
1968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 PyObject *factory = dd->default_factory;
1970 PyObject *value;
1971 if (factory == NULL || factory == Py_None) {
1972 /* XXX Call dict.__missing__(key) */
1973 PyObject *tup;
1974 tup = PyTuple_Pack(1, key);
1975 if (!tup) return NULL;
1976 PyErr_SetObject(PyExc_KeyError, tup);
1977 Py_DECREF(tup);
1978 return NULL;
1979 }
1980 value = PyEval_CallObject(factory, NULL);
1981 if (value == NULL)
1982 return value;
1983 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1984 Py_DECREF(value);
1985 return NULL;
1986 }
1987 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001988}
1989
1990PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1991
1992static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301993defdict_copy(defdictobject *dd, PyObject *Py_UNUSED(ignored))
Guido van Rossum1968ad32006-02-25 22:38:04 +00001994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 /* This calls the object's class. That only works for subclasses
1996 whose class constructor has the same signature. Subclasses that
1997 define a different constructor signature must override copy().
1998 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 if (dd->default_factory == NULL)
2001 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
2002 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2003 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002004}
2005
2006static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302007defdict_reduce(defdictobject *dd, PyObject *Py_UNUSED(ignored))
Guido van Rossum1968ad32006-02-25 22:38:04 +00002008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00002010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 - factory function
2012 - tuple of args for the factory function
2013 - additional state (here None)
2014 - sequence iterator (here None)
2015 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 For this to be useful with pickle.py, the default_factory
2020 must be picklable; e.g., None, a built-in, or a global
2021 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 Both shallow and deep copying are supported, but for deep
2024 copying, the default_factory must be deep-copyable; e.g. None,
2025 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 This only works for subclasses as long as their constructor
2028 signature is compatible; the first argument must be the
2029 optional default_factory, defaulting to None.
2030 */
2031 PyObject *args;
2032 PyObject *items;
2033 PyObject *iter;
2034 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002035 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 if (dd->default_factory == NULL || dd->default_factory == Py_None)
2038 args = PyTuple_New(0);
2039 else
2040 args = PyTuple_Pack(1, dd->default_factory);
2041 if (args == NULL)
2042 return NULL;
Victor Stinnerad8c83a2016-09-05 17:53:15 -07002043 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 if (items == NULL) {
2045 Py_DECREF(args);
2046 return NULL;
2047 }
2048 iter = PyObject_GetIter(items);
2049 if (iter == NULL) {
2050 Py_DECREF(items);
2051 Py_DECREF(args);
2052 return NULL;
2053 }
2054 result = PyTuple_Pack(5, Py_TYPE(dd), args,
2055 Py_None, Py_None, iter);
2056 Py_DECREF(iter);
2057 Py_DECREF(items);
2058 Py_DECREF(args);
2059 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002060}
2061
2062static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 {"__missing__", (PyCFunction)defdict_missing, METH_O,
2064 defdict_missing_doc},
2065 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
2066 defdict_copy_doc},
2067 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
2068 defdict_copy_doc},
2069 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
2070 reduce_doc},
2071 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002072};
2073
2074static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 {"default_factory", T_OBJECT,
2076 offsetof(defdictobject, default_factory), 0,
2077 PyDoc_STR("Factory for default value called by __missing__().")},
2078 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002079};
2080
2081static void
2082defdict_dealloc(defdictobject *dd)
2083{
INADA Naokia6296d32017-08-24 14:55:17 +09002084 /* bpo-31095: UnTrack is needed before calling any callbacks */
2085 PyObject_GC_UnTrack(dd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 Py_CLEAR(dd->default_factory);
2087 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002088}
2089
Guido van Rossum1968ad32006-02-25 22:38:04 +00002090static PyObject *
2091defdict_repr(defdictobject *dd)
2092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 PyObject *baserepr;
2094 PyObject *defrepr;
2095 PyObject *result;
2096 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2097 if (baserepr == NULL)
2098 return NULL;
2099 if (dd->default_factory == NULL)
2100 defrepr = PyUnicode_FromString("None");
2101 else
2102 {
2103 int status = Py_ReprEnter(dd->default_factory);
2104 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002105 if (status < 0) {
2106 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 defrepr = PyUnicode_FromString("...");
2110 }
2111 else
2112 defrepr = PyObject_Repr(dd->default_factory);
2113 Py_ReprLeave(dd->default_factory);
2114 }
2115 if (defrepr == NULL) {
2116 Py_DECREF(baserepr);
2117 return NULL;
2118 }
Serhiy Storchakab3a77962017-09-21 14:24:13 +03002119 result = PyUnicode_FromFormat("%s(%U, %U)",
2120 _PyType_Name(Py_TYPE(dd)),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 defrepr, baserepr);
2122 Py_DECREF(defrepr);
2123 Py_DECREF(baserepr);
2124 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002125}
2126
2127static int
2128defdict_traverse(PyObject *self, visitproc visit, void *arg)
2129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 Py_VISIT(((defdictobject *)self)->default_factory);
2131 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002132}
2133
2134static int
2135defdict_tp_clear(defdictobject *dd)
2136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 Py_CLEAR(dd->default_factory);
2138 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002139}
2140
2141static int
2142defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 defdictobject *dd = (defdictobject *)self;
2145 PyObject *olddefault = dd->default_factory;
2146 PyObject *newdefault = NULL;
2147 PyObject *newargs;
2148 int result;
2149 if (args == NULL || !PyTuple_Check(args))
2150 newargs = PyTuple_New(0);
2151 else {
2152 Py_ssize_t n = PyTuple_GET_SIZE(args);
2153 if (n > 0) {
2154 newdefault = PyTuple_GET_ITEM(args, 0);
2155 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2156 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002157 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 return -1;
2159 }
2160 }
2161 newargs = PySequence_GetSlice(args, 1, n);
2162 }
2163 if (newargs == NULL)
2164 return -1;
2165 Py_XINCREF(newdefault);
2166 dd->default_factory = newdefault;
2167 result = PyDict_Type.tp_init(self, newargs, kwds);
2168 Py_DECREF(newargs);
2169 Py_XDECREF(olddefault);
2170 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002171}
2172
2173PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002174"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002175\n\
2176The default factory is called without arguments to produce\n\
2177a new value when a key is not present, in __getitem__ only.\n\
2178A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002179All remaining arguments are treated the same as if they were\n\
2180passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002181");
2182
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002183/* See comment in xxsubtype.c */
2184#define DEFERRED_ADDRESS(ADDR) 0
2185
Guido van Rossum1968ad32006-02-25 22:38:04 +00002186static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2188 "collections.defaultdict", /* tp_name */
2189 sizeof(defdictobject), /* tp_basicsize */
2190 0, /* tp_itemsize */
2191 /* methods */
2192 (destructor)defdict_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002193 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 0, /* tp_getattr */
2195 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002196 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 (reprfunc)defdict_repr, /* tp_repr */
2198 0, /* tp_as_number */
2199 0, /* tp_as_sequence */
2200 0, /* tp_as_mapping */
2201 0, /* tp_hash */
2202 0, /* tp_call */
2203 0, /* tp_str */
2204 PyObject_GenericGetAttr, /* tp_getattro */
2205 0, /* tp_setattro */
2206 0, /* tp_as_buffer */
2207 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2208 /* tp_flags */
2209 defdict_doc, /* tp_doc */
2210 defdict_traverse, /* tp_traverse */
2211 (inquiry)defdict_tp_clear, /* tp_clear */
2212 0, /* tp_richcompare */
2213 0, /* tp_weaklistoffset*/
2214 0, /* tp_iter */
2215 0, /* tp_iternext */
2216 defdict_methods, /* tp_methods */
2217 defdict_members, /* tp_members */
2218 0, /* tp_getset */
2219 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2220 0, /* tp_dict */
2221 0, /* tp_descr_get */
2222 0, /* tp_descr_set */
2223 0, /* tp_dictoffset */
2224 defdict_init, /* tp_init */
2225 PyType_GenericAlloc, /* tp_alloc */
2226 0, /* tp_new */
2227 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002228};
2229
Raymond Hettinger96f34102010-12-15 16:30:37 +00002230/* helper function for Counter *********************************************/
2231
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002232/*[clinic input]
2233_collections._count_elements
2234
2235 mapping: object
2236 iterable: object
2237 /
2238
2239Count elements in the iterable, updating the mapping
2240[clinic start generated code]*/
Raymond Hettinger96f34102010-12-15 16:30:37 +00002241
2242static PyObject *
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002243_collections__count_elements_impl(PyObject *module, PyObject *mapping,
2244 PyObject *iterable)
2245/*[clinic end generated code: output=7e0c1789636b3d8f input=e79fad04534a0b45]*/
Raymond Hettinger96f34102010-12-15 16:30:37 +00002246{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002247 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002248 _Py_IDENTIFIER(__setitem__);
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002249 PyObject *it, *oldval;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002250 PyObject *newval = NULL;
2251 PyObject *key = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002252 PyObject *bound_get = NULL;
2253 PyObject *mapping_get;
2254 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002255 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002256 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002257
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 Hettingercb1d96f2013-10-04 16:51:02 -07002262 /* Only take the fast path when get() and __setitem__()
2263 * have not been overridden.
2264 */
2265 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2266 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002267 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2268 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2269
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002270 if (mapping_get != NULL && mapping_get == dict_get &&
Oren Milman31aca4b2017-09-27 06:18:21 +03002271 mapping_setitem != NULL && mapping_setitem == dict_setitem &&
2272 PyDict_Check(mapping))
2273 {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002274 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002275 /* Fast path advantages:
2276 1. Eliminate double hashing
2277 (by re-using the same hash for both the get and set)
2278 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2279 (argument tuple creation and parsing)
2280 3. Avoid indirection through a bound method object
2281 (creates another argument tuple)
2282 4. Avoid initial increment from zero
2283 (reuse an existing one-object instead)
2284 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002285 Py_hash_t hash;
2286
Raymond Hettinger426e0522011-01-03 02:12:02 +00002287 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002288 if (key == NULL)
2289 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002290
2291 if (!PyUnicode_CheckExact(key) ||
2292 (hash = ((PyASCIIObject *) key)->hash) == -1)
2293 {
2294 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002295 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002296 goto done;
2297 }
2298
2299 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002300 if (oldval == NULL) {
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002301 if (PyErr_Occurred())
2302 goto done;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002303 if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_One, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002304 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002305 } else {
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002306 newval = PyNumber_Add(oldval, _PyLong_One);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002307 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002308 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002309 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002310 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002311 Py_CLEAR(newval);
2312 }
2313 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002314 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002315 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002316 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002317 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002318 goto done;
2319
Raymond Hettinger426e0522011-01-03 02:12:02 +00002320 while (1) {
2321 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002322 if (key == NULL)
2323 break;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002324 oldval = PyObject_CallFunctionObjArgs(bound_get, key, _PyLong_Zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002325 if (oldval == NULL)
2326 break;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002327 newval = PyNumber_Add(oldval, _PyLong_One);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002328 Py_DECREF(oldval);
2329 if (newval == NULL)
2330 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002331 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002332 break;
2333 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002334 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002335 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002336 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002337
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002338done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002339 Py_DECREF(it);
2340 Py_XDECREF(key);
2341 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002342 Py_XDECREF(bound_get);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002343 if (PyErr_Occurred())
2344 return NULL;
2345 Py_RETURN_NONE;
2346}
2347
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002348/* Helper function for namedtuple() ************************************/
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002349
2350typedef struct {
2351 PyObject_HEAD
2352 Py_ssize_t index;
2353 PyObject* doc;
2354} _tuplegetterobject;
2355
2356/*[clinic input]
2357@classmethod
2358_tuplegetter.__new__ as tuplegetter_new
2359
2360 index: Py_ssize_t
2361 doc: object
2362 /
2363[clinic start generated code]*/
2364
2365static PyObject *
2366tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc)
2367/*[clinic end generated code: output=014be444ad80263f input=87c576a5bdbc0bbb]*/
2368{
2369 _tuplegetterobject* self;
2370 self = (_tuplegetterobject *)type->tp_alloc(type, 0);
2371 if (self == NULL) {
2372 return NULL;
2373 }
2374 self->index = index;
2375 Py_INCREF(doc);
2376 self->doc = doc;
2377 return (PyObject *)self;
2378}
2379
2380static PyObject *
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002381tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002382{
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002383 Py_ssize_t index = ((_tuplegetterobject*)self)->index;
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002384 PyObject *result;
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002385
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002386 if (obj == NULL) {
2387 Py_INCREF(self);
2388 return self;
2389 }
2390 if (!PyTuple_Check(obj)) {
2391 if (obj == Py_None) {
2392 Py_INCREF(self);
2393 return self;
2394 }
2395 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02002396 "descriptor for index '%zd' for tuple subclasses "
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002397 "doesn't apply to '%s' object",
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002398 index,
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002399 obj->ob_type->tp_name);
2400 return NULL;
2401 }
2402
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002403 if (!valid_index(index, PyTuple_GET_SIZE(obj))) {
2404 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
2405 return NULL;
2406 }
2407
2408 result = PyTuple_GET_ITEM(obj, index);
2409 Py_INCREF(result);
2410 return result;
2411}
2412
2413static int
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002414tuplegetter_descr_set(PyObject *self, PyObject *obj, PyObject *value)
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002415{
2416 if (value == NULL) {
2417 PyErr_SetString(PyExc_AttributeError, "can't delete attribute");
2418 } else {
2419 PyErr_SetString(PyExc_AttributeError, "can't set attribute");
2420 }
2421 return -1;
2422}
2423
2424static int
2425tuplegetter_traverse(PyObject *self, visitproc visit, void *arg)
2426{
2427 _tuplegetterobject *tuplegetter = (_tuplegetterobject *)self;
2428 Py_VISIT(tuplegetter->doc);
2429 return 0;
2430}
2431
2432static int
2433tuplegetter_clear(PyObject *self)
2434{
2435 _tuplegetterobject *tuplegetter = (_tuplegetterobject *)self;
2436 Py_CLEAR(tuplegetter->doc);
2437 return 0;
2438}
2439
2440static void
2441tuplegetter_dealloc(_tuplegetterobject *self)
2442{
2443 PyObject_GC_UnTrack(self);
2444 tuplegetter_clear((PyObject*)self);
2445 Py_TYPE(self)->tp_free((PyObject*)self);
2446}
2447
Joe Jevnikf36f8922019-02-21 16:00:40 -05002448static PyObject*
Serhiy Storchakaadfffc72019-03-05 18:41:09 +02002449tuplegetter_reduce(_tuplegetterobject *self, PyObject *Py_UNUSED(ignored))
Joe Jevnikf36f8922019-02-21 16:00:40 -05002450{
2451 return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc);
2452}
2453
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002454
2455static PyMemberDef tuplegetter_members[] = {
2456 {"__doc__", T_OBJECT, offsetof(_tuplegetterobject, doc), 0},
2457 {0}
2458};
2459
Joe Jevnikf36f8922019-02-21 16:00:40 -05002460static PyMethodDef tuplegetter_methods[] = {
Serhiy Storchakaadfffc72019-03-05 18:41:09 +02002461 {"__reduce__", (PyCFunction)tuplegetter_reduce, METH_NOARGS, NULL},
Joe Jevnikf36f8922019-02-21 16:00:40 -05002462 {NULL},
2463};
2464
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002465static PyTypeObject tuplegetter_type = {
2466 PyVarObject_HEAD_INIT(NULL, 0)
2467 "_collections._tuplegetter", /* tp_name */
2468 sizeof(_tuplegetterobject), /* tp_basicsize */
2469 0, /* tp_itemsize */
2470 /* methods */
2471 (destructor)tuplegetter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002472 0, /* tp_vectorcall_offset */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002473 0, /* tp_getattr */
2474 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002475 0, /* tp_as_async */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002476 0, /* tp_repr */
2477 0, /* tp_as_number */
2478 0, /* tp_as_sequence */
2479 0, /* tp_as_mapping */
2480 0, /* tp_hash */
2481 0, /* tp_call */
2482 0, /* tp_str */
2483 0, /* tp_getattro */
2484 0, /* tp_setattro */
2485 0, /* tp_as_buffer */
2486 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2487 0, /* tp_doc */
2488 (traverseproc)tuplegetter_traverse, /* tp_traverse */
2489 (inquiry)tuplegetter_clear, /* tp_clear */
2490 0, /* tp_richcompare */
2491 0, /* tp_weaklistoffset */
2492 0, /* tp_iter */
2493 0, /* tp_iternext */
Joe Jevnikf36f8922019-02-21 16:00:40 -05002494 tuplegetter_methods, /* tp_methods */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002495 tuplegetter_members, /* tp_members */
2496 0, /* tp_getset */
2497 0, /* tp_base */
2498 0, /* tp_dict */
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002499 tuplegetter_descr_get, /* tp_descr_get */
2500 tuplegetter_descr_set, /* tp_descr_set */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002501 0, /* tp_dictoffset */
2502 0, /* tp_init */
2503 0, /* tp_alloc */
2504 tuplegetter_new, /* tp_new */
2505 0,
2506};
2507
2508
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002509/* module level code ********************************************************/
2510
2511PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002512"High performance data structures.\n\
2513- deque: ordered collection accessible from endpoints only\n\
2514- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002515");
2516
Raymond Hettinger96f34102010-12-15 16:30:37 +00002517static struct PyMethodDef module_functions[] = {
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002518 _COLLECTIONS__COUNT_ELEMENTS_METHODDEF
Raymond Hettinger96f34102010-12-15 16:30:37 +00002519 {NULL, NULL} /* sentinel */
2520};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002521
2522static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 PyModuleDef_HEAD_INIT,
2524 "_collections",
2525 module_doc,
2526 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002527 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 NULL,
2529 NULL,
2530 NULL,
2531 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002532};
2533
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002534PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002535PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 m = PyModule_Create(&_collectionsmodule);
2540 if (m == NULL)
2541 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 if (PyType_Ready(&deque_type) < 0)
2544 return NULL;
2545 Py_INCREF(&deque_type);
2546 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 defdict_type.tp_base = &PyDict_Type;
2549 if (PyType_Ready(&defdict_type) < 0)
2550 return NULL;
2551 Py_INCREF(&defdict_type);
2552 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002553
Eric Snow47db7172015-05-29 22:21:39 -06002554 Py_INCREF(&PyODict_Type);
2555 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 if (PyType_Ready(&dequeiter_type) < 0)
2558 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002559 Py_INCREF(&dequeiter_type);
2560 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 if (PyType_Ready(&dequereviter_type) < 0)
2563 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002564 Py_INCREF(&dequereviter_type);
2565 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002566
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002567 if (PyType_Ready(&tuplegetter_type) < 0)
2568 return NULL;
2569 Py_INCREF(&tuplegetter_type);
2570 PyModule_AddObject(m, "_tuplegetter", (PyObject *)&tuplegetter_type);
2571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002573}