blob: dbe44e145596bc76a5ba55a7e6e46c7e088733aa [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 Hettinger0e14e662015-09-19 00:21:33 -0600374 int trim = (deque->maxlen != -1);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 /* Handle case where id(deque) == id(iterable) */
377 if ((PyObject *)deque == iterable) {
378 PyObject *result;
379 PyObject *s = PySequence_List(iterable);
380 if (s == NULL)
381 return NULL;
382 result = deque_extend(deque, s);
383 Py_DECREF(s);
384 return result;
385 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000386
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700387 /* Space saving heuristic. Start filling from the left */
388 if (Py_SIZE(deque) == 0) {
389 assert(deque->leftblock == deque->rightblock);
390 assert(deque->leftindex == deque->rightindex+1);
391 deque->leftindex = 1;
392 deque->rightindex = 0;
393 }
394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 it = PyObject_GetIter(iterable);
396 if (it == NULL)
397 return NULL;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 if (deque->maxlen == 0)
400 return consume_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 while ((item = PyIter_Next(it)) != NULL) {
403 deque->state++;
Raymond Hettinger8dbbae22015-03-24 21:01:50 -0700404 if (deque->rightindex == BLOCKLEN - 1) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000405 block *b = newblock(Py_SIZE(deque));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 if (b == NULL) {
407 Py_DECREF(item);
408 Py_DECREF(it);
409 return NULL;
410 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000411 b->leftlink = deque->rightblock;
412 CHECK_END(deque->rightblock->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 deque->rightblock->rightlink = b;
414 deque->rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000415 MARK_END(b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 deque->rightindex = -1;
417 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000418 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 deque->rightindex++;
420 deque->rightblock->data[deque->rightindex] = item;
Raymond Hettinger0e14e662015-09-19 00:21:33 -0600421 if (trim)
422 deque_trim_left(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 }
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700424 if (PyErr_Occurred()) {
425 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 return NULL;
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700427 }
428 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 Py_RETURN_NONE;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000430}
431
Tim Peters1065f752004-10-01 01:03:29 +0000432PyDoc_STRVAR(extend_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000433"Extend the right side of the deque with elements from the iterable");
434
435static PyObject *
436deque_extendleft(dequeobject *deque, PyObject *iterable)
437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 PyObject *it, *item;
Raymond Hettinger0e14e662015-09-19 00:21:33 -0600439 int trim = (deque->maxlen != -1);
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 /* Handle case where id(deque) == id(iterable) */
442 if ((PyObject *)deque == iterable) {
443 PyObject *result;
444 PyObject *s = PySequence_List(iterable);
445 if (s == NULL)
446 return NULL;
447 result = deque_extendleft(deque, s);
448 Py_DECREF(s);
449 return result;
450 }
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000451
Raymond Hettingerd9c116c2013-07-09 00:13:21 -0700452 /* Space saving heuristic. Start filling from the right */
453 if (Py_SIZE(deque) == 0) {
454 assert(deque->leftblock == deque->rightblock);
455 assert(deque->leftindex == deque->rightindex+1);
456 deque->leftindex = BLOCKLEN - 1;
457 deque->rightindex = BLOCKLEN - 2;
458 }
459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 it = PyObject_GetIter(iterable);
461 if (it == NULL)
462 return NULL;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (deque->maxlen == 0)
465 return consume_iterator(it);
Raymond Hettinger060c7f62009-03-10 09:36:07 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 while ((item = PyIter_Next(it)) != NULL) {
468 deque->state++;
469 if (deque->leftindex == 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000470 block *b = newblock(Py_SIZE(deque));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 if (b == NULL) {
472 Py_DECREF(item);
473 Py_DECREF(it);
474 return NULL;
475 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000476 b->rightlink = deque->leftblock;
477 CHECK_END(deque->leftblock->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 deque->leftblock->leftlink = b;
479 deque->leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000480 MARK_END(b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 deque->leftindex = BLOCKLEN;
482 }
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000483 Py_SIZE(deque)++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 deque->leftindex--;
485 deque->leftblock->data[deque->leftindex] = item;
Raymond Hettinger0e14e662015-09-19 00:21:33 -0600486 if (trim)
487 deque_trim_right(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 }
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700489 if (PyErr_Occurred()) {
490 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 return NULL;
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700492 }
493 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 Py_RETURN_NONE;
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000495}
496
Tim Peters1065f752004-10-01 01:03:29 +0000497PyDoc_STRVAR(extendleft_doc,
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000498"Extend the left side of the deque with elements from the iterable");
499
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000500static PyObject *
501deque_inplace_concat(dequeobject *deque, PyObject *other)
502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 PyObject *result;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 result = deque_extend(deque, other);
506 if (result == NULL)
507 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 Py_INCREF(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -0700509 Py_DECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 return (PyObject *)deque;
Raymond Hettinger3f9afd82009-12-10 03:03:02 +0000511}
512
Raymond Hettinger41290a62015-03-31 08:12:23 -0700513static PyObject *deque_copy(PyObject *deque);
514
515static PyObject *
516deque_concat(dequeobject *deque, PyObject *other)
517{
Benjamin Peterson1a629212015-04-04 10:52:36 -0400518 PyObject *new_deque, *result;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700519 int rv;
520
521 rv = PyObject_IsInstance(other, (PyObject *)&deque_type);
522 if (rv <= 0) {
523 if (rv == 0) {
524 PyErr_Format(PyExc_TypeError,
525 "can only concatenate deque (not \"%.200s\") to deque",
526 other->ob_type->tp_name);
527 }
528 return NULL;
529 }
530
531 new_deque = deque_copy((PyObject *)deque);
532 if (new_deque == NULL)
533 return NULL;
Benjamin Peterson1a629212015-04-04 10:52:36 -0400534 result = deque_extend((dequeobject *)new_deque, other);
535 if (result == NULL) {
536 Py_DECREF(new_deque);
537 return NULL;
538 }
539 Py_DECREF(result);
540 return new_deque;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700541}
542
543static void deque_clear(dequeobject *deque);
544
545static PyObject *
Raymond Hettinger41290a62015-03-31 08:12:23 -0700546deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
547{
548 Py_ssize_t i, size;
549 PyObject *seq;
550 PyObject *rv;
551
552 size = Py_SIZE(deque);
553 if (size == 0 || n == 1) {
554 Py_INCREF(deque);
555 return (PyObject *)deque;
556 }
557
558 if (n <= 0) {
559 deque_clear(deque);
560 Py_INCREF(deque);
561 return (PyObject *)deque;
562 }
563
Raymond Hettinger41290a62015-03-31 08:12:23 -0700564 if (size == 1) {
565 /* common case, repeating a single element */
566 PyObject *item = deque->leftblock->data[deque->leftindex];
567
568 if (deque->maxlen != -1 && n > deque->maxlen)
569 n = deque->maxlen;
570
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400571 if (n > MAX_DEQUE_LEN)
572 return PyErr_NoMemory();
573
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400574 deque->state++;
Raymond Hettingerad262252015-09-14 01:03:04 -0400575 for (i = 0 ; i < n-1 ; ) {
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400576 if (deque->rightindex == BLOCKLEN - 1) {
577 block *b = newblock(Py_SIZE(deque) + i);
578 if (b == NULL) {
579 Py_SIZE(deque) += i;
580 return NULL;
581 }
582 b->leftlink = deque->rightblock;
583 CHECK_END(deque->rightblock->rightlink);
584 deque->rightblock->rightlink = b;
585 deque->rightblock = b;
586 MARK_END(b->rightlink);
587 deque->rightindex = -1;
588 }
Raymond Hettingerad262252015-09-14 01:03:04 -0400589 for ( ; i < n-1 && deque->rightindex != BLOCKLEN - 1 ; i++) {
590 deque->rightindex++;
591 Py_INCREF(item);
592 deque->rightblock->data[deque->rightindex] = item;
593 }
Raymond Hettinger41290a62015-03-31 08:12:23 -0700594 }
Raymond Hettinger67c78b52015-09-12 11:00:20 -0400595 Py_SIZE(deque) += i;
Raymond Hettinger41290a62015-03-31 08:12:23 -0700596 Py_INCREF(deque);
597 return (PyObject *)deque;
598 }
599
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400600 if ((size_t)size > MAX_DEQUE_LEN / (size_t)n) {
601 return PyErr_NoMemory();
602 }
603
Raymond Hettinger41290a62015-03-31 08:12:23 -0700604 seq = PySequence_List((PyObject *)deque);
605 if (seq == NULL)
606 return seq;
607
608 for (i = 0 ; i < n-1 ; i++) {
609 rv = deque_extend(deque, seq);
610 if (rv == NULL) {
611 Py_DECREF(seq);
612 return NULL;
613 }
614 Py_DECREF(rv);
615 }
616 Py_INCREF(deque);
617 Py_DECREF(seq);
618 return (PyObject *)deque;
619}
620
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400621static PyObject *
622deque_repeat(dequeobject *deque, Py_ssize_t n)
623{
624 dequeobject *new_deque;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400625 PyObject *rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400626
627 new_deque = (dequeobject *)deque_copy((PyObject *) deque);
628 if (new_deque == NULL)
629 return NULL;
Raymond Hettinger95e2cc52015-09-13 02:41:18 -0400630 rv = deque_inplace_repeat(new_deque, n);
631 Py_DECREF(new_deque);
632 return rv;
Raymond Hettingerf5d72f32015-09-09 22:39:44 -0400633}
634
Raymond Hettinger54023152014-04-23 00:58:48 -0700635/* The rotate() method is part of the public API and is used internally
636as a primitive for other methods.
637
638Rotation by 1 or -1 is a common case, so any optimizations for high
639volume rotations should take care not to penalize the common case.
640
641Conceptually, a rotate by one is equivalent to a pop on one side and an
642append on the other. However, a pop/append pair is unnecessarily slow
643because it requires a incref/decref pair for an object located randomly
644in memory. It is better to just move the object pointer from one block
645to the next without changing the reference count.
646
647When moving batches of pointers, it is tempting to use memcpy() but that
648proved to be slower than a simple loop for a variety of reasons.
649Memcpy() cannot know in advance that we're copying pointers instead of
650bytes, that the source and destination are pointer aligned and
651non-overlapping, that moving just one pointer is a common case, that we
652never need to move more than BLOCKLEN pointers, and that at least one
653pointer is always moved.
654
655For high volume rotations, newblock() and freeblock() are never called
656more than once. Previously emptied blocks are immediately reused as a
657destination block. If a block is left-over at the end, it is freed.
658*/
659
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000660static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000661_deque_rotate(dequeobject *deque, Py_ssize_t n)
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000662{
Raymond Hettinger3959af92013-07-13 02:34:08 -0700663 block *b = NULL;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700664 block *leftblock = deque->leftblock;
665 block *rightblock = deque->rightblock;
666 Py_ssize_t leftindex = deque->leftindex;
667 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000668 Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700669 int rv = -1;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000670
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800671 if (len <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 return 0;
673 if (n > halflen || n < -halflen) {
674 n %= len;
675 if (n > halflen)
676 n -= len;
677 else if (n < -halflen)
678 n += len;
679 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500680 assert(len > 1);
Raymond Hettingera4409c12013-02-04 00:08:12 -0500681 assert(-halflen <= n && n <= halflen);
Raymond Hettinger231ee4d2013-02-02 11:24:43 -0800682
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800683 deque->state++;
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500684 while (n > 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700685 if (leftindex == 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700686 if (b == NULL) {
Raymond Hettinger3959af92013-07-13 02:34:08 -0700687 b = newblock(len);
688 if (b == NULL)
689 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700690 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000691 b->rightlink = leftblock;
692 CHECK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700693 leftblock->leftlink = b;
694 leftblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000695 MARK_END(b->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700696 leftindex = BLOCKLEN;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700697 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800698 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700699 assert(leftindex > 0);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700700 {
701 PyObject **src, **dest;
702 Py_ssize_t m = n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800703
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700704 if (m > rightindex + 1)
705 m = rightindex + 1;
706 if (m > leftindex)
707 m = leftindex;
708 assert (m > 0 && m <= len);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700709 rightindex -= m;
710 leftindex -= m;
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800711 src = &rightblock->data[rightindex + 1];
712 dest = &leftblock->data[leftindex];
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700713 n -= m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700714 do {
Raymond Hettinger0e259f12015-02-01 22:53:41 -0800715 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700716 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700717 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700718 if (rightindex == -1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700719 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700720 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700721 b = rightblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700722 CHECK_NOT_END(rightblock->leftlink);
723 rightblock = rightblock->leftlink;
724 MARK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700725 rightindex = BLOCKLEN - 1;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800726 }
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800727 }
Raymond Hettinger1f0044c2013-02-05 01:30:46 -0500728 while (n < 0) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700729 if (rightindex == BLOCKLEN - 1) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700730 if (b == NULL) {
Raymond Hettinger3959af92013-07-13 02:34:08 -0700731 b = newblock(len);
732 if (b == NULL)
733 goto done;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700734 }
Raymond Hettinger82df9252013-07-07 01:43:42 -1000735 b->leftlink = rightblock;
736 CHECK_END(rightblock->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700737 rightblock->rightlink = b;
738 rightblock = b;
Raymond Hettinger82df9252013-07-07 01:43:42 -1000739 MARK_END(b->rightlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700740 rightindex = -1;
Raymond Hettinger3959af92013-07-13 02:34:08 -0700741 b = NULL;
Raymond Hettinger464d89b2013-01-11 22:29:50 -0800742 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700743 assert (rightindex < BLOCKLEN - 1);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700744 {
745 PyObject **src, **dest;
746 Py_ssize_t m = -n;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800747
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700748 if (m > BLOCKLEN - leftindex)
749 m = BLOCKLEN - leftindex;
750 if (m > BLOCKLEN - 1 - rightindex)
751 m = BLOCKLEN - 1 - rightindex;
752 assert (m > 0 && m <= len);
753 src = &leftblock->data[leftindex];
754 dest = &rightblock->data[rightindex + 1];
755 leftindex += m;
756 rightindex += m;
757 n += m;
Raymond Hettinger840533b2013-07-13 17:03:58 -0700758 do {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700759 *(dest++) = *(src++);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700760 } while (--m);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700761 }
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700762 if (leftindex == BLOCKLEN) {
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700763 assert(leftblock != rightblock);
Raymond Hettinger840533b2013-07-13 17:03:58 -0700764 assert(b == NULL);
Raymond Hettinger3959af92013-07-13 02:34:08 -0700765 b = leftblock;
Raymond Hettingerb97cc492013-07-21 01:51:07 -0700766 CHECK_NOT_END(leftblock->rightlink);
767 leftblock = leftblock->rightlink;
768 MARK_END(leftblock->leftlink);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700769 leftindex = 0;
Raymond Hettinger21777ac2013-02-02 09:56:08 -0800770 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 }
Raymond Hettinger3959af92013-07-13 02:34:08 -0700772 rv = 0;
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700773done:
Raymond Hettinger3959af92013-07-13 02:34:08 -0700774 if (b != NULL)
775 freeblock(b);
Raymond Hettinger20b0f872013-06-23 15:44:33 -0700776 deque->leftblock = leftblock;
777 deque->rightblock = rightblock;
778 deque->leftindex = leftindex;
779 deque->rightindex = rightindex;
780
781 return rv;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000782}
783
784static PyObject *
785deque_rotate(dequeobject *deque, PyObject *args)
786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 Py_ssize_t n=1;
Raymond Hettingerdcb9d942004-10-09 16:02:18 +0000788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 if (!PyArg_ParseTuple(args, "|n:rotate", &n))
790 return NULL;
Raymond Hettinger6921c132015-03-21 02:03:40 -0700791 if (!_deque_rotate(deque, n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 Py_RETURN_NONE;
793 return NULL;
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000794}
795
Tim Peters1065f752004-10-01 01:03:29 +0000796PyDoc_STRVAR(rotate_doc,
Raymond Hettingeree33b272004-02-08 04:05:26 +0000797"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.");
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000798
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000799static PyObject *
800deque_reverse(dequeobject *deque, PyObject *unused)
801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 block *leftblock = deque->leftblock;
803 block *rightblock = deque->rightblock;
804 Py_ssize_t leftindex = deque->leftindex;
805 Py_ssize_t rightindex = deque->rightindex;
Raymond Hettingercfe5b6c2015-07-20 00:25:50 -0400806 Py_ssize_t n = Py_SIZE(deque) >> 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 Py_ssize_t i;
808 PyObject *tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 for (i=0 ; i<n ; i++) {
811 /* Validate that pointers haven't met in the middle */
812 assert(leftblock != rightblock || leftindex < rightindex);
Raymond Hettinger82df9252013-07-07 01:43:42 -1000813 CHECK_NOT_END(leftblock);
814 CHECK_NOT_END(rightblock);
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 /* Swap */
817 tmp = leftblock->data[leftindex];
818 leftblock->data[leftindex] = rightblock->data[rightindex];
819 rightblock->data[rightindex] = tmp;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 /* Advance left block/index pair */
822 leftindex++;
823 if (leftindex == BLOCKLEN) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 leftblock = leftblock->rightlink;
825 leftindex = 0;
826 }
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 /* Step backwards with the right block/index pair */
829 rightindex--;
830 if (rightindex == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 rightblock = rightblock->leftlink;
832 rightindex = BLOCKLEN - 1;
833 }
834 }
835 Py_RETURN_NONE;
Raymond Hettingere5fdedb2009-12-10 00:47:21 +0000836}
837
838PyDoc_STRVAR(reverse_doc,
839"D.reverse() -- reverse *IN PLACE*");
840
Raymond Hettinger44459de2010-04-03 23:20:46 +0000841static PyObject *
842deque_count(dequeobject *deque, PyObject *v)
843{
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000844 block *b = deque->leftblock;
845 Py_ssize_t index = deque->leftindex;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000846 Py_ssize_t n = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 Py_ssize_t i;
848 Py_ssize_t count = 0;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -0800849 size_t start_state = deque->state;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 PyObject *item;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 int cmp;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 for (i=0 ; i<n ; i++) {
Raymond Hettinger82df9252013-07-07 01:43:42 -1000854 CHECK_NOT_END(b);
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000855 item = b->data[index];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
857 if (cmp > 0)
858 count++;
859 else if (cmp < 0)
860 return NULL;
Raymond Hettinger44459de2010-04-03 23:20:46 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 if (start_state != deque->state) {
863 PyErr_SetString(PyExc_RuntimeError,
864 "deque mutated during iteration");
865 return NULL;
866 }
Raymond Hettinger44459de2010-04-03 23:20:46 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 /* Advance left block/index pair */
Raymond Hettingerf3a67b72013-07-06 17:49:06 -1000869 index++;
870 if (index == BLOCKLEN) {
871 b = b->rightlink;
872 index = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 }
874 }
875 return PyLong_FromSsize_t(count);
Raymond Hettinger44459de2010-04-03 23:20:46 +0000876}
877
878PyDoc_STRVAR(count_doc,
879"D.count(value) -> integer -- return number of occurrences of value");
880
Raymond Hettinger39dadf72015-03-20 16:38:56 -0700881static int
882deque_contains(dequeobject *deque, PyObject *v)
883{
884 block *b = deque->leftblock;
885 Py_ssize_t index = deque->leftindex;
886 Py_ssize_t n = Py_SIZE(deque);
887 Py_ssize_t i;
888 size_t start_state = deque->state;
889 PyObject *item;
890 int cmp;
891
892 for (i=0 ; i<n ; i++) {
893 CHECK_NOT_END(b);
894 item = b->data[index];
895 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
896 if (cmp) {
897 return cmp;
898 }
899 if (start_state != deque->state) {
900 PyErr_SetString(PyExc_RuntimeError,
901 "deque mutated during iteration");
902 return -1;
903 }
904 index++;
905 if (index == BLOCKLEN) {
906 b = b->rightlink;
907 index = 0;
908 }
909 }
910 return 0;
911}
912
Martin v. Löwis18e16552006-02-15 17:27:45 +0000913static Py_ssize_t
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000914deque_len(dequeobject *deque)
915{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -1000916 return Py_SIZE(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000917}
918
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000919static PyObject *
Raymond Hettinger32ea1652015-03-21 01:37:37 -0700920deque_index(dequeobject *deque, PyObject *args)
921{
922 Py_ssize_t i, start=0, stop=Py_SIZE(deque);
923 PyObject *v, *item;
924 block *b = deque->leftblock;
925 Py_ssize_t index = deque->leftindex;
926 size_t start_state = deque->state;
927
928 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
929 _PyEval_SliceIndex, &start,
930 _PyEval_SliceIndex, &stop))
931 return NULL;
932 if (start < 0) {
933 start += Py_SIZE(deque);
934 if (start < 0)
935 start = 0;
936 }
937 if (stop < 0) {
938 stop += Py_SIZE(deque);
939 if (stop < 0)
940 stop = 0;
941 }
Raymond Hettinger87674ec2015-08-26 08:08:38 -0700942 if (stop > Py_SIZE(deque))
943 stop = Py_SIZE(deque);
Raymond Hettinger32ea1652015-03-21 01:37:37 -0700944
945 for (i=0 ; i<stop ; i++) {
946 if (i >= start) {
947 int cmp;
948 CHECK_NOT_END(b);
949 item = b->data[index];
950 cmp = PyObject_RichCompareBool(item, v, Py_EQ);
951 if (cmp > 0)
952 return PyLong_FromSsize_t(i);
953 else if (cmp < 0)
954 return NULL;
955 if (start_state != deque->state) {
956 PyErr_SetString(PyExc_RuntimeError,
957 "deque mutated during iteration");
958 return NULL;
959 }
960 }
961 index++;
962 if (index == BLOCKLEN) {
963 b = b->rightlink;
964 index = 0;
965 }
966 }
967 PyErr_Format(PyExc_ValueError, "%R is not in deque", v);
968 return NULL;
969}
970
971PyDoc_STRVAR(index_doc,
972"D.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
973"Raises ValueError if the value is not present.");
974
Raymond Hettinger551350a2015-03-24 00:19:53 -0700975/* insert(), remove(), and delitem() are implemented in terms of
976 rotate() for simplicity and reasonable performance near the end
977 points. If for some reason these methods become popular, it is not
978 hard to re-implement this using direct data movement (similar to
979 the code used in list slice assignments) and achieve a performance
Raymond Hettingerfef9c1b2015-03-24 21:12:57 -0700980 boost (by moving each pointer only once instead of twice).
Raymond Hettinger551350a2015-03-24 00:19:53 -0700981*/
982
Raymond Hettinger32ea1652015-03-21 01:37:37 -0700983static PyObject *
984deque_insert(dequeobject *deque, PyObject *args)
985{
986 Py_ssize_t index;
987 Py_ssize_t n = Py_SIZE(deque);
988 PyObject *value;
989 PyObject *rv;
990
991 if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
992 return NULL;
993 if (index >= n)
994 return deque_append(deque, value);
995 if (index <= -n || index == 0)
996 return deque_appendleft(deque, value);
997 if (_deque_rotate(deque, -index))
998 return NULL;
999 if (index < 0)
1000 rv = deque_append(deque, value);
1001 else
1002 rv = deque_appendleft(deque, value);
1003 if (rv == NULL)
1004 return NULL;
1005 Py_DECREF(rv);
1006 if (_deque_rotate(deque, index))
1007 return NULL;
1008 Py_RETURN_NONE;
1009}
1010
1011PyDoc_STRVAR(insert_doc,
1012"D.insert(index, object) -- insert object before index");
1013
1014static PyObject *
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001015deque_remove(dequeobject *deque, PyObject *value)
1016{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001017 Py_ssize_t i, n=Py_SIZE(deque);
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 for (i=0 ; i<n ; i++) {
1020 PyObject *item = deque->leftblock->data[deque->leftindex];
1021 int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
Raymond Hettingerd73202c2005-03-19 00:00:51 +00001022
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001023 if (Py_SIZE(deque) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 PyErr_SetString(PyExc_IndexError,
1025 "deque mutated during remove().");
1026 return NULL;
1027 }
1028 if (cmp > 0) {
1029 PyObject *tgt = deque_popleft(deque, NULL);
1030 assert (tgt != NULL);
Raymond Hettinger6921c132015-03-21 02:03:40 -07001031 if (_deque_rotate(deque, i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 return NULL;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001033 Py_DECREF(tgt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 Py_RETURN_NONE;
1035 }
1036 else if (cmp < 0) {
1037 _deque_rotate(deque, i);
1038 return NULL;
1039 }
1040 _deque_rotate(deque, -1);
1041 }
1042 PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");
1043 return NULL;
Raymond Hettinger4aec61e2005-03-18 21:20:23 +00001044}
1045
1046PyDoc_STRVAR(remove_doc,
1047"D.remove(value) -- remove first occurrence of value.");
1048
Benjamin Peterson0e5c48a2013-01-12 21:22:18 -05001049static void
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001050deque_clear(dequeobject *deque)
1051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyObject *item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001053
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001054 while (Py_SIZE(deque)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 item = deque_pop(deque, NULL);
1056 assert (item != NULL);
1057 Py_DECREF(item);
1058 }
Raymond Hettinger87e69122015-03-02 23:32:02 -08001059 assert(deque->leftblock == deque->rightblock);
1060 assert(deque->leftindex - 1 == deque->rightindex);
1061 assert(Py_SIZE(deque) == 0);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001062}
1063
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001064static int
1065valid_index(Py_ssize_t i, Py_ssize_t limit)
1066{
Raymond Hettinger12f896c2015-07-31 12:03:20 -07001067 /* The cast to size_t lets us use just a single comparison
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001068 to check whether i is in the range: 0 <= i < limit */
1069 return (size_t) i < (size_t) limit;
1070}
1071
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001072static PyObject *
Benjamin Petersond6313712008-07-31 16:23:04 +00001073deque_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 block *b;
1076 PyObject *item;
1077 Py_ssize_t n, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001078
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001079 if (!valid_index(i, Py_SIZE(deque))) {
1080 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 return NULL;
1082 }
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 if (i == 0) {
1085 i = deque->leftindex;
1086 b = deque->leftblock;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001087 } else if (i == Py_SIZE(deque) - 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 i = deque->rightindex;
1089 b = deque->rightblock;
1090 } else {
1091 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001092 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1093 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001094 if (index < (Py_SIZE(deque) >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 b = deque->leftblock;
1096 while (n--)
1097 b = b->rightlink;
1098 } else {
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001099 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001100 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettinger63d1ff22015-02-28 07:41:30 -08001101 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 b = deque->rightblock;
1103 while (n--)
1104 b = b->leftlink;
1105 }
1106 }
1107 item = b->data[i];
1108 Py_INCREF(item);
1109 return item;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001110}
1111
1112static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001113deque_del_item(dequeobject *deque, Py_ssize_t i)
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 PyObject *item;
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001116 int rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001117
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001118 assert (i >= 0 && i < Py_SIZE(deque));
Raymond Hettinger6921c132015-03-21 02:03:40 -07001119 if (_deque_rotate(deque, -i))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 item = deque_popleft(deque, NULL);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001122 rv = _deque_rotate(deque, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 assert (item != NULL);
1124 Py_DECREF(item);
Raymond Hettingerac13ad62015-03-21 01:53:16 -07001125 return rv;
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001126}
1127
1128static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001129deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 PyObject *old_value;
1132 block *b;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001133 Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001134
Raymond Hettinger3c186ba2015-03-02 21:45:02 -08001135 if (!valid_index(i, len)) {
1136 PyErr_SetString(PyExc_IndexError, "deque index out of range");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 return -1;
1138 }
1139 if (v == NULL)
1140 return deque_del_item(deque, i);
Raymond Hettinger0e371f22004-05-12 20:55:56 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 i += deque->leftindex;
Raymond Hettingerc2083082015-02-28 23:29:16 -08001143 n = (Py_ssize_t)((size_t) i / BLOCKLEN);
1144 i = (Py_ssize_t)((size_t) i % BLOCKLEN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 if (index <= halflen) {
1146 b = deque->leftblock;
1147 while (n--)
1148 b = b->rightlink;
1149 } else {
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001150 n = (Py_ssize_t)(
Raymond Hettingerc2083082015-02-28 23:29:16 -08001151 ((size_t)(deque->leftindex + Py_SIZE(deque) - 1))
Raymond Hettingera473b9d2015-02-28 17:49:47 -08001152 / BLOCKLEN - n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 b = deque->rightblock;
1154 while (n--)
1155 b = b->leftlink;
1156 }
1157 Py_INCREF(v);
1158 old_value = b->data[i];
1159 b->data[i] = v;
1160 Py_DECREF(old_value);
1161 return 0;
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001162}
1163
1164static PyObject *
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001165deque_clearmethod(dequeobject *deque)
1166{
Benjamin Peterson0e5c48a2013-01-12 21:22:18 -05001167 deque_clear(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 Py_RETURN_NONE;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001169}
1170
1171PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");
1172
1173static void
1174deque_dealloc(dequeobject *deque)
1175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 PyObject_GC_UnTrack(deque);
1177 if (deque->weakreflist != NULL)
1178 PyObject_ClearWeakRefs((PyObject *) deque);
1179 if (deque->leftblock != NULL) {
1180 deque_clear(deque);
1181 assert(deque->leftblock != NULL);
1182 freeblock(deque->leftblock);
1183 }
1184 deque->leftblock = NULL;
1185 deque->rightblock = NULL;
1186 Py_TYPE(deque)->tp_free(deque);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001187}
1188
1189static int
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00001190deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 block *b;
1193 PyObject *item;
1194 Py_ssize_t index;
1195 Py_ssize_t indexlo = deque->leftindex;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001196
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001197 for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
1198 for (index = indexlo; index < BLOCKLEN ; index++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 item = b->data[index];
1200 Py_VISIT(item);
1201 }
1202 indexlo = 0;
1203 }
Raymond Hettinger5bfa8672013-07-06 11:58:09 -10001204 for (index = indexlo; index <= deque->rightindex; index++) {
1205 item = b->data[index];
1206 Py_VISIT(item);
1207 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001209}
1210
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001211static PyObject *
1212deque_copy(PyObject *deque)
1213{
Raymond Hettingere4f34672015-09-13 19:27:01 -04001214 if (Py_TYPE(deque) == &deque_type) {
1215 dequeobject *new_deque;
1216 PyObject *rv;
1217
1218 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
1219 if (new_deque == NULL)
1220 return NULL;
1221 new_deque->maxlen = ((dequeobject *)deque)->maxlen;
1222 rv = deque_extend(new_deque, deque);
1223 if (rv != NULL) {
1224 Py_DECREF(rv);
1225 return (PyObject *)new_deque;
1226 }
1227 Py_DECREF(new_deque);
1228 return NULL;
1229 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 if (((dequeobject *)deque)->maxlen == -1)
1231 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
1232 else
1233 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
1234 deque, ((dequeobject *)deque)->maxlen, NULL);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001235}
1236
1237PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
1238
1239static PyObject *
1240deque_reduce(dequeobject *deque)
1241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 PyObject *dict, *result, *aslist;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001243 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001244
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001245 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 if (dict == NULL)
1247 PyErr_Clear();
1248 aslist = PySequence_List((PyObject *)deque);
1249 if (aslist == NULL) {
1250 Py_XDECREF(dict);
1251 return NULL;
1252 }
1253 if (dict == NULL) {
1254 if (deque->maxlen == -1)
1255 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
1256 else
1257 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
1258 } else {
1259 if (deque->maxlen == -1)
1260 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
1261 else
1262 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
1263 }
1264 Py_XDECREF(dict);
1265 Py_DECREF(aslist);
1266 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001267}
1268
1269PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1270
1271static PyObject *
1272deque_repr(PyObject *deque)
1273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 PyObject *aslist, *result;
1275 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 i = Py_ReprEnter(deque);
1278 if (i != 0) {
1279 if (i < 0)
1280 return NULL;
1281 return PyUnicode_FromString("[...]");
1282 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 aslist = PySequence_List(deque);
1285 if (aslist == NULL) {
1286 Py_ReprLeave(deque);
1287 return NULL;
1288 }
1289 if (((dequeobject *)deque)->maxlen != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1291 aslist, ((dequeobject *)deque)->maxlen);
1292 else
1293 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001295 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001297}
1298
Raymond Hettinger738ec902004-02-29 02:15:56 +00001299static PyObject *
1300deque_richcompare(PyObject *v, PyObject *w, int op)
1301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 PyObject *it1=NULL, *it2=NULL, *x, *y;
1303 Py_ssize_t vs, ws;
1304 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 if (!PyObject_TypeCheck(v, &deque_type) ||
1307 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001308 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001312 vs = Py_SIZE((dequeobject *)v);
1313 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 if (op == Py_EQ) {
1315 if (v == w)
1316 Py_RETURN_TRUE;
1317 if (vs != ws)
1318 Py_RETURN_FALSE;
1319 }
1320 if (op == Py_NE) {
1321 if (v == w)
1322 Py_RETURN_FALSE;
1323 if (vs != ws)
1324 Py_RETURN_TRUE;
1325 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 /* Search for the first index where items are different */
1328 it1 = PyObject_GetIter(v);
1329 if (it1 == NULL)
1330 goto done;
1331 it2 = PyObject_GetIter(w);
1332 if (it2 == NULL)
1333 goto done;
1334 for (;;) {
1335 x = PyIter_Next(it1);
1336 if (x == NULL && PyErr_Occurred())
1337 goto done;
1338 y = PyIter_Next(it2);
1339 if (x == NULL || y == NULL)
1340 break;
1341 b = PyObject_RichCompareBool(x, y, Py_EQ);
1342 if (b == 0) {
1343 cmp = PyObject_RichCompareBool(x, y, op);
1344 Py_DECREF(x);
1345 Py_DECREF(y);
1346 goto done;
1347 }
1348 Py_DECREF(x);
1349 Py_DECREF(y);
1350 if (b == -1)
1351 goto done;
1352 }
1353 /* We reached the end of one deque or both */
1354 Py_XDECREF(x);
1355 Py_XDECREF(y);
1356 if (PyErr_Occurred())
1357 goto done;
1358 switch (op) {
1359 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1360 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1361 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1362 case Py_NE: cmp = x != y; break; /* if one deque continues */
1363 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1364 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1365 }
Tim Peters1065f752004-10-01 01:03:29 +00001366
Raymond Hettinger738ec902004-02-29 02:15:56 +00001367done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 Py_XDECREF(it1);
1369 Py_XDECREF(it2);
1370 if (cmp == 1)
1371 Py_RETURN_TRUE;
1372 if (cmp == 0)
1373 Py_RETURN_FALSE;
1374 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001375}
1376
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001377static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001378deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 PyObject *iterable = NULL;
1381 PyObject *maxlenobj = NULL;
1382 Py_ssize_t maxlen = -1;
1383 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1386 return -1;
1387 if (maxlenobj != NULL && maxlenobj != Py_None) {
1388 maxlen = PyLong_AsSsize_t(maxlenobj);
1389 if (maxlen == -1 && PyErr_Occurred())
1390 return -1;
1391 if (maxlen < 0) {
1392 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1393 return -1;
1394 }
1395 }
1396 deque->maxlen = maxlen;
1397 deque_clear(deque);
1398 if (iterable != NULL) {
1399 PyObject *rv = deque_extend(deque, iterable);
1400 if (rv == NULL)
1401 return -1;
1402 Py_DECREF(rv);
1403 }
1404 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001405}
1406
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001407static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001408deque_sizeof(dequeobject *deque, void *unused)
1409{
1410 Py_ssize_t res;
1411 Py_ssize_t blocks;
1412
1413 res = sizeof(dequeobject);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001414 blocks = (deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
1415 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001416 (blocks - 1) * BLOCKLEN + deque->rightindex);
1417 res += blocks * sizeof(block);
1418 return PyLong_FromSsize_t(res);
1419}
1420
1421PyDoc_STRVAR(sizeof_doc,
1422"D.__sizeof__() -- size of D in memory, in bytes");
1423
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001424static int
1425deque_bool(dequeobject *deque)
1426{
1427 return Py_SIZE(deque) != 0;
1428}
1429
Jesus Cea16e2fca2012-08-03 14:49:42 +02001430static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001431deque_get_maxlen(dequeobject *deque)
1432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 if (deque->maxlen == -1)
1434 Py_RETURN_NONE;
1435 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001436}
1437
Raymond Hettinger41290a62015-03-31 08:12:23 -07001438
1439/* deque object ********************************************************/
1440
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001441static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1443 "maximum size of a deque or None if unbounded"},
1444 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001445};
1446
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001447static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001449 (binaryfunc)deque_concat, /* sq_concat */
1450 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 (ssizeargfunc)deque_item, /* sq_item */
1452 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001453 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001455 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001456 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001457 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001458};
1459
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001460static PyNumberMethods deque_as_number = {
1461 0, /* nb_add */
1462 0, /* nb_subtract */
1463 0, /* nb_multiply */
1464 0, /* nb_remainder */
1465 0, /* nb_divmod */
1466 0, /* nb_power */
1467 0, /* nb_negative */
1468 0, /* nb_positive */
1469 0, /* nb_absolute */
1470 (inquiry)deque_bool, /* nb_bool */
1471 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001472 };
1473
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001474static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001475static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001476PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001478
1479static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 {"append", (PyCFunction)deque_append,
1481 METH_O, append_doc},
1482 {"appendleft", (PyCFunction)deque_appendleft,
1483 METH_O, appendleft_doc},
1484 {"clear", (PyCFunction)deque_clearmethod,
1485 METH_NOARGS, clear_doc},
1486 {"__copy__", (PyCFunction)deque_copy,
1487 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001488 {"copy", (PyCFunction)deque_copy,
1489 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001491 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 {"extend", (PyCFunction)deque_extend,
1493 METH_O, extend_doc},
1494 {"extendleft", (PyCFunction)deque_extendleft,
1495 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001496 {"index", (PyCFunction)deque_index,
1497 METH_VARARGS, index_doc},
1498 {"insert", (PyCFunction)deque_insert,
1499 METH_VARARGS, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 {"pop", (PyCFunction)deque_pop,
1501 METH_NOARGS, pop_doc},
1502 {"popleft", (PyCFunction)deque_popleft,
1503 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001504 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 METH_NOARGS, reduce_doc},
1506 {"remove", (PyCFunction)deque_remove,
1507 METH_O, remove_doc},
1508 {"__reversed__", (PyCFunction)deque_reviter,
1509 METH_NOARGS, reversed_doc},
1510 {"reverse", (PyCFunction)deque_reverse,
1511 METH_NOARGS, reverse_doc},
1512 {"rotate", (PyCFunction)deque_rotate,
Jesus Cea16e2fca2012-08-03 14:49:42 +02001513 METH_VARARGS, rotate_doc},
1514 {"__sizeof__", (PyCFunction)deque_sizeof,
1515 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001517};
1518
1519PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001520"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001521\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001522A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001523
Neal Norwitz87f10132004-02-29 15:40:53 +00001524static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 PyVarObject_HEAD_INIT(NULL, 0)
1526 "collections.deque", /* tp_name */
1527 sizeof(dequeobject), /* tp_basicsize */
1528 0, /* tp_itemsize */
1529 /* methods */
1530 (destructor)deque_dealloc, /* tp_dealloc */
1531 0, /* tp_print */
1532 0, /* tp_getattr */
1533 0, /* tp_setattr */
1534 0, /* tp_reserved */
1535 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001536 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 &deque_as_sequence, /* tp_as_sequence */
1538 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001539 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 0, /* tp_call */
1541 0, /* tp_str */
1542 PyObject_GenericGetAttr, /* tp_getattro */
1543 0, /* tp_setattro */
1544 0, /* tp_as_buffer */
1545 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001546 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 deque_doc, /* tp_doc */
1548 (traverseproc)deque_traverse, /* tp_traverse */
1549 (inquiry)deque_clear, /* tp_clear */
1550 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001551 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 (getiterfunc)deque_iter, /* tp_iter */
1553 0, /* tp_iternext */
1554 deque_methods, /* tp_methods */
1555 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001556 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 0, /* tp_base */
1558 0, /* tp_dict */
1559 0, /* tp_descr_get */
1560 0, /* tp_descr_set */
1561 0, /* tp_dictoffset */
1562 (initproc)deque_init, /* tp_init */
1563 PyType_GenericAlloc, /* tp_alloc */
1564 deque_new, /* tp_new */
1565 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001566};
1567
1568/*********************** Deque Iterator **************************/
1569
1570typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001573 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001575 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001577} dequeiterobject;
1578
Martin v. Löwis59683e82008-06-13 07:50:45 +00001579static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001580
1581static PyObject *
1582deque_iter(dequeobject *deque)
1583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1587 if (it == NULL)
1588 return NULL;
1589 it->b = deque->leftblock;
1590 it->index = deque->leftindex;
1591 Py_INCREF(deque);
1592 it->deque = deque;
1593 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001594 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 PyObject_GC_Track(it);
1596 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001597}
1598
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001599static int
1600dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 Py_VISIT(dio->deque);
1603 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001604}
1605
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001606static void
1607dequeiter_dealloc(dequeiterobject *dio)
1608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 Py_XDECREF(dio->deque);
1610 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001611}
1612
1613static PyObject *
1614dequeiter_next(dequeiterobject *it)
1615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 if (it->deque->state != it->state) {
1619 it->counter = 0;
1620 PyErr_SetString(PyExc_RuntimeError,
1621 "deque mutated during iteration");
1622 return NULL;
1623 }
1624 if (it->counter == 0)
1625 return NULL;
1626 assert (!(it->b == it->deque->rightblock &&
1627 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 item = it->b->data[it->index];
1630 it->index++;
1631 it->counter--;
1632 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001633 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 it->b = it->b->rightlink;
1635 it->index = 0;
1636 }
1637 Py_INCREF(item);
1638 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001639}
1640
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001641static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001642dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1643{
1644 Py_ssize_t i, index=0;
1645 PyObject *deque;
1646 dequeiterobject *it;
1647 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1648 return NULL;
1649 assert(type == &dequeiter_type);
1650
1651 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1652 if (!it)
1653 return NULL;
1654 /* consume items from the queue */
1655 for(i=0; i<index; i++) {
1656 PyObject *item = dequeiter_next(it);
1657 if (item) {
1658 Py_DECREF(item);
1659 } else {
1660 if (it->counter) {
1661 Py_DECREF(it);
1662 return NULL;
1663 } else
1664 break;
1665 }
1666 }
1667 return (PyObject*)it;
1668}
1669
1670static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001671dequeiter_len(dequeiterobject *it)
1672{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001673 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001674}
1675
Armin Rigof5b3e362006-02-11 21:32:43 +00001676PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001677
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001678static PyObject *
1679dequeiter_reduce(dequeiterobject *it)
1680{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001681 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 +00001682}
1683
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001684static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001686 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001688};
1689
Martin v. Löwis59683e82008-06-13 07:50:45 +00001690static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001692 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 sizeof(dequeiterobject), /* tp_basicsize */
1694 0, /* tp_itemsize */
1695 /* methods */
1696 (destructor)dequeiter_dealloc, /* tp_dealloc */
1697 0, /* tp_print */
1698 0, /* tp_getattr */
1699 0, /* tp_setattr */
1700 0, /* tp_reserved */
1701 0, /* tp_repr */
1702 0, /* tp_as_number */
1703 0, /* tp_as_sequence */
1704 0, /* tp_as_mapping */
1705 0, /* tp_hash */
1706 0, /* tp_call */
1707 0, /* tp_str */
1708 PyObject_GenericGetAttr, /* tp_getattro */
1709 0, /* tp_setattro */
1710 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001711 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 0, /* tp_doc */
1713 (traverseproc)dequeiter_traverse, /* tp_traverse */
1714 0, /* tp_clear */
1715 0, /* tp_richcompare */
1716 0, /* tp_weaklistoffset */
1717 PyObject_SelfIter, /* tp_iter */
1718 (iternextfunc)dequeiter_next, /* tp_iternext */
1719 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001720 0, /* tp_members */
1721 0, /* tp_getset */
1722 0, /* tp_base */
1723 0, /* tp_dict */
1724 0, /* tp_descr_get */
1725 0, /* tp_descr_set */
1726 0, /* tp_dictoffset */
1727 0, /* tp_init */
1728 0, /* tp_alloc */
1729 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001731};
1732
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001733/*********************** Deque Reverse Iterator **************************/
1734
Martin v. Löwis59683e82008-06-13 07:50:45 +00001735static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001736
1737static PyObject *
1738deque_reviter(dequeobject *deque)
1739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1743 if (it == NULL)
1744 return NULL;
1745 it->b = deque->rightblock;
1746 it->index = deque->rightindex;
1747 Py_INCREF(deque);
1748 it->deque = deque;
1749 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001750 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 PyObject_GC_Track(it);
1752 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001753}
1754
1755static PyObject *
1756dequereviter_next(dequeiterobject *it)
1757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 PyObject *item;
1759 if (it->counter == 0)
1760 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 if (it->deque->state != it->state) {
1763 it->counter = 0;
1764 PyErr_SetString(PyExc_RuntimeError,
1765 "deque mutated during iteration");
1766 return NULL;
1767 }
1768 assert (!(it->b == it->deque->leftblock &&
1769 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 item = it->b->data[it->index];
1772 it->index--;
1773 it->counter--;
1774 if (it->index == -1 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001775 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 it->b = it->b->leftlink;
1777 it->index = BLOCKLEN - 1;
1778 }
1779 Py_INCREF(item);
1780 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001781}
1782
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001783static PyObject *
1784dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1785{
1786 Py_ssize_t i, index=0;
1787 PyObject *deque;
1788 dequeiterobject *it;
1789 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1790 return NULL;
1791 assert(type == &dequereviter_type);
1792
1793 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1794 if (!it)
1795 return NULL;
1796 /* consume items from the queue */
1797 for(i=0; i<index; i++) {
1798 PyObject *item = dequereviter_next(it);
1799 if (item) {
1800 Py_DECREF(item);
1801 } else {
1802 if (it->counter) {
1803 Py_DECREF(it);
1804 return NULL;
1805 } else
1806 break;
1807 }
1808 }
1809 return (PyObject*)it;
1810}
1811
Martin v. Löwis59683e82008-06-13 07:50:45 +00001812static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001814 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 sizeof(dequeiterobject), /* tp_basicsize */
1816 0, /* tp_itemsize */
1817 /* methods */
1818 (destructor)dequeiter_dealloc, /* tp_dealloc */
1819 0, /* tp_print */
1820 0, /* tp_getattr */
1821 0, /* tp_setattr */
1822 0, /* tp_reserved */
1823 0, /* tp_repr */
1824 0, /* tp_as_number */
1825 0, /* tp_as_sequence */
1826 0, /* tp_as_mapping */
1827 0, /* tp_hash */
1828 0, /* tp_call */
1829 0, /* tp_str */
1830 PyObject_GenericGetAttr, /* tp_getattro */
1831 0, /* tp_setattro */
1832 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001833 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 0, /* tp_doc */
1835 (traverseproc)dequeiter_traverse, /* tp_traverse */
1836 0, /* tp_clear */
1837 0, /* tp_richcompare */
1838 0, /* tp_weaklistoffset */
1839 PyObject_SelfIter, /* tp_iter */
1840 (iternextfunc)dequereviter_next, /* tp_iternext */
1841 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001842 0, /* tp_members */
1843 0, /* tp_getset */
1844 0, /* tp_base */
1845 0, /* tp_dict */
1846 0, /* tp_descr_get */
1847 0, /* tp_descr_set */
1848 0, /* tp_dictoffset */
1849 0, /* tp_init */
1850 0, /* tp_alloc */
1851 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001853};
1854
Guido van Rossum1968ad32006-02-25 22:38:04 +00001855/* defaultdict type *********************************************************/
1856
1857typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 PyDictObject dict;
1859 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001860} defdictobject;
1861
1862static PyTypeObject defdict_type; /* Forward */
1863
1864PyDoc_STRVAR(defdict_missing_doc,
1865"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001866 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001867 self[key] = value = self.default_factory()\n\
1868 return value\n\
1869");
1870
1871static PyObject *
1872defdict_missing(defdictobject *dd, PyObject *key)
1873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 PyObject *factory = dd->default_factory;
1875 PyObject *value;
1876 if (factory == NULL || factory == Py_None) {
1877 /* XXX Call dict.__missing__(key) */
1878 PyObject *tup;
1879 tup = PyTuple_Pack(1, key);
1880 if (!tup) return NULL;
1881 PyErr_SetObject(PyExc_KeyError, tup);
1882 Py_DECREF(tup);
1883 return NULL;
1884 }
1885 value = PyEval_CallObject(factory, NULL);
1886 if (value == NULL)
1887 return value;
1888 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1889 Py_DECREF(value);
1890 return NULL;
1891 }
1892 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001893}
1894
1895PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1896
1897static PyObject *
1898defdict_copy(defdictobject *dd)
1899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 /* This calls the object's class. That only works for subclasses
1901 whose class constructor has the same signature. Subclasses that
1902 define a different constructor signature must override copy().
1903 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 if (dd->default_factory == NULL)
1906 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1907 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1908 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001909}
1910
1911static PyObject *
1912defdict_reduce(defdictobject *dd)
1913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 - factory function
1917 - tuple of args for the factory function
1918 - additional state (here None)
1919 - sequence iterator (here None)
1920 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 For this to be useful with pickle.py, the default_factory
1925 must be picklable; e.g., None, a built-in, or a global
1926 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 Both shallow and deep copying are supported, but for deep
1929 copying, the default_factory must be deep-copyable; e.g. None,
1930 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00001931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 This only works for subclasses as long as their constructor
1933 signature is compatible; the first argument must be the
1934 optional default_factory, defaulting to None.
1935 */
1936 PyObject *args;
1937 PyObject *items;
1938 PyObject *iter;
1939 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001940 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 if (dd->default_factory == NULL || dd->default_factory == Py_None)
1943 args = PyTuple_New(0);
1944 else
1945 args = PyTuple_Pack(1, dd->default_factory);
1946 if (args == NULL)
1947 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001948 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 if (items == NULL) {
1950 Py_DECREF(args);
1951 return NULL;
1952 }
1953 iter = PyObject_GetIter(items);
1954 if (iter == NULL) {
1955 Py_DECREF(items);
1956 Py_DECREF(args);
1957 return NULL;
1958 }
1959 result = PyTuple_Pack(5, Py_TYPE(dd), args,
1960 Py_None, Py_None, iter);
1961 Py_DECREF(iter);
1962 Py_DECREF(items);
1963 Py_DECREF(args);
1964 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001965}
1966
1967static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 {"__missing__", (PyCFunction)defdict_missing, METH_O,
1969 defdict_missing_doc},
1970 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1971 defdict_copy_doc},
1972 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1973 defdict_copy_doc},
1974 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1975 reduce_doc},
1976 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001977};
1978
1979static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 {"default_factory", T_OBJECT,
1981 offsetof(defdictobject, default_factory), 0,
1982 PyDoc_STR("Factory for default value called by __missing__().")},
1983 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001984};
1985
1986static void
1987defdict_dealloc(defdictobject *dd)
1988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 Py_CLEAR(dd->default_factory);
1990 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001991}
1992
Guido van Rossum1968ad32006-02-25 22:38:04 +00001993static PyObject *
1994defdict_repr(defdictobject *dd)
1995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 PyObject *baserepr;
1997 PyObject *defrepr;
1998 PyObject *result;
1999 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2000 if (baserepr == NULL)
2001 return NULL;
2002 if (dd->default_factory == NULL)
2003 defrepr = PyUnicode_FromString("None");
2004 else
2005 {
2006 int status = Py_ReprEnter(dd->default_factory);
2007 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002008 if (status < 0) {
2009 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002011 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 defrepr = PyUnicode_FromString("...");
2013 }
2014 else
2015 defrepr = PyObject_Repr(dd->default_factory);
2016 Py_ReprLeave(dd->default_factory);
2017 }
2018 if (defrepr == NULL) {
2019 Py_DECREF(baserepr);
2020 return NULL;
2021 }
2022 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2023 defrepr, baserepr);
2024 Py_DECREF(defrepr);
2025 Py_DECREF(baserepr);
2026 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002027}
2028
2029static int
2030defdict_traverse(PyObject *self, visitproc visit, void *arg)
2031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 Py_VISIT(((defdictobject *)self)->default_factory);
2033 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002034}
2035
2036static int
2037defdict_tp_clear(defdictobject *dd)
2038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 Py_CLEAR(dd->default_factory);
2040 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002041}
2042
2043static int
2044defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 defdictobject *dd = (defdictobject *)self;
2047 PyObject *olddefault = dd->default_factory;
2048 PyObject *newdefault = NULL;
2049 PyObject *newargs;
2050 int result;
2051 if (args == NULL || !PyTuple_Check(args))
2052 newargs = PyTuple_New(0);
2053 else {
2054 Py_ssize_t n = PyTuple_GET_SIZE(args);
2055 if (n > 0) {
2056 newdefault = PyTuple_GET_ITEM(args, 0);
2057 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2058 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002059 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 return -1;
2061 }
2062 }
2063 newargs = PySequence_GetSlice(args, 1, n);
2064 }
2065 if (newargs == NULL)
2066 return -1;
2067 Py_XINCREF(newdefault);
2068 dd->default_factory = newdefault;
2069 result = PyDict_Type.tp_init(self, newargs, kwds);
2070 Py_DECREF(newargs);
2071 Py_XDECREF(olddefault);
2072 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002073}
2074
2075PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002076"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002077\n\
2078The default factory is called without arguments to produce\n\
2079a new value when a key is not present, in __getitem__ only.\n\
2080A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002081All remaining arguments are treated the same as if they were\n\
2082passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002083");
2084
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002085/* See comment in xxsubtype.c */
2086#define DEFERRED_ADDRESS(ADDR) 0
2087
Guido van Rossum1968ad32006-02-25 22:38:04 +00002088static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2090 "collections.defaultdict", /* tp_name */
2091 sizeof(defdictobject), /* tp_basicsize */
2092 0, /* tp_itemsize */
2093 /* methods */
2094 (destructor)defdict_dealloc, /* tp_dealloc */
2095 0, /* tp_print */
2096 0, /* tp_getattr */
2097 0, /* tp_setattr */
2098 0, /* tp_reserved */
2099 (reprfunc)defdict_repr, /* tp_repr */
2100 0, /* tp_as_number */
2101 0, /* tp_as_sequence */
2102 0, /* tp_as_mapping */
2103 0, /* tp_hash */
2104 0, /* tp_call */
2105 0, /* tp_str */
2106 PyObject_GenericGetAttr, /* tp_getattro */
2107 0, /* tp_setattro */
2108 0, /* tp_as_buffer */
2109 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2110 /* tp_flags */
2111 defdict_doc, /* tp_doc */
2112 defdict_traverse, /* tp_traverse */
2113 (inquiry)defdict_tp_clear, /* tp_clear */
2114 0, /* tp_richcompare */
2115 0, /* tp_weaklistoffset*/
2116 0, /* tp_iter */
2117 0, /* tp_iternext */
2118 defdict_methods, /* tp_methods */
2119 defdict_members, /* tp_members */
2120 0, /* tp_getset */
2121 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2122 0, /* tp_dict */
2123 0, /* tp_descr_get */
2124 0, /* tp_descr_set */
2125 0, /* tp_dictoffset */
2126 defdict_init, /* tp_init */
2127 PyType_GenericAlloc, /* tp_alloc */
2128 0, /* tp_new */
2129 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002130};
2131
Raymond Hettinger96f34102010-12-15 16:30:37 +00002132/* helper function for Counter *********************************************/
2133
2134PyDoc_STRVAR(_count_elements_doc,
2135"_count_elements(mapping, iterable) -> None\n\
2136\n\
2137Count elements in the iterable, updating the mappping");
2138
2139static PyObject *
2140_count_elements(PyObject *self, PyObject *args)
2141{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002142 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002143 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002144 PyObject *it, *iterable, *mapping, *oldval;
2145 PyObject *newval = NULL;
2146 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002147 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002148 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002149 PyObject *bound_get = NULL;
2150 PyObject *mapping_get;
2151 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002152 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002153 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002154
2155 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2156 return NULL;
2157
Raymond Hettinger96f34102010-12-15 16:30:37 +00002158 it = PyObject_GetIter(iterable);
2159 if (it == NULL)
2160 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002161
Raymond Hettinger96f34102010-12-15 16:30:37 +00002162 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002163 if (one == NULL)
2164 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002165
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002166 /* Only take the fast path when get() and __setitem__()
2167 * have not been overridden.
2168 */
2169 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2170 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002171 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2172 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2173
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002174 if (mapping_get != NULL && mapping_get == dict_get &&
2175 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002176 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002177 /* Fast path advantages:
2178 1. Eliminate double hashing
2179 (by re-using the same hash for both the get and set)
2180 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2181 (argument tuple creation and parsing)
2182 3. Avoid indirection through a bound method object
2183 (creates another argument tuple)
2184 4. Avoid initial increment from zero
2185 (reuse an existing one-object instead)
2186 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002187 Py_hash_t hash;
2188
Raymond Hettinger426e0522011-01-03 02:12:02 +00002189 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002190 if (key == NULL)
2191 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002192
2193 if (!PyUnicode_CheckExact(key) ||
2194 (hash = ((PyASCIIObject *) key)->hash) == -1)
2195 {
2196 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002197 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002198 goto done;
2199 }
2200
2201 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002202 if (oldval == NULL) {
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002203 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002204 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002205 } else {
2206 newval = PyNumber_Add(oldval, one);
2207 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002208 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002209 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002210 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002211 Py_CLEAR(newval);
2212 }
2213 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002214 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002215 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002216 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002217 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002218 goto done;
2219
2220 zero = PyLong_FromLong(0);
2221 if (zero == NULL)
2222 goto done;
2223
Raymond Hettinger426e0522011-01-03 02:12:02 +00002224 while (1) {
2225 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002226 if (key == NULL)
2227 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002228 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002229 if (oldval == NULL)
2230 break;
2231 newval = PyNumber_Add(oldval, one);
2232 Py_DECREF(oldval);
2233 if (newval == NULL)
2234 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002235 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002236 break;
2237 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002238 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002239 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002240 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002241
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002242done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002243 Py_DECREF(it);
2244 Py_XDECREF(key);
2245 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002246 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002247 Py_XDECREF(zero);
2248 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002249 if (PyErr_Occurred())
2250 return NULL;
2251 Py_RETURN_NONE;
2252}
2253
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002254/* module level code ********************************************************/
2255
2256PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002257"High performance data structures.\n\
2258- deque: ordered collection accessible from endpoints only\n\
2259- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002260");
2261
Raymond Hettinger96f34102010-12-15 16:30:37 +00002262static struct PyMethodDef module_functions[] = {
2263 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2264 {NULL, NULL} /* sentinel */
2265};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002266
2267static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 PyModuleDef_HEAD_INIT,
2269 "_collections",
2270 module_doc,
2271 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002272 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 NULL,
2274 NULL,
2275 NULL,
2276 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002277};
2278
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002279PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002280PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 m = PyModule_Create(&_collectionsmodule);
2285 if (m == NULL)
2286 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 if (PyType_Ready(&deque_type) < 0)
2289 return NULL;
2290 Py_INCREF(&deque_type);
2291 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 defdict_type.tp_base = &PyDict_Type;
2294 if (PyType_Ready(&defdict_type) < 0)
2295 return NULL;
2296 Py_INCREF(&defdict_type);
2297 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002298
Eric Snow47db7172015-05-29 22:21:39 -06002299 Py_INCREF(&PyODict_Type);
2300 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 if (PyType_Ready(&dequeiter_type) < 0)
2303 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002304 Py_INCREF(&dequeiter_type);
2305 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 if (PyType_Ready(&dequereviter_type) < 0)
2308 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002309 Py_INCREF(&dequereviter_type);
2310 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002313}