blob: cc2b90eaa283ea3f704e1a3f593dfcb32ffba642 [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];
Miss Islington (bot)dc56f5f2020-02-09 00:39:28 -0800969 Py_INCREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Miss Islington (bot)dc56f5f2020-02-09 00:39:28 -0800971 Py_DECREF(item);
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700972 if (cmp < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 return NULL;
Raymond Hettinger2b0d6462015-09-23 19:15:44 -0700974 count += cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 if (start_state != deque->state) {
977 PyErr_SetString(PyExc_RuntimeError,
978 "deque mutated during iteration");
979 return NULL;
980 }
Raymond Hettinger44459de2010-04-03 23:20:46 +0000981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000983 index++;
984 if (index == BLOCKLEN) {
985 b = b->rightlink;
986 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 }
988 }
989 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +0000990}
991
992PyDoc_STRVAR(count_doc,
993"D.count(value) -> integer -- return number of occurrences of value");
994
Raymond Hettinger39dadf72015-03-20 16:38:56 -0700995static int
996deque_contains(dequeobject *deque, PyObject *v)
997{
998 block *b = deque->leftblock;
999 Py_ssize_t index = deque->leftindex;
1000 Py_ssize_t n = Py_SIZE(deque);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001001 size_t start_state = deque->state;
1002 PyObject *item;
1003 int cmp;
1004
Raymond Hettingere1b02872017-09-04 16:07:06 -07001005 while (--n >= 0) {
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001006 CHECK_NOT_END(b);
1007 item = b->data[index];
Miss Islington (bot)dc56f5f2020-02-09 00:39:28 -08001008 Py_INCREF(item);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001009 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
Miss Islington (bot)dc56f5f2020-02-09 00:39:28 -08001010 Py_DECREF(item);
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001011 if (cmp) {
1012 return cmp;
1013 }
1014 if (start_state != deque->state) {
1015 PyErr_SetString(PyExc_RuntimeError,
1016 "deque mutated during iteration");
1017 return -1;
1018 }
1019 index++;
1020 if (index == BLOCKLEN) {
1021 b = b->rightlink;
1022 index = 0;
1023 }
1024 }
1025 return 0;
1026}
1027
Martin v. Löwis18e16552006-02-15 17:27:45 +00001028static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001029deque_len(dequeobject *deque)
1030{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001031 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001032}
1033
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001034static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001035deque_index(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001036{
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001037 Py_ssize_t i, n, start=0, stop=Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001038 PyObject *v, *item;
1039 block *b = deque->leftblock;
1040 Py_ssize_t index = deque->leftindex;
1041 size_t start_state = deque->state;
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001042 int cmp;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001043
Victor Stinnerdd407d52017-02-06 16:06:49 +01001044 if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index", &v,
Serhiy Storchakad4edfc92017-03-30 18:29:23 +03001045 _PyEval_SliceIndexNotNone, &start,
1046 _PyEval_SliceIndexNotNone, &stop)) {
Victor Stinnerdd407d52017-02-06 16:06:49 +01001047 return NULL;
1048 }
1049
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001050 if (start < 0) {
1051 start += Py_SIZE(deque);
1052 if (start < 0)
1053 start = 0;
1054 }
1055 if (stop < 0) {
1056 stop += Py_SIZE(deque);
1057 if (stop < 0)
1058 stop = 0;
1059 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -07001060 if (stop > Py_SIZE(deque))
1061 stop = Py_SIZE(deque);
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001062 if (start > stop)
1063 start = stop;
1064 assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001065
Raymond Hettingerb46ad542018-09-21 01:46:41 -07001066 for (i=0 ; i < start - BLOCKLEN ; i += BLOCKLEN) {
1067 b = b->rightlink;
1068 }
1069 for ( ; i < start ; i++) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001070 index++;
1071 if (index == BLOCKLEN) {
1072 b = b->rightlink;
1073 index = 0;
1074 }
1075 }
1076
Raymond Hettingere1b02872017-09-04 16:07:06 -07001077 n = stop - i;
1078 while (--n >= 0) {
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001079 CHECK_NOT_END(b);
1080 item = b->data[index];
1081 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1082 if (cmp > 0)
Raymond Hettingere1b02872017-09-04 16:07:06 -07001083 return PyLong_FromSsize_t(stop - n - 1);
Raymond Hettingerdf8f5b52015-11-02 07:27:40 -05001084 if (cmp < 0)
Raymond Hettinger67b97b82015-11-01 23:57:37 -05001085 return NULL;
1086 if (start_state != deque->state) {
1087 PyErr_SetString(PyExc_RuntimeError,
1088 "deque mutated during iteration");
1089 return NULL;
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001090 }
1091 index++;
1092 if (index == BLOCKLEN) {
1093 b = b->rightlink;
1094 index = 0;
1095 }
1096 }
1097 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
1098 return NULL;
1099}
1100
1101PyDoc_STRVAR(index_doc,
1102"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
1103"Raises ValueError if the value is not present.");
1104
Raymond Hettinger551350a2015-03-24 00:19:53 -07001105/* insert(), remove(), and delitem() are implemented in terms of
1106 rotate() for simplicity and reasonable performance near the end
1107 points. If for some reason these methods become popular, it is not
1108 hard to re-implement this using direct data movement (similar to
1109 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -07001110 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -07001111*/
1112
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001113static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001114deque_insert(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001115{
1116 Py_ssize_t index;
1117 Py_ssize_t n = Py_SIZE(deque);
1118 PyObject *value;
1119 PyObject *rv;
1120
Victor Stinnerdd407d52017-02-06 16:06:49 +01001121 if (!_PyArg_ParseStack(args, nargs, "nO:insert", &index, &value)) {
1122 return NULL;
1123 }
1124
Raymond Hettinger37434322016-01-26 21:44:16 -08001125 if (deque->maxlen == Py_SIZE(deque)) {
Raymond Hettingera6389712016-02-01 21:21:19 -08001126 PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
1127 return NULL;
Raymond Hettinger37434322016-01-26 21:44:16 -08001128 }
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001129 if (index >= n)
1130 return deque_append(deque, value);
1131 if (index <= -n || index == 0)
1132 return deque_appendleft(deque, value);
1133 if (_deque_rotate(deque, -index))
1134 return NULL;
1135 if (index < 0)
1136 rv = deque_append(deque, value);
1137 else
1138 rv = deque_appendleft(deque, value);
1139 if (rv == NULL)
1140 return NULL;
1141 Py_DECREF(rv);
1142 if (_deque_rotate(deque, index))
1143 return NULL;
1144 Py_RETURN_NONE;
1145}
1146
1147PyDoc_STRVAR(insert_doc,
1148"D.insert(index, object) -- insert object before index");
1149
1150static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001151deque_remove(dequeobject *deque, PyObject *value)
1152{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001153 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 for (i=0 ; i<n ; i++) {
1156 PyObject *item = deque->leftblock->data[deque->leftindex];
1157 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001158
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001159 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 PyErr_SetString(PyExc_IndexError,
1161 "deque mutated during remove().");
1162 return NULL;
1163 }
1164 if (cmp > 0) {
1165 PyObject *tgt = deque_popleft(deque, NULL);
1166 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001167 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001169 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 Py_RETURN_NONE;
1171 }
1172 else if (cmp < 0) {
1173 _deque_rotate(deque, i);
1174 return NULL;
1175 }
1176 _deque_rotate(deque, -1);
1177 }
1178 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1179 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001180}
1181
1182PyDoc_STRVAR(remove_doc,
1183"D.remove(value) -- remove first occurrence of value.");
1184
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001185static int
1186valid_index(Py_ssize_t i, Py_ssize_t limit)
1187{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001188 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001189 to check whether i is in the range: 0 <= i < limit */
1190 return (size_t) i < (size_t) limit;
1191}
1192
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001193static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001194deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 block *b;
1197 PyObject *item;
1198 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001199
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001200 if (!valid_index(i, Py_SIZE(deque))) {
1201 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 return NULL;
1203 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 if (i == 0) {
1206 i = deque->leftindex;
1207 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001208 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 i = deque->rightindex;
1210 b = deque->rightblock;
1211 } else {
1212 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001213 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1214 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001215 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 b = deque->leftblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001217 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 b = b->rightlink;
1219 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001220 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001221 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001222 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 b = deque->rightblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001224 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 b = b->leftlink;
1226 }
1227 }
1228 item = b->data[i];
1229 Py_INCREF(item);
1230 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001231}
1232
1233static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001234deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001237 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001238
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001239 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001240 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001243 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 assert (item != NULL);
1245 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001246 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001247}
1248
1249static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001250deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001251{
Raymond Hettinger38418662016-02-08 20:34:49 -08001252 PyObject *old_value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001254 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001255
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001256 if (!valid_index(i, len)) {
1257 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 return -1;
1259 }
1260 if (v == NULL)
1261 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001264 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1265 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 if (index <= halflen) {
1267 b = deque->leftblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001268 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 b = b->rightlink;
1270 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001271 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001272 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001273 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 b = deque->rightblock;
Raymond Hettingere1b02872017-09-04 16:07:06 -07001275 while (--n >= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 b = b->leftlink;
1277 }
1278 Py_INCREF(v);
Raymond Hettinger38418662016-02-08 20:34:49 -08001279 old_value = b->data[i];
1280 b->data[i] = v;
1281 Py_DECREF(old_value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001283}
1284
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001285static void
1286deque_dealloc(dequeobject *deque)
1287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 PyObject_GC_UnTrack(deque);
1289 if (deque->weakreflist != NULL)
1290 PyObject_ClearWeakRefs((PyObject *) deque);
1291 if (deque->leftblock != NULL) {
1292 deque_clear(deque);
1293 assert(deque->leftblock != NULL);
1294 freeblock(deque->leftblock);
1295 }
1296 deque->leftblock = NULL;
1297 deque->rightblock = NULL;
1298 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001299}
1300
1301static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001302deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 block *b;
1305 PyObject *item;
1306 Py_ssize_t index;
1307 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger1286d142015-10-14 23:16:57 -07001308 Py_ssize_t indexhigh;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001309
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001310 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1311 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 item = b->data[index];
1313 Py_VISIT(item);
1314 }
1315 indexlo = 0;
1316 }
Raymond Hettinger1286d142015-10-14 23:16:57 -07001317 indexhigh = deque->rightindex;
1318 for (index = indexlo; index <= indexhigh; index++) {
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001319 item = b->data[index];
1320 Py_VISIT(item);
1321 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001323}
1324
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001325static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02001326deque_reduce(dequeobject *deque, PyObject *Py_UNUSED(ignored))
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001327{
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001328 PyObject *dict, *it;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001329 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001330
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001331 if (_PyObject_LookupAttrId((PyObject *)deque, &PyId___dict__, &dict) < 0) {
1332 return NULL;
1333 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001334 if (dict == NULL) {
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001335 dict = Py_None;
1336 Py_INCREF(dict);
1337 }
1338
1339 it = PyObject_GetIter((PyObject *)deque);
1340 if (it == NULL) {
1341 Py_DECREF(dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 return NULL;
1343 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001344
1345 if (deque->maxlen < 0) {
1346 return Py_BuildValue("O()NN", Py_TYPE(deque), dict, it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 }
Serhiy Storchakaa0d416f2016-03-06 08:55:21 +02001348 else {
1349 return Py_BuildValue("O(()n)NN", Py_TYPE(deque), deque->maxlen, dict, it);
1350 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001351}
1352
1353PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1354
1355static PyObject *
1356deque_repr(PyObject *deque)
1357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 PyObject *aslist, *result;
1359 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 i = Py_ReprEnter(deque);
1362 if (i != 0) {
1363 if (i < 0)
1364 return NULL;
1365 return PyUnicode_FromString("[...]");
1366 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 aslist = PySequence_List(deque);
1369 if (aslist == NULL) {
1370 Py_ReprLeave(deque);
1371 return NULL;
1372 }
Raymond Hettingera7f630092015-10-10 23:56:02 -04001373 if (((dequeobject *)deque)->maxlen >= 0)
Serhiy Storchakab3a77962017-09-21 14:24:13 +03001374 result = PyUnicode_FromFormat("%s(%R, maxlen=%zd)",
1375 _PyType_Name(Py_TYPE(deque)), aslist,
1376 ((dequeobject *)deque)->maxlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 else
Serhiy Storchakab3a77962017-09-21 14:24:13 +03001378 result = PyUnicode_FromFormat("%s(%R)",
1379 _PyType_Name(Py_TYPE(deque)), aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001381 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001383}
1384
Raymond Hettinger738ec902004-02-29 02:15:56 +00001385static PyObject *
1386deque_richcompare(PyObject *v, PyObject *w, int op)
1387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 PyObject *it1=NULL, *it2=NULL, *x, *y;
1389 Py_ssize_t vs, ws;
1390 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 if (!PyObject_TypeCheck(v, &deque_type) ||
1393 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001394 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001398 vs = Py_SIZE((dequeobject *)v);
1399 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 if (op == Py_EQ) {
1401 if (v == w)
1402 Py_RETURN_TRUE;
1403 if (vs != ws)
1404 Py_RETURN_FALSE;
1405 }
1406 if (op == Py_NE) {
1407 if (v == w)
1408 Py_RETURN_FALSE;
1409 if (vs != ws)
1410 Py_RETURN_TRUE;
1411 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 /* Search for the first index where items are different */
1414 it1 = PyObject_GetIter(v);
1415 if (it1 == NULL)
1416 goto done;
1417 it2 = PyObject_GetIter(w);
1418 if (it2 == NULL)
1419 goto done;
1420 for (;;) {
1421 x = PyIter_Next(it1);
1422 if (x == NULL && PyErr_Occurred())
1423 goto done;
1424 y = PyIter_Next(it2);
1425 if (x == NULL || y == NULL)
1426 break;
1427 b = PyObject_RichCompareBool(x, y, Py_EQ);
1428 if (b == 0) {
1429 cmp = PyObject_RichCompareBool(x, y, op);
1430 Py_DECREF(x);
1431 Py_DECREF(y);
1432 goto done;
1433 }
1434 Py_DECREF(x);
1435 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001436 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 goto done;
1438 }
1439 /* We reached the end of one deque or both */
1440 Py_XDECREF(x);
1441 Py_XDECREF(y);
1442 if (PyErr_Occurred())
1443 goto done;
1444 switch (op) {
1445 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1446 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1447 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1448 case Py_NE: cmp = x != y; break; /* if one deque continues */
1449 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1450 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1451 }
Tim Peters1065f752004-10-01 01:03:29 +00001452
Raymond Hettinger738ec902004-02-29 02:15:56 +00001453done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 Py_XDECREF(it1);
1455 Py_XDECREF(it2);
1456 if (cmp == 1)
1457 Py_RETURN_TRUE;
1458 if (cmp == 0)
1459 Py_RETURN_FALSE;
1460 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001461}
1462
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001463static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001464deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 PyObject *iterable = NULL;
1467 PyObject *maxlenobj = NULL;
1468 Py_ssize_t maxlen = -1;
1469 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001470
Raymond Hettinger05f1b932019-01-31 22:13:43 -08001471 if (kwdargs == NULL && PyTuple_GET_SIZE(args) <= 2) {
1472 if (PyTuple_GET_SIZE(args) > 0) {
1473 iterable = PyTuple_GET_ITEM(args, 0);
1474 }
1475 if (PyTuple_GET_SIZE(args) > 1) {
1476 maxlenobj = PyTuple_GET_ITEM(args, 1);
1477 }
Raymond Hettinger0d309402015-09-30 23:15:02 -07001478 } else {
1479 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist,
1480 &iterable, &maxlenobj))
1481 return -1;
1482 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 if (maxlenobj != NULL && maxlenobj != Py_None) {
1484 maxlen = PyLong_AsSsize_t(maxlenobj);
1485 if (maxlen == -1 && PyErr_Occurred())
1486 return -1;
1487 if (maxlen < 0) {
1488 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1489 return -1;
1490 }
1491 }
1492 deque->maxlen = maxlen;
Raymond Hettinger0d309402015-09-30 23:15:02 -07001493 if (Py_SIZE(deque) > 0)
1494 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 if (iterable != NULL) {
1496 PyObject *rv = deque_extend(deque, iterable);
1497 if (rv == NULL)
1498 return -1;
1499 Py_DECREF(rv);
1500 }
1501 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001502}
1503
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001504static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001505deque_sizeof(dequeobject *deque, void *unused)
1506{
1507 Py_ssize_t res;
1508 Py_ssize_t blocks;
1509
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02001510 res = _PyObject_SIZE(Py_TYPE(deque));
Raymond Hettingerbc003412015-10-14 23:33:23 -07001511 blocks = (size_t)(deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001512 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001513 (blocks - 1) * BLOCKLEN + deque->rightindex);
1514 res += blocks * sizeof(block);
1515 return PyLong_FromSsize_t(res);
1516}
1517
1518PyDoc_STRVAR(sizeof_doc,
1519"D.__sizeof__() -- size of D in memory, in bytes");
1520
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001521static int
1522deque_bool(dequeobject *deque)
1523{
1524 return Py_SIZE(deque) != 0;
1525}
1526
Jesus Cea16e2fca2012-08-03 14:49:42 +02001527static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02001528deque_get_maxlen(dequeobject *deque, void *Py_UNUSED(ignored))
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001529{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001530 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 Py_RETURN_NONE;
1532 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001533}
1534
Raymond Hettinger41290a62015-03-31 08:12:23 -07001535
1536/* deque object ********************************************************/
1537
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001538static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1540 "maximum size of a deque or None if unbounded"},
1541 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001542};
1543
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001544static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001546 (binaryfunc)deque_concat, /* sq_concat */
1547 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 (ssizeargfunc)deque_item, /* sq_item */
1549 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001550 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001552 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001553 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001554 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001555};
1556
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001557static PyNumberMethods deque_as_number = {
1558 0, /* nb_add */
1559 0, /* nb_subtract */
1560 0, /* nb_multiply */
1561 0, /* nb_remainder */
1562 0, /* nb_divmod */
1563 0, /* nb_power */
1564 0, /* nb_negative */
1565 0, /* nb_positive */
1566 0, /* nb_absolute */
1567 (inquiry)deque_bool, /* nb_bool */
1568 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001569 };
1570
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001571static PyObject *deque_iter(dequeobject *deque);
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301572static PyObject *deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored));
Tim Peters1065f752004-10-01 01:03:29 +00001573PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001575
1576static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 {"append", (PyCFunction)deque_append,
1578 METH_O, append_doc},
1579 {"appendleft", (PyCFunction)deque_appendleft,
1580 METH_O, appendleft_doc},
1581 {"clear", (PyCFunction)deque_clearmethod,
1582 METH_NOARGS, clear_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301583 {"__copy__", deque_copy,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 METH_NOARGS, copy_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301585 {"copy", deque_copy,
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001586 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001588 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 {"extend", (PyCFunction)deque_extend,
1590 METH_O, extend_doc},
1591 {"extendleft", (PyCFunction)deque_extendleft,
1592 METH_O, extendleft_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001593 {"index", (PyCFunction)(void(*)(void))deque_index,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001594 METH_FASTCALL, index_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001595 {"insert", (PyCFunction)(void(*)(void))deque_insert,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001596 METH_FASTCALL, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 {"pop", (PyCFunction)deque_pop,
1598 METH_NOARGS, pop_doc},
1599 {"popleft", (PyCFunction)deque_popleft,
1600 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001601 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 METH_NOARGS, reduce_doc},
1603 {"remove", (PyCFunction)deque_remove,
1604 METH_O, remove_doc},
1605 {"__reversed__", (PyCFunction)deque_reviter,
1606 METH_NOARGS, reversed_doc},
1607 {"reverse", (PyCFunction)deque_reverse,
1608 METH_NOARGS, reverse_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001609 {"rotate", (PyCFunction)(void(*)(void))deque_rotate,
Victor Stinnerdd407d52017-02-06 16:06:49 +01001610 METH_FASTCALL, rotate_doc},
Jesus Cea16e2fca2012-08-03 14:49:42 +02001611 {"__sizeof__", (PyCFunction)deque_sizeof,
1612 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001614};
1615
1616PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001617"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001618\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001619A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001620
Neal Norwitz87f10132004-02-29 15:40:53 +00001621static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 PyVarObject_HEAD_INIT(NULL, 0)
1623 "collections.deque", /* tp_name */
1624 sizeof(dequeobject), /* tp_basicsize */
1625 0, /* tp_itemsize */
1626 /* methods */
1627 (destructor)deque_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001628 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 0, /* tp_getattr */
1630 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001631 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001633 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 &deque_as_sequence, /* tp_as_sequence */
1635 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001636 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 0, /* tp_call */
1638 0, /* tp_str */
1639 PyObject_GenericGetAttr, /* tp_getattro */
1640 0, /* tp_setattro */
1641 0, /* tp_as_buffer */
1642 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001643 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 deque_doc, /* tp_doc */
1645 (traverseproc)deque_traverse, /* tp_traverse */
1646 (inquiry)deque_clear, /* tp_clear */
1647 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001648 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 (getiterfunc)deque_iter, /* tp_iter */
1650 0, /* tp_iternext */
1651 deque_methods, /* tp_methods */
1652 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001653 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 0, /* tp_base */
1655 0, /* tp_dict */
1656 0, /* tp_descr_get */
1657 0, /* tp_descr_set */
1658 0, /* tp_dictoffset */
1659 (initproc)deque_init, /* tp_init */
1660 PyType_GenericAlloc, /* tp_alloc */
1661 deque_new, /* tp_new */
1662 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001663};
1664
1665/*********************** Deque Iterator **************************/
1666
1667typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001670 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001672 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001674} dequeiterobject;
1675
Martin v. Löwis59683e82008-06-13 07:50:45 +00001676static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001677
1678static PyObject *
1679deque_iter(dequeobject *deque)
1680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1684 if (it == NULL)
1685 return NULL;
1686 it->b = deque->leftblock;
1687 it->index = deque->leftindex;
1688 Py_INCREF(deque);
1689 it->deque = deque;
1690 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001691 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 PyObject_GC_Track(it);
1693 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001694}
1695
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001696static int
1697dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 Py_VISIT(dio->deque);
1700 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001701}
1702
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001703static void
1704dequeiter_dealloc(dequeiterobject *dio)
1705{
INADA Naokia6296d32017-08-24 14:55:17 +09001706 /* bpo-31095: UnTrack is needed before calling any callbacks */
1707 PyObject_GC_UnTrack(dio);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 Py_XDECREF(dio->deque);
1709 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001710}
1711
1712static PyObject *
1713dequeiter_next(dequeiterobject *it)
1714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 if (it->deque->state != it->state) {
1718 it->counter = 0;
1719 PyErr_SetString(PyExc_RuntimeError,
1720 "deque mutated during iteration");
1721 return NULL;
1722 }
1723 if (it->counter == 0)
1724 return NULL;
1725 assert (!(it->b == it->deque->rightblock &&
1726 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 item = it->b->data[it->index];
1729 it->index++;
1730 it->counter--;
1731 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001732 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 it->b = it->b->rightlink;
1734 it->index = 0;
1735 }
1736 Py_INCREF(item);
1737 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001738}
1739
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001740static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001741dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1742{
1743 Py_ssize_t i, index=0;
1744 PyObject *deque;
1745 dequeiterobject *it;
1746 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1747 return NULL;
1748 assert(type == &dequeiter_type);
1749
1750 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1751 if (!it)
1752 return NULL;
1753 /* consume items from the queue */
1754 for(i=0; i<index; i++) {
1755 PyObject *item = dequeiter_next(it);
1756 if (item) {
1757 Py_DECREF(item);
1758 } else {
1759 if (it->counter) {
1760 Py_DECREF(it);
1761 return NULL;
1762 } else
1763 break;
1764 }
1765 }
1766 return (PyObject*)it;
1767}
1768
1769static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301770dequeiter_len(dequeiterobject *it, PyObject *Py_UNUSED(ignored))
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001771{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001772 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001773}
1774
Armin Rigof5b3e362006-02-11 21:32:43 +00001775PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001776
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001777static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301778dequeiter_reduce(dequeiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001779{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001780 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 +00001781}
1782
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001783static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001785 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001787};
1788
Martin v. Löwis59683e82008-06-13 07:50:45 +00001789static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001791 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 sizeof(dequeiterobject), /* tp_basicsize */
1793 0, /* tp_itemsize */
1794 /* methods */
1795 (destructor)dequeiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001796 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 0, /* tp_getattr */
1798 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001799 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 0, /* tp_repr */
1801 0, /* tp_as_number */
1802 0, /* tp_as_sequence */
1803 0, /* tp_as_mapping */
1804 0, /* tp_hash */
1805 0, /* tp_call */
1806 0, /* tp_str */
1807 PyObject_GenericGetAttr, /* tp_getattro */
1808 0, /* tp_setattro */
1809 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001810 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 0, /* tp_doc */
1812 (traverseproc)dequeiter_traverse, /* tp_traverse */
1813 0, /* tp_clear */
1814 0, /* tp_richcompare */
1815 0, /* tp_weaklistoffset */
1816 PyObject_SelfIter, /* tp_iter */
1817 (iternextfunc)dequeiter_next, /* tp_iternext */
1818 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001819 0, /* tp_members */
1820 0, /* tp_getset */
1821 0, /* tp_base */
1822 0, /* tp_dict */
1823 0, /* tp_descr_get */
1824 0, /* tp_descr_set */
1825 0, /* tp_dictoffset */
1826 0, /* tp_init */
1827 0, /* tp_alloc */
1828 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001830};
1831
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001832/*********************** Deque Reverse Iterator **************************/
1833
Martin v. Löwis59683e82008-06-13 07:50:45 +00001834static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001835
1836static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301837deque_reviter(dequeobject *deque, PyObject *Py_UNUSED(ignored))
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1842 if (it == NULL)
1843 return NULL;
1844 it->b = deque->rightblock;
1845 it->index = deque->rightindex;
1846 Py_INCREF(deque);
1847 it->deque = deque;
1848 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001849 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 PyObject_GC_Track(it);
1851 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001852}
1853
1854static PyObject *
1855dequereviter_next(dequeiterobject *it)
1856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 PyObject *item;
1858 if (it->counter == 0)
1859 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 if (it->deque->state != it->state) {
1862 it->counter = 0;
1863 PyErr_SetString(PyExc_RuntimeError,
1864 "deque mutated during iteration");
1865 return NULL;
1866 }
1867 assert (!(it->b == it->deque->leftblock &&
1868 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 item = it->b->data[it->index];
1871 it->index--;
1872 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001873 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001874 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 it->b = it->b->leftlink;
1876 it->index = BLOCKLEN - 1;
1877 }
1878 Py_INCREF(item);
1879 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001880}
1881
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001882static PyObject *
1883dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1884{
1885 Py_ssize_t i, index=0;
1886 PyObject *deque;
1887 dequeiterobject *it;
1888 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1889 return NULL;
1890 assert(type == &dequereviter_type);
1891
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301892 it = (dequeiterobject*)deque_reviter((dequeobject *)deque, NULL);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001893 if (!it)
1894 return NULL;
1895 /* consume items from the queue */
1896 for(i=0; i<index; i++) {
1897 PyObject *item = dequereviter_next(it);
1898 if (item) {
1899 Py_DECREF(item);
1900 } else {
1901 if (it->counter) {
1902 Py_DECREF(it);
1903 return NULL;
1904 } else
1905 break;
1906 }
1907 }
1908 return (PyObject*)it;
1909}
1910
Martin v. Löwis59683e82008-06-13 07:50:45 +00001911static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001913 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 sizeof(dequeiterobject), /* tp_basicsize */
1915 0, /* tp_itemsize */
1916 /* methods */
1917 (destructor)dequeiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001918 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 0, /* tp_getattr */
1920 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001921 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 0, /* tp_repr */
1923 0, /* tp_as_number */
1924 0, /* tp_as_sequence */
1925 0, /* tp_as_mapping */
1926 0, /* tp_hash */
1927 0, /* tp_call */
1928 0, /* tp_str */
1929 PyObject_GenericGetAttr, /* tp_getattro */
1930 0, /* tp_setattro */
1931 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001932 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 0, /* tp_doc */
1934 (traverseproc)dequeiter_traverse, /* tp_traverse */
1935 0, /* tp_clear */
1936 0, /* tp_richcompare */
1937 0, /* tp_weaklistoffset */
1938 PyObject_SelfIter, /* tp_iter */
1939 (iternextfunc)dequereviter_next, /* tp_iternext */
1940 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001941 0, /* tp_members */
1942 0, /* tp_getset */
1943 0, /* tp_base */
1944 0, /* tp_dict */
1945 0, /* tp_descr_get */
1946 0, /* tp_descr_set */
1947 0, /* tp_dictoffset */
1948 0, /* tp_init */
1949 0, /* tp_alloc */
1950 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001952};
1953
Guido van Rossum1968ad32006-02-25 22:38:04 +00001954/* defaultdict type *********************************************************/
1955
1956typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 PyDictObject dict;
1958 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001959} defdictobject;
1960
1961static PyTypeObject defdict_type; /* Forward */
1962
1963PyDoc_STRVAR(defdict_missing_doc,
1964"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001965 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001966 self[key] = value = self.default_factory()\n\
1967 return value\n\
1968");
1969
1970static PyObject *
1971defdict_missing(defdictobject *dd, PyObject *key)
1972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 PyObject *factory = dd->default_factory;
1974 PyObject *value;
1975 if (factory == NULL || factory == Py_None) {
1976 /* XXX Call dict.__missing__(key) */
1977 PyObject *tup;
1978 tup = PyTuple_Pack(1, key);
1979 if (!tup) return NULL;
1980 PyErr_SetObject(PyExc_KeyError, tup);
1981 Py_DECREF(tup);
1982 return NULL;
1983 }
1984 value = PyEval_CallObject(factory, NULL);
1985 if (value == NULL)
1986 return value;
1987 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1988 Py_DECREF(value);
1989 return NULL;
1990 }
1991 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001992}
1993
1994PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1995
1996static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301997defdict_copy(defdictobject *dd, PyObject *Py_UNUSED(ignored))
Guido van Rossum1968ad32006-02-25 22:38:04 +00001998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 /* This calls the object's class. That only works for subclasses
2000 whose class constructor has the same signature. Subclasses that
2001 define a different constructor signature must override copy().
2002 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 if (dd->default_factory == NULL)
2005 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
2006 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
2007 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002008}
2009
2010static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302011defdict_reduce(defdictobject *dd, PyObject *Py_UNUSED(ignored))
Guido van Rossum1968ad32006-02-25 22:38:04 +00002012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00002014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 - factory function
2016 - tuple of args for the factory function
2017 - additional state (here None)
2018 - sequence iterator (here None)
2019 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 For this to be useful with pickle.py, the default_factory
2024 must be picklable; e.g., None, a built-in, or a global
2025 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 Both shallow and deep copying are supported, but for deep
2028 copying, the default_factory must be deep-copyable; e.g. None,
2029 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00002030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 This only works for subclasses as long as their constructor
2032 signature is compatible; the first argument must be the
2033 optional default_factory, defaulting to None.
2034 */
2035 PyObject *args;
2036 PyObject *items;
2037 PyObject *iter;
2038 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002039 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 if (dd->default_factory == NULL || dd->default_factory == Py_None)
2042 args = PyTuple_New(0);
2043 else
2044 args = PyTuple_Pack(1, dd->default_factory);
2045 if (args == NULL)
2046 return NULL;
Victor Stinnerad8c83a2016-09-05 17:53:15 -07002047 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 if (items == NULL) {
2049 Py_DECREF(args);
2050 return NULL;
2051 }
2052 iter = PyObject_GetIter(items);
2053 if (iter == NULL) {
2054 Py_DECREF(items);
2055 Py_DECREF(args);
2056 return NULL;
2057 }
2058 result = PyTuple_Pack(5, Py_TYPE(dd), args,
2059 Py_None, Py_None, iter);
2060 Py_DECREF(iter);
2061 Py_DECREF(items);
2062 Py_DECREF(args);
2063 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002064}
2065
2066static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 {"__missing__", (PyCFunction)defdict_missing, METH_O,
2068 defdict_missing_doc},
2069 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
2070 defdict_copy_doc},
2071 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
2072 defdict_copy_doc},
2073 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
2074 reduce_doc},
2075 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002076};
2077
2078static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 {"default_factory", T_OBJECT,
2080 offsetof(defdictobject, default_factory), 0,
2081 PyDoc_STR("Factory for default value called by __missing__().")},
2082 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00002083};
2084
2085static void
2086defdict_dealloc(defdictobject *dd)
2087{
INADA Naokia6296d32017-08-24 14:55:17 +09002088 /* bpo-31095: UnTrack is needed before calling any callbacks */
2089 PyObject_GC_UnTrack(dd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 Py_CLEAR(dd->default_factory);
2091 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002092}
2093
Guido van Rossum1968ad32006-02-25 22:38:04 +00002094static PyObject *
2095defdict_repr(defdictobject *dd)
2096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 PyObject *baserepr;
2098 PyObject *defrepr;
2099 PyObject *result;
2100 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2101 if (baserepr == NULL)
2102 return NULL;
2103 if (dd->default_factory == NULL)
2104 defrepr = PyUnicode_FromString("None");
2105 else
2106 {
2107 int status = Py_ReprEnter(dd->default_factory);
2108 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002109 if (status < 0) {
2110 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002112 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 defrepr = PyUnicode_FromString("...");
2114 }
2115 else
2116 defrepr = PyObject_Repr(dd->default_factory);
2117 Py_ReprLeave(dd->default_factory);
2118 }
2119 if (defrepr == NULL) {
2120 Py_DECREF(baserepr);
2121 return NULL;
2122 }
Serhiy Storchakab3a77962017-09-21 14:24:13 +03002123 result = PyUnicode_FromFormat("%s(%U, %U)",
2124 _PyType_Name(Py_TYPE(dd)),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 defrepr, baserepr);
2126 Py_DECREF(defrepr);
2127 Py_DECREF(baserepr);
2128 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002129}
2130
2131static int
2132defdict_traverse(PyObject *self, visitproc visit, void *arg)
2133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 Py_VISIT(((defdictobject *)self)->default_factory);
2135 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002136}
2137
2138static int
2139defdict_tp_clear(defdictobject *dd)
2140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 Py_CLEAR(dd->default_factory);
2142 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002143}
2144
2145static int
2146defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 defdictobject *dd = (defdictobject *)self;
2149 PyObject *olddefault = dd->default_factory;
2150 PyObject *newdefault = NULL;
2151 PyObject *newargs;
2152 int result;
2153 if (args == NULL || !PyTuple_Check(args))
2154 newargs = PyTuple_New(0);
2155 else {
2156 Py_ssize_t n = PyTuple_GET_SIZE(args);
2157 if (n > 0) {
2158 newdefault = PyTuple_GET_ITEM(args, 0);
2159 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2160 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002161 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 return -1;
2163 }
2164 }
2165 newargs = PySequence_GetSlice(args, 1, n);
2166 }
2167 if (newargs == NULL)
2168 return -1;
2169 Py_XINCREF(newdefault);
2170 dd->default_factory = newdefault;
2171 result = PyDict_Type.tp_init(self, newargs, kwds);
2172 Py_DECREF(newargs);
2173 Py_XDECREF(olddefault);
2174 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002175}
2176
2177PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002178"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002179\n\
2180The default factory is called without arguments to produce\n\
2181a new value when a key is not present, in __getitem__ only.\n\
2182A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002183All remaining arguments are treated the same as if they were\n\
2184passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002185");
2186
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002187/* See comment in xxsubtype.c */
2188#define DEFERRED_ADDRESS(ADDR) 0
2189
Guido van Rossum1968ad32006-02-25 22:38:04 +00002190static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2192 "collections.defaultdict", /* tp_name */
2193 sizeof(defdictobject), /* tp_basicsize */
2194 0, /* tp_itemsize */
2195 /* methods */
2196 (destructor)defdict_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002197 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 0, /* tp_getattr */
2199 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002200 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 (reprfunc)defdict_repr, /* tp_repr */
2202 0, /* tp_as_number */
2203 0, /* tp_as_sequence */
2204 0, /* tp_as_mapping */
2205 0, /* tp_hash */
2206 0, /* tp_call */
2207 0, /* tp_str */
2208 PyObject_GenericGetAttr, /* tp_getattro */
2209 0, /* tp_setattro */
2210 0, /* tp_as_buffer */
2211 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2212 /* tp_flags */
2213 defdict_doc, /* tp_doc */
2214 defdict_traverse, /* tp_traverse */
2215 (inquiry)defdict_tp_clear, /* tp_clear */
2216 0, /* tp_richcompare */
2217 0, /* tp_weaklistoffset*/
2218 0, /* tp_iter */
2219 0, /* tp_iternext */
2220 defdict_methods, /* tp_methods */
2221 defdict_members, /* tp_members */
2222 0, /* tp_getset */
2223 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2224 0, /* tp_dict */
2225 0, /* tp_descr_get */
2226 0, /* tp_descr_set */
2227 0, /* tp_dictoffset */
2228 defdict_init, /* tp_init */
2229 PyType_GenericAlloc, /* tp_alloc */
2230 0, /* tp_new */
2231 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002232};
2233
Raymond Hettinger96f34102010-12-15 16:30:37 +00002234/* helper function for Counter *********************************************/
2235
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002236/*[clinic input]
2237_collections._count_elements
2238
2239 mapping: object
2240 iterable: object
2241 /
2242
2243Count elements in the iterable, updating the mapping
2244[clinic start generated code]*/
Raymond Hettinger96f34102010-12-15 16:30:37 +00002245
2246static PyObject *
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002247_collections__count_elements_impl(PyObject *module, PyObject *mapping,
2248 PyObject *iterable)
2249/*[clinic end generated code: output=7e0c1789636b3d8f input=e79fad04534a0b45]*/
Raymond Hettinger96f34102010-12-15 16:30:37 +00002250{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002251 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002252 _Py_IDENTIFIER(__setitem__);
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002253 PyObject *it, *oldval;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002254 PyObject *newval = NULL;
2255 PyObject *key = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002256 PyObject *bound_get = NULL;
2257 PyObject *mapping_get;
2258 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002259 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002260 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002261
Raymond Hettinger96f34102010-12-15 16:30:37 +00002262 it = PyObject_GetIter(iterable);
2263 if (it == NULL)
2264 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002265
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002266 /* Only take the fast path when get() and __setitem__()
2267 * have not been overridden.
2268 */
2269 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2270 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002271 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2272 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2273
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002274 if (mapping_get != NULL && mapping_get == dict_get &&
Oren Milman31aca4b2017-09-27 06:18:21 +03002275 mapping_setitem != NULL && mapping_setitem == dict_setitem &&
2276 PyDict_Check(mapping))
2277 {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002278 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002279 /* Fast path advantages:
2280 1. Eliminate double hashing
2281 (by re-using the same hash for both the get and set)
2282 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2283 (argument tuple creation and parsing)
2284 3. Avoid indirection through a bound method object
2285 (creates another argument tuple)
2286 4. Avoid initial increment from zero
2287 (reuse an existing one-object instead)
2288 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002289 Py_hash_t hash;
2290
Raymond Hettinger426e0522011-01-03 02:12:02 +00002291 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002292 if (key == NULL)
2293 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002294
2295 if (!PyUnicode_CheckExact(key) ||
2296 (hash = ((PyASCIIObject *) key)->hash) == -1)
2297 {
2298 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002299 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002300 goto done;
2301 }
2302
2303 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002304 if (oldval == NULL) {
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02002305 if (PyErr_Occurred())
2306 goto done;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002307 if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_One, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002308 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002309 } else {
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002310 newval = PyNumber_Add(oldval, _PyLong_One);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002311 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002312 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002313 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002314 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002315 Py_CLEAR(newval);
2316 }
2317 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002318 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002319 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002320 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002321 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002322 goto done;
2323
Raymond Hettinger426e0522011-01-03 02:12:02 +00002324 while (1) {
2325 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002326 if (key == NULL)
2327 break;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002328 oldval = PyObject_CallFunctionObjArgs(bound_get, key, _PyLong_Zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002329 if (oldval == NULL)
2330 break;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002331 newval = PyNumber_Add(oldval, _PyLong_One);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002332 Py_DECREF(oldval);
2333 if (newval == NULL)
2334 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002335 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002336 break;
2337 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002338 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002339 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002340 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002341
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002342done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002343 Py_DECREF(it);
2344 Py_XDECREF(key);
2345 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002346 Py_XDECREF(bound_get);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002347 if (PyErr_Occurred())
2348 return NULL;
2349 Py_RETURN_NONE;
2350}
2351
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002352/* Helper function for namedtuple() ************************************/
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002353
2354typedef struct {
2355 PyObject_HEAD
2356 Py_ssize_t index;
2357 PyObject* doc;
2358} _tuplegetterobject;
2359
2360/*[clinic input]
2361@classmethod
2362_tuplegetter.__new__ as tuplegetter_new
2363
2364 index: Py_ssize_t
2365 doc: object
2366 /
2367[clinic start generated code]*/
2368
2369static PyObject *
2370tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc)
2371/*[clinic end generated code: output=014be444ad80263f input=87c576a5bdbc0bbb]*/
2372{
2373 _tuplegetterobject* self;
2374 self = (_tuplegetterobject *)type->tp_alloc(type, 0);
2375 if (self == NULL) {
2376 return NULL;
2377 }
2378 self->index = index;
2379 Py_INCREF(doc);
2380 self->doc = doc;
2381 return (PyObject *)self;
2382}
2383
2384static PyObject *
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002385tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002386{
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002387 Py_ssize_t index = ((_tuplegetterobject*)self)->index;
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002388 PyObject *result;
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002389
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002390 if (obj == NULL) {
2391 Py_INCREF(self);
2392 return self;
2393 }
2394 if (!PyTuple_Check(obj)) {
2395 if (obj == Py_None) {
2396 Py_INCREF(self);
2397 return self;
2398 }
2399 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02002400 "descriptor for index '%zd' for tuple subclasses "
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002401 "doesn't apply to '%s' object",
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002402 index,
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002403 obj->ob_type->tp_name);
2404 return NULL;
2405 }
2406
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002407 if (!valid_index(index, PyTuple_GET_SIZE(obj))) {
2408 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
2409 return NULL;
2410 }
2411
2412 result = PyTuple_GET_ITEM(obj, index);
2413 Py_INCREF(result);
2414 return result;
2415}
2416
2417static int
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002418tuplegetter_descr_set(PyObject *self, PyObject *obj, PyObject *value)
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002419{
2420 if (value == NULL) {
2421 PyErr_SetString(PyExc_AttributeError, "can't delete attribute");
2422 } else {
2423 PyErr_SetString(PyExc_AttributeError, "can't set attribute");
2424 }
2425 return -1;
2426}
2427
2428static int
2429tuplegetter_traverse(PyObject *self, visitproc visit, void *arg)
2430{
2431 _tuplegetterobject *tuplegetter = (_tuplegetterobject *)self;
2432 Py_VISIT(tuplegetter->doc);
2433 return 0;
2434}
2435
2436static int
2437tuplegetter_clear(PyObject *self)
2438{
2439 _tuplegetterobject *tuplegetter = (_tuplegetterobject *)self;
2440 Py_CLEAR(tuplegetter->doc);
2441 return 0;
2442}
2443
2444static void
2445tuplegetter_dealloc(_tuplegetterobject *self)
2446{
2447 PyObject_GC_UnTrack(self);
2448 tuplegetter_clear((PyObject*)self);
2449 Py_TYPE(self)->tp_free((PyObject*)self);
2450}
2451
Joe Jevnikf36f8922019-02-21 16:00:40 -05002452static PyObject*
Serhiy Storchakaadfffc72019-03-05 18:41:09 +02002453tuplegetter_reduce(_tuplegetterobject *self, PyObject *Py_UNUSED(ignored))
Joe Jevnikf36f8922019-02-21 16:00:40 -05002454{
2455 return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc);
2456}
2457
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002458
2459static PyMemberDef tuplegetter_members[] = {
2460 {"__doc__", T_OBJECT, offsetof(_tuplegetterobject, doc), 0},
2461 {0}
2462};
2463
Joe Jevnikf36f8922019-02-21 16:00:40 -05002464static PyMethodDef tuplegetter_methods[] = {
Serhiy Storchakaadfffc72019-03-05 18:41:09 +02002465 {"__reduce__", (PyCFunction)tuplegetter_reduce, METH_NOARGS, NULL},
Joe Jevnikf36f8922019-02-21 16:00:40 -05002466 {NULL},
2467};
2468
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002469static PyTypeObject tuplegetter_type = {
2470 PyVarObject_HEAD_INIT(NULL, 0)
2471 "_collections._tuplegetter", /* tp_name */
2472 sizeof(_tuplegetterobject), /* tp_basicsize */
2473 0, /* tp_itemsize */
2474 /* methods */
2475 (destructor)tuplegetter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002476 0, /* tp_vectorcall_offset */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002477 0, /* tp_getattr */
2478 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002479 0, /* tp_as_async */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002480 0, /* tp_repr */
2481 0, /* tp_as_number */
2482 0, /* tp_as_sequence */
2483 0, /* tp_as_mapping */
2484 0, /* tp_hash */
2485 0, /* tp_call */
2486 0, /* tp_str */
2487 0, /* tp_getattro */
2488 0, /* tp_setattro */
2489 0, /* tp_as_buffer */
2490 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2491 0, /* tp_doc */
2492 (traverseproc)tuplegetter_traverse, /* tp_traverse */
2493 (inquiry)tuplegetter_clear, /* tp_clear */
2494 0, /* tp_richcompare */
2495 0, /* tp_weaklistoffset */
2496 0, /* tp_iter */
2497 0, /* tp_iternext */
Joe Jevnikf36f8922019-02-21 16:00:40 -05002498 tuplegetter_methods, /* tp_methods */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002499 tuplegetter_members, /* tp_members */
2500 0, /* tp_getset */
2501 0, /* tp_base */
2502 0, /* tp_dict */
Serhiy Storchaka052b2df2018-12-31 14:15:16 +02002503 tuplegetter_descr_get, /* tp_descr_get */
2504 tuplegetter_descr_set, /* tp_descr_set */
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002505 0, /* tp_dictoffset */
2506 0, /* tp_init */
2507 0, /* tp_alloc */
2508 tuplegetter_new, /* tp_new */
2509 0,
2510};
2511
2512
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002513/* module level code ********************************************************/
2514
2515PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002516"High performance data structures.\n\
2517- deque: ordered collection accessible from endpoints only\n\
2518- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002519");
2520
Raymond Hettinger96f34102010-12-15 16:30:37 +00002521static struct PyMethodDef module_functions[] = {
Miss Islington (bot)21ce2452019-06-05 16:20:58 -07002522 _COLLECTIONS__COUNT_ELEMENTS_METHODDEF
Raymond Hettinger96f34102010-12-15 16:30:37 +00002523 {NULL, NULL} /* sentinel */
2524};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002525
2526static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 PyModuleDef_HEAD_INIT,
2528 "_collections",
2529 module_doc,
2530 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002531 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 NULL,
2533 NULL,
2534 NULL,
2535 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002536};
2537
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002538PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002539PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 m = PyModule_Create(&_collectionsmodule);
2544 if (m == NULL)
2545 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 if (PyType_Ready(&deque_type) < 0)
2548 return NULL;
2549 Py_INCREF(&deque_type);
2550 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 defdict_type.tp_base = &PyDict_Type;
2553 if (PyType_Ready(&defdict_type) < 0)
2554 return NULL;
2555 Py_INCREF(&defdict_type);
2556 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002557
Eric Snow47db7172015-05-29 22:21:39 -06002558 Py_INCREF(&PyODict_Type);
2559 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 if (PyType_Ready(&dequeiter_type) < 0)
2562 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002563 Py_INCREF(&dequeiter_type);
2564 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 if (PyType_Ready(&dequereviter_type) < 0)
2567 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002568 Py_INCREF(&dequereviter_type);
2569 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002570
Pablo Galindo3f5fc702018-12-30 09:24:03 +00002571 if (PyType_Ready(&tuplegetter_type) < 0)
2572 return NULL;
2573 Py_INCREF(&tuplegetter_type);
2574 PyModule_AddObject(m, "_tuplegetter", (PyObject *)&tuplegetter_type);
2575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002577}