blob: 17233e4089450303400b24da0f17500c4a50445a [file] [log] [blame]
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001#include "Python.h"
Raymond Hettinger691d8052004-05-30 07:26:47 +00002#include "structmember.h"
Raymond Hettinger756b3f32004-01-29 06:37:52 +00003
Raymond Hettingerc2083082015-02-28 23:29:16 -08004#ifdef STDC_HEADERS
5#include <stddef.h>
6#else
7#include <sys/types.h> /* For size_t */
8#endif
9
Raymond Hettinger756b3f32004-01-29 06:37:52 +000010/* collections module implementation of a deque() datatype
11 Written and maintained by Raymond D. Hettinger <python@rcn.com>
Raymond Hettingereb6b5542015-02-10 22:37:22 -060012 Copyright (c) 2004-2015 Python Software Foundation.
Raymond Hettinger756b3f32004-01-29 06:37:52 +000013 All rights reserved.
14*/
15
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000016/* The block length may be set to any number over 1. Larger numbers
Raymond Hettinger20b0f872013-06-23 15:44:33 -070017 * reduce the number of calls to the memory allocator, give faster
Raymond Hettinger30c90742015-03-02 22:31:35 -080018 * indexing and rotation, and reduce the link to data overhead ratio.
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080019 * Making the block length a power of two speeds-up the modulo
Raymond Hettinger30c90742015-03-02 22:31:35 -080020 * and division calculations in deque_item() and deque_ass_item().
Raymond Hettinger77e8bf12004-10-01 15:25:53 +000021 */
22
Raymond Hettingerdaf57f22015-02-26 23:21:29 -080023#define BLOCKLEN 64
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000024#define CENTER ((BLOCKLEN - 1) / 2)
Raymond Hettinger756b3f32004-01-29 06:37:52 +000025
Raymond Hettinger551350a2015-03-24 00:19:53 -070026/* Data for deque objects is stored in a doubly-linked list of fixed
27 * length blocks. This assures that appends or pops never move any
28 * other data elements besides the one being appended or popped.
29 *
30 * Another advantage is that it completely avoids use of realloc(),
31 * resulting in more predictable performance.
32 *
33 * Textbook implementations of doubly-linked lists store one datum
34 * per link, but that gives them a 200% memory overhead (a prev and
35 * next link for each datum) and it costs one malloc() call per data
36 * element. By using fixed-length blocks, the link to data ratio is
37 * significantly improved and there are proportionally fewer calls
38 * to malloc() and free(). The data blocks of consecutive pointers
39 * also improve cache locality.
40 *
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000041 * The list of blocks is never empty, so d.leftblock and d.rightblock
Raymond Hettinger82df9252013-07-07 01:43:42 -100042 * are never equal to NULL. The list is not circular.
43 *
44 * A deque d's first element is at d.leftblock[leftindex]
45 * and its last element is at d.rightblock[rightindex].
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000046 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070047 * Unlike Python slice indices, these indices are inclusive on both
48 * ends. This makes the algorithms for left and right operations
49 * more symmetrical and it simplifies the design.
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000050 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070051 * The indices, d.leftindex and d.rightindex are always in the range:
52 * 0 <= index < BLOCKLEN
53 *
54 * And their exact relationship is:
55 * (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex
Raymond Hettinger61f05fb2004-10-01 06:24:12 +000056 *
Raymond Hettinger8dbbae22015-03-24 21:01:50 -070057 * Whenever d.leftblock == d.rightblock, then:
Raymond Hettinger551350a2015-03-24 00:19:53 -070058 * d.leftindex + d.len - 1 == d.rightindex
Thomas Wouters0e3f5912006-08-11 14:57:12 +000059 *
Raymond Hettinger551350a2015-03-24 00:19:53 -070060 * However, when d.leftblock != d.rightblock, the d.leftindex and
61 * d.rightindex become indices into distinct blocks and either may
62 * be larger than the other.
63 *
64 * Empty deques have:
65 * d.len == 0
66 * d.leftblock == d.rightblock
67 * d.leftindex == CENTER + 1
68 * d.rightindex == CENTER
69 *
70 * Checking for d.len == 0 is the intended way to see whether d is empty.
Tim Petersd8768d32004-10-01 01:32:53 +000071 */
72
Raymond Hettinger756b3f32004-01-29 06:37:52 +000073typedef struct BLOCK {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 struct BLOCK *leftlink;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 PyObject *data[BLOCKLEN];
Raymond Hettinger20b0f872013-06-23 15:44:33 -070076 struct BLOCK *rightlink;
Raymond Hettinger756b3f32004-01-29 06:37:52 +000077} block;
78
Raymond Hettinger30c90742015-03-02 22:31:35 -080079typedef struct {
80 PyObject_VAR_HEAD
81 block *leftblock;
82 block *rightblock;
Raymond Hettinger551350a2015-03-24 00:19:53 -070083 Py_ssize_t leftindex; /* 0 <= leftindex < BLOCKLEN */
84 Py_ssize_t rightindex; /* 0 <= rightindex < BLOCKLEN */
Raymond Hettingerf9d9c792015-03-02 22:47:46 -080085 size_t state; /* incremented whenever the indices move */
Raymond Hettinger30c90742015-03-02 22:31:35 -080086 Py_ssize_t maxlen;
Raymond Hettinger0f6f9472015-03-21 01:42:10 -070087 PyObject *weakreflist;
Raymond Hettinger30c90742015-03-02 22:31:35 -080088} dequeobject;
89
90static PyTypeObject deque_type;
91
Raymond Hettinger82df9252013-07-07 01:43:42 -100092/* For debug builds, add error checking to track the endpoints
93 * in the chain of links. The goal is to make sure that link
94 * assignments only take place at endpoints so that links already
95 * in use do not get overwritten.
96 *
97 * CHECK_END should happen before each assignment to a block's link field.
98 * MARK_END should happen whenever a link field becomes a new endpoint.
99 * This happens when new blocks are added or whenever an existing
100 * block is freed leaving another existing block as the new endpoint.
101 */
102
Raymond Hettinger3223dd52013-07-26 23:14:22 -0700103#ifndef NDEBUG
Raymond Hettinger82df9252013-07-07 01:43:42 -1000104#define MARK_END(link) link = NULL;
105#define CHECK_END(link) assert(link == NULL);
106#define CHECK_NOT_END(link) assert(link != NULL);
107#else
108#define MARK_END(link)
109#define CHECK_END(link)
110#define CHECK_NOT_END(link)
111#endif
112
Raymond Hettinger41290a62015-03-31 08:12:23 -0700113/* To prevent len from overflowing PY_SSIZE_T_MAX, we refuse to
114 allocate new blocks if the current len is nearing overflow.
115*/
116
117#define MAX_DEQUE_LEN (PY_SSIZE_T_MAX - 3*BLOCKLEN)
118
Raymond Hettinger82df9252013-07-07 01:43:42 -1000119/* A simple freelisting scheme is used to minimize calls to the memory
Raymond Hettinger551350a2015-03-24 00:19:53 -0700120 allocator. It accommodates common use cases where new blocks are being
Raymond Hettinger82df9252013-07-07 01:43:42 -1000121 added at about the same rate as old blocks are being freed.
122 */
123
Guido van Rossum58da9312007-11-10 23:39:45 +0000124#define MAXFREEBLOCKS 10
Benjamin Petersond6313712008-07-31 16:23:04 +0000125static Py_ssize_t numfreeblocks = 0;
Guido van Rossum58da9312007-11-10 23:39:45 +0000126static block *freeblocks[MAXFREEBLOCKS];
127
Tim Peters6f853562004-10-01 01:04:50 +0000128static block *
Raymond Hettinger82df9252013-07-07 01:43:42 -1000129newblock(Py_ssize_t len) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 block *b;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700131 if (len >= MAX_DEQUE_LEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 PyErr_SetString(PyExc_OverflowError,
133 "cannot add more blocks to the deque");
134 return NULL;
135 }
136 if (numfreeblocks) {
Raymond Hettinger59cf23a2013-02-07 00:57:19 -0500137 numfreeblocks--;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000138 return freeblocks[numfreeblocks];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000140 b = PyMem_Malloc(sizeof(block));
141 if (b != NULL) {
142 return b;
143 }
144 PyErr_NoMemory();
145 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000146}
147
Martin v. Löwis59683e82008-06-13 07:50:45 +0000148static void
Guido van Rossum58da9312007-11-10 23:39:45 +0000149freeblock(block *b)
150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 if (numfreeblocks < MAXFREEBLOCKS) {
152 freeblocks[numfreeblocks] = b;
153 numfreeblocks++;
154 } else {
155 PyMem_Free(b);
156 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000157}
158
Raymond Hettingerda2850f2015-02-27 12:42:54 -0800159/* XXX Todo:
Raymond Hettinger54023152014-04-23 00:58:48 -0700160 If aligned memory allocations become available, make the
161 deque object 64 byte aligned so that all of the fields
162 can be retrieved or updated in a single cache line.
163*/
164
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000165static PyObject *
166deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 dequeobject *deque;
169 block *b;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 /* create dequeobject structure */
172 deque = (dequeobject *)type->tp_alloc(type, 0);
173 if (deque == NULL)
174 return NULL;
Tim Peters1065f752004-10-01 01:03:29 +0000175
Raymond Hettinger82df9252013-07-07 01:43:42 -1000176 b = newblock(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 if (b == NULL) {
178 Py_DECREF(deque);
179 return NULL;
180 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000181 MARK_END(b->leftlink);
182 MARK_END(b->rightlink);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 assert(BLOCKLEN >= 2);
Raymond Hettinger87e69122015-03-02 23:32:02 -0800185 Py_SIZE(deque) = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 deque->leftblock = b;
187 deque->rightblock = b;
188 deque->leftindex = CENTER + 1;
189 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 deque->state = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 deque->maxlen = -1;
Raymond Hettinger87e69122015-03-02 23:32:02 -0800192 deque->weakreflist = NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 return (PyObject *)deque;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000195}
196
197static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000198deque_pop(dequeobject *deque, PyObject *unused)
199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 PyObject *item;
201 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000202
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000203 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
205 return NULL;
206 }
207 item = deque->rightblock->data[deque->rightindex];
208 deque->rightindex--;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000209 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 if (deque->rightindex == -1) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700213 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 prevblock = deque->rightblock->leftlink;
215 assert(deque->leftblock != deque->rightblock);
216 freeblock(deque->rightblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000217 CHECK_NOT_END(prevblock);
218 MARK_END(prevblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 deque->rightblock = prevblock;
220 deque->rightindex = BLOCKLEN - 1;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700221 } else {
222 assert(deque->leftblock == deque->rightblock);
223 assert(deque->leftindex == deque->rightindex+1);
224 /* re-center instead of freeing a block */
225 deque->leftindex = CENTER + 1;
226 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 }
228 }
229 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000230}
231
232PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");
233
234static PyObject *
235deque_popleft(dequeobject *deque, PyObject *unused)
236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 PyObject *item;
238 block *prevblock;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000239
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000240 if (Py_SIZE(deque) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
242 return NULL;
243 }
244 assert(deque->leftblock != NULL);
245 item = deque->leftblock->data[deque->leftindex];
246 deque->leftindex++;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000247 Py_SIZE(deque)--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 deque->state++;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 if (deque->leftindex == BLOCKLEN) {
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700251 if (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 assert(deque->leftblock != deque->rightblock);
253 prevblock = deque->leftblock->rightlink;
254 freeblock(deque->leftblock);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000255 CHECK_NOT_END(prevblock);
256 MARK_END(prevblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 deque->leftblock = prevblock;
258 deque->leftindex = 0;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700259 } else {
260 assert(deque->leftblock == deque->rightblock);
261 assert(deque->leftindex == deque->rightindex+1);
262 /* re-center instead of freeing a block */
263 deque->leftindex = CENTER + 1;
264 deque->rightindex = CENTER;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 }
266 }
267 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000268}
269
270PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
271
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800272/* The deque's size limit is d.maxlen. The limit can be zero or positive.
273 * If there is no limit, then d.maxlen == -1.
274 *
275 * After an item is added to a deque, we check to see if the size has grown past
276 * the limit. If it has, we get the size back down to the limit by popping an
277 * item off of the opposite end. The methods that can trigger this are append(),
278 * appendleft(), extend(), and extendleft().
279 */
280
281static void
282deque_trim_right(dequeobject *deque)
283{
284 if (deque->maxlen != -1 && Py_SIZE(deque) > deque->maxlen) {
285 PyObject *rv = deque_pop(deque, NULL);
286 assert(rv != NULL);
287 assert(Py_SIZE(deque) <= deque->maxlen);
288 Py_DECREF(rv);
289 }
290}
291
292static void
293deque_trim_left(dequeobject *deque)
294{
295 if (deque->maxlen != -1 && Py_SIZE(deque) > deque->maxlen) {
296 PyObject *rv = deque_popleft(deque, NULL);
297 assert(rv != NULL);
298 assert(Py_SIZE(deque) <= deque->maxlen);
299 Py_DECREF(rv);
300 }
301}
302
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000303static PyObject *
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000304deque_append(dequeobject *deque, PyObject *item)
305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 deque->state++;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700307 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000308 block *b = newblock(Py_SIZE(deque));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 if (b == NULL)
310 return NULL;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000311 b->leftlink = deque->rightblock;
312 CHECK_END(deque->rightblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 deque->rightblock->rightlink = b;
314 deque->rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000315 MARK_END(b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 deque->rightindex = -1;
317 }
318 Py_INCREF(item);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000319 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 deque->rightindex++;
321 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800322 deque_trim_left(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000324}
325
326PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
327
328static PyObject *
329deque_appendleft(dequeobject *deque, PyObject *item)
330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 deque->state++;
332 if (deque->leftindex == 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000333 block *b = newblock(Py_SIZE(deque));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 if (b == NULL)
335 return NULL;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000336 b->rightlink = deque->leftblock;
337 CHECK_END(deque->leftblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 deque->leftblock->leftlink = b;
339 deque->leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000340 MARK_END(b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 deque->leftindex = BLOCKLEN;
342 }
343 Py_INCREF(item);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000344 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 deque->leftindex--;
346 deque->leftblock->data[deque->leftindex] = item;
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800347 deque_trim_right(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 Py_RETURN_NONE;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000349}
350
351PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
352
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354/* Run an iterator to exhaustion. Shortcut for
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000355 the extend/extendleft methods when maxlen == 0. */
356static PyObject*
357consume_iterator(PyObject *it)
358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 PyObject *item;
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 while ((item = PyIter_Next(it)) != NULL) {
362 Py_DECREF(item);
363 }
364 Py_DECREF(it);
365 if (PyErr_Occurred())
366 return NULL;
367 Py_RETURN_NONE;
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000368}
369
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000370static PyObject *
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000371deque_extend(dequeobject *deque, PyObject *iterable)
372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 PyObject *it, *item;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 /* Handle case where id(deque) == id(iterable) */
376 if ((PyObject *)deque == iterable) {
377 PyObject *result;
378 PyObject *s = PySequence_List(iterable);
379 if (s == NULL)
380 return NULL;
381 result = deque_extend(deque, s);
382 Py_DECREF(s);
383 return result;
384 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000385
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700386 /* Space saving heuristic. Start filling from the left */
387 if (Py_SIZE(deque) == 0) {
388 assert(deque->leftblock == deque->rightblock);
389 assert(deque->leftindex == deque->rightindex+1);
390 deque->leftindex = 1;
391 deque->rightindex = 0;
392 }
393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 it = PyObject_GetIter(iterable);
395 if (it == NULL)
396 return NULL;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (deque->maxlen == 0)
399 return consume_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 while ((item = PyIter_Next(it)) != NULL) {
402 deque->state++;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700403 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000404 block *b = newblock(Py_SIZE(deque));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 if (b == NULL) {
406 Py_DECREF(item);
407 Py_DECREF(it);
408 return NULL;
409 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000410 b->leftlink = deque->rightblock;
411 CHECK_END(deque->rightblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 deque->rightblock->rightlink = b;
413 deque->rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000414 MARK_END(b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 deque->rightindex = -1;
416 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000417 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 deque->rightindex++;
419 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800420 deque_trim_left(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 }
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700422 if (PyErr_Occurred()) {
423 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 return NULL;
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700425 }
426 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 Py_RETURN_NONE;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000428}
429
Tim Peters1065f752004-10-01 01:03:29 +0000430PyDoc_STRVAR(extend_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000431"Extend the right side of the deque with elements from the iterable");
432
433static PyObject *
434deque_extendleft(dequeobject *deque, PyObject *iterable)
435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 PyObject *it, *item;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 /* Handle case where id(deque) == id(iterable) */
439 if ((PyObject *)deque == iterable) {
440 PyObject *result;
441 PyObject *s = PySequence_List(iterable);
442 if (s == NULL)
443 return NULL;
444 result = deque_extendleft(deque, s);
445 Py_DECREF(s);
446 return result;
447 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000448
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700449 /* Space saving heuristic. Start filling from the right */
450 if (Py_SIZE(deque) == 0) {
451 assert(deque->leftblock == deque->rightblock);
452 assert(deque->leftindex == deque->rightindex+1);
453 deque->leftindex = BLOCKLEN - 1;
454 deque->rightindex = BLOCKLEN - 2;
455 }
456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 it = PyObject_GetIter(iterable);
458 if (it == NULL)
459 return NULL;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 if (deque->maxlen == 0)
462 return consume_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 while ((item = PyIter_Next(it)) != NULL) {
465 deque->state++;
466 if (deque->leftindex == 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000467 block *b = newblock(Py_SIZE(deque));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 if (b == NULL) {
469 Py_DECREF(item);
470 Py_DECREF(it);
471 return NULL;
472 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000473 b->rightlink = deque->leftblock;
474 CHECK_END(deque->leftblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 deque->leftblock->leftlink = b;
476 deque->leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000477 MARK_END(b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 deque->leftindex = BLOCKLEN;
479 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000480 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 deque->leftindex--;
482 deque->leftblock->data[deque->leftindex] = item;
Raymond Hettingerf30f5b92015-03-02 22:23:37 -0800483 deque_trim_right(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 }
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700485 if (PyErr_Occurred()) {
486 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 return NULL;
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700488 }
489 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 Py_RETURN_NONE;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000491}
492
Tim Peters1065f752004-10-01 01:03:29 +0000493PyDoc_STRVAR(extendleft_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000494"Extend the left side of the deque with elements from the iterable");
495
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000496static PyObject *
497deque_inplace_concat(dequeobject *deque, PyObject *other)
498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 PyObject *result;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 result = deque_extend(deque, other);
502 if (result == NULL)
503 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 Py_INCREF(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700505 Py_DECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 return (PyObject *)deque;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000507}
508
Raymond Hettinger41290a62015-03-31 08:12:23 -0700509static PyObject *deque_copy(PyObject *deque);
510
511static PyObject *
512deque_concat(dequeobject *deque, PyObject *other)
513{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400514 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700515 int rv;
516
517 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
518 if (rv <= 0) {
519 if (rv == 0) {
520 PyErr_Format(PyExc_TypeError,
521 "can only concatenate deque (not \"%.200s\") to deque",
522 other->ob_type->tp_name);
523 }
524 return NULL;
525 }
526
527 new_deque = deque_copy((PyObject *)deque);
528 if (new_deque == NULL)
529 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400530 result = deque_extend((dequeobject *)new_deque, other);
531 if (result == NULL) {
532 Py_DECREF(new_deque);
533 return NULL;
534 }
535 Py_DECREF(result);
536 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700537}
538
539static void deque_clear(dequeobject *deque);
540
541static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700542deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
543{
544 Py_ssize_t i, size;
545 PyObject *seq;
546 PyObject *rv;
547
548 size = Py_SIZE(deque);
549 if (size == 0 || n == 1) {
550 Py_INCREF(deque);
551 return (PyObject *)deque;
552 }
553
554 if (n <= 0) {
555 deque_clear(deque);
556 Py_INCREF(deque);
557 return (PyObject *)deque;
558 }
559
Raymond Hettinger41290a62015-03-31 08:12:23 -0700560 if (size == 1) {
561 /* common case, repeating a single element */
562 PyObject *item = deque->leftblock->data[deque->leftindex];
563
564 if (deque->maxlen != -1 && n > deque->maxlen)
565 n = deque->maxlen;
566
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400567 if (n > MAX_DEQUE_LEN)
568 return PyErr_NoMemory();
569
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400570 deque->state++;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700571 for (i = 0 ; i < n-1 ; i++) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400572 if (deque->rightindex == BLOCKLEN - 1) {
573 block *b = newblock(Py_SIZE(deque) + i);
574 if (b == NULL) {
575 Py_SIZE(deque) += i;
576 return NULL;
577 }
578 b->leftlink = deque->rightblock;
579 CHECK_END(deque->rightblock->rightlink);
580 deque->rightblock->rightlink = b;
581 deque->rightblock = b;
582 MARK_END(b->rightlink);
583 deque->rightindex = -1;
584 }
585 deque->rightindex++;
586 Py_INCREF(item);
587 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700588 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400589 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700590 Py_INCREF(deque);
591 return (PyObject *)deque;
592 }
593
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400594 if ((size_t)size > MAX_DEQUE_LEN / (size_t)n) {
595 return PyErr_NoMemory();
596 }
597
Raymond Hettinger41290a62015-03-31 08:12:23 -0700598 seq = PySequence_List((PyObject *)deque);
599 if (seq == NULL)
600 return seq;
601
602 for (i = 0 ; i < n-1 ; i++) {
603 rv = deque_extend(deque, seq);
604 if (rv == NULL) {
605 Py_DECREF(seq);
606 return NULL;
607 }
608 Py_DECREF(rv);
609 }
610 Py_INCREF(deque);
611 Py_DECREF(seq);
612 return (PyObject *)deque;
613}
614
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400615static PyObject *
616deque_repeat(dequeobject *deque, Py_ssize_t n)
617{
618 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400619 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400620
621 new_deque = (dequeobject *)deque_copy((PyObject *) deque);
622 if (new_deque == NULL)
623 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400624 rv = deque_inplace_repeat(new_deque, n);
625 Py_DECREF(new_deque);
626 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400627}
628
Raymond Hettinger54023152014-04-23 00:58:48 -0700629/* The rotate() method is part of the public API and is used internally
630as a primitive for other methods.
631
632Rotation by 1 or -1 is a common case, so any optimizations for high
633volume rotations should take care not to penalize the common case.
634
635Conceptually, a rotate by one is equivalent to a pop on one side and an
636append on the other. However, a pop/append pair is unnecessarily slow
637because it requires a incref/decref pair for an object located randomly
638in memory. It is better to just move the object pointer from one block
639to the next without changing the reference count.
640
641When moving batches of pointers, it is tempting to use memcpy() but that
642proved to be slower than a simple loop for a variety of reasons.
643Memcpy() cannot know in advance that we're copying pointers instead of
644bytes, that the source and destination are pointer aligned and
645non-overlapping, that moving just one pointer is a common case, that we
646never need to move more than BLOCKLEN pointers, and that at least one
647pointer is always moved.
648
649For high volume rotations, newblock() and freeblock() are never called
650more than once. Previously emptied blocks are immediately reused as a
651destination block. If a block is left-over at the end, it is freed.
652*/
653
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000654static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000655_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000656{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700657 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700658 block *leftblock = deque->leftblock;
659 block *rightblock = deque->rightblock;
660 Py_ssize_t leftindex = deque->leftindex;
661 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000662 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700663 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000664
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800665 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 return 0;
667 if (n > halflen || n < -halflen) {
668 n %= len;
669 if (n > halflen)
670 n -= len;
671 else if (n < -halflen)
672 n += len;
673 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500674 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500675 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800676
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800677 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500678 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700679 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700680 if (b == NULL) {
Raymond Hettinger3959af92013-07-13 02:34:08 -0700681 b = newblock(len);
682 if (b == NULL)
683 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700684 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000685 b->rightlink = leftblock;
686 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700687 leftblock->leftlink = b;
688 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000689 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700690 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700691 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800692 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700693 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700694 {
695 PyObject **src, **dest;
696 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800697
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700698 if (m > rightindex + 1)
699 m = rightindex + 1;
700 if (m > leftindex)
701 m = leftindex;
702 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700703 rightindex -= m;
704 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800705 src = &rightblock->data[rightindex + 1];
706 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700707 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700708 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800709 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700710 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700711 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700712 if (rightindex == -1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700713 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700714 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700715 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700716 CHECK_NOT_END(rightblock->leftlink);
717 rightblock = rightblock->leftlink;
718 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700719 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800720 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800721 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500722 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700723 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700724 if (b == NULL) {
Raymond Hettinger3959af92013-07-13 02:34:08 -0700725 b = newblock(len);
726 if (b == NULL)
727 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700728 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000729 b->leftlink = rightblock;
730 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700731 rightblock->rightlink = b;
732 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000733 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700734 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700735 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800736 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700737 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700738 {
739 PyObject **src, **dest;
740 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800741
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700742 if (m > BLOCKLEN - leftindex)
743 m = BLOCKLEN - leftindex;
744 if (m > BLOCKLEN - 1 - rightindex)
745 m = BLOCKLEN - 1 - rightindex;
746 assert (m > 0 && m <= len);
747 src = &leftblock->data[leftindex];
748 dest = &rightblock->data[rightindex + 1];
749 leftindex += m;
750 rightindex += m;
751 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700752 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700753 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700754 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700755 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700756 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700757 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700758 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700759 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700760 CHECK_NOT_END(leftblock->rightlink);
761 leftblock = leftblock->rightlink;
762 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700763 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800764 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700766 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700767done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700768 if (b != NULL)
769 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700770 deque->leftblock = leftblock;
771 deque->rightblock = rightblock;
772 deque->leftindex = leftindex;
773 deque->rightindex = rightindex;
774
775 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000776}
777
778static PyObject *
779deque_rotate(dequeobject *deque, PyObject *args)
780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 if (!PyArg_ParseTuple(args, "|n:rotate", &n))
784 return NULL;
Raymond Hettinger6921c132015-03-21 02:03:40 -0700785 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 Py_RETURN_NONE;
787 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000788}
789
Tim Peters1065f752004-10-01 01:03:29 +0000790PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000791"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000792
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000793static PyObject *
794deque_reverse(dequeobject *deque, PyObject *unused)
795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 block *leftblock = deque->leftblock;
797 block *rightblock = deque->rightblock;
798 Py_ssize_t leftindex = deque->leftindex;
799 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400800 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 Py_ssize_t i;
802 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 for (i=0 ; i<n ; i++) {
805 /* Validate that pointers haven't met in the middle */
806 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000807 CHECK_NOT_END(leftblock);
808 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* Swap */
811 tmp = leftblock->data[leftindex];
812 leftblock->data[leftindex] = rightblock->data[rightindex];
813 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 /* Advance left block/index pair */
816 leftindex++;
817 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 leftblock = leftblock->rightlink;
819 leftindex = 0;
820 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 /* Step backwards with the right block/index pair */
823 rightindex--;
824 if (rightindex == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 rightblock = rightblock->leftlink;
826 rightindex = BLOCKLEN - 1;
827 }
828 }
829 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000830}
831
832PyDoc_STRVAR(reverse_doc,
833"D.reverse() -- reverse *IN PLACE*");
834
Raymond Hettinger44459de2010-04-03 23:20:46 +0000835static PyObject *
836deque_count(dequeobject *deque, PyObject *v)
837{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000838 block *b = deque->leftblock;
839 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000840 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 Py_ssize_t i;
842 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800843 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 for (i=0 ; i<n ; i++) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000848 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000849 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
851 if (cmp > 0)
852 count++;
853 else if (cmp < 0)
854 return NULL;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 if (start_state != deque->state) {
857 PyErr_SetString(PyExc_RuntimeError,
858 "deque mutated during iteration");
859 return NULL;
860 }
Raymond Hettinger44459de2010-04-03 23:20:46 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000863 index++;
864 if (index == BLOCKLEN) {
865 b = b->rightlink;
866 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 }
868 }
869 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +0000870}
871
872PyDoc_STRVAR(count_doc,
873"D.count(value) -> integer -- return number of occurrences of value");
874
Raymond Hettinger39dadf72015-03-20 16:38:56 -0700875static int
876deque_contains(dequeobject *deque, PyObject *v)
877{
878 block *b = deque->leftblock;
879 Py_ssize_t index = deque->leftindex;
880 Py_ssize_t n = Py_SIZE(deque);
881 Py_ssize_t i;
882 size_t start_state = deque->state;
883 PyObject *item;
884 int cmp;
885
886 for (i=0 ; i<n ; i++) {
887 CHECK_NOT_END(b);
888 item = b->data[index];
889 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
890 if (cmp) {
891 return cmp;
892 }
893 if (start_state != deque->state) {
894 PyErr_SetString(PyExc_RuntimeError,
895 "deque mutated during iteration");
896 return -1;
897 }
898 index++;
899 if (index == BLOCKLEN) {
900 b = b->rightlink;
901 index = 0;
902 }
903 }
904 return 0;
905}
906
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000908deque_len(dequeobject *deque)
909{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000910 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000911}
912
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000913static PyObject *
Raymond Hettinger32ea1652015-03-21 01:37:37 -0700914deque_index(dequeobject *deque, PyObject *args)
915{
916 Py_ssize_t i, start=0, stop=Py_SIZE(deque);
917 PyObject *v, *item;
918 block *b = deque->leftblock;
919 Py_ssize_t index = deque->leftindex;
920 size_t start_state = deque->state;
921
922 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
923 _PyEval_SliceIndex, &start,
924 _PyEval_SliceIndex, &stop))
925 return NULL;
926 if (start < 0) {
927 start += Py_SIZE(deque);
928 if (start < 0)
929 start = 0;
930 }
931 if (stop < 0) {
932 stop += Py_SIZE(deque);
933 if (stop < 0)
934 stop = 0;
935 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -0700936 if (stop > Py_SIZE(deque))
937 stop = Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -0700938
939 for (i=0 ; i<stop ; i++) {
940 if (i >= start) {
941 int cmp;
942 CHECK_NOT_END(b);
943 item = b->data[index];
944 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
945 if (cmp > 0)
946 return PyLong_FromSsize_t(i);
947 else if (cmp < 0)
948 return NULL;
949 if (start_state != deque->state) {
950 PyErr_SetString(PyExc_RuntimeError,
951 "deque mutated during iteration");
952 return NULL;
953 }
954 }
955 index++;
956 if (index == BLOCKLEN) {
957 b = b->rightlink;
958 index = 0;
959 }
960 }
961 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
962 return NULL;
963}
964
965PyDoc_STRVAR(index_doc,
966"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
967"Raises ValueError if the value is not present.");
968
Raymond Hettinger551350a2015-03-24 00:19:53 -0700969/* insert(), remove(), and delitem() are implemented in terms of
970 rotate() for simplicity and reasonable performance near the end
971 points. If for some reason these methods become popular, it is not
972 hard to re-implement this using direct data movement (similar to
973 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -0700974 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -0700975*/
976
Raymond Hettinger32ea1652015-03-21 01:37:37 -0700977static PyObject *
978deque_insert(dequeobject *deque, PyObject *args)
979{
980 Py_ssize_t index;
981 Py_ssize_t n = Py_SIZE(deque);
982 PyObject *value;
983 PyObject *rv;
984
985 if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
986 return NULL;
987 if (index >= n)
988 return deque_append(deque, value);
989 if (index <= -n || index == 0)
990 return deque_appendleft(deque, value);
991 if (_deque_rotate(deque, -index))
992 return NULL;
993 if (index < 0)
994 rv = deque_append(deque, value);
995 else
996 rv = deque_appendleft(deque, value);
997 if (rv == NULL)
998 return NULL;
999 Py_DECREF(rv);
1000 if (_deque_rotate(deque, index))
1001 return NULL;
1002 Py_RETURN_NONE;
1003}
1004
1005PyDoc_STRVAR(insert_doc,
1006"D.insert(index, object) -- insert object before index");
1007
1008static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001009deque_remove(dequeobject *deque, PyObject *value)
1010{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001011 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 for (i=0 ; i<n ; i++) {
1014 PyObject *item = deque->leftblock->data[deque->leftindex];
1015 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001016
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001017 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyErr_SetString(PyExc_IndexError,
1019 "deque mutated during remove().");
1020 return NULL;
1021 }
1022 if (cmp > 0) {
1023 PyObject *tgt = deque_popleft(deque, NULL);
1024 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001025 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001027 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 Py_RETURN_NONE;
1029 }
1030 else if (cmp < 0) {
1031 _deque_rotate(deque, i);
1032 return NULL;
1033 }
1034 _deque_rotate(deque, -1);
1035 }
1036 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1037 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001038}
1039
1040PyDoc_STRVAR(remove_doc,
1041"D.remove(value) -- remove first occurrence of value.");
1042
Benjamin Peterson0e5c48a2013-01-12 21:22:18 -05001043static void
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001044deque_clear(dequeobject *deque)
1045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 PyObject *item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001047
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001048 while (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 item = deque_pop(deque, NULL);
1050 assert (item != NULL);
1051 Py_DECREF(item);
1052 }
Raymond Hettinger87e69122015-03-02 23:32:02 -08001053 assert(deque->leftblock == deque->rightblock);
1054 assert(deque->leftindex - 1 == deque->rightindex);
1055 assert(Py_SIZE(deque) == 0);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001056}
1057
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001058static int
1059valid_index(Py_ssize_t i, Py_ssize_t limit)
1060{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001061 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001062 to check whether i is in the range: 0 <= i < limit */
1063 return (size_t) i < (size_t) limit;
1064}
1065
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001066static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001067deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 block *b;
1070 PyObject *item;
1071 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001072
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001073 if (!valid_index(i, Py_SIZE(deque))) {
1074 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 return NULL;
1076 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 if (i == 0) {
1079 i = deque->leftindex;
1080 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001081 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 i = deque->rightindex;
1083 b = deque->rightblock;
1084 } else {
1085 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001086 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1087 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001088 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 b = deque->leftblock;
1090 while (n--)
1091 b = b->rightlink;
1092 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001093 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001094 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001095 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 b = deque->rightblock;
1097 while (n--)
1098 b = b->leftlink;
1099 }
1100 }
1101 item = b->data[i];
1102 Py_INCREF(item);
1103 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001104}
1105
1106static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001107deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001110 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001111
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001112 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001113 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001116 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 assert (item != NULL);
1118 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001119 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001120}
1121
1122static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001123deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 PyObject *old_value;
1126 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001127 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001128
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001129 if (!valid_index(i, len)) {
1130 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 return -1;
1132 }
1133 if (v == NULL)
1134 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001137 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1138 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 if (index <= halflen) {
1140 b = deque->leftblock;
1141 while (n--)
1142 b = b->rightlink;
1143 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001144 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001145 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001146 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 b = deque->rightblock;
1148 while (n--)
1149 b = b->leftlink;
1150 }
1151 Py_INCREF(v);
1152 old_value = b->data[i];
1153 b->data[i] = v;
1154 Py_DECREF(old_value);
1155 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001156}
1157
1158static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001159deque_clearmethod(dequeobject *deque)
1160{
Benjamin Peterson0e5c48a2013-01-12 21:22:18 -05001161 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 Py_RETURN_NONE;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001163}
1164
1165PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
1166
1167static void
1168deque_dealloc(dequeobject *deque)
1169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 PyObject_GC_UnTrack(deque);
1171 if (deque->weakreflist != NULL)
1172 PyObject_ClearWeakRefs((PyObject *) deque);
1173 if (deque->leftblock != NULL) {
1174 deque_clear(deque);
1175 assert(deque->leftblock != NULL);
1176 freeblock(deque->leftblock);
1177 }
1178 deque->leftblock = NULL;
1179 deque->rightblock = NULL;
1180 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001181}
1182
1183static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001184deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 block *b;
1187 PyObject *item;
1188 Py_ssize_t index;
1189 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001190
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001191 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1192 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 item = b->data[index];
1194 Py_VISIT(item);
1195 }
1196 indexlo = 0;
1197 }
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001198 for (index = indexlo; index <= deque->rightindex; index++) {
1199 item = b->data[index];
1200 Py_VISIT(item);
1201 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001203}
1204
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001205static PyObject *
1206deque_copy(PyObject *deque)
1207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 if (((dequeobject *)deque)->maxlen == -1)
1209 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
1210 else
1211 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
1212 deque, ((dequeobject *)deque)->maxlen, NULL);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001213}
1214
1215PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
1216
1217static PyObject *
1218deque_reduce(dequeobject *deque)
1219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 PyObject *dict, *result, *aslist;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001221 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001222
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001223 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 if (dict == NULL)
1225 PyErr_Clear();
1226 aslist = PySequence_List((PyObject *)deque);
1227 if (aslist == NULL) {
1228 Py_XDECREF(dict);
1229 return NULL;
1230 }
1231 if (dict == NULL) {
1232 if (deque->maxlen == -1)
1233 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
1234 else
1235 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
1236 } else {
1237 if (deque->maxlen == -1)
1238 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
1239 else
1240 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
1241 }
1242 Py_XDECREF(dict);
1243 Py_DECREF(aslist);
1244 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001245}
1246
1247PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1248
1249static PyObject *
1250deque_repr(PyObject *deque)
1251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 PyObject *aslist, *result;
1253 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 i = Py_ReprEnter(deque);
1256 if (i != 0) {
1257 if (i < 0)
1258 return NULL;
1259 return PyUnicode_FromString("[...]");
1260 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 aslist = PySequence_List(deque);
1263 if (aslist == NULL) {
1264 Py_ReprLeave(deque);
1265 return NULL;
1266 }
1267 if (((dequeobject *)deque)->maxlen != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1269 aslist, ((dequeobject *)deque)->maxlen);
1270 else
1271 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001273 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001275}
1276
Raymond Hettinger738ec902004-02-29 02:15:56 +00001277static PyObject *
1278deque_richcompare(PyObject *v, PyObject *w, int op)
1279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 PyObject *it1=NULL, *it2=NULL, *x, *y;
1281 Py_ssize_t vs, ws;
1282 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 if (!PyObject_TypeCheck(v, &deque_type) ||
1285 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001286 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001290 vs = Py_SIZE((dequeobject *)v);
1291 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 if (op == Py_EQ) {
1293 if (v == w)
1294 Py_RETURN_TRUE;
1295 if (vs != ws)
1296 Py_RETURN_FALSE;
1297 }
1298 if (op == Py_NE) {
1299 if (v == w)
1300 Py_RETURN_FALSE;
1301 if (vs != ws)
1302 Py_RETURN_TRUE;
1303 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 /* Search for the first index where items are different */
1306 it1 = PyObject_GetIter(v);
1307 if (it1 == NULL)
1308 goto done;
1309 it2 = PyObject_GetIter(w);
1310 if (it2 == NULL)
1311 goto done;
1312 for (;;) {
1313 x = PyIter_Next(it1);
1314 if (x == NULL && PyErr_Occurred())
1315 goto done;
1316 y = PyIter_Next(it2);
1317 if (x == NULL || y == NULL)
1318 break;
1319 b = PyObject_RichCompareBool(x, y, Py_EQ);
1320 if (b == 0) {
1321 cmp = PyObject_RichCompareBool(x, y, op);
1322 Py_DECREF(x);
1323 Py_DECREF(y);
1324 goto done;
1325 }
1326 Py_DECREF(x);
1327 Py_DECREF(y);
1328 if (b == -1)
1329 goto done;
1330 }
1331 /* We reached the end of one deque or both */
1332 Py_XDECREF(x);
1333 Py_XDECREF(y);
1334 if (PyErr_Occurred())
1335 goto done;
1336 switch (op) {
1337 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1338 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1339 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1340 case Py_NE: cmp = x != y; break; /* if one deque continues */
1341 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1342 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1343 }
Tim Peters1065f752004-10-01 01:03:29 +00001344
Raymond Hettinger738ec902004-02-29 02:15:56 +00001345done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 Py_XDECREF(it1);
1347 Py_XDECREF(it2);
1348 if (cmp == 1)
1349 Py_RETURN_TRUE;
1350 if (cmp == 0)
1351 Py_RETURN_FALSE;
1352 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001353}
1354
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001355static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001356deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 PyObject *iterable = NULL;
1359 PyObject *maxlenobj = NULL;
1360 Py_ssize_t maxlen = -1;
1361 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1364 return -1;
1365 if (maxlenobj != NULL && maxlenobj != Py_None) {
1366 maxlen = PyLong_AsSsize_t(maxlenobj);
1367 if (maxlen == -1 && PyErr_Occurred())
1368 return -1;
1369 if (maxlen < 0) {
1370 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1371 return -1;
1372 }
1373 }
1374 deque->maxlen = maxlen;
1375 deque_clear(deque);
1376 if (iterable != NULL) {
1377 PyObject *rv = deque_extend(deque, iterable);
1378 if (rv == NULL)
1379 return -1;
1380 Py_DECREF(rv);
1381 }
1382 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001383}
1384
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001385static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001386deque_sizeof(dequeobject *deque, void *unused)
1387{
1388 Py_ssize_t res;
1389 Py_ssize_t blocks;
1390
1391 res = sizeof(dequeobject);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001392 blocks = (deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
1393 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001394 (blocks - 1) * BLOCKLEN + deque->rightindex);
1395 res += blocks * sizeof(block);
1396 return PyLong_FromSsize_t(res);
1397}
1398
1399PyDoc_STRVAR(sizeof_doc,
1400"D.__sizeof__() -- size of D in memory, in bytes");
1401
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001402static int
1403deque_bool(dequeobject *deque)
1404{
1405 return Py_SIZE(deque) != 0;
1406}
1407
Jesus Cea16e2fca2012-08-03 14:49:42 +02001408static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001409deque_get_maxlen(dequeobject *deque)
1410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 if (deque->maxlen == -1)
1412 Py_RETURN_NONE;
1413 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001414}
1415
Raymond Hettinger41290a62015-03-31 08:12:23 -07001416
1417/* deque object ********************************************************/
1418
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001419static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1421 "maximum size of a deque or None if unbounded"},
1422 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001423};
1424
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001425static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001427 (binaryfunc)deque_concat, /* sq_concat */
1428 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 (ssizeargfunc)deque_item, /* sq_item */
1430 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001431 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001433 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001434 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001435 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001436};
1437
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001438static PyNumberMethods deque_as_number = {
1439 0, /* nb_add */
1440 0, /* nb_subtract */
1441 0, /* nb_multiply */
1442 0, /* nb_remainder */
1443 0, /* nb_divmod */
1444 0, /* nb_power */
1445 0, /* nb_negative */
1446 0, /* nb_positive */
1447 0, /* nb_absolute */
1448 (inquiry)deque_bool, /* nb_bool */
1449 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001450 };
1451
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001452static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001453static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001454PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001456
1457static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 {"append", (PyCFunction)deque_append,
1459 METH_O, append_doc},
1460 {"appendleft", (PyCFunction)deque_appendleft,
1461 METH_O, appendleft_doc},
1462 {"clear", (PyCFunction)deque_clearmethod,
1463 METH_NOARGS, clear_doc},
1464 {"__copy__", (PyCFunction)deque_copy,
1465 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001466 {"copy", (PyCFunction)deque_copy,
1467 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001469 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 {"extend", (PyCFunction)deque_extend,
1471 METH_O, extend_doc},
1472 {"extendleft", (PyCFunction)deque_extendleft,
1473 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001474 {"index", (PyCFunction)deque_index,
1475 METH_VARARGS, index_doc},
1476 {"insert", (PyCFunction)deque_insert,
1477 METH_VARARGS, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 {"pop", (PyCFunction)deque_pop,
1479 METH_NOARGS, pop_doc},
1480 {"popleft", (PyCFunction)deque_popleft,
1481 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001482 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 METH_NOARGS, reduce_doc},
1484 {"remove", (PyCFunction)deque_remove,
1485 METH_O, remove_doc},
1486 {"__reversed__", (PyCFunction)deque_reviter,
1487 METH_NOARGS, reversed_doc},
1488 {"reverse", (PyCFunction)deque_reverse,
1489 METH_NOARGS, reverse_doc},
1490 {"rotate", (PyCFunction)deque_rotate,
Jesus Cea16e2fca2012-08-03 14:49:42 +02001491 METH_VARARGS, rotate_doc},
1492 {"__sizeof__", (PyCFunction)deque_sizeof,
1493 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001495};
1496
1497PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001498"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001499\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001500A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001501
Neal Norwitz87f10132004-02-29 15:40:53 +00001502static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 PyVarObject_HEAD_INIT(NULL, 0)
1504 "collections.deque", /* tp_name */
1505 sizeof(dequeobject), /* tp_basicsize */
1506 0, /* tp_itemsize */
1507 /* methods */
1508 (destructor)deque_dealloc, /* tp_dealloc */
1509 0, /* tp_print */
1510 0, /* tp_getattr */
1511 0, /* tp_setattr */
1512 0, /* tp_reserved */
1513 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001514 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 &deque_as_sequence, /* tp_as_sequence */
1516 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001517 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 0, /* tp_call */
1519 0, /* tp_str */
1520 PyObject_GenericGetAttr, /* tp_getattro */
1521 0, /* tp_setattro */
1522 0, /* tp_as_buffer */
1523 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001524 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 deque_doc, /* tp_doc */
1526 (traverseproc)deque_traverse, /* tp_traverse */
1527 (inquiry)deque_clear, /* tp_clear */
1528 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001529 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 (getiterfunc)deque_iter, /* tp_iter */
1531 0, /* tp_iternext */
1532 deque_methods, /* tp_methods */
1533 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001534 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 0, /* tp_base */
1536 0, /* tp_dict */
1537 0, /* tp_descr_get */
1538 0, /* tp_descr_set */
1539 0, /* tp_dictoffset */
1540 (initproc)deque_init, /* tp_init */
1541 PyType_GenericAlloc, /* tp_alloc */
1542 deque_new, /* tp_new */
1543 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001544};
1545
1546/*********************** Deque Iterator **************************/
1547
1548typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001551 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001553 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001555} dequeiterobject;
1556
Martin v. Löwis59683e82008-06-13 07:50:45 +00001557static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001558
1559static PyObject *
1560deque_iter(dequeobject *deque)
1561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1565 if (it == NULL)
1566 return NULL;
1567 it->b = deque->leftblock;
1568 it->index = deque->leftindex;
1569 Py_INCREF(deque);
1570 it->deque = deque;
1571 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001572 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 PyObject_GC_Track(it);
1574 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001575}
1576
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001577static int
1578dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 Py_VISIT(dio->deque);
1581 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001582}
1583
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001584static void
1585dequeiter_dealloc(dequeiterobject *dio)
1586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 Py_XDECREF(dio->deque);
1588 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001589}
1590
1591static PyObject *
1592dequeiter_next(dequeiterobject *it)
1593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 if (it->deque->state != it->state) {
1597 it->counter = 0;
1598 PyErr_SetString(PyExc_RuntimeError,
1599 "deque mutated during iteration");
1600 return NULL;
1601 }
1602 if (it->counter == 0)
1603 return NULL;
1604 assert (!(it->b == it->deque->rightblock &&
1605 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 item = it->b->data[it->index];
1608 it->index++;
1609 it->counter--;
1610 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001611 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 it->b = it->b->rightlink;
1613 it->index = 0;
1614 }
1615 Py_INCREF(item);
1616 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001617}
1618
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001619static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001620dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1621{
1622 Py_ssize_t i, index=0;
1623 PyObject *deque;
1624 dequeiterobject *it;
1625 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1626 return NULL;
1627 assert(type == &dequeiter_type);
1628
1629 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1630 if (!it)
1631 return NULL;
1632 /* consume items from the queue */
1633 for(i=0; i<index; i++) {
1634 PyObject *item = dequeiter_next(it);
1635 if (item) {
1636 Py_DECREF(item);
1637 } else {
1638 if (it->counter) {
1639 Py_DECREF(it);
1640 return NULL;
1641 } else
1642 break;
1643 }
1644 }
1645 return (PyObject*)it;
1646}
1647
1648static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001649dequeiter_len(dequeiterobject *it)
1650{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001651 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001652}
1653
Armin Rigof5b3e362006-02-11 21:32:43 +00001654PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001655
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001656static PyObject *
1657dequeiter_reduce(dequeiterobject *it)
1658{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001659 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 +00001660}
1661
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001662static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001664 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001666};
1667
Martin v. Löwis59683e82008-06-13 07:50:45 +00001668static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001670 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 sizeof(dequeiterobject), /* tp_basicsize */
1672 0, /* tp_itemsize */
1673 /* methods */
1674 (destructor)dequeiter_dealloc, /* tp_dealloc */
1675 0, /* tp_print */
1676 0, /* tp_getattr */
1677 0, /* tp_setattr */
1678 0, /* tp_reserved */
1679 0, /* tp_repr */
1680 0, /* tp_as_number */
1681 0, /* tp_as_sequence */
1682 0, /* tp_as_mapping */
1683 0, /* tp_hash */
1684 0, /* tp_call */
1685 0, /* tp_str */
1686 PyObject_GenericGetAttr, /* tp_getattro */
1687 0, /* tp_setattro */
1688 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001689 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 0, /* tp_doc */
1691 (traverseproc)dequeiter_traverse, /* tp_traverse */
1692 0, /* tp_clear */
1693 0, /* tp_richcompare */
1694 0, /* tp_weaklistoffset */
1695 PyObject_SelfIter, /* tp_iter */
1696 (iternextfunc)dequeiter_next, /* tp_iternext */
1697 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001698 0, /* tp_members */
1699 0, /* tp_getset */
1700 0, /* tp_base */
1701 0, /* tp_dict */
1702 0, /* tp_descr_get */
1703 0, /* tp_descr_set */
1704 0, /* tp_dictoffset */
1705 0, /* tp_init */
1706 0, /* tp_alloc */
1707 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001709};
1710
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001711/*********************** Deque Reverse Iterator **************************/
1712
Martin v. Löwis59683e82008-06-13 07:50:45 +00001713static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001714
1715static PyObject *
1716deque_reviter(dequeobject *deque)
1717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1721 if (it == NULL)
1722 return NULL;
1723 it->b = deque->rightblock;
1724 it->index = deque->rightindex;
1725 Py_INCREF(deque);
1726 it->deque = deque;
1727 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001728 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 PyObject_GC_Track(it);
1730 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001731}
1732
1733static PyObject *
1734dequereviter_next(dequeiterobject *it)
1735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 PyObject *item;
1737 if (it->counter == 0)
1738 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 if (it->deque->state != it->state) {
1741 it->counter = 0;
1742 PyErr_SetString(PyExc_RuntimeError,
1743 "deque mutated during iteration");
1744 return NULL;
1745 }
1746 assert (!(it->b == it->deque->leftblock &&
1747 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 item = it->b->data[it->index];
1750 it->index--;
1751 it->counter--;
1752 if (it->index == -1 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001753 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 it->b = it->b->leftlink;
1755 it->index = BLOCKLEN - 1;
1756 }
1757 Py_INCREF(item);
1758 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001759}
1760
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001761static PyObject *
1762dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1763{
1764 Py_ssize_t i, index=0;
1765 PyObject *deque;
1766 dequeiterobject *it;
1767 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1768 return NULL;
1769 assert(type == &dequereviter_type);
1770
1771 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1772 if (!it)
1773 return NULL;
1774 /* consume items from the queue */
1775 for(i=0; i<index; i++) {
1776 PyObject *item = dequereviter_next(it);
1777 if (item) {
1778 Py_DECREF(item);
1779 } else {
1780 if (it->counter) {
1781 Py_DECREF(it);
1782 return NULL;
1783 } else
1784 break;
1785 }
1786 }
1787 return (PyObject*)it;
1788}
1789
Martin v. Löwis59683e82008-06-13 07:50:45 +00001790static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001792 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 sizeof(dequeiterobject), /* tp_basicsize */
1794 0, /* tp_itemsize */
1795 /* methods */
1796 (destructor)dequeiter_dealloc, /* tp_dealloc */
1797 0, /* tp_print */
1798 0, /* tp_getattr */
1799 0, /* tp_setattr */
1800 0, /* tp_reserved */
1801 0, /* tp_repr */
1802 0, /* tp_as_number */
1803 0, /* tp_as_sequence */
1804 0, /* tp_as_mapping */
1805 0, /* tp_hash */
1806 0, /* tp_call */
1807 0, /* tp_str */
1808 PyObject_GenericGetAttr, /* tp_getattro */
1809 0, /* tp_setattro */
1810 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001811 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 0, /* tp_doc */
1813 (traverseproc)dequeiter_traverse, /* tp_traverse */
1814 0, /* tp_clear */
1815 0, /* tp_richcompare */
1816 0, /* tp_weaklistoffset */
1817 PyObject_SelfIter, /* tp_iter */
1818 (iternextfunc)dequereviter_next, /* tp_iternext */
1819 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001820 0, /* tp_members */
1821 0, /* tp_getset */
1822 0, /* tp_base */
1823 0, /* tp_dict */
1824 0, /* tp_descr_get */
1825 0, /* tp_descr_set */
1826 0, /* tp_dictoffset */
1827 0, /* tp_init */
1828 0, /* tp_alloc */
1829 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001831};
1832
Guido van Rossum1968ad32006-02-25 22:38:04 +00001833/* defaultdict type *********************************************************/
1834
1835typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 PyDictObject dict;
1837 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001838} defdictobject;
1839
1840static PyTypeObject defdict_type; /* Forward */
1841
1842PyDoc_STRVAR(defdict_missing_doc,
1843"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001844 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001845 self[key] = value = self.default_factory()\n\
1846 return value\n\
1847");
1848
1849static PyObject *
1850defdict_missing(defdictobject *dd, PyObject *key)
1851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 PyObject *factory = dd->default_factory;
1853 PyObject *value;
1854 if (factory == NULL || factory == Py_None) {
1855 /* XXX Call dict.__missing__(key) */
1856 PyObject *tup;
1857 tup = PyTuple_Pack(1, key);
1858 if (!tup) return NULL;
1859 PyErr_SetObject(PyExc_KeyError, tup);
1860 Py_DECREF(tup);
1861 return NULL;
1862 }
1863 value = PyEval_CallObject(factory, NULL);
1864 if (value == NULL)
1865 return value;
1866 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1867 Py_DECREF(value);
1868 return NULL;
1869 }
1870 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001871}
1872
1873PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1874
1875static PyObject *
1876defdict_copy(defdictobject *dd)
1877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 /* This calls the object's class. That only works for subclasses
1879 whose class constructor has the same signature. Subclasses that
1880 define a different constructor signature must override copy().
1881 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 if (dd->default_factory == NULL)
1884 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1885 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1886 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001887}
1888
1889static PyObject *
1890defdict_reduce(defdictobject *dd)
1891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 - factory function
1895 - tuple of args for the factory function
1896 - additional state (here None)
1897 - sequence iterator (here None)
1898 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00001899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 For this to be useful with pickle.py, the default_factory
1903 must be picklable; e.g., None, a built-in, or a global
1904 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 Both shallow and deep copying are supported, but for deep
1907 copying, the default_factory must be deep-copyable; e.g. None,
1908 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 This only works for subclasses as long as their constructor
1911 signature is compatible; the first argument must be the
1912 optional default_factory, defaulting to None.
1913 */
1914 PyObject *args;
1915 PyObject *items;
1916 PyObject *iter;
1917 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001918 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 if (dd->default_factory == NULL || dd->default_factory == Py_None)
1921 args = PyTuple_New(0);
1922 else
1923 args = PyTuple_Pack(1, dd->default_factory);
1924 if (args == NULL)
1925 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001926 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 if (items == NULL) {
1928 Py_DECREF(args);
1929 return NULL;
1930 }
1931 iter = PyObject_GetIter(items);
1932 if (iter == NULL) {
1933 Py_DECREF(items);
1934 Py_DECREF(args);
1935 return NULL;
1936 }
1937 result = PyTuple_Pack(5, Py_TYPE(dd), args,
1938 Py_None, Py_None, iter);
1939 Py_DECREF(iter);
1940 Py_DECREF(items);
1941 Py_DECREF(args);
1942 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001943}
1944
1945static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 {"__missing__", (PyCFunction)defdict_missing, METH_O,
1947 defdict_missing_doc},
1948 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1949 defdict_copy_doc},
1950 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1951 defdict_copy_doc},
1952 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1953 reduce_doc},
1954 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001955};
1956
1957static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 {"default_factory", T_OBJECT,
1959 offsetof(defdictobject, default_factory), 0,
1960 PyDoc_STR("Factory for default value called by __missing__().")},
1961 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001962};
1963
1964static void
1965defdict_dealloc(defdictobject *dd)
1966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 Py_CLEAR(dd->default_factory);
1968 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001969}
1970
Guido van Rossum1968ad32006-02-25 22:38:04 +00001971static PyObject *
1972defdict_repr(defdictobject *dd)
1973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 PyObject *baserepr;
1975 PyObject *defrepr;
1976 PyObject *result;
1977 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
1978 if (baserepr == NULL)
1979 return NULL;
1980 if (dd->default_factory == NULL)
1981 defrepr = PyUnicode_FromString("None");
1982 else
1983 {
1984 int status = Py_ReprEnter(dd->default_factory);
1985 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01001986 if (status < 0) {
1987 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01001989 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 defrepr = PyUnicode_FromString("...");
1991 }
1992 else
1993 defrepr = PyObject_Repr(dd->default_factory);
1994 Py_ReprLeave(dd->default_factory);
1995 }
1996 if (defrepr == NULL) {
1997 Py_DECREF(baserepr);
1998 return NULL;
1999 }
2000 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2001 defrepr, baserepr);
2002 Py_DECREF(defrepr);
2003 Py_DECREF(baserepr);
2004 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002005}
2006
2007static int
2008defdict_traverse(PyObject *self, visitproc visit, void *arg)
2009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 Py_VISIT(((defdictobject *)self)->default_factory);
2011 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002012}
2013
2014static int
2015defdict_tp_clear(defdictobject *dd)
2016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 Py_CLEAR(dd->default_factory);
2018 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002019}
2020
2021static int
2022defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 defdictobject *dd = (defdictobject *)self;
2025 PyObject *olddefault = dd->default_factory;
2026 PyObject *newdefault = NULL;
2027 PyObject *newargs;
2028 int result;
2029 if (args == NULL || !PyTuple_Check(args))
2030 newargs = PyTuple_New(0);
2031 else {
2032 Py_ssize_t n = PyTuple_GET_SIZE(args);
2033 if (n > 0) {
2034 newdefault = PyTuple_GET_ITEM(args, 0);
2035 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2036 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002037 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 return -1;
2039 }
2040 }
2041 newargs = PySequence_GetSlice(args, 1, n);
2042 }
2043 if (newargs == NULL)
2044 return -1;
2045 Py_XINCREF(newdefault);
2046 dd->default_factory = newdefault;
2047 result = PyDict_Type.tp_init(self, newargs, kwds);
2048 Py_DECREF(newargs);
2049 Py_XDECREF(olddefault);
2050 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002051}
2052
2053PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002054"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002055\n\
2056The default factory is called without arguments to produce\n\
2057a new value when a key is not present, in __getitem__ only.\n\
2058A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002059All remaining arguments are treated the same as if they were\n\
2060passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002061");
2062
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002063/* See comment in xxsubtype.c */
2064#define DEFERRED_ADDRESS(ADDR) 0
2065
Guido van Rossum1968ad32006-02-25 22:38:04 +00002066static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2068 "collections.defaultdict", /* tp_name */
2069 sizeof(defdictobject), /* tp_basicsize */
2070 0, /* tp_itemsize */
2071 /* methods */
2072 (destructor)defdict_dealloc, /* tp_dealloc */
2073 0, /* tp_print */
2074 0, /* tp_getattr */
2075 0, /* tp_setattr */
2076 0, /* tp_reserved */
2077 (reprfunc)defdict_repr, /* tp_repr */
2078 0, /* tp_as_number */
2079 0, /* tp_as_sequence */
2080 0, /* tp_as_mapping */
2081 0, /* tp_hash */
2082 0, /* tp_call */
2083 0, /* tp_str */
2084 PyObject_GenericGetAttr, /* tp_getattro */
2085 0, /* tp_setattro */
2086 0, /* tp_as_buffer */
2087 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2088 /* tp_flags */
2089 defdict_doc, /* tp_doc */
2090 defdict_traverse, /* tp_traverse */
2091 (inquiry)defdict_tp_clear, /* tp_clear */
2092 0, /* tp_richcompare */
2093 0, /* tp_weaklistoffset*/
2094 0, /* tp_iter */
2095 0, /* tp_iternext */
2096 defdict_methods, /* tp_methods */
2097 defdict_members, /* tp_members */
2098 0, /* tp_getset */
2099 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2100 0, /* tp_dict */
2101 0, /* tp_descr_get */
2102 0, /* tp_descr_set */
2103 0, /* tp_dictoffset */
2104 defdict_init, /* tp_init */
2105 PyType_GenericAlloc, /* tp_alloc */
2106 0, /* tp_new */
2107 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002108};
2109
Raymond Hettinger96f34102010-12-15 16:30:37 +00002110/* helper function for Counter *********************************************/
2111
2112PyDoc_STRVAR(_count_elements_doc,
2113"_count_elements(mapping, iterable) -> None\n\
2114\n\
2115Count elements in the iterable, updating the mappping");
2116
2117static PyObject *
2118_count_elements(PyObject *self, PyObject *args)
2119{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002120 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002121 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002122 PyObject *it, *iterable, *mapping, *oldval;
2123 PyObject *newval = NULL;
2124 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002125 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002126 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002127 PyObject *bound_get = NULL;
2128 PyObject *mapping_get;
2129 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002130 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002131 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002132
2133 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2134 return NULL;
2135
Raymond Hettinger96f34102010-12-15 16:30:37 +00002136 it = PyObject_GetIter(iterable);
2137 if (it == NULL)
2138 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002139
Raymond Hettinger96f34102010-12-15 16:30:37 +00002140 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002141 if (one == NULL)
2142 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002143
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002144 /* Only take the fast path when get() and __setitem__()
2145 * have not been overridden.
2146 */
2147 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2148 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002149 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2150 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2151
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002152 if (mapping_get != NULL && mapping_get == dict_get &&
2153 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002154 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002155 /* Fast path advantages:
2156 1. Eliminate double hashing
2157 (by re-using the same hash for both the get and set)
2158 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2159 (argument tuple creation and parsing)
2160 3. Avoid indirection through a bound method object
2161 (creates another argument tuple)
2162 4. Avoid initial increment from zero
2163 (reuse an existing one-object instead)
2164 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002165 Py_hash_t hash;
2166
Raymond Hettinger426e0522011-01-03 02:12:02 +00002167 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002168 if (key == NULL)
2169 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002170
2171 if (!PyUnicode_CheckExact(key) ||
2172 (hash = ((PyASCIIObject *) key)->hash) == -1)
2173 {
2174 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002175 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002176 goto done;
2177 }
2178
2179 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002180 if (oldval == NULL) {
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002181 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002182 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002183 } else {
2184 newval = PyNumber_Add(oldval, one);
2185 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002186 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002187 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002188 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002189 Py_CLEAR(newval);
2190 }
2191 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002192 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002193 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002194 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002195 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002196 goto done;
2197
2198 zero = PyLong_FromLong(0);
2199 if (zero == NULL)
2200 goto done;
2201
Raymond Hettinger426e0522011-01-03 02:12:02 +00002202 while (1) {
2203 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002204 if (key == NULL)
2205 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002206 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002207 if (oldval == NULL)
2208 break;
2209 newval = PyNumber_Add(oldval, one);
2210 Py_DECREF(oldval);
2211 if (newval == NULL)
2212 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002213 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002214 break;
2215 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002216 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002217 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002218 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002219
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002220done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002221 Py_DECREF(it);
2222 Py_XDECREF(key);
2223 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002224 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002225 Py_XDECREF(zero);
2226 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002227 if (PyErr_Occurred())
2228 return NULL;
2229 Py_RETURN_NONE;
2230}
2231
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002232/* module level code ********************************************************/
2233
2234PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002235"High performance data structures.\n\
2236- deque: ordered collection accessible from endpoints only\n\
2237- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002238");
2239
Raymond Hettinger96f34102010-12-15 16:30:37 +00002240static struct PyMethodDef module_functions[] = {
2241 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2242 {NULL, NULL} /* sentinel */
2243};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002244
2245static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 PyModuleDef_HEAD_INIT,
2247 "_collections",
2248 module_doc,
2249 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002250 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 NULL,
2252 NULL,
2253 NULL,
2254 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002255};
2256
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002257PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002258PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 m = PyModule_Create(&_collectionsmodule);
2263 if (m == NULL)
2264 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 if (PyType_Ready(&deque_type) < 0)
2267 return NULL;
2268 Py_INCREF(&deque_type);
2269 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 defdict_type.tp_base = &PyDict_Type;
2272 if (PyType_Ready(&defdict_type) < 0)
2273 return NULL;
2274 Py_INCREF(&defdict_type);
2275 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002276
Eric Snow47db7172015-05-29 22:21:39 -06002277 Py_INCREF(&PyODict_Type);
2278 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 if (PyType_Ready(&dequeiter_type) < 0)
2281 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002282 Py_INCREF(&dequeiter_type);
2283 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 if (PyType_Ready(&dequereviter_type) < 0)
2286 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002287 Py_INCREF(&dequereviter_type);
2288 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002291}