blob: 49a46a153eba12a492bb87b8163bd50d09ba124b [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{
Raymond Hettingere4f34672015-09-13 19:27:01 -04001208 if (Py_TYPE(deque) == &deque_type) {
1209 dequeobject *new_deque;
1210 PyObject *rv;
1211
1212 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
1213 if (new_deque == NULL)
1214 return NULL;
1215 new_deque->maxlen = ((dequeobject *)deque)->maxlen;
1216 rv = deque_extend(new_deque, deque);
1217 if (rv != NULL) {
1218 Py_DECREF(rv);
1219 return (PyObject *)new_deque;
1220 }
1221 Py_DECREF(new_deque);
1222 return NULL;
1223 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 if (((dequeobject *)deque)->maxlen == -1)
1225 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
1226 else
1227 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
1228 deque, ((dequeobject *)deque)->maxlen, NULL);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001229}
1230
1231PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
1232
1233static PyObject *
1234deque_reduce(dequeobject *deque)
1235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 PyObject *dict, *result, *aslist;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001237 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001238
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001239 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 if (dict == NULL)
1241 PyErr_Clear();
1242 aslist = PySequence_List((PyObject *)deque);
1243 if (aslist == NULL) {
1244 Py_XDECREF(dict);
1245 return NULL;
1246 }
1247 if (dict == NULL) {
1248 if (deque->maxlen == -1)
1249 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
1250 else
1251 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
1252 } else {
1253 if (deque->maxlen == -1)
1254 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
1255 else
1256 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
1257 }
1258 Py_XDECREF(dict);
1259 Py_DECREF(aslist);
1260 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001261}
1262
1263PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1264
1265static PyObject *
1266deque_repr(PyObject *deque)
1267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 PyObject *aslist, *result;
1269 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 i = Py_ReprEnter(deque);
1272 if (i != 0) {
1273 if (i < 0)
1274 return NULL;
1275 return PyUnicode_FromString("[...]");
1276 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 aslist = PySequence_List(deque);
1279 if (aslist == NULL) {
1280 Py_ReprLeave(deque);
1281 return NULL;
1282 }
1283 if (((dequeobject *)deque)->maxlen != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1285 aslist, ((dequeobject *)deque)->maxlen);
1286 else
1287 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001289 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001291}
1292
Raymond Hettinger738ec902004-02-29 02:15:56 +00001293static PyObject *
1294deque_richcompare(PyObject *v, PyObject *w, int op)
1295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyObject *it1=NULL, *it2=NULL, *x, *y;
1297 Py_ssize_t vs, ws;
1298 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 if (!PyObject_TypeCheck(v, &deque_type) ||
1301 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001302 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001306 vs = Py_SIZE((dequeobject *)v);
1307 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 if (op == Py_EQ) {
1309 if (v == w)
1310 Py_RETURN_TRUE;
1311 if (vs != ws)
1312 Py_RETURN_FALSE;
1313 }
1314 if (op == Py_NE) {
1315 if (v == w)
1316 Py_RETURN_FALSE;
1317 if (vs != ws)
1318 Py_RETURN_TRUE;
1319 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 /* Search for the first index where items are different */
1322 it1 = PyObject_GetIter(v);
1323 if (it1 == NULL)
1324 goto done;
1325 it2 = PyObject_GetIter(w);
1326 if (it2 == NULL)
1327 goto done;
1328 for (;;) {
1329 x = PyIter_Next(it1);
1330 if (x == NULL && PyErr_Occurred())
1331 goto done;
1332 y = PyIter_Next(it2);
1333 if (x == NULL || y == NULL)
1334 break;
1335 b = PyObject_RichCompareBool(x, y, Py_EQ);
1336 if (b == 0) {
1337 cmp = PyObject_RichCompareBool(x, y, op);
1338 Py_DECREF(x);
1339 Py_DECREF(y);
1340 goto done;
1341 }
1342 Py_DECREF(x);
1343 Py_DECREF(y);
1344 if (b == -1)
1345 goto done;
1346 }
1347 /* We reached the end of one deque or both */
1348 Py_XDECREF(x);
1349 Py_XDECREF(y);
1350 if (PyErr_Occurred())
1351 goto done;
1352 switch (op) {
1353 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1354 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1355 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1356 case Py_NE: cmp = x != y; break; /* if one deque continues */
1357 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1358 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1359 }
Tim Peters1065f752004-10-01 01:03:29 +00001360
Raymond Hettinger738ec902004-02-29 02:15:56 +00001361done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 Py_XDECREF(it1);
1363 Py_XDECREF(it2);
1364 if (cmp == 1)
1365 Py_RETURN_TRUE;
1366 if (cmp == 0)
1367 Py_RETURN_FALSE;
1368 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001369}
1370
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001371static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001372deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 PyObject *iterable = NULL;
1375 PyObject *maxlenobj = NULL;
1376 Py_ssize_t maxlen = -1;
1377 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1380 return -1;
1381 if (maxlenobj != NULL && maxlenobj != Py_None) {
1382 maxlen = PyLong_AsSsize_t(maxlenobj);
1383 if (maxlen == -1 && PyErr_Occurred())
1384 return -1;
1385 if (maxlen < 0) {
1386 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1387 return -1;
1388 }
1389 }
1390 deque->maxlen = maxlen;
1391 deque_clear(deque);
1392 if (iterable != NULL) {
1393 PyObject *rv = deque_extend(deque, iterable);
1394 if (rv == NULL)
1395 return -1;
1396 Py_DECREF(rv);
1397 }
1398 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001399}
1400
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001401static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001402deque_sizeof(dequeobject *deque, void *unused)
1403{
1404 Py_ssize_t res;
1405 Py_ssize_t blocks;
1406
1407 res = sizeof(dequeobject);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001408 blocks = (deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
1409 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001410 (blocks - 1) * BLOCKLEN + deque->rightindex);
1411 res += blocks * sizeof(block);
1412 return PyLong_FromSsize_t(res);
1413}
1414
1415PyDoc_STRVAR(sizeof_doc,
1416"D.__sizeof__() -- size of D in memory, in bytes");
1417
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001418static int
1419deque_bool(dequeobject *deque)
1420{
1421 return Py_SIZE(deque) != 0;
1422}
1423
Jesus Cea16e2fca2012-08-03 14:49:42 +02001424static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001425deque_get_maxlen(dequeobject *deque)
1426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 if (deque->maxlen == -1)
1428 Py_RETURN_NONE;
1429 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001430}
1431
Raymond Hettinger41290a62015-03-31 08:12:23 -07001432
1433/* deque object ********************************************************/
1434
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001435static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1437 "maximum size of a deque or None if unbounded"},
1438 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001439};
1440
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001441static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001443 (binaryfunc)deque_concat, /* sq_concat */
1444 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 (ssizeargfunc)deque_item, /* sq_item */
1446 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001447 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001449 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001450 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001451 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001452};
1453
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001454static PyNumberMethods deque_as_number = {
1455 0, /* nb_add */
1456 0, /* nb_subtract */
1457 0, /* nb_multiply */
1458 0, /* nb_remainder */
1459 0, /* nb_divmod */
1460 0, /* nb_power */
1461 0, /* nb_negative */
1462 0, /* nb_positive */
1463 0, /* nb_absolute */
1464 (inquiry)deque_bool, /* nb_bool */
1465 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001466 };
1467
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001468static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001469static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001470PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001472
1473static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 {"append", (PyCFunction)deque_append,
1475 METH_O, append_doc},
1476 {"appendleft", (PyCFunction)deque_appendleft,
1477 METH_O, appendleft_doc},
1478 {"clear", (PyCFunction)deque_clearmethod,
1479 METH_NOARGS, clear_doc},
1480 {"__copy__", (PyCFunction)deque_copy,
1481 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001482 {"copy", (PyCFunction)deque_copy,
1483 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001485 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 {"extend", (PyCFunction)deque_extend,
1487 METH_O, extend_doc},
1488 {"extendleft", (PyCFunction)deque_extendleft,
1489 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001490 {"index", (PyCFunction)deque_index,
1491 METH_VARARGS, index_doc},
1492 {"insert", (PyCFunction)deque_insert,
1493 METH_VARARGS, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 {"pop", (PyCFunction)deque_pop,
1495 METH_NOARGS, pop_doc},
1496 {"popleft", (PyCFunction)deque_popleft,
1497 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001498 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 METH_NOARGS, reduce_doc},
1500 {"remove", (PyCFunction)deque_remove,
1501 METH_O, remove_doc},
1502 {"__reversed__", (PyCFunction)deque_reviter,
1503 METH_NOARGS, reversed_doc},
1504 {"reverse", (PyCFunction)deque_reverse,
1505 METH_NOARGS, reverse_doc},
1506 {"rotate", (PyCFunction)deque_rotate,
Jesus Cea16e2fca2012-08-03 14:49:42 +02001507 METH_VARARGS, rotate_doc},
1508 {"__sizeof__", (PyCFunction)deque_sizeof,
1509 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001511};
1512
1513PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001514"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001515\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001516A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001517
Neal Norwitz87f10132004-02-29 15:40:53 +00001518static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 PyVarObject_HEAD_INIT(NULL, 0)
1520 "collections.deque", /* tp_name */
1521 sizeof(dequeobject), /* tp_basicsize */
1522 0, /* tp_itemsize */
1523 /* methods */
1524 (destructor)deque_dealloc, /* tp_dealloc */
1525 0, /* tp_print */
1526 0, /* tp_getattr */
1527 0, /* tp_setattr */
1528 0, /* tp_reserved */
1529 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001530 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 &deque_as_sequence, /* tp_as_sequence */
1532 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001533 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 0, /* tp_call */
1535 0, /* tp_str */
1536 PyObject_GenericGetAttr, /* tp_getattro */
1537 0, /* tp_setattro */
1538 0, /* tp_as_buffer */
1539 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001540 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 deque_doc, /* tp_doc */
1542 (traverseproc)deque_traverse, /* tp_traverse */
1543 (inquiry)deque_clear, /* tp_clear */
1544 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001545 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 (getiterfunc)deque_iter, /* tp_iter */
1547 0, /* tp_iternext */
1548 deque_methods, /* tp_methods */
1549 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001550 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 0, /* tp_base */
1552 0, /* tp_dict */
1553 0, /* tp_descr_get */
1554 0, /* tp_descr_set */
1555 0, /* tp_dictoffset */
1556 (initproc)deque_init, /* tp_init */
1557 PyType_GenericAlloc, /* tp_alloc */
1558 deque_new, /* tp_new */
1559 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001560};
1561
1562/*********************** Deque Iterator **************************/
1563
1564typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001567 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001569 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001571} dequeiterobject;
1572
Martin v. Löwis59683e82008-06-13 07:50:45 +00001573static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001574
1575static PyObject *
1576deque_iter(dequeobject *deque)
1577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1581 if (it == NULL)
1582 return NULL;
1583 it->b = deque->leftblock;
1584 it->index = deque->leftindex;
1585 Py_INCREF(deque);
1586 it->deque = deque;
1587 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001588 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 PyObject_GC_Track(it);
1590 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001591}
1592
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001593static int
1594dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 Py_VISIT(dio->deque);
1597 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001598}
1599
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001600static void
1601dequeiter_dealloc(dequeiterobject *dio)
1602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 Py_XDECREF(dio->deque);
1604 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001605}
1606
1607static PyObject *
1608dequeiter_next(dequeiterobject *it)
1609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 if (it->deque->state != it->state) {
1613 it->counter = 0;
1614 PyErr_SetString(PyExc_RuntimeError,
1615 "deque mutated during iteration");
1616 return NULL;
1617 }
1618 if (it->counter == 0)
1619 return NULL;
1620 assert (!(it->b == it->deque->rightblock &&
1621 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 item = it->b->data[it->index];
1624 it->index++;
1625 it->counter--;
1626 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001627 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 it->b = it->b->rightlink;
1629 it->index = 0;
1630 }
1631 Py_INCREF(item);
1632 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001633}
1634
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001635static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001636dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1637{
1638 Py_ssize_t i, index=0;
1639 PyObject *deque;
1640 dequeiterobject *it;
1641 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1642 return NULL;
1643 assert(type == &dequeiter_type);
1644
1645 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1646 if (!it)
1647 return NULL;
1648 /* consume items from the queue */
1649 for(i=0; i<index; i++) {
1650 PyObject *item = dequeiter_next(it);
1651 if (item) {
1652 Py_DECREF(item);
1653 } else {
1654 if (it->counter) {
1655 Py_DECREF(it);
1656 return NULL;
1657 } else
1658 break;
1659 }
1660 }
1661 return (PyObject*)it;
1662}
1663
1664static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001665dequeiter_len(dequeiterobject *it)
1666{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001667 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001668}
1669
Armin Rigof5b3e362006-02-11 21:32:43 +00001670PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001671
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001672static PyObject *
1673dequeiter_reduce(dequeiterobject *it)
1674{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001675 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 +00001676}
1677
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001678static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001680 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001682};
1683
Martin v. Löwis59683e82008-06-13 07:50:45 +00001684static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001686 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 sizeof(dequeiterobject), /* tp_basicsize */
1688 0, /* tp_itemsize */
1689 /* methods */
1690 (destructor)dequeiter_dealloc, /* tp_dealloc */
1691 0, /* tp_print */
1692 0, /* tp_getattr */
1693 0, /* tp_setattr */
1694 0, /* tp_reserved */
1695 0, /* tp_repr */
1696 0, /* tp_as_number */
1697 0, /* tp_as_sequence */
1698 0, /* tp_as_mapping */
1699 0, /* tp_hash */
1700 0, /* tp_call */
1701 0, /* tp_str */
1702 PyObject_GenericGetAttr, /* tp_getattro */
1703 0, /* tp_setattro */
1704 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001705 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 0, /* tp_doc */
1707 (traverseproc)dequeiter_traverse, /* tp_traverse */
1708 0, /* tp_clear */
1709 0, /* tp_richcompare */
1710 0, /* tp_weaklistoffset */
1711 PyObject_SelfIter, /* tp_iter */
1712 (iternextfunc)dequeiter_next, /* tp_iternext */
1713 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001714 0, /* tp_members */
1715 0, /* tp_getset */
1716 0, /* tp_base */
1717 0, /* tp_dict */
1718 0, /* tp_descr_get */
1719 0, /* tp_descr_set */
1720 0, /* tp_dictoffset */
1721 0, /* tp_init */
1722 0, /* tp_alloc */
1723 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001725};
1726
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001727/*********************** Deque Reverse Iterator **************************/
1728
Martin v. Löwis59683e82008-06-13 07:50:45 +00001729static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001730
1731static PyObject *
1732deque_reviter(dequeobject *deque)
1733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1737 if (it == NULL)
1738 return NULL;
1739 it->b = deque->rightblock;
1740 it->index = deque->rightindex;
1741 Py_INCREF(deque);
1742 it->deque = deque;
1743 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001744 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 PyObject_GC_Track(it);
1746 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001747}
1748
1749static PyObject *
1750dequereviter_next(dequeiterobject *it)
1751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 PyObject *item;
1753 if (it->counter == 0)
1754 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 if (it->deque->state != it->state) {
1757 it->counter = 0;
1758 PyErr_SetString(PyExc_RuntimeError,
1759 "deque mutated during iteration");
1760 return NULL;
1761 }
1762 assert (!(it->b == it->deque->leftblock &&
1763 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 item = it->b->data[it->index];
1766 it->index--;
1767 it->counter--;
1768 if (it->index == -1 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001769 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 it->b = it->b->leftlink;
1771 it->index = BLOCKLEN - 1;
1772 }
1773 Py_INCREF(item);
1774 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001775}
1776
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001777static PyObject *
1778dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1779{
1780 Py_ssize_t i, index=0;
1781 PyObject *deque;
1782 dequeiterobject *it;
1783 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1784 return NULL;
1785 assert(type == &dequereviter_type);
1786
1787 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1788 if (!it)
1789 return NULL;
1790 /* consume items from the queue */
1791 for(i=0; i<index; i++) {
1792 PyObject *item = dequereviter_next(it);
1793 if (item) {
1794 Py_DECREF(item);
1795 } else {
1796 if (it->counter) {
1797 Py_DECREF(it);
1798 return NULL;
1799 } else
1800 break;
1801 }
1802 }
1803 return (PyObject*)it;
1804}
1805
Martin v. Löwis59683e82008-06-13 07:50:45 +00001806static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001808 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 sizeof(dequeiterobject), /* tp_basicsize */
1810 0, /* tp_itemsize */
1811 /* methods */
1812 (destructor)dequeiter_dealloc, /* tp_dealloc */
1813 0, /* tp_print */
1814 0, /* tp_getattr */
1815 0, /* tp_setattr */
1816 0, /* tp_reserved */
1817 0, /* tp_repr */
1818 0, /* tp_as_number */
1819 0, /* tp_as_sequence */
1820 0, /* tp_as_mapping */
1821 0, /* tp_hash */
1822 0, /* tp_call */
1823 0, /* tp_str */
1824 PyObject_GenericGetAttr, /* tp_getattro */
1825 0, /* tp_setattro */
1826 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001827 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 0, /* tp_doc */
1829 (traverseproc)dequeiter_traverse, /* tp_traverse */
1830 0, /* tp_clear */
1831 0, /* tp_richcompare */
1832 0, /* tp_weaklistoffset */
1833 PyObject_SelfIter, /* tp_iter */
1834 (iternextfunc)dequereviter_next, /* tp_iternext */
1835 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001836 0, /* tp_members */
1837 0, /* tp_getset */
1838 0, /* tp_base */
1839 0, /* tp_dict */
1840 0, /* tp_descr_get */
1841 0, /* tp_descr_set */
1842 0, /* tp_dictoffset */
1843 0, /* tp_init */
1844 0, /* tp_alloc */
1845 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001847};
1848
Guido van Rossum1968ad32006-02-25 22:38:04 +00001849/* defaultdict type *********************************************************/
1850
1851typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 PyDictObject dict;
1853 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001854} defdictobject;
1855
1856static PyTypeObject defdict_type; /* Forward */
1857
1858PyDoc_STRVAR(defdict_missing_doc,
1859"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001860 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001861 self[key] = value = self.default_factory()\n\
1862 return value\n\
1863");
1864
1865static PyObject *
1866defdict_missing(defdictobject *dd, PyObject *key)
1867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 PyObject *factory = dd->default_factory;
1869 PyObject *value;
1870 if (factory == NULL || factory == Py_None) {
1871 /* XXX Call dict.__missing__(key) */
1872 PyObject *tup;
1873 tup = PyTuple_Pack(1, key);
1874 if (!tup) return NULL;
1875 PyErr_SetObject(PyExc_KeyError, tup);
1876 Py_DECREF(tup);
1877 return NULL;
1878 }
1879 value = PyEval_CallObject(factory, NULL);
1880 if (value == NULL)
1881 return value;
1882 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1883 Py_DECREF(value);
1884 return NULL;
1885 }
1886 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001887}
1888
1889PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1890
1891static PyObject *
1892defdict_copy(defdictobject *dd)
1893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 /* This calls the object's class. That only works for subclasses
1895 whose class constructor has the same signature. Subclasses that
1896 define a different constructor signature must override copy().
1897 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00001898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 if (dd->default_factory == NULL)
1900 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1901 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1902 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001903}
1904
1905static PyObject *
1906defdict_reduce(defdictobject *dd)
1907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 - factory function
1911 - tuple of args for the factory function
1912 - additional state (here None)
1913 - sequence iterator (here None)
1914 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 For this to be useful with pickle.py, the default_factory
1919 must be picklable; e.g., None, a built-in, or a global
1920 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 Both shallow and deep copying are supported, but for deep
1923 copying, the default_factory must be deep-copyable; e.g. None,
1924 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 This only works for subclasses as long as their constructor
1927 signature is compatible; the first argument must be the
1928 optional default_factory, defaulting to None.
1929 */
1930 PyObject *args;
1931 PyObject *items;
1932 PyObject *iter;
1933 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001934 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 if (dd->default_factory == NULL || dd->default_factory == Py_None)
1937 args = PyTuple_New(0);
1938 else
1939 args = PyTuple_Pack(1, dd->default_factory);
1940 if (args == NULL)
1941 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001942 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 if (items == NULL) {
1944 Py_DECREF(args);
1945 return NULL;
1946 }
1947 iter = PyObject_GetIter(items);
1948 if (iter == NULL) {
1949 Py_DECREF(items);
1950 Py_DECREF(args);
1951 return NULL;
1952 }
1953 result = PyTuple_Pack(5, Py_TYPE(dd), args,
1954 Py_None, Py_None, iter);
1955 Py_DECREF(iter);
1956 Py_DECREF(items);
1957 Py_DECREF(args);
1958 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001959}
1960
1961static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 {"__missing__", (PyCFunction)defdict_missing, METH_O,
1963 defdict_missing_doc},
1964 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1965 defdict_copy_doc},
1966 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1967 defdict_copy_doc},
1968 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1969 reduce_doc},
1970 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001971};
1972
1973static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 {"default_factory", T_OBJECT,
1975 offsetof(defdictobject, default_factory), 0,
1976 PyDoc_STR("Factory for default value called by __missing__().")},
1977 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001978};
1979
1980static void
1981defdict_dealloc(defdictobject *dd)
1982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 Py_CLEAR(dd->default_factory);
1984 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001985}
1986
Guido van Rossum1968ad32006-02-25 22:38:04 +00001987static PyObject *
1988defdict_repr(defdictobject *dd)
1989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 PyObject *baserepr;
1991 PyObject *defrepr;
1992 PyObject *result;
1993 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
1994 if (baserepr == NULL)
1995 return NULL;
1996 if (dd->default_factory == NULL)
1997 defrepr = PyUnicode_FromString("None");
1998 else
1999 {
2000 int status = Py_ReprEnter(dd->default_factory);
2001 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002002 if (status < 0) {
2003 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002005 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 defrepr = PyUnicode_FromString("...");
2007 }
2008 else
2009 defrepr = PyObject_Repr(dd->default_factory);
2010 Py_ReprLeave(dd->default_factory);
2011 }
2012 if (defrepr == NULL) {
2013 Py_DECREF(baserepr);
2014 return NULL;
2015 }
2016 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2017 defrepr, baserepr);
2018 Py_DECREF(defrepr);
2019 Py_DECREF(baserepr);
2020 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002021}
2022
2023static int
2024defdict_traverse(PyObject *self, visitproc visit, void *arg)
2025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 Py_VISIT(((defdictobject *)self)->default_factory);
2027 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002028}
2029
2030static int
2031defdict_tp_clear(defdictobject *dd)
2032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 Py_CLEAR(dd->default_factory);
2034 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002035}
2036
2037static int
2038defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 defdictobject *dd = (defdictobject *)self;
2041 PyObject *olddefault = dd->default_factory;
2042 PyObject *newdefault = NULL;
2043 PyObject *newargs;
2044 int result;
2045 if (args == NULL || !PyTuple_Check(args))
2046 newargs = PyTuple_New(0);
2047 else {
2048 Py_ssize_t n = PyTuple_GET_SIZE(args);
2049 if (n > 0) {
2050 newdefault = PyTuple_GET_ITEM(args, 0);
2051 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2052 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002053 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 return -1;
2055 }
2056 }
2057 newargs = PySequence_GetSlice(args, 1, n);
2058 }
2059 if (newargs == NULL)
2060 return -1;
2061 Py_XINCREF(newdefault);
2062 dd->default_factory = newdefault;
2063 result = PyDict_Type.tp_init(self, newargs, kwds);
2064 Py_DECREF(newargs);
2065 Py_XDECREF(olddefault);
2066 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002067}
2068
2069PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002070"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002071\n\
2072The default factory is called without arguments to produce\n\
2073a new value when a key is not present, in __getitem__ only.\n\
2074A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002075All remaining arguments are treated the same as if they were\n\
2076passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002077");
2078
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002079/* See comment in xxsubtype.c */
2080#define DEFERRED_ADDRESS(ADDR) 0
2081
Guido van Rossum1968ad32006-02-25 22:38:04 +00002082static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2084 "collections.defaultdict", /* tp_name */
2085 sizeof(defdictobject), /* tp_basicsize */
2086 0, /* tp_itemsize */
2087 /* methods */
2088 (destructor)defdict_dealloc, /* tp_dealloc */
2089 0, /* tp_print */
2090 0, /* tp_getattr */
2091 0, /* tp_setattr */
2092 0, /* tp_reserved */
2093 (reprfunc)defdict_repr, /* tp_repr */
2094 0, /* tp_as_number */
2095 0, /* tp_as_sequence */
2096 0, /* tp_as_mapping */
2097 0, /* tp_hash */
2098 0, /* tp_call */
2099 0, /* tp_str */
2100 PyObject_GenericGetAttr, /* tp_getattro */
2101 0, /* tp_setattro */
2102 0, /* tp_as_buffer */
2103 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2104 /* tp_flags */
2105 defdict_doc, /* tp_doc */
2106 defdict_traverse, /* tp_traverse */
2107 (inquiry)defdict_tp_clear, /* tp_clear */
2108 0, /* tp_richcompare */
2109 0, /* tp_weaklistoffset*/
2110 0, /* tp_iter */
2111 0, /* tp_iternext */
2112 defdict_methods, /* tp_methods */
2113 defdict_members, /* tp_members */
2114 0, /* tp_getset */
2115 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2116 0, /* tp_dict */
2117 0, /* tp_descr_get */
2118 0, /* tp_descr_set */
2119 0, /* tp_dictoffset */
2120 defdict_init, /* tp_init */
2121 PyType_GenericAlloc, /* tp_alloc */
2122 0, /* tp_new */
2123 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002124};
2125
Raymond Hettinger96f34102010-12-15 16:30:37 +00002126/* helper function for Counter *********************************************/
2127
2128PyDoc_STRVAR(_count_elements_doc,
2129"_count_elements(mapping, iterable) -> None\n\
2130\n\
2131Count elements in the iterable, updating the mappping");
2132
2133static PyObject *
2134_count_elements(PyObject *self, PyObject *args)
2135{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002136 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002137 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002138 PyObject *it, *iterable, *mapping, *oldval;
2139 PyObject *newval = NULL;
2140 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002141 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002142 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002143 PyObject *bound_get = NULL;
2144 PyObject *mapping_get;
2145 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002146 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002147 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002148
2149 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2150 return NULL;
2151
Raymond Hettinger96f34102010-12-15 16:30:37 +00002152 it = PyObject_GetIter(iterable);
2153 if (it == NULL)
2154 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002155
Raymond Hettinger96f34102010-12-15 16:30:37 +00002156 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002157 if (one == NULL)
2158 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002159
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002160 /* Only take the fast path when get() and __setitem__()
2161 * have not been overridden.
2162 */
2163 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2164 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002165 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2166 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2167
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002168 if (mapping_get != NULL && mapping_get == dict_get &&
2169 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002170 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002171 /* Fast path advantages:
2172 1. Eliminate double hashing
2173 (by re-using the same hash for both the get and set)
2174 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2175 (argument tuple creation and parsing)
2176 3. Avoid indirection through a bound method object
2177 (creates another argument tuple)
2178 4. Avoid initial increment from zero
2179 (reuse an existing one-object instead)
2180 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002181 Py_hash_t hash;
2182
Raymond Hettinger426e0522011-01-03 02:12:02 +00002183 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002184 if (key == NULL)
2185 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002186
2187 if (!PyUnicode_CheckExact(key) ||
2188 (hash = ((PyASCIIObject *) key)->hash) == -1)
2189 {
2190 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002191 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002192 goto done;
2193 }
2194
2195 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002196 if (oldval == NULL) {
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002197 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002198 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002199 } else {
2200 newval = PyNumber_Add(oldval, one);
2201 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002202 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002203 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002204 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002205 Py_CLEAR(newval);
2206 }
2207 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002208 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002209 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002210 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002211 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002212 goto done;
2213
2214 zero = PyLong_FromLong(0);
2215 if (zero == NULL)
2216 goto done;
2217
Raymond Hettinger426e0522011-01-03 02:12:02 +00002218 while (1) {
2219 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002220 if (key == NULL)
2221 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002222 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002223 if (oldval == NULL)
2224 break;
2225 newval = PyNumber_Add(oldval, one);
2226 Py_DECREF(oldval);
2227 if (newval == NULL)
2228 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002229 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002230 break;
2231 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002232 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002233 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002234 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002235
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002236done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002237 Py_DECREF(it);
2238 Py_XDECREF(key);
2239 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002240 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002241 Py_XDECREF(zero);
2242 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002243 if (PyErr_Occurred())
2244 return NULL;
2245 Py_RETURN_NONE;
2246}
2247
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002248/* module level code ********************************************************/
2249
2250PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002251"High performance data structures.\n\
2252- deque: ordered collection accessible from endpoints only\n\
2253- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002254");
2255
Raymond Hettinger96f34102010-12-15 16:30:37 +00002256static struct PyMethodDef module_functions[] = {
2257 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2258 {NULL, NULL} /* sentinel */
2259};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002260
2261static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 PyModuleDef_HEAD_INIT,
2263 "_collections",
2264 module_doc,
2265 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002266 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 NULL,
2268 NULL,
2269 NULL,
2270 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002271};
2272
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002273PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002274PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 m = PyModule_Create(&_collectionsmodule);
2279 if (m == NULL)
2280 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 if (PyType_Ready(&deque_type) < 0)
2283 return NULL;
2284 Py_INCREF(&deque_type);
2285 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 defdict_type.tp_base = &PyDict_Type;
2288 if (PyType_Ready(&defdict_type) < 0)
2289 return NULL;
2290 Py_INCREF(&defdict_type);
2291 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002292
Eric Snow47db7172015-05-29 22:21:39 -06002293 Py_INCREF(&PyODict_Type);
2294 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 if (PyType_Ready(&dequeiter_type) < 0)
2297 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002298 Py_INCREF(&dequeiter_type);
2299 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 if (PyType_Ready(&dequereviter_type) < 0)
2302 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002303 Py_INCREF(&dequereviter_type);
2304 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002307}