blob: 7dbf7555d4987d55c910bd2a93543434e1b32490 [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
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700212 if (deque->rightindex < 0) {
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 Hettingerd3d2b2c2015-09-21 23:41:56 -0700718 if (rightindex < 0) {
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--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -0700830 if (rightindex < 0) {
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 Hettingeraed88302015-09-19 09:05:42 -07001214 dequeobject *old_deque = (dequeobject *)deque;
Raymond Hettingere4f34672015-09-13 19:27:01 -04001215 if (Py_TYPE(deque) == &deque_type) {
1216 dequeobject *new_deque;
1217 PyObject *rv;
1218
1219 new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
1220 if (new_deque == NULL)
1221 return NULL;
Raymond Hettingeraed88302015-09-19 09:05:42 -07001222 new_deque->maxlen = old_deque->maxlen;
1223 /* Fast path for the deque_repeat() common case where len(deque) == 1 */
1224 if (Py_SIZE(deque) == 1 && new_deque->maxlen != 0) {
1225 PyObject *item = old_deque->leftblock->data[old_deque->leftindex];
1226 rv = deque_append(new_deque, item);
1227 } else {
1228 rv = deque_extend(new_deque, deque);
1229 }
Raymond Hettingere4f34672015-09-13 19:27:01 -04001230 if (rv != NULL) {
1231 Py_DECREF(rv);
1232 return (PyObject *)new_deque;
1233 }
1234 Py_DECREF(new_deque);
1235 return NULL;
1236 }
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001237 if (old_deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
1239 else
1240 return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
Raymond Hettingeraed88302015-09-19 09:05:42 -07001241 deque, old_deque->maxlen, NULL);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001242}
1243
1244PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
1245
1246static PyObject *
1247deque_reduce(dequeobject *deque)
1248{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 PyObject *dict, *result, *aslist;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001250 _Py_IDENTIFIER(__dict__);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001251
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001252 dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 if (dict == NULL)
1254 PyErr_Clear();
1255 aslist = PySequence_List((PyObject *)deque);
1256 if (aslist == NULL) {
1257 Py_XDECREF(dict);
1258 return NULL;
1259 }
1260 if (dict == NULL) {
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001261 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);
1263 else
1264 result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);
1265 } else {
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001266 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);
1268 else
1269 result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);
1270 }
1271 Py_XDECREF(dict);
1272 Py_DECREF(aslist);
1273 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001274}
1275
1276PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1277
1278static PyObject *
1279deque_repr(PyObject *deque)
1280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 PyObject *aslist, *result;
1282 int i;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 i = Py_ReprEnter(deque);
1285 if (i != 0) {
1286 if (i < 0)
1287 return NULL;
1288 return PyUnicode_FromString("[...]");
1289 }
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 aslist = PySequence_List(deque);
1292 if (aslist == NULL) {
1293 Py_ReprLeave(deque);
1294 return NULL;
1295 }
1296 if (((dequeobject *)deque)->maxlen != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
1298 aslist, ((dequeobject *)deque)->maxlen);
1299 else
1300 result = PyUnicode_FromFormat("deque(%R)", aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 Py_ReprLeave(deque);
Raymond Hettinger2b2b7532015-09-05 17:05:52 -07001302 Py_DECREF(aslist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 return result;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001304}
1305
Raymond Hettinger738ec902004-02-29 02:15:56 +00001306static PyObject *
1307deque_richcompare(PyObject *v, PyObject *w, int op)
1308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 PyObject *it1=NULL, *it2=NULL, *x, *y;
1310 Py_ssize_t vs, ws;
1311 int b, cmp=-1;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 if (!PyObject_TypeCheck(v, &deque_type) ||
1314 !PyObject_TypeCheck(w, &deque_type)) {
Brian Curtindfc80e32011-08-10 20:28:54 -05001315 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 /* Shortcuts */
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001319 vs = Py_SIZE((dequeobject *)v);
1320 ws = Py_SIZE((dequeobject *)w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 if (op == Py_EQ) {
1322 if (v == w)
1323 Py_RETURN_TRUE;
1324 if (vs != ws)
1325 Py_RETURN_FALSE;
1326 }
1327 if (op == Py_NE) {
1328 if (v == w)
1329 Py_RETURN_FALSE;
1330 if (vs != ws)
1331 Py_RETURN_TRUE;
1332 }
Raymond Hettinger738ec902004-02-29 02:15:56 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 /* Search for the first index where items are different */
1335 it1 = PyObject_GetIter(v);
1336 if (it1 == NULL)
1337 goto done;
1338 it2 = PyObject_GetIter(w);
1339 if (it2 == NULL)
1340 goto done;
1341 for (;;) {
1342 x = PyIter_Next(it1);
1343 if (x == NULL && PyErr_Occurred())
1344 goto done;
1345 y = PyIter_Next(it2);
1346 if (x == NULL || y == NULL)
1347 break;
1348 b = PyObject_RichCompareBool(x, y, Py_EQ);
1349 if (b == 0) {
1350 cmp = PyObject_RichCompareBool(x, y, op);
1351 Py_DECREF(x);
1352 Py_DECREF(y);
1353 goto done;
1354 }
1355 Py_DECREF(x);
1356 Py_DECREF(y);
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001357 if (b < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 goto done;
1359 }
1360 /* We reached the end of one deque or both */
1361 Py_XDECREF(x);
1362 Py_XDECREF(y);
1363 if (PyErr_Occurred())
1364 goto done;
1365 switch (op) {
1366 case Py_LT: cmp = y != NULL; break; /* if w was longer */
1367 case Py_LE: cmp = x == NULL; break; /* if v was not longer */
1368 case Py_EQ: cmp = x == y; break; /* if we reached the end of both */
1369 case Py_NE: cmp = x != y; break; /* if one deque continues */
1370 case Py_GT: cmp = x != NULL; break; /* if v was longer */
1371 case Py_GE: cmp = y == NULL; break; /* if w was not longer */
1372 }
Tim Peters1065f752004-10-01 01:03:29 +00001373
Raymond Hettinger738ec902004-02-29 02:15:56 +00001374done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 Py_XDECREF(it1);
1376 Py_XDECREF(it2);
1377 if (cmp == 1)
1378 Py_RETURN_TRUE;
1379 if (cmp == 0)
1380 Py_RETURN_FALSE;
1381 return NULL;
Raymond Hettinger738ec902004-02-29 02:15:56 +00001382}
1383
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001384static int
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001385deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 PyObject *iterable = NULL;
1388 PyObject *maxlenobj = NULL;
1389 Py_ssize_t maxlen = -1;
1390 char *kwlist[] = {"iterable", "maxlen", 0};
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
1393 return -1;
1394 if (maxlenobj != NULL && maxlenobj != Py_None) {
1395 maxlen = PyLong_AsSsize_t(maxlenobj);
1396 if (maxlen == -1 && PyErr_Occurred())
1397 return -1;
1398 if (maxlen < 0) {
1399 PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
1400 return -1;
1401 }
1402 }
1403 deque->maxlen = maxlen;
1404 deque_clear(deque);
1405 if (iterable != NULL) {
1406 PyObject *rv = deque_extend(deque, iterable);
1407 if (rv == NULL)
1408 return -1;
1409 Py_DECREF(rv);
1410 }
1411 return 0;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001412}
1413
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001414static PyObject *
Jesus Cea16e2fca2012-08-03 14:49:42 +02001415deque_sizeof(dequeobject *deque, void *unused)
1416{
1417 Py_ssize_t res;
1418 Py_ssize_t blocks;
1419
1420 res = sizeof(dequeobject);
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001421 blocks = (deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
1422 assert(deque->leftindex + Py_SIZE(deque) - 1 ==
Jesus Cea16e2fca2012-08-03 14:49:42 +02001423 (blocks - 1) * BLOCKLEN + deque->rightindex);
1424 res += blocks * sizeof(block);
1425 return PyLong_FromSsize_t(res);
1426}
1427
1428PyDoc_STRVAR(sizeof_doc,
1429"D.__sizeof__() -- size of D in memory, in bytes");
1430
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001431static int
1432deque_bool(dequeobject *deque)
1433{
1434 return Py_SIZE(deque) != 0;
1435}
1436
Jesus Cea16e2fca2012-08-03 14:49:42 +02001437static PyObject *
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001438deque_get_maxlen(dequeobject *deque)
1439{
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001440 if (deque->maxlen < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 Py_RETURN_NONE;
1442 return PyLong_FromSsize_t(deque->maxlen);
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001443}
1444
Raymond Hettinger41290a62015-03-31 08:12:23 -07001445
1446/* deque object ********************************************************/
1447
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001448static PyGetSetDef deque_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 {"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1450 "maximum size of a deque or None if unbounded"},
1451 {0}
Raymond Hettinger5bb0f0e2009-03-10 12:56:32 +00001452};
1453
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001454static PySequenceMethods deque_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 (lenfunc)deque_len, /* sq_length */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001456 (binaryfunc)deque_concat, /* sq_concat */
1457 (ssizeargfunc)deque_repeat, /* sq_repeat */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 (ssizeargfunc)deque_item, /* sq_item */
1459 0, /* sq_slice */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001460 (ssizeobjargproc)deque_ass_item, /* sq_ass_item */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 0, /* sq_ass_slice */
Raymond Hettinger39dadf72015-03-20 16:38:56 -07001462 (objobjproc)deque_contains, /* sq_contains */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001463 (binaryfunc)deque_inplace_concat, /* sq_inplace_concat */
Raymond Hettinger41290a62015-03-31 08:12:23 -07001464 (ssizeargfunc)deque_inplace_repeat, /* sq_inplace_repeat */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001465};
1466
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001467static PyNumberMethods deque_as_number = {
1468 0, /* nb_add */
1469 0, /* nb_subtract */
1470 0, /* nb_multiply */
1471 0, /* nb_remainder */
1472 0, /* nb_divmod */
1473 0, /* nb_power */
1474 0, /* nb_negative */
1475 0, /* nb_positive */
1476 0, /* nb_absolute */
1477 (inquiry)deque_bool, /* nb_bool */
1478 0, /* nb_invert */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001479 };
1480
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001481static PyObject *deque_iter(dequeobject *deque);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001482static PyObject *deque_reviter(dequeobject *deque);
Tim Peters1065f752004-10-01 01:03:29 +00001483PyDoc_STRVAR(reversed_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 "D.__reversed__() -- return a reverse iterator over the deque");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001485
1486static PyMethodDef deque_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 {"append", (PyCFunction)deque_append,
1488 METH_O, append_doc},
1489 {"appendleft", (PyCFunction)deque_appendleft,
1490 METH_O, appendleft_doc},
1491 {"clear", (PyCFunction)deque_clearmethod,
1492 METH_NOARGS, clear_doc},
1493 {"__copy__", (PyCFunction)deque_copy,
1494 METH_NOARGS, copy_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001495 {"copy", (PyCFunction)deque_copy,
1496 METH_NOARGS, copy_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 {"count", (PyCFunction)deque_count,
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001498 METH_O, count_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 {"extend", (PyCFunction)deque_extend,
1500 METH_O, extend_doc},
1501 {"extendleft", (PyCFunction)deque_extendleft,
1502 METH_O, extendleft_doc},
Raymond Hettinger32ea1652015-03-21 01:37:37 -07001503 {"index", (PyCFunction)deque_index,
1504 METH_VARARGS, index_doc},
1505 {"insert", (PyCFunction)deque_insert,
1506 METH_VARARGS, insert_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 {"pop", (PyCFunction)deque_pop,
1508 METH_NOARGS, pop_doc},
1509 {"popleft", (PyCFunction)deque_popleft,
1510 METH_NOARGS, popleft_doc},
Raymond Hettinger0f6f9472015-03-21 01:42:10 -07001511 {"__reduce__", (PyCFunction)deque_reduce,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 METH_NOARGS, reduce_doc},
1513 {"remove", (PyCFunction)deque_remove,
1514 METH_O, remove_doc},
1515 {"__reversed__", (PyCFunction)deque_reviter,
1516 METH_NOARGS, reversed_doc},
1517 {"reverse", (PyCFunction)deque_reverse,
1518 METH_NOARGS, reverse_doc},
1519 {"rotate", (PyCFunction)deque_rotate,
Jesus Cea16e2fca2012-08-03 14:49:42 +02001520 METH_VARARGS, rotate_doc},
1521 {"__sizeof__", (PyCFunction)deque_sizeof,
1522 METH_NOARGS, sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 {NULL, NULL} /* sentinel */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001524};
1525
1526PyDoc_STRVAR(deque_doc,
Andrew Svetlov6a5c7c32012-10-31 11:50:40 +02001527"deque([iterable[, maxlen]]) --> deque object\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001528\n\
Raymond Hettinger41290a62015-03-31 08:12:23 -07001529A list-like sequence optimized for data accesses near its endpoints.");
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001530
Neal Norwitz87f10132004-02-29 15:40:53 +00001531static PyTypeObject deque_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 PyVarObject_HEAD_INIT(NULL, 0)
1533 "collections.deque", /* tp_name */
1534 sizeof(dequeobject), /* tp_basicsize */
1535 0, /* tp_itemsize */
1536 /* methods */
1537 (destructor)deque_dealloc, /* tp_dealloc */
1538 0, /* tp_print */
1539 0, /* tp_getattr */
1540 0, /* tp_setattr */
1541 0, /* tp_reserved */
1542 deque_repr, /* tp_repr */
Raymond Hettinger0f1451c2015-03-23 23:23:55 -07001543 &deque_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 &deque_as_sequence, /* tp_as_sequence */
1545 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00001546 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 0, /* tp_call */
1548 0, /* tp_str */
1549 PyObject_GenericGetAttr, /* tp_getattro */
1550 0, /* tp_setattro */
1551 0, /* tp_as_buffer */
1552 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandlf038b322010-10-18 07:35:09 +00001553 /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 deque_doc, /* tp_doc */
1555 (traverseproc)deque_traverse, /* tp_traverse */
1556 (inquiry)deque_clear, /* tp_clear */
1557 (richcmpfunc)deque_richcompare, /* tp_richcompare */
Georg Brandlf038b322010-10-18 07:35:09 +00001558 offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 (getiterfunc)deque_iter, /* tp_iter */
1560 0, /* tp_iternext */
1561 deque_methods, /* tp_methods */
1562 0, /* tp_members */
Georg Brandlf038b322010-10-18 07:35:09 +00001563 deque_getset, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 0, /* tp_base */
1565 0, /* tp_dict */
1566 0, /* tp_descr_get */
1567 0, /* tp_descr_set */
1568 0, /* tp_dictoffset */
1569 (initproc)deque_init, /* tp_init */
1570 PyType_GenericAlloc, /* tp_alloc */
1571 deque_new, /* tp_new */
1572 PyObject_GC_Del, /* tp_free */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001573};
1574
1575/*********************** Deque Iterator **************************/
1576
1577typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 block *b;
Raymond Hettinger87e69122015-03-02 23:32:02 -08001580 Py_ssize_t index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 dequeobject *deque;
Raymond Hettingerf9d9c792015-03-02 22:47:46 -08001582 size_t state; /* state when the iterator is created */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 Py_ssize_t counter; /* number of items remaining for iteration */
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001584} dequeiterobject;
1585
Martin v. Löwis59683e82008-06-13 07:50:45 +00001586static PyTypeObject dequeiter_type;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001587
1588static PyObject *
1589deque_iter(dequeobject *deque)
1590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 dequeiterobject *it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 it = PyObject_GC_New(dequeiterobject, &dequeiter_type);
1594 if (it == NULL)
1595 return NULL;
1596 it->b = deque->leftblock;
1597 it->index = deque->leftindex;
1598 Py_INCREF(deque);
1599 it->deque = deque;
1600 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001601 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 PyObject_GC_Track(it);
1603 return (PyObject *)it;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001604}
1605
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001606static int
1607dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)
1608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 Py_VISIT(dio->deque);
1610 return 0;
Antoine Pitrou7ddda782009-01-01 15:35:33 +00001611}
1612
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001613static void
1614dequeiter_dealloc(dequeiterobject *dio)
1615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 Py_XDECREF(dio->deque);
1617 PyObject_GC_Del(dio);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001618}
1619
1620static PyObject *
1621dequeiter_next(dequeiterobject *it)
1622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 PyObject *item;
Raymond Hettingerd1b3d882004-10-02 00:43:13 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 if (it->deque->state != it->state) {
1626 it->counter = 0;
1627 PyErr_SetString(PyExc_RuntimeError,
1628 "deque mutated during iteration");
1629 return NULL;
1630 }
1631 if (it->counter == 0)
1632 return NULL;
1633 assert (!(it->b == it->deque->rightblock &&
1634 it->index > it->deque->rightindex));
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 item = it->b->data[it->index];
1637 it->index++;
1638 it->counter--;
1639 if (it->index == BLOCKLEN && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001640 CHECK_NOT_END(it->b->rightlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 it->b = it->b->rightlink;
1642 it->index = 0;
1643 }
1644 Py_INCREF(item);
1645 return item;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001646}
1647
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001648static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001649dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1650{
1651 Py_ssize_t i, index=0;
1652 PyObject *deque;
1653 dequeiterobject *it;
1654 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1655 return NULL;
1656 assert(type == &dequeiter_type);
1657
1658 it = (dequeiterobject*)deque_iter((dequeobject *)deque);
1659 if (!it)
1660 return NULL;
1661 /* consume items from the queue */
1662 for(i=0; i<index; i++) {
1663 PyObject *item = dequeiter_next(it);
1664 if (item) {
1665 Py_DECREF(item);
1666 } else {
1667 if (it->counter) {
1668 Py_DECREF(it);
1669 return NULL;
1670 } else
1671 break;
1672 }
1673 }
1674 return (PyObject*)it;
1675}
1676
1677static PyObject *
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001678dequeiter_len(dequeiterobject *it)
1679{
Antoine Pitrou554f3342010-08-17 18:30:06 +00001680 return PyLong_FromSsize_t(it->counter);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001681}
1682
Armin Rigof5b3e362006-02-11 21:32:43 +00001683PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001684
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001685static PyObject *
1686dequeiter_reduce(dequeiterobject *it)
1687{
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001688 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 +00001689}
1690
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001691static PyMethodDef dequeiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001693 {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 {NULL, NULL} /* sentinel */
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001695};
1696
Martin v. Löwis59683e82008-06-13 07:50:45 +00001697static PyTypeObject dequeiter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001699 "_collections._deque_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 sizeof(dequeiterobject), /* tp_basicsize */
1701 0, /* tp_itemsize */
1702 /* methods */
1703 (destructor)dequeiter_dealloc, /* tp_dealloc */
1704 0, /* tp_print */
1705 0, /* tp_getattr */
1706 0, /* tp_setattr */
1707 0, /* tp_reserved */
1708 0, /* tp_repr */
1709 0, /* tp_as_number */
1710 0, /* tp_as_sequence */
1711 0, /* tp_as_mapping */
1712 0, /* tp_hash */
1713 0, /* tp_call */
1714 0, /* tp_str */
1715 PyObject_GenericGetAttr, /* tp_getattro */
1716 0, /* tp_setattro */
1717 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001718 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 0, /* tp_doc */
1720 (traverseproc)dequeiter_traverse, /* tp_traverse */
1721 0, /* tp_clear */
1722 0, /* tp_richcompare */
1723 0, /* tp_weaklistoffset */
1724 PyObject_SelfIter, /* tp_iter */
1725 (iternextfunc)dequeiter_next, /* tp_iternext */
1726 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001727 0, /* tp_members */
1728 0, /* tp_getset */
1729 0, /* tp_base */
1730 0, /* tp_dict */
1731 0, /* tp_descr_get */
1732 0, /* tp_descr_set */
1733 0, /* tp_dictoffset */
1734 0, /* tp_init */
1735 0, /* tp_alloc */
1736 dequeiter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 0,
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001738};
1739
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001740/*********************** Deque Reverse Iterator **************************/
1741
Martin v. Löwis59683e82008-06-13 07:50:45 +00001742static PyTypeObject dequereviter_type;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001743
1744static PyObject *
1745deque_reviter(dequeobject *deque)
1746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 dequeiterobject *it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 it = PyObject_GC_New(dequeiterobject, &dequereviter_type);
1750 if (it == NULL)
1751 return NULL;
1752 it->b = deque->rightblock;
1753 it->index = deque->rightindex;
1754 Py_INCREF(deque);
1755 it->deque = deque;
1756 it->state = deque->state;
Raymond Hettingerdf715ba2013-07-06 13:01:13 -10001757 it->counter = Py_SIZE(deque);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 PyObject_GC_Track(it);
1759 return (PyObject *)it;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001760}
1761
1762static PyObject *
1763dequereviter_next(dequeiterobject *it)
1764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 PyObject *item;
1766 if (it->counter == 0)
1767 return NULL;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 if (it->deque->state != it->state) {
1770 it->counter = 0;
1771 PyErr_SetString(PyExc_RuntimeError,
1772 "deque mutated during iteration");
1773 return NULL;
1774 }
1775 assert (!(it->b == it->deque->leftblock &&
1776 it->index < it->deque->leftindex));
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 item = it->b->data[it->index];
1779 it->index--;
1780 it->counter--;
Raymond Hettingerd3d2b2c2015-09-21 23:41:56 -07001781 if (it->index < 0 && it->counter > 0) {
Raymond Hettinger82df9252013-07-07 01:43:42 -10001782 CHECK_NOT_END(it->b->leftlink);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 it->b = it->b->leftlink;
1784 it->index = BLOCKLEN - 1;
1785 }
1786 Py_INCREF(item);
1787 return item;
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001788}
1789
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001790static PyObject *
1791dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1792{
1793 Py_ssize_t i, index=0;
1794 PyObject *deque;
1795 dequeiterobject *it;
1796 if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
1797 return NULL;
1798 assert(type == &dequereviter_type);
1799
1800 it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
1801 if (!it)
1802 return NULL;
1803 /* consume items from the queue */
1804 for(i=0; i<index; i++) {
1805 PyObject *item = dequereviter_next(it);
1806 if (item) {
1807 Py_DECREF(item);
1808 } else {
1809 if (it->counter) {
1810 Py_DECREF(it);
1811 return NULL;
1812 } else
1813 break;
1814 }
1815 }
1816 return (PyObject*)it;
1817}
1818
Martin v. Löwis59683e82008-06-13 07:50:45 +00001819static PyTypeObject dequereviter_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger87e69122015-03-02 23:32:02 -08001821 "_collections._deque_reverse_iterator", /* tp_name */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 sizeof(dequeiterobject), /* tp_basicsize */
1823 0, /* tp_itemsize */
1824 /* methods */
1825 (destructor)dequeiter_dealloc, /* tp_dealloc */
1826 0, /* tp_print */
1827 0, /* tp_getattr */
1828 0, /* tp_setattr */
1829 0, /* tp_reserved */
1830 0, /* tp_repr */
1831 0, /* tp_as_number */
1832 0, /* tp_as_sequence */
1833 0, /* tp_as_mapping */
1834 0, /* tp_hash */
1835 0, /* tp_call */
1836 0, /* tp_str */
1837 PyObject_GenericGetAttr, /* tp_getattro */
1838 0, /* tp_setattro */
1839 0, /* tp_as_buffer */
Raymond Hettinger87e69122015-03-02 23:32:02 -08001840 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 0, /* tp_doc */
1842 (traverseproc)dequeiter_traverse, /* tp_traverse */
1843 0, /* tp_clear */
1844 0, /* tp_richcompare */
1845 0, /* tp_weaklistoffset */
1846 PyObject_SelfIter, /* tp_iter */
1847 (iternextfunc)dequereviter_next, /* tp_iternext */
1848 dequeiter_methods, /* tp_methods */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001849 0, /* tp_members */
1850 0, /* tp_getset */
1851 0, /* tp_base */
1852 0, /* tp_dict */
1853 0, /* tp_descr_get */
1854 0, /* tp_descr_set */
1855 0, /* tp_dictoffset */
1856 0, /* tp_init */
1857 0, /* tp_alloc */
1858 dequereviter_new, /* tp_new */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 0,
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00001860};
1861
Guido van Rossum1968ad32006-02-25 22:38:04 +00001862/* defaultdict type *********************************************************/
1863
1864typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 PyDictObject dict;
1866 PyObject *default_factory;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001867} defdictobject;
1868
1869static PyTypeObject defdict_type; /* Forward */
1870
1871PyDoc_STRVAR(defdict_missing_doc,
1872"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
Guido van Rossumd8faa362007-04-27 19:54:29 +00001873 if self.default_factory is None: raise KeyError((key,))\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00001874 self[key] = value = self.default_factory()\n\
1875 return value\n\
1876");
1877
1878static PyObject *
1879defdict_missing(defdictobject *dd, PyObject *key)
1880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 PyObject *factory = dd->default_factory;
1882 PyObject *value;
1883 if (factory == NULL || factory == Py_None) {
1884 /* XXX Call dict.__missing__(key) */
1885 PyObject *tup;
1886 tup = PyTuple_Pack(1, key);
1887 if (!tup) return NULL;
1888 PyErr_SetObject(PyExc_KeyError, tup);
1889 Py_DECREF(tup);
1890 return NULL;
1891 }
1892 value = PyEval_CallObject(factory, NULL);
1893 if (value == NULL)
1894 return value;
1895 if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {
1896 Py_DECREF(value);
1897 return NULL;
1898 }
1899 return value;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001900}
1901
1902PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");
1903
1904static PyObject *
1905defdict_copy(defdictobject *dd)
1906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 /* This calls the object's class. That only works for subclasses
1908 whose class constructor has the same signature. Subclasses that
1909 define a different constructor signature must override copy().
1910 */
Raymond Hettinger54628fa2009-08-04 19:16:39 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 if (dd->default_factory == NULL)
1913 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1914 return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1915 dd->default_factory, dd, NULL);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001916}
1917
1918static PyObject *
1919defdict_reduce(defdictobject *dd)
1920{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* __reduce__ must return a 5-tuple as follows:
Guido van Rossum1968ad32006-02-25 22:38:04 +00001922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 - factory function
1924 - tuple of args for the factory function
1925 - additional state (here None)
1926 - sequence iterator (here None)
1927 - dictionary iterator (yielding successive (key, value) pairs
Guido van Rossum1968ad32006-02-25 22:38:04 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 This API is used by pickle.py and copy.py.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 For this to be useful with pickle.py, the default_factory
1932 must be picklable; e.g., None, a built-in, or a global
1933 function in a module or package.
Guido van Rossum1968ad32006-02-25 22:38:04 +00001934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 Both shallow and deep copying are supported, but for deep
1936 copying, the default_factory must be deep-copyable; e.g. None,
1937 or a built-in (functions are not copyable at this time).
Guido van Rossum1968ad32006-02-25 22:38:04 +00001938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 This only works for subclasses as long as their constructor
1940 signature is compatible; the first argument must be the
1941 optional default_factory, defaulting to None.
1942 */
1943 PyObject *args;
1944 PyObject *items;
1945 PyObject *iter;
1946 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001947 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 if (dd->default_factory == NULL || dd->default_factory == Py_None)
1950 args = PyTuple_New(0);
1951 else
1952 args = PyTuple_Pack(1, dd->default_factory);
1953 if (args == NULL)
1954 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001955 items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 if (items == NULL) {
1957 Py_DECREF(args);
1958 return NULL;
1959 }
1960 iter = PyObject_GetIter(items);
1961 if (iter == NULL) {
1962 Py_DECREF(items);
1963 Py_DECREF(args);
1964 return NULL;
1965 }
1966 result = PyTuple_Pack(5, Py_TYPE(dd), args,
1967 Py_None, Py_None, iter);
1968 Py_DECREF(iter);
1969 Py_DECREF(items);
1970 Py_DECREF(args);
1971 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00001972}
1973
1974static PyMethodDef defdict_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 {"__missing__", (PyCFunction)defdict_missing, METH_O,
1976 defdict_missing_doc},
1977 {"copy", (PyCFunction)defdict_copy, METH_NOARGS,
1978 defdict_copy_doc},
1979 {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
1980 defdict_copy_doc},
1981 {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,
1982 reduce_doc},
1983 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001984};
1985
1986static PyMemberDef defdict_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 {"default_factory", T_OBJECT,
1988 offsetof(defdictobject, default_factory), 0,
1989 PyDoc_STR("Factory for default value called by __missing__().")},
1990 {NULL}
Guido van Rossum1968ad32006-02-25 22:38:04 +00001991};
1992
1993static void
1994defdict_dealloc(defdictobject *dd)
1995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 Py_CLEAR(dd->default_factory);
1997 PyDict_Type.tp_dealloc((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00001998}
1999
Guido van Rossum1968ad32006-02-25 22:38:04 +00002000static PyObject *
2001defdict_repr(defdictobject *dd)
2002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 PyObject *baserepr;
2004 PyObject *defrepr;
2005 PyObject *result;
2006 baserepr = PyDict_Type.tp_repr((PyObject *)dd);
2007 if (baserepr == NULL)
2008 return NULL;
2009 if (dd->default_factory == NULL)
2010 defrepr = PyUnicode_FromString("None");
2011 else
2012 {
2013 int status = Py_ReprEnter(dd->default_factory);
2014 if (status != 0) {
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002015 if (status < 0) {
2016 Py_DECREF(baserepr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 return NULL;
Antoine Pitrouf5f1fe02012-02-15 02:42:46 +01002018 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 defrepr = PyUnicode_FromString("...");
2020 }
2021 else
2022 defrepr = PyObject_Repr(dd->default_factory);
2023 Py_ReprLeave(dd->default_factory);
2024 }
2025 if (defrepr == NULL) {
2026 Py_DECREF(baserepr);
2027 return NULL;
2028 }
2029 result = PyUnicode_FromFormat("defaultdict(%U, %U)",
2030 defrepr, baserepr);
2031 Py_DECREF(defrepr);
2032 Py_DECREF(baserepr);
2033 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002034}
2035
2036static int
2037defdict_traverse(PyObject *self, visitproc visit, void *arg)
2038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 Py_VISIT(((defdictobject *)self)->default_factory);
2040 return PyDict_Type.tp_traverse(self, visit, arg);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002041}
2042
2043static int
2044defdict_tp_clear(defdictobject *dd)
2045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 Py_CLEAR(dd->default_factory);
2047 return PyDict_Type.tp_clear((PyObject *)dd);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002048}
2049
2050static int
2051defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
2052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 defdictobject *dd = (defdictobject *)self;
2054 PyObject *olddefault = dd->default_factory;
2055 PyObject *newdefault = NULL;
2056 PyObject *newargs;
2057 int result;
2058 if (args == NULL || !PyTuple_Check(args))
2059 newargs = PyTuple_New(0);
2060 else {
2061 Py_ssize_t n = PyTuple_GET_SIZE(args);
2062 if (n > 0) {
2063 newdefault = PyTuple_GET_ITEM(args, 0);
2064 if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
2065 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger239aba72015-07-20 03:09:22 -04002066 "first argument must be callable or None");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 return -1;
2068 }
2069 }
2070 newargs = PySequence_GetSlice(args, 1, n);
2071 }
2072 if (newargs == NULL)
2073 return -1;
2074 Py_XINCREF(newdefault);
2075 dd->default_factory = newdefault;
2076 result = PyDict_Type.tp_init(self, newargs, kwds);
2077 Py_DECREF(newargs);
2078 Py_XDECREF(olddefault);
2079 return result;
Guido van Rossum1968ad32006-02-25 22:38:04 +00002080}
2081
2082PyDoc_STRVAR(defdict_doc,
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002083"defaultdict(default_factory[, ...]) --> dict with default factory\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002084\n\
2085The default factory is called without arguments to produce\n\
2086a new value when a key is not present, in __getitem__ only.\n\
2087A defaultdict compares equal to a dict with the same items.\n\
Benjamin Peterson9cb33b72014-01-13 23:56:05 -05002088All remaining arguments are treated the same as if they were\n\
2089passed to the dict constructor, including keyword arguments.\n\
Guido van Rossum1968ad32006-02-25 22:38:04 +00002090");
2091
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002092/* See comment in xxsubtype.c */
2093#define DEFERRED_ADDRESS(ADDR) 0
2094
Guido van Rossum1968ad32006-02-25 22:38:04 +00002095static PyTypeObject defdict_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
2097 "collections.defaultdict", /* tp_name */
2098 sizeof(defdictobject), /* tp_basicsize */
2099 0, /* tp_itemsize */
2100 /* methods */
2101 (destructor)defdict_dealloc, /* tp_dealloc */
2102 0, /* tp_print */
2103 0, /* tp_getattr */
2104 0, /* tp_setattr */
2105 0, /* tp_reserved */
2106 (reprfunc)defdict_repr, /* tp_repr */
2107 0, /* tp_as_number */
2108 0, /* tp_as_sequence */
2109 0, /* tp_as_mapping */
2110 0, /* tp_hash */
2111 0, /* tp_call */
2112 0, /* tp_str */
2113 PyObject_GenericGetAttr, /* tp_getattro */
2114 0, /* tp_setattro */
2115 0, /* tp_as_buffer */
2116 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2117 /* tp_flags */
2118 defdict_doc, /* tp_doc */
2119 defdict_traverse, /* tp_traverse */
2120 (inquiry)defdict_tp_clear, /* tp_clear */
2121 0, /* tp_richcompare */
2122 0, /* tp_weaklistoffset*/
2123 0, /* tp_iter */
2124 0, /* tp_iternext */
2125 defdict_methods, /* tp_methods */
2126 defdict_members, /* tp_members */
2127 0, /* tp_getset */
2128 DEFERRED_ADDRESS(&PyDict_Type), /* tp_base */
2129 0, /* tp_dict */
2130 0, /* tp_descr_get */
2131 0, /* tp_descr_set */
2132 0, /* tp_dictoffset */
2133 defdict_init, /* tp_init */
2134 PyType_GenericAlloc, /* tp_alloc */
2135 0, /* tp_new */
2136 PyObject_GC_Del, /* tp_free */
Guido van Rossum1968ad32006-02-25 22:38:04 +00002137};
2138
Raymond Hettinger96f34102010-12-15 16:30:37 +00002139/* helper function for Counter *********************************************/
2140
2141PyDoc_STRVAR(_count_elements_doc,
2142"_count_elements(mapping, iterable) -> None\n\
2143\n\
2144Count elements in the iterable, updating the mappping");
2145
2146static PyObject *
2147_count_elements(PyObject *self, PyObject *args)
2148{
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002149 _Py_IDENTIFIER(get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002150 _Py_IDENTIFIER(__setitem__);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002151 PyObject *it, *iterable, *mapping, *oldval;
2152 PyObject *newval = NULL;
2153 PyObject *key = NULL;
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002154 PyObject *zero = NULL;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002155 PyObject *one = NULL;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002156 PyObject *bound_get = NULL;
2157 PyObject *mapping_get;
2158 PyObject *dict_get;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002159 PyObject *mapping_setitem;
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002160 PyObject *dict_setitem;
Raymond Hettinger96f34102010-12-15 16:30:37 +00002161
2162 if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
2163 return NULL;
2164
Raymond Hettinger96f34102010-12-15 16:30:37 +00002165 it = PyObject_GetIter(iterable);
2166 if (it == NULL)
2167 return NULL;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002168
Raymond Hettinger96f34102010-12-15 16:30:37 +00002169 one = PyLong_FromLong(1);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002170 if (one == NULL)
2171 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002172
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002173 /* Only take the fast path when get() and __setitem__()
2174 * have not been overridden.
2175 */
2176 mapping_get = _PyType_LookupId(Py_TYPE(mapping), &PyId_get);
2177 dict_get = _PyType_LookupId(&PyDict_Type, &PyId_get);
Raymond Hettinger2ff21902013-10-01 00:55:43 -07002178 mapping_setitem = _PyType_LookupId(Py_TYPE(mapping), &PyId___setitem__);
2179 dict_setitem = _PyType_LookupId(&PyDict_Type, &PyId___setitem__);
2180
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002181 if (mapping_get != NULL && mapping_get == dict_get &&
2182 mapping_setitem != NULL && mapping_setitem == dict_setitem) {
Raymond Hettinger426e0522011-01-03 02:12:02 +00002183 while (1) {
Raymond Hettinger507d9972014-05-18 21:32:40 +01002184 /* Fast path advantages:
2185 1. Eliminate double hashing
2186 (by re-using the same hash for both the get and set)
2187 2. Avoid argument overhead of PyObject_CallFunctionObjArgs
2188 (argument tuple creation and parsing)
2189 3. Avoid indirection through a bound method object
2190 (creates another argument tuple)
2191 4. Avoid initial increment from zero
2192 (reuse an existing one-object instead)
2193 */
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002194 Py_hash_t hash;
2195
Raymond Hettinger426e0522011-01-03 02:12:02 +00002196 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002197 if (key == NULL)
2198 break;
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002199
2200 if (!PyUnicode_CheckExact(key) ||
2201 (hash = ((PyASCIIObject *) key)->hash) == -1)
2202 {
2203 hash = PyObject_Hash(key);
Raymond Hettingerda2850f2015-02-27 12:42:54 -08002204 if (hash == -1)
Raymond Hettinger4b0b1ac2014-05-03 16:41:19 -07002205 goto done;
2206 }
2207
2208 oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002209 if (oldval == NULL) {
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002210 if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002211 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002212 } else {
2213 newval = PyNumber_Add(oldval, one);
2214 if (newval == NULL)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002215 goto done;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002216 if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0)
Raymond Hettinger507d9972014-05-18 21:32:40 +01002217 goto done;
Raymond Hettinger426e0522011-01-03 02:12:02 +00002218 Py_CLEAR(newval);
2219 }
2220 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002221 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002222 } else {
Victor Stinnere7f516c2013-11-06 23:52:55 +01002223 bound_get = _PyObject_GetAttrId(mapping, &PyId_get);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002224 if (bound_get == NULL)
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002225 goto done;
2226
2227 zero = PyLong_FromLong(0);
2228 if (zero == NULL)
2229 goto done;
2230
Raymond Hettinger426e0522011-01-03 02:12:02 +00002231 while (1) {
2232 key = PyIter_Next(it);
Victor Stinnera154b5c2011-04-20 23:23:52 +02002233 if (key == NULL)
2234 break;
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002235 oldval = PyObject_CallFunctionObjArgs(bound_get, key, zero, NULL);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002236 if (oldval == NULL)
2237 break;
2238 newval = PyNumber_Add(oldval, one);
2239 Py_DECREF(oldval);
2240 if (newval == NULL)
2241 break;
Raymond Hettinger28c995d2015-08-14 02:07:41 -07002242 if (PyObject_SetItem(mapping, key, newval) < 0)
Raymond Hettinger96f34102010-12-15 16:30:37 +00002243 break;
2244 Py_CLEAR(newval);
Raymond Hettinger426e0522011-01-03 02:12:02 +00002245 Py_DECREF(key);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002246 }
Raymond Hettinger96f34102010-12-15 16:30:37 +00002247 }
Raymond Hettinger426e0522011-01-03 02:12:02 +00002248
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002249done:
Raymond Hettinger96f34102010-12-15 16:30:37 +00002250 Py_DECREF(it);
2251 Py_XDECREF(key);
2252 Py_XDECREF(newval);
Raymond Hettingercb1d96f2013-10-04 16:51:02 -07002253 Py_XDECREF(bound_get);
Raymond Hettinger224c87d2013-10-01 21:36:09 -07002254 Py_XDECREF(zero);
2255 Py_XDECREF(one);
Raymond Hettinger96f34102010-12-15 16:30:37 +00002256 if (PyErr_Occurred())
2257 return NULL;
2258 Py_RETURN_NONE;
2259}
2260
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002261/* module level code ********************************************************/
2262
2263PyDoc_STRVAR(module_doc,
Guido van Rossum1968ad32006-02-25 22:38:04 +00002264"High performance data structures.\n\
2265- deque: ordered collection accessible from endpoints only\n\
2266- defaultdict: dict subclass with a default value factory\n\
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002267");
2268
Raymond Hettinger96f34102010-12-15 16:30:37 +00002269static struct PyMethodDef module_functions[] = {
2270 {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
2271 {NULL, NULL} /* sentinel */
2272};
Martin v. Löwis1a214512008-06-11 05:26:20 +00002273
2274static struct PyModuleDef _collectionsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 PyModuleDef_HEAD_INIT,
2276 "_collections",
2277 module_doc,
2278 -1,
Raymond Hettinger96f34102010-12-15 16:30:37 +00002279 module_functions,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 NULL,
2281 NULL,
2282 NULL,
2283 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002284};
2285
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002286PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002287PyInit__collections(void)
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 m = PyModule_Create(&_collectionsmodule);
2292 if (m == NULL)
2293 return NULL;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (PyType_Ready(&deque_type) < 0)
2296 return NULL;
2297 Py_INCREF(&deque_type);
2298 PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 defdict_type.tp_base = &PyDict_Type;
2301 if (PyType_Ready(&defdict_type) < 0)
2302 return NULL;
2303 Py_INCREF(&defdict_type);
2304 PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
Guido van Rossum1968ad32006-02-25 22:38:04 +00002305
Eric Snow47db7172015-05-29 22:21:39 -06002306 Py_INCREF(&PyODict_Type);
2307 PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
2308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 if (PyType_Ready(&dequeiter_type) < 0)
2310 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002311 Py_INCREF(&dequeiter_type);
2312 PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 if (PyType_Ready(&dequereviter_type) < 0)
2315 return NULL;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002316 Py_INCREF(&dequereviter_type);
2317 PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
Raymond Hettinger1e5809f2004-03-18 11:04:57 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 return m;
Raymond Hettinger756b3f32004-01-29 06:37:52 +00002320}