blob: f98a930edef22246ab55f8ecb2a0be8f9f1b3bb6 [file] [log] [blame]
Raymond Hettingerc991db22005-08-11 07:58:45 +00001
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002/* set object implementation
Raymond Hettingera9d99362005-08-05 00:01:15 +00003 Written and maintained by Raymond D. Hettinger <python@rcn.com>
4 Derived from Lib/sets.py and Objects/dictobject.c.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00005
Martin v. Löwis68192102007-07-21 06:55:02 +00006 Copyright (c) 2003-2007 Python Software Foundation.
Raymond Hettingera9d99362005-08-05 00:01:15 +00007 All rights reserved.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00008*/
9
Raymond Hettingera690a992003-11-16 16:17:49 +000010#include "Python.h"
Raymond Hettingera9d99362005-08-05 00:01:15 +000011#include "structmember.h"
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000012
Raymond Hettinger9c14ffb2006-12-08 04:57:50 +000013/* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16static void
17set_key_error(PyObject *arg)
18{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000019 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
24 Py_DECREF(tup);
Raymond Hettinger9c14ffb2006-12-08 04:57:50 +000025}
26
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000027/* This must be >= 1. */
28#define PERTURB_SHIFT 5
29
30/* Object used as dummy key to fill deleted entries */
Raymond Hettingera9d99362005-08-05 00:01:15 +000031static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000032
Armin Rigoe1709372006-04-12 17:06:05 +000033#ifdef Py_REF_DEBUG
34PyObject *
35_PySet_Dummy(void)
36{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000037 return dummy;
Armin Rigoe1709372006-04-12 17:06:05 +000038}
39#endif
40
Antoine Pitrouc83ea132010-05-09 14:46:46 +000041#define INIT_NONZERO_SET_SLOTS(so) do { \
42 (so)->table = (so)->smalltable; \
43 (so)->mask = PySet_MINSIZE - 1; \
44 (so)->hash = -1; \
Raymond Hettingerbc841a12005-08-07 13:02:53 +000045 } while(0)
46
Antoine Pitrouc83ea132010-05-09 14:46:46 +000047#define EMPTY_TO_MINSIZE(so) do { \
48 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \
49 (so)->used = (so)->fill = 0; \
50 INIT_NONZERO_SET_SLOTS(so); \
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000051 } while(0)
52
Raymond Hettingerbc841a12005-08-07 13:02:53 +000053/* Reuse scheme to save calls to malloc, free, and memset */
Christian Heimes5b970ad2008-02-06 13:33:44 +000054#ifndef PySet_MAXFREELIST
55#define PySet_MAXFREELIST 80
56#endif
57static PySetObject *free_list[PySet_MAXFREELIST];
58static int numfree = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000059
60/*
61The basic lookup function used by all operations.
62This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
63Open addressing is preferred over chaining since the link overhead for
64chaining would be substantial (100% with typical malloc overhead).
65
66The initial probe index is computed as hash mod the table size. Subsequent
Raymond Hettingerbc841a12005-08-07 13:02:53 +000067probe indices are computed as explained in Objects/dictobject.c.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000068
69All arithmetic on hash should ignore overflow.
70
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000071Unlike the dictionary implementation, the lookkey functions can return
72NULL if the rich comparison returns an error.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000073*/
74
75static setentry *
76set_lookkey(PySetObject *so, PyObject *key, register long hash)
77{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000078 register Py_ssize_t i;
79 register size_t perturb;
80 register setentry *freeslot;
81 register size_t mask = so->mask;
82 setentry *table = so->table;
83 register setentry *entry;
84 register int cmp;
85 PyObject *startkey;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000086
Antoine Pitrouc83ea132010-05-09 14:46:46 +000087 i = hash & mask;
88 entry = &table[i];
89 if (entry->key == NULL || entry->key == key)
90 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000091
Antoine Pitrouc83ea132010-05-09 14:46:46 +000092 if (entry->key == dummy)
93 freeslot = entry;
94 else {
95 if (entry->hash == hash) {
96 startkey = entry->key;
97 Py_INCREF(startkey);
98 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
99 Py_DECREF(startkey);
100 if (cmp < 0)
101 return NULL;
102 if (table == so->table && entry->key == startkey) {
103 if (cmp > 0)
104 return entry;
105 }
106 else {
107 /* The compare did major nasty stuff to the
108 * set: start over.
109 */
110 return set_lookkey(so, key, hash);
111 }
112 }
113 freeslot = NULL;
114 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000115
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000116 /* In the loop, key == dummy is by far (factor of 100s) the
117 least likely outcome, so test for that last. */
118 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
119 i = (i << 2) + i + perturb + 1;
120 entry = &table[i & mask];
121 if (entry->key == NULL) {
122 if (freeslot != NULL)
123 entry = freeslot;
124 break;
125 }
126 if (entry->key == key)
127 break;
128 if (entry->hash == hash && entry->key != dummy) {
129 startkey = entry->key;
130 Py_INCREF(startkey);
131 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
132 Py_DECREF(startkey);
133 if (cmp < 0)
134 return NULL;
135 if (table == so->table && entry->key == startkey) {
136 if (cmp > 0)
137 break;
138 }
139 else {
140 /* The compare did major nasty stuff to the
141 * set: start over.
142 */
143 return set_lookkey(so, key, hash);
144 }
145 }
146 else if (entry->key == dummy && freeslot == NULL)
147 freeslot = entry;
148 }
149 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000150}
151
152/*
153 * Hacked up version of set_lookkey which can assume keys are always strings;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000154 * This means we can always use _PyString_Eq directly and not have to check to
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000155 * see if the comparison altered the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000156 */
157static setentry *
158set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
159{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000160 register Py_ssize_t i;
161 register size_t perturb;
162 register setentry *freeslot;
163 register size_t mask = so->mask;
164 setentry *table = so->table;
165 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000166
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000167 /* Make sure this function doesn't have to handle non-string keys,
168 including subclasses of str; e.g., one reason to subclass
169 strings is to override __eq__, and for speed we don't cater to
170 that here. */
171 if (!PyString_CheckExact(key)) {
172 so->lookup = set_lookkey;
173 return set_lookkey(so, key, hash);
174 }
175 i = hash & mask;
176 entry = &table[i];
177 if (entry->key == NULL || entry->key == key)
178 return entry;
179 if (entry->key == dummy)
180 freeslot = entry;
181 else {
182 if (entry->hash == hash && _PyString_Eq(entry->key, key))
183 return entry;
184 freeslot = NULL;
185 }
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000186
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000187 /* In the loop, key == dummy is by far (factor of 100s) the
188 least likely outcome, so test for that last. */
189 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
190 i = (i << 2) + i + perturb + 1;
191 entry = &table[i & mask];
192 if (entry->key == NULL)
193 return freeslot == NULL ? entry : freeslot;
194 if (entry->key == key
195 || (entry->hash == hash
196 && entry->key != dummy
197 && _PyString_Eq(entry->key, key)))
198 return entry;
199 if (entry->key == dummy && freeslot == NULL)
200 freeslot = entry;
201 }
202 assert(0); /* NOT REACHED */
203 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000204}
205
206/*
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000207Internal routine to insert a new key into the table.
Raymond Hettinger0c850862006-12-08 04:24:33 +0000208Used by the public insert routine.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000209Eats a reference to key.
210*/
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000211static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000212set_insert_key(register PySetObject *so, PyObject *key, long hash)
213{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000214 register setentry *entry;
215 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000216
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000217 assert(so->lookup != NULL);
218 entry = so->lookup(so, key, hash);
219 if (entry == NULL)
220 return -1;
221 if (entry->key == NULL) {
222 /* UNUSED */
223 so->fill++;
224 entry->key = key;
225 entry->hash = hash;
226 so->used++;
227 } else if (entry->key == dummy) {
228 /* DUMMY */
229 entry->key = key;
230 entry->hash = hash;
231 so->used++;
232 Py_DECREF(dummy);
233 } else {
234 /* ACTIVE */
235 Py_DECREF(key);
236 }
237 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000238}
239
240/*
Raymond Hettinger0c850862006-12-08 04:24:33 +0000241Internal routine used by set_table_resize() to insert an item which is
242known to be absent from the set. This routine also assumes that
243the set contains no deleted entries. Besides the performance benefit,
244using set_insert_clean() in set_table_resize() is dangerous (SF bug #1456209).
245Note that no refcounts are changed by this routine; if needed, the caller
246is responsible for incref'ing `key`.
247*/
248static void
249set_insert_clean(register PySetObject *so, PyObject *key, long hash)
250{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000251 register size_t i;
252 register size_t perturb;
253 register size_t mask = (size_t)so->mask;
254 setentry *table = so->table;
255 register setentry *entry;
Raymond Hettinger0c850862006-12-08 04:24:33 +0000256
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 i = hash & mask;
258 entry = &table[i];
259 for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) {
260 i = (i << 2) + i + perturb + 1;
261 entry = &table[i & mask];
262 }
263 so->fill++;
264 entry->key = key;
265 entry->hash = hash;
266 so->used++;
Raymond Hettinger0c850862006-12-08 04:24:33 +0000267}
268
269/*
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000270Restructure the table by allocating a new table and reinserting all
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000271keys again. When entries have been deleted, the new table may
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000272actually be smaller than the old one.
273*/
274static int
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000275set_table_resize(PySetObject *so, Py_ssize_t minused)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000276{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000277 Py_ssize_t newsize;
278 setentry *oldtable, *newtable, *entry;
279 Py_ssize_t i;
280 int is_oldtable_malloced;
281 setentry small_copy[PySet_MINSIZE];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000282
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000283 assert(minused >= 0);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000284
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000285 /* Find the smallest table size > minused. */
286 for (newsize = PySet_MINSIZE;
287 newsize <= minused && newsize > 0;
288 newsize <<= 1)
289 ;
290 if (newsize <= 0) {
291 PyErr_NoMemory();
292 return -1;
293 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000294
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000295 /* Get space for a new table. */
296 oldtable = so->table;
297 assert(oldtable != NULL);
298 is_oldtable_malloced = oldtable != so->smalltable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000299
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000300 if (newsize == PySet_MINSIZE) {
301 /* A large table is shrinking, or we can't get any smaller. */
302 newtable = so->smalltable;
303 if (newtable == oldtable) {
304 if (so->fill == so->used) {
305 /* No dummies, so no point doing anything. */
306 return 0;
307 }
308 /* We're not going to resize it, but rebuild the
309 table anyway to purge old dummy entries.
310 Subtle: This is *necessary* if fill==size,
311 as set_lookkey needs at least one virgin slot to
312 terminate failing searches. If fill < size, it's
313 merely desirable, as dummies slow searches. */
314 assert(so->fill > so->used);
315 memcpy(small_copy, oldtable, sizeof(small_copy));
316 oldtable = small_copy;
317 }
318 }
319 else {
320 newtable = PyMem_NEW(setentry, newsize);
321 if (newtable == NULL) {
322 PyErr_NoMemory();
323 return -1;
324 }
325 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000326
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000327 /* Make the set empty, using the new table. */
328 assert(newtable != oldtable);
329 so->table = newtable;
330 so->mask = newsize - 1;
331 memset(newtable, 0, sizeof(setentry) * newsize);
332 so->used = 0;
333 i = so->fill;
334 so->fill = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000335
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000336 /* Copy the data over; this is refcount-neutral for active entries;
337 dummy entries aren't copied over, of course */
338 for (entry = oldtable; i > 0; entry++) {
339 if (entry->key == NULL) {
340 /* UNUSED */
341 ;
342 } else if (entry->key == dummy) {
343 /* DUMMY */
344 --i;
345 assert(entry->key == dummy);
346 Py_DECREF(entry->key);
347 } else {
348 /* ACTIVE */
349 --i;
350 set_insert_clean(so, entry->key, entry->hash);
351 }
352 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000353
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000354 if (is_oldtable_malloced)
355 PyMem_DEL(oldtable);
356 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000357}
358
Raymond Hettingerc991db22005-08-11 07:58:45 +0000359/* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
360
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000361static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000362set_add_entry(register PySetObject *so, setentry *entry)
363{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000364 register Py_ssize_t n_used;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000365
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 assert(so->fill <= so->mask); /* at least one empty slot */
367 n_used = so->used;
368 Py_INCREF(entry->key);
369 if (set_insert_key(so, entry->key, entry->hash) == -1) {
370 Py_DECREF(entry->key);
371 return -1;
372 }
373 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
374 return 0;
375 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Raymond Hettingerc991db22005-08-11 07:58:45 +0000376}
377
378static int
379set_add_key(register PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000380{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000381 register long hash;
382 register Py_ssize_t n_used;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000383
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000384 if (!PyString_CheckExact(key) ||
385 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
386 hash = PyObject_Hash(key);
387 if (hash == -1)
388 return -1;
389 }
390 assert(so->fill <= so->mask); /* at least one empty slot */
391 n_used = so->used;
392 Py_INCREF(key);
393 if (set_insert_key(so, key, hash) == -1) {
394 Py_DECREF(key);
395 return -1;
396 }
397 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
398 return 0;
399 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000400}
401
402#define DISCARD_NOTFOUND 0
403#define DISCARD_FOUND 1
404
405static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000406set_discard_entry(PySetObject *so, setentry *oldentry)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000407{ register setentry *entry;
408 PyObject *old_key;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000409
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000410 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
411 if (entry == NULL)
412 return -1;
413 if (entry->key == NULL || entry->key == dummy)
414 return DISCARD_NOTFOUND;
415 old_key = entry->key;
416 Py_INCREF(dummy);
417 entry->key = dummy;
418 so->used--;
419 Py_DECREF(old_key);
420 return DISCARD_FOUND;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000421}
422
423static int
424set_discard_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000425{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000426 register long hash;
427 register setentry *entry;
428 PyObject *old_key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000429
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000430 assert (PyAnySet_Check(so));
431 if (!PyString_CheckExact(key) ||
432 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
433 hash = PyObject_Hash(key);
434 if (hash == -1)
435 return -1;
436 }
437 entry = (so->lookup)(so, key, hash);
438 if (entry == NULL)
439 return -1;
440 if (entry->key == NULL || entry->key == dummy)
441 return DISCARD_NOTFOUND;
442 old_key = entry->key;
443 Py_INCREF(dummy);
444 entry->key = dummy;
445 so->used--;
446 Py_DECREF(old_key);
447 return DISCARD_FOUND;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000448}
449
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000450static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000451set_clear_internal(PySetObject *so)
452{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000453 setentry *entry, *table;
454 int table_is_malloced;
455 Py_ssize_t fill;
456 setentry small_copy[PySet_MINSIZE];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000457#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000458 Py_ssize_t i, n;
459 assert (PyAnySet_Check(so));
Raymond Hettingera580c472005-08-05 17:19:54 +0000460
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000461 n = so->mask + 1;
462 i = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000463#endif
464
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 table = so->table;
466 assert(table != NULL);
467 table_is_malloced = table != so->smalltable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000468
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 /* This is delicate. During the process of clearing the set,
470 * decrefs can cause the set to mutate. To avoid fatal confusion
471 * (voice of experience), we have to make the set empty before
472 * clearing the slots, and never refer to anything via so->ref while
473 * clearing.
474 */
475 fill = so->fill;
476 if (table_is_malloced)
477 EMPTY_TO_MINSIZE(so);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000478
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000479 else if (fill > 0) {
480 /* It's a small table with something that needs to be cleared.
481 * Afraid the only safe way is to copy the set entries into
482 * another small table first.
483 */
484 memcpy(small_copy, table, sizeof(small_copy));
485 table = small_copy;
486 EMPTY_TO_MINSIZE(so);
487 }
488 /* else it's a small table that's already empty */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000489
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000490 /* Now we can finally clear things. If C had refcounts, we could
491 * assert that the refcount on table is 1 now, i.e. that this function
492 * has unique access to it, so decref side-effects can't alter it.
493 */
494 for (entry = table; fill > 0; ++entry) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000495#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000496 assert(i < n);
497 ++i;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000498#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000499 if (entry->key) {
500 --fill;
501 Py_DECREF(entry->key);
502 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000503#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000504 else
505 assert(entry->key == NULL);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000506#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000507 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000508
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000509 if (table_is_malloced)
510 PyMem_DEL(table);
511 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000512}
513
514/*
515 * Iterate over a set table. Use like so:
516 *
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000517 * Py_ssize_t pos;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000518 * setentry *entry;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000519 * pos = 0; # important! pos should not otherwise be changed by you
Raymond Hettingerc991db22005-08-11 07:58:45 +0000520 * while (set_next(yourset, &pos, &entry)) {
521 * Refer to borrowed reference in entry->key.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000522 * }
523 *
Raymond Hettingerc991db22005-08-11 07:58:45 +0000524 * CAUTION: In general, it isn't safe to use set_next in a loop that
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000525 * mutates the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000526 */
527static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000528set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000529{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 Py_ssize_t i;
531 Py_ssize_t mask;
532 register setentry *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000533
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000534 assert (PyAnySet_Check(so));
535 i = *pos_ptr;
536 assert(i >= 0);
537 table = so->table;
538 mask = so->mask;
539 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
540 i++;
541 *pos_ptr = i+1;
542 if (i > mask)
543 return 0;
544 assert(table[i].key != NULL);
545 *entry_ptr = &table[i];
546 return 1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000547}
548
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000549static void
550set_dealloc(PySetObject *so)
551{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000552 register setentry *entry;
553 Py_ssize_t fill = so->fill;
554 PyObject_GC_UnTrack(so);
555 Py_TRASHCAN_SAFE_BEGIN(so)
556 if (so->weakreflist != NULL)
557 PyObject_ClearWeakRefs((PyObject *) so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000558
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000559 for (entry = so->table; fill > 0; entry++) {
560 if (entry->key) {
561 --fill;
562 Py_DECREF(entry->key);
563 }
564 }
565 if (so->table != so->smalltable)
566 PyMem_DEL(so->table);
567 if (numfree < PySet_MAXFREELIST && PyAnySet_CheckExact(so))
568 free_list[numfree++] = so;
569 else
570 Py_TYPE(so)->tp_free(so);
571 Py_TRASHCAN_SAFE_END(so)
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000572}
573
574static int
575set_tp_print(PySetObject *so, FILE *fp, int flags)
576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 setentry *entry;
578 Py_ssize_t pos=0;
579 char *emit = ""; /* No separator emitted on first pass */
580 char *separator = ", ";
581 int status = Py_ReprEnter((PyObject*)so);
Raymond Hettinger53999102006-12-30 04:01:17 +0000582
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 if (status != 0) {
584 if (status < 0)
585 return status;
586 Py_BEGIN_ALLOW_THREADS
587 fprintf(fp, "%s(...)", so->ob_type->tp_name);
588 Py_END_ALLOW_THREADS
589 return 0;
590 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000591
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 Py_BEGIN_ALLOW_THREADS
593 fprintf(fp, "%s([", so->ob_type->tp_name);
594 Py_END_ALLOW_THREADS
595 while (set_next(so, &pos, &entry)) {
596 Py_BEGIN_ALLOW_THREADS
597 fputs(emit, fp);
598 Py_END_ALLOW_THREADS
599 emit = separator;
600 if (PyObject_Print(entry->key, fp, 0) != 0) {
601 Py_ReprLeave((PyObject*)so);
602 return -1;
603 }
604 }
605 Py_BEGIN_ALLOW_THREADS
606 fputs("])", fp);
607 Py_END_ALLOW_THREADS
608 Py_ReprLeave((PyObject*)so);
609 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000610}
611
612static PyObject *
613set_repr(PySetObject *so)
614{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000615 PyObject *keys, *result=NULL, *listrepr;
616 int status = Py_ReprEnter((PyObject*)so);
Raymond Hettinger53999102006-12-30 04:01:17 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 if (status != 0) {
619 if (status < 0)
620 return NULL;
621 return PyString_FromFormat("%s(...)", so->ob_type->tp_name);
622 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000623
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000624 keys = PySequence_List((PyObject *)so);
625 if (keys == NULL)
626 goto done;
627 listrepr = PyObject_Repr(keys);
628 Py_DECREF(keys);
629 if (listrepr == NULL)
630 goto done;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000631
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000632 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
633 PyString_AS_STRING(listrepr));
634 Py_DECREF(listrepr);
Raymond Hettinger53999102006-12-30 04:01:17 +0000635done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000636 Py_ReprLeave((PyObject*)so);
637 return result;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000638}
639
Martin v. Löwis18e16552006-02-15 17:27:45 +0000640static Py_ssize_t
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000641set_len(PyObject *so)
642{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000643 return ((PySetObject *)so)->used;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000644}
645
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000646static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000647set_merge(PySetObject *so, PyObject *otherset)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000648{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000649 PySetObject *other;
650 register Py_ssize_t i;
651 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000652
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000653 assert (PyAnySet_Check(so));
654 assert (PyAnySet_Check(otherset));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000655
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 other = (PySetObject*)otherset;
657 if (other == so || other->used == 0)
658 /* a.update(a) or a.update({}); nothing to do */
659 return 0;
660 /* Do one big resize at the start, rather than
661 * incrementally resizing as we insert new keys. Expect
662 * that there will be no (or few) overlapping keys.
663 */
664 if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
665 if (set_table_resize(so, (so->used + other->used)*2) != 0)
666 return -1;
667 }
668 for (i = 0; i <= other->mask; i++) {
669 entry = &other->table[i];
670 if (entry->key != NULL &&
671 entry->key != dummy) {
672 Py_INCREF(entry->key);
673 if (set_insert_key(so, entry->key, entry->hash) == -1) {
674 Py_DECREF(entry->key);
675 return -1;
676 }
677 }
678 }
679 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000680}
681
682static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000683set_contains_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000684{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000685 long hash;
686 setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000687
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000688 if (!PyString_CheckExact(key) ||
689 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
690 hash = PyObject_Hash(key);
691 if (hash == -1)
692 return -1;
693 }
694 entry = (so->lookup)(so, key, hash);
695 if (entry == NULL)
696 return -1;
697 key = entry->key;
698 return key != NULL && key != dummy;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000699}
700
Raymond Hettingerc991db22005-08-11 07:58:45 +0000701static int
702set_contains_entry(PySetObject *so, setentry *entry)
703{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 PyObject *key;
705 setentry *lu_entry;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000706
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000707 lu_entry = (so->lookup)(so, entry->key, entry->hash);
708 if (lu_entry == NULL)
709 return -1;
710 key = lu_entry->key;
711 return key != NULL && key != dummy;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000712}
713
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000714static PyObject *
715set_pop(PySetObject *so)
716{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000717 register Py_ssize_t i = 0;
718 register setentry *entry;
719 PyObject *key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000720
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000721 assert (PyAnySet_Check(so));
722 if (so->used == 0) {
723 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
724 return NULL;
725 }
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 /* Set entry to "the first" unused or dummy set entry. We abuse
728 * the hash field of slot 0 to hold a search finger:
729 * If slot 0 has a value, use slot 0.
730 * Else slot 0 is being used to hold a search finger,
731 * and we use its hash value as the first index to look.
732 */
733 entry = &so->table[0];
734 if (entry->key == NULL || entry->key == dummy) {
735 i = entry->hash;
736 /* The hash field may be a real hash value, or it may be a
737 * legit search finger, or it may be a once-legit search
738 * finger that's out of bounds now because it wrapped around
739 * or the table shrunk -- simply make sure it's in bounds now.
740 */
741 if (i > so->mask || i < 1)
742 i = 1; /* skip slot 0 */
743 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
744 i++;
745 if (i > so->mask)
746 i = 1;
747 }
748 }
749 key = entry->key;
750 Py_INCREF(dummy);
751 entry->key = dummy;
752 so->used--;
753 so->table[0].hash = i + 1; /* next place to start */
754 return key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000755}
756
Andrew M. Kuchlingd7b7dde2008-10-03 16:29:19 +0000757PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
758Raises KeyError if the set is empty.");
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000759
760static int
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000761set_traverse(PySetObject *so, visitproc visit, void *arg)
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000762{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000763 Py_ssize_t pos = 0;
764 setentry *entry;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000765
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000766 while (set_next(so, &pos, &entry))
767 Py_VISIT(entry->key);
768 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000769}
770
771static long
772frozenset_hash(PyObject *self)
773{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000774 PySetObject *so = (PySetObject *)self;
775 long h, hash = 1927868237L;
776 setentry *entry;
777 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000778
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000779 if (so->hash != -1)
780 return so->hash;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000781
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000782 hash *= PySet_GET_SIZE(self) + 1;
783 while (set_next(so, &pos, &entry)) {
784 /* Work to increase the bit dispersion for closely spaced hash
785 values. The is important because some use cases have many
786 combinations of a small number of elements with nearby
787 hashes so that many distinct combinations collapse to only
788 a handful of distinct hash values. */
789 h = entry->hash;
790 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
791 }
792 hash = hash * 69069L + 907133923L;
793 if (hash == -1)
794 hash = 590923713L;
795 so->hash = hash;
796 return hash;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000797}
798
Raymond Hettingera9d99362005-08-05 00:01:15 +0000799/***** Set iterator type ***********************************************/
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000800
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000801typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000802 PyObject_HEAD
803 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
804 Py_ssize_t si_used;
805 Py_ssize_t si_pos;
806 Py_ssize_t len;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000807} setiterobject;
808
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000809static void
810setiter_dealloc(setiterobject *si)
811{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000812 Py_XDECREF(si->si_set);
813 PyObject_GC_Del(si);
Antoine Pitrouaa687902009-01-01 14:11:22 +0000814}
815
816static int
817setiter_traverse(setiterobject *si, visitproc visit, void *arg)
818{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000819 Py_VISIT(si->si_set);
820 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000821}
822
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000823static PyObject *
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000824setiter_len(setiterobject *si)
825{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000826 Py_ssize_t len = 0;
827 if (si->si_set != NULL && si->si_used == si->si_set->used)
828 len = si->len;
829 return PyInt_FromLong(len);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000830}
831
Armin Rigof5b3e362006-02-11 21:32:43 +0000832PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000833
834static PyMethodDef setiter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000835 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
836 {NULL, NULL} /* sentinel */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000837};
838
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000839static PyObject *setiter_iternext(setiterobject *si)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000840{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000841 PyObject *key;
842 register Py_ssize_t i, mask;
843 register setentry *entry;
844 PySetObject *so = si->si_set;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000845
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000846 if (so == NULL)
847 return NULL;
848 assert (PyAnySet_Check(so));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000849
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000850 if (si->si_used != so->used) {
851 PyErr_SetString(PyExc_RuntimeError,
852 "Set changed size during iteration");
853 si->si_used = -1; /* Make this state sticky */
854 return NULL;
855 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000856
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 i = si->si_pos;
858 assert(i>=0);
859 entry = so->table;
860 mask = so->mask;
861 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
862 i++;
863 si->si_pos = i+1;
864 if (i > mask)
865 goto fail;
866 si->len--;
867 key = entry[i].key;
868 Py_INCREF(key);
869 return key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000870
871fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000872 Py_DECREF(so);
873 si->si_set = NULL;
874 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000875}
876
Hye-Shik Change2956762005-08-01 05:26:41 +0000877static PyTypeObject PySetIter_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000878 PyVarObject_HEAD_INIT(&PyType_Type, 0)
879 "setiterator", /* tp_name */
880 sizeof(setiterobject), /* tp_basicsize */
881 0, /* tp_itemsize */
882 /* methods */
883 (destructor)setiter_dealloc, /* tp_dealloc */
884 0, /* tp_print */
885 0, /* tp_getattr */
886 0, /* tp_setattr */
887 0, /* tp_compare */
888 0, /* tp_repr */
889 0, /* tp_as_number */
890 0, /* tp_as_sequence */
891 0, /* tp_as_mapping */
892 0, /* tp_hash */
893 0, /* tp_call */
894 0, /* tp_str */
895 PyObject_GenericGetAttr, /* tp_getattro */
896 0, /* tp_setattro */
897 0, /* tp_as_buffer */
898 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
899 0, /* tp_doc */
900 (traverseproc)setiter_traverse, /* tp_traverse */
901 0, /* tp_clear */
902 0, /* tp_richcompare */
903 0, /* tp_weaklistoffset */
904 PyObject_SelfIter, /* tp_iter */
905 (iternextfunc)setiter_iternext, /* tp_iternext */
906 setiter_methods, /* tp_methods */
907 0,
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000908};
909
Martin v. Löwis72d20672006-04-11 09:04:12 +0000910static PyObject *
911set_iter(PySetObject *so)
912{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000913 setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
914 if (si == NULL)
915 return NULL;
916 Py_INCREF(so);
917 si->si_set = so;
918 si->si_used = so->used;
919 si->si_pos = 0;
920 si->len = so->used;
921 _PyObject_GC_TRACK(si);
922 return (PyObject *)si;
Martin v. Löwis72d20672006-04-11 09:04:12 +0000923}
924
Raymond Hettingerd7946662005-08-01 21:39:29 +0000925static int
Raymond Hettingerd7946662005-08-01 21:39:29 +0000926set_update_internal(PySetObject *so, PyObject *other)
Raymond Hettingera690a992003-11-16 16:17:49 +0000927{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 PyObject *key, *it;
Raymond Hettingera690a992003-11-16 16:17:49 +0000929
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000930 if (PyAnySet_Check(other))
931 return set_merge(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +0000932
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000933 if (PyDict_CheckExact(other)) {
934 PyObject *value;
935 Py_ssize_t pos = 0;
936 long hash;
937 Py_ssize_t dictsize = PyDict_Size(other);
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000938
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000939 /* Do one big resize at the start, rather than
940 * incrementally resizing as we insert new keys. Expect
941 * that there will be no (or few) overlapping keys.
942 */
943 if (dictsize == -1)
944 return -1;
945 if ((so->fill + dictsize)*3 >= (so->mask+1)*2) {
946 if (set_table_resize(so, (so->used + dictsize)*2) != 0)
947 return -1;
948 }
949 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
950 setentry an_entry;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000951
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000952 an_entry.hash = hash;
953 an_entry.key = key;
954 if (set_add_entry(so, &an_entry) == -1)
955 return -1;
956 }
957 return 0;
958 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000959
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000960 it = PyObject_GetIter(other);
961 if (it == NULL)
962 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000963
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000964 while ((key = PyIter_Next(it)) != NULL) {
965 if (set_add_key(so, key) == -1) {
966 Py_DECREF(it);
967 Py_DECREF(key);
968 return -1;
969 }
970 Py_DECREF(key);
971 }
972 Py_DECREF(it);
973 if (PyErr_Occurred())
974 return -1;
975 return 0;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000976}
977
978static PyObject *
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000979set_update(PySetObject *so, PyObject *args)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000980{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000981 Py_ssize_t i;
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000982
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000983 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
984 PyObject *other = PyTuple_GET_ITEM(args, i);
985 if (set_update_internal(so, other) == -1)
986 return NULL;
987 }
988 Py_RETURN_NONE;
Raymond Hettingera38123e2003-11-24 22:18:49 +0000989}
990
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000991PyDoc_STRVAR(update_doc,
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000992"Update a set with the union of itself and others.");
Raymond Hettingera38123e2003-11-24 22:18:49 +0000993
994static PyObject *
995make_new_set(PyTypeObject *type, PyObject *iterable)
996{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000997 register PySetObject *so = NULL;
Raymond Hettingera38123e2003-11-24 22:18:49 +0000998
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000999 if (dummy == NULL) { /* Auto-initialize dummy */
1000 dummy = PyString_FromString("<dummy key>");
1001 if (dummy == NULL)
1002 return NULL;
1003 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001004
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001005 /* create PySetObject structure */
1006 if (numfree &&
1007 (type == &PySet_Type || type == &PyFrozenSet_Type)) {
1008 so = free_list[--numfree];
1009 assert (so != NULL && PyAnySet_CheckExact(so));
1010 Py_TYPE(so) = type;
1011 _Py_NewReference((PyObject *)so);
1012 EMPTY_TO_MINSIZE(so);
1013 PyObject_GC_Track(so);
1014 } else {
1015 so = (PySetObject *)type->tp_alloc(type, 0);
1016 if (so == NULL)
1017 return NULL;
1018 /* tp_alloc has already zeroed the structure */
1019 assert(so->table == NULL && so->fill == 0 && so->used == 0);
1020 INIT_NONZERO_SET_SLOTS(so);
1021 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001022
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001023 so->lookup = set_lookkey_string;
1024 so->weakreflist = NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001025
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001026 if (iterable != NULL) {
1027 if (set_update_internal(so, iterable) == -1) {
1028 Py_DECREF(so);
1029 return NULL;
1030 }
1031 }
Raymond Hettingera38123e2003-11-24 22:18:49 +00001032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001033 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001034}
1035
Raymond Hettingerd7946662005-08-01 21:39:29 +00001036/* The empty frozenset is a singleton */
1037static PyObject *emptyfrozenset = NULL;
1038
Raymond Hettingera690a992003-11-16 16:17:49 +00001039static PyObject *
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001040frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Raymond Hettingera690a992003-11-16 16:17:49 +00001041{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001042 PyObject *iterable = NULL, *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001044 if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds))
1045 return NULL;
Georg Brandl02c42872005-08-26 06:42:30 +00001046
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001047 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
1048 return NULL;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001049
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001050 if (type != &PyFrozenSet_Type)
1051 return make_new_set(type, iterable);
Raymond Hettingerd7946662005-08-01 21:39:29 +00001052
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001053 if (iterable != NULL) {
1054 /* frozenset(f) is idempotent */
1055 if (PyFrozenSet_CheckExact(iterable)) {
1056 Py_INCREF(iterable);
1057 return iterable;
1058 }
1059 result = make_new_set(type, iterable);
1060 if (result == NULL || PySet_GET_SIZE(result))
1061 return result;
1062 Py_DECREF(result);
1063 }
1064 /* The empty frozenset is a singleton */
1065 if (emptyfrozenset == NULL)
1066 emptyfrozenset = make_new_set(type, NULL);
1067 Py_XINCREF(emptyfrozenset);
1068 return emptyfrozenset;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001069}
1070
1071void
1072PySet_Fini(void)
1073{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001074 PySetObject *so;
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001075
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001076 while (numfree) {
1077 numfree--;
1078 so = free_list[numfree];
1079 PyObject_GC_Del(so);
1080 }
1081 Py_CLEAR(dummy);
1082 Py_CLEAR(emptyfrozenset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001083}
1084
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001085static PyObject *
1086set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1087{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001088 if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds))
1089 return NULL;
1090
1091 return make_new_set(type, NULL);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001092}
1093
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001094/* set_swap_bodies() switches the contents of any two sets by moving their
1095 internal data pointers and, if needed, copying the internal smalltables.
1096 Semantically equivalent to:
1097
1098 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
1099
1100 The function always succeeds and it leaves both objects in a stable state.
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001101 Useful for creating temporary frozensets from sets for membership testing
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001102 in __contains__(), discard(), and remove(). Also useful for operations
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001103 that update in-place (by allowing an intermediate result to be swapped
Raymond Hettinger9dcb17c2005-07-31 13:09:28 +00001104 into one of the original inputs).
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001105*/
1106
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001107static void
1108set_swap_bodies(PySetObject *a, PySetObject *b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001109{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001110 Py_ssize_t t;
1111 setentry *u;
1112 setentry *(*f)(PySetObject *so, PyObject *key, long hash);
1113 setentry tab[PySet_MINSIZE];
1114 long h;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001116 t = a->fill; a->fill = b->fill; b->fill = t;
1117 t = a->used; a->used = b->used; b->used = t;
1118 t = a->mask; a->mask = b->mask; b->mask = t;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001119
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001120 u = a->table;
1121 if (a->table == a->smalltable)
1122 u = b->smalltable;
1123 a->table = b->table;
1124 if (b->table == b->smalltable)
1125 a->table = a->smalltable;
1126 b->table = u;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001127
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001128 f = a->lookup; a->lookup = b->lookup; b->lookup = f;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001130 if (a->table == a->smalltable || b->table == b->smalltable) {
1131 memcpy(tab, a->smalltable, sizeof(tab));
1132 memcpy(a->smalltable, b->smalltable, sizeof(tab));
1133 memcpy(b->smalltable, tab, sizeof(tab));
1134 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001135
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001136 if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) &&
1137 PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) {
1138 h = a->hash; a->hash = b->hash; b->hash = h;
1139 } else {
1140 a->hash = -1;
1141 b->hash = -1;
1142 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001143}
1144
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001145static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001146set_copy(PySetObject *so)
1147{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001148 return make_new_set(Py_TYPE(so), (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001149}
1150
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001151static PyObject *
1152frozenset_copy(PySetObject *so)
1153{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001154 if (PyFrozenSet_CheckExact(so)) {
1155 Py_INCREF(so);
1156 return (PyObject *)so;
1157 }
1158 return set_copy(so);
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001159}
1160
Raymond Hettingera690a992003-11-16 16:17:49 +00001161PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
1162
1163static PyObject *
Raymond Hettingerc991db22005-08-11 07:58:45 +00001164set_clear(PySetObject *so)
1165{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001166 set_clear_internal(so);
1167 Py_RETURN_NONE;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001168}
1169
1170PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
1171
1172static PyObject *
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001173set_union(PySetObject *so, PyObject *args)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001174{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001175 PySetObject *result;
1176 PyObject *other;
1177 Py_ssize_t i;
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001178
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001179 result = (PySetObject *)set_copy(so);
1180 if (result == NULL)
1181 return NULL;
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001182
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001183 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1184 other = PyTuple_GET_ITEM(args, i);
1185 if ((PyObject *)so == other)
1186 continue;
1187 if (set_update_internal(result, other) == -1) {
1188 Py_DECREF(result);
1189 return NULL;
1190 }
1191 }
1192 return (PyObject *)result;
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001193}
1194
1195PyDoc_STRVAR(union_doc,
1196 "Return the union of sets as a new set.\n\
1197\n\
1198(i.e. all elements that are in either set.)");
1199
1200static PyObject *
1201set_or(PySetObject *so, PyObject *other)
1202{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001203 PySetObject *result;
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001204
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001205 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1206 Py_INCREF(Py_NotImplemented);
1207 return Py_NotImplemented;
1208 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001209
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001210 result = (PySetObject *)set_copy(so);
1211 if (result == NULL)
1212 return NULL;
1213 if ((PyObject *)so == other)
1214 return (PyObject *)result;
1215 if (set_update_internal(result, other) == -1) {
1216 Py_DECREF(result);
1217 return NULL;
1218 }
1219 return (PyObject *)result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001220}
1221
Raymond Hettingera690a992003-11-16 16:17:49 +00001222static PyObject *
1223set_ior(PySetObject *so, PyObject *other)
1224{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001225 if (!PyAnySet_Check(other)) {
1226 Py_INCREF(Py_NotImplemented);
1227 return Py_NotImplemented;
1228 }
1229 if (set_update_internal(so, other) == -1)
1230 return NULL;
1231 Py_INCREF(so);
1232 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001233}
1234
1235static PyObject *
1236set_intersection(PySetObject *so, PyObject *other)
1237{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001238 PySetObject *result;
1239 PyObject *key, *it, *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001240
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001241 if ((PyObject *)so == other)
1242 return set_copy(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001243
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001244 result = (PySetObject *)make_new_set(Py_TYPE(so), NULL);
1245 if (result == NULL)
1246 return NULL;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001247
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001248 if (PyAnySet_Check(other)) {
1249 Py_ssize_t pos = 0;
1250 setentry *entry;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001251
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001252 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1253 tmp = (PyObject *)so;
1254 so = (PySetObject *)other;
1255 other = tmp;
1256 }
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001257
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001258 while (set_next((PySetObject *)other, &pos, &entry)) {
1259 int rv = set_contains_entry(so, entry);
1260 if (rv == -1) {
1261 Py_DECREF(result);
1262 return NULL;
1263 }
1264 if (rv) {
1265 if (set_add_entry(result, entry) == -1) {
1266 Py_DECREF(result);
1267 return NULL;
1268 }
1269 }
1270 }
1271 return (PyObject *)result;
1272 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001273
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001274 it = PyObject_GetIter(other);
1275 if (it == NULL) {
1276 Py_DECREF(result);
1277 return NULL;
1278 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001279
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001280 while ((key = PyIter_Next(it)) != NULL) {
1281 int rv;
1282 setentry entry;
1283 long hash = PyObject_Hash(key);
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001284
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001285 if (hash == -1) {
1286 Py_DECREF(it);
1287 Py_DECREF(result);
1288 Py_DECREF(key);
1289 return NULL;
1290 }
1291 entry.hash = hash;
1292 entry.key = key;
1293 rv = set_contains_entry(so, &entry);
1294 if (rv == -1) {
1295 Py_DECREF(it);
1296 Py_DECREF(result);
1297 Py_DECREF(key);
1298 return NULL;
1299 }
1300 if (rv) {
1301 if (set_add_entry(result, &entry) == -1) {
1302 Py_DECREF(it);
1303 Py_DECREF(result);
1304 Py_DECREF(key);
1305 return NULL;
1306 }
1307 }
1308 Py_DECREF(key);
1309 }
1310 Py_DECREF(it);
1311 if (PyErr_Occurred()) {
1312 Py_DECREF(result);
1313 return NULL;
1314 }
1315 return (PyObject *)result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001316}
1317
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001318static PyObject *
1319set_intersection_multi(PySetObject *so, PyObject *args)
1320{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001321 Py_ssize_t i;
1322 PyObject *result = (PyObject *)so;
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001324 if (PyTuple_GET_SIZE(args) == 0)
1325 return set_copy(so);
Raymond Hettinger610a93e2008-06-11 00:44:47 +00001326
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001327 Py_INCREF(so);
1328 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1329 PyObject *other = PyTuple_GET_ITEM(args, i);
1330 PyObject *newresult = set_intersection((PySetObject *)result, other);
1331 if (newresult == NULL) {
1332 Py_DECREF(result);
1333 return NULL;
1334 }
1335 Py_DECREF(result);
1336 result = newresult;
1337 }
1338 return result;
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001339}
1340
Raymond Hettingera690a992003-11-16 16:17:49 +00001341PyDoc_STRVAR(intersection_doc,
Raymond Hettinger79628d32009-11-18 20:28:22 +00001342"Return the intersection of two or more sets as a new set.\n\
Raymond Hettingera690a992003-11-16 16:17:49 +00001343\n\
Raymond Hettinger79628d32009-11-18 20:28:22 +00001344(i.e. elements that are common to all of the sets.)");
Raymond Hettingera690a992003-11-16 16:17:49 +00001345
1346static PyObject *
1347set_intersection_update(PySetObject *so, PyObject *other)
1348{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001349 PyObject *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001350
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001351 tmp = set_intersection(so, other);
1352 if (tmp == NULL)
1353 return NULL;
1354 set_swap_bodies(so, (PySetObject *)tmp);
1355 Py_DECREF(tmp);
1356 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001357}
1358
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001359static PyObject *
1360set_intersection_update_multi(PySetObject *so, PyObject *args)
1361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001362 PyObject *tmp;
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001364 tmp = set_intersection_multi(so, args);
1365 if (tmp == NULL)
1366 return NULL;
1367 set_swap_bodies(so, (PySetObject *)tmp);
1368 Py_DECREF(tmp);
1369 Py_RETURN_NONE;
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001370}
1371
Raymond Hettingera690a992003-11-16 16:17:49 +00001372PyDoc_STRVAR(intersection_update_doc,
1373"Update a set with the intersection of itself and another.");
1374
1375static PyObject *
1376set_and(PySetObject *so, PyObject *other)
1377{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001378 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1379 Py_INCREF(Py_NotImplemented);
1380 return Py_NotImplemented;
1381 }
1382 return set_intersection(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001383}
1384
1385static PyObject *
1386set_iand(PySetObject *so, PyObject *other)
1387{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001388 PyObject *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001389
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001390 if (!PyAnySet_Check(other)) {
1391 Py_INCREF(Py_NotImplemented);
1392 return Py_NotImplemented;
1393 }
1394 result = set_intersection_update(so, other);
1395 if (result == NULL)
1396 return NULL;
1397 Py_DECREF(result);
1398 Py_INCREF(so);
1399 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001400}
1401
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001402static PyObject *
1403set_isdisjoint(PySetObject *so, PyObject *other)
1404{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001405 PyObject *key, *it, *tmp;
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001407 if ((PyObject *)so == other) {
1408 if (PySet_GET_SIZE(so) == 0)
1409 Py_RETURN_TRUE;
1410 else
1411 Py_RETURN_FALSE;
1412 }
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001414 if (PyAnySet_CheckExact(other)) {
1415 Py_ssize_t pos = 0;
1416 setentry *entry;
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001417
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001418 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1419 tmp = (PyObject *)so;
1420 so = (PySetObject *)other;
1421 other = tmp;
1422 }
1423 while (set_next((PySetObject *)other, &pos, &entry)) {
1424 int rv = set_contains_entry(so, entry);
1425 if (rv == -1)
1426 return NULL;
1427 if (rv)
1428 Py_RETURN_FALSE;
1429 }
1430 Py_RETURN_TRUE;
1431 }
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001432
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001433 it = PyObject_GetIter(other);
1434 if (it == NULL)
1435 return NULL;
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001436
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001437 while ((key = PyIter_Next(it)) != NULL) {
1438 int rv;
1439 setentry entry;
1440 long hash = PyObject_Hash(key);
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001441
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001442 if (hash == -1) {
1443 Py_DECREF(key);
1444 Py_DECREF(it);
1445 return NULL;
1446 }
1447 entry.hash = hash;
1448 entry.key = key;
1449 rv = set_contains_entry(so, &entry);
1450 Py_DECREF(key);
1451 if (rv == -1) {
1452 Py_DECREF(it);
1453 return NULL;
1454 }
1455 if (rv) {
1456 Py_DECREF(it);
1457 Py_RETURN_FALSE;
1458 }
1459 }
1460 Py_DECREF(it);
1461 if (PyErr_Occurred())
1462 return NULL;
1463 Py_RETURN_TRUE;
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001464}
1465
1466PyDoc_STRVAR(isdisjoint_doc,
1467"Return True if two sets have a null intersection.");
1468
Neal Norwitz6576bd82005-11-13 18:41:28 +00001469static int
Raymond Hettingerc991db22005-08-11 07:58:45 +00001470set_difference_update_internal(PySetObject *so, PyObject *other)
1471{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001472 if ((PyObject *)so == other)
1473 return set_clear_internal(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001475 if (PyAnySet_Check(other)) {
1476 setentry *entry;
1477 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001479 while (set_next((PySetObject *)other, &pos, &entry))
1480 if (set_discard_entry(so, entry) == -1)
1481 return -1;
1482 } else {
1483 PyObject *key, *it;
1484 it = PyObject_GetIter(other);
1485 if (it == NULL)
1486 return -1;
1487
1488 while ((key = PyIter_Next(it)) != NULL) {
1489 if (set_discard_key(so, key) == -1) {
1490 Py_DECREF(it);
1491 Py_DECREF(key);
1492 return -1;
1493 }
1494 Py_DECREF(key);
1495 }
1496 Py_DECREF(it);
1497 if (PyErr_Occurred())
1498 return -1;
1499 }
1500 /* If more than 1/5 are dummies, then resize them away. */
1501 if ((so->fill - so->used) * 5 < so->mask)
1502 return 0;
1503 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001504}
1505
Raymond Hettingera690a992003-11-16 16:17:49 +00001506static PyObject *
Raymond Hettinger4267be62008-06-11 10:30:54 +00001507set_difference_update(PySetObject *so, PyObject *args)
Raymond Hettingera690a992003-11-16 16:17:49 +00001508{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001509 Py_ssize_t i;
Raymond Hettinger4267be62008-06-11 10:30:54 +00001510
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001511 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1512 PyObject *other = PyTuple_GET_ITEM(args, i);
1513 if (set_difference_update_internal(so, other) == -1)
1514 return NULL;
1515 }
1516 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001517}
1518
1519PyDoc_STRVAR(difference_update_doc,
1520"Remove all elements of another set from this set.");
1521
1522static PyObject *
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001523set_difference(PySetObject *so, PyObject *other)
1524{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001525 PyObject *result;
1526 setentry *entry;
1527 Py_ssize_t pos = 0;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001528
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001529 if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) {
1530 result = set_copy(so);
1531 if (result == NULL)
1532 return NULL;
1533 if (set_difference_update_internal((PySetObject *)result, other) != -1)
1534 return result;
1535 Py_DECREF(result);
1536 return NULL;
1537 }
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001538
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001539 result = make_new_set(Py_TYPE(so), NULL);
1540 if (result == NULL)
1541 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001542
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001543 if (PyDict_CheckExact(other)) {
1544 while (set_next(so, &pos, &entry)) {
1545 setentry entrycopy;
1546 entrycopy.hash = entry->hash;
1547 entrycopy.key = entry->key;
1548 if (!_PyDict_Contains(other, entry->key, entry->hash)) {
1549 if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
1550 Py_DECREF(result);
1551 return NULL;
1552 }
1553 }
1554 }
1555 return result;
1556 }
1557
1558 while (set_next(so, &pos, &entry)) {
1559 int rv = set_contains_entry((PySetObject *)other, entry);
1560 if (rv == -1) {
1561 Py_DECREF(result);
1562 return NULL;
1563 }
1564 if (!rv) {
1565 if (set_add_entry((PySetObject *)result, entry) == -1) {
1566 Py_DECREF(result);
1567 return NULL;
1568 }
1569 }
1570 }
1571 return result;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001572}
1573
Raymond Hettinger4267be62008-06-11 10:30:54 +00001574static PyObject *
1575set_difference_multi(PySetObject *so, PyObject *args)
1576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001577 Py_ssize_t i;
1578 PyObject *result, *other;
Raymond Hettinger4267be62008-06-11 10:30:54 +00001579
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001580 if (PyTuple_GET_SIZE(args) == 0)
1581 return set_copy(so);
Raymond Hettinger4267be62008-06-11 10:30:54 +00001582
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001583 other = PyTuple_GET_ITEM(args, 0);
1584 result = set_difference(so, other);
1585 if (result == NULL)
1586 return NULL;
Raymond Hettinger4267be62008-06-11 10:30:54 +00001587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 for (i=1 ; i<PyTuple_GET_SIZE(args) ; i++) {
1589 other = PyTuple_GET_ITEM(args, i);
1590 if (set_difference_update_internal((PySetObject *)result, other) == -1) {
1591 Py_DECREF(result);
1592 return NULL;
1593 }
1594 }
1595 return result;
Raymond Hettinger4267be62008-06-11 10:30:54 +00001596}
1597
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001598PyDoc_STRVAR(difference_doc,
Raymond Hettinger4267be62008-06-11 10:30:54 +00001599"Return the difference of two or more sets as a new set.\n\
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001600\n\
Raymond Hettinger4267be62008-06-11 10:30:54 +00001601(i.e. all elements that are in this set but not the others.)");
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001602static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001603set_sub(PySetObject *so, PyObject *other)
1604{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001605 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1606 Py_INCREF(Py_NotImplemented);
1607 return Py_NotImplemented;
1608 }
1609 return set_difference(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001610}
1611
1612static PyObject *
1613set_isub(PySetObject *so, PyObject *other)
1614{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001615 if (!PyAnySet_Check(other)) {
1616 Py_INCREF(Py_NotImplemented);
1617 return Py_NotImplemented;
1618 }
1619 if (set_difference_update_internal(so, other) == -1)
1620 return NULL;
1621 Py_INCREF(so);
1622 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001623}
1624
1625static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001626set_symmetric_difference_update(PySetObject *so, PyObject *other)
1627{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001628 PySetObject *otherset;
1629 PyObject *key;
1630 Py_ssize_t pos = 0;
1631 setentry *entry;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001632
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001633 if ((PyObject *)so == other)
1634 return set_clear(so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001635
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001636 if (PyDict_CheckExact(other)) {
1637 PyObject *value;
1638 int rv;
1639 long hash;
1640 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
1641 setentry an_entry;
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001642
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001643 an_entry.hash = hash;
1644 an_entry.key = key;
1645 rv = set_discard_entry(so, &an_entry);
1646 if (rv == -1)
1647 return NULL;
1648 if (rv == DISCARD_NOTFOUND) {
1649 if (set_add_entry(so, &an_entry) == -1)
1650 return NULL;
1651 }
1652 }
1653 Py_RETURN_NONE;
1654 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 if (PyAnySet_Check(other)) {
1657 Py_INCREF(other);
1658 otherset = (PySetObject *)other;
1659 } else {
1660 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
1661 if (otherset == NULL)
1662 return NULL;
1663 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001664
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001665 while (set_next(otherset, &pos, &entry)) {
1666 int rv = set_discard_entry(so, entry);
1667 if (rv == -1) {
1668 Py_DECREF(otherset);
1669 return NULL;
1670 }
1671 if (rv == DISCARD_NOTFOUND) {
1672 if (set_add_entry(so, entry) == -1) {
1673 Py_DECREF(otherset);
1674 return NULL;
1675 }
1676 }
1677 }
1678 Py_DECREF(otherset);
1679 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001680}
1681
1682PyDoc_STRVAR(symmetric_difference_update_doc,
1683"Update a set with the symmetric difference of itself and another.");
1684
1685static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001686set_symmetric_difference(PySetObject *so, PyObject *other)
1687{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001688 PyObject *rv;
1689 PySetObject *otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001690
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001691 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
1692 if (otherset == NULL)
1693 return NULL;
1694 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1695 if (rv == NULL)
1696 return NULL;
1697 Py_DECREF(rv);
1698 return (PyObject *)otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001699}
1700
1701PyDoc_STRVAR(symmetric_difference_doc,
1702"Return the symmetric difference of two sets as a new set.\n\
1703\n\
1704(i.e. all elements that are in exactly one of the sets.)");
1705
1706static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001707set_xor(PySetObject *so, PyObject *other)
1708{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001709 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1710 Py_INCREF(Py_NotImplemented);
1711 return Py_NotImplemented;
1712 }
1713 return set_symmetric_difference(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001714}
1715
1716static PyObject *
1717set_ixor(PySetObject *so, PyObject *other)
1718{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001719 PyObject *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001720
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001721 if (!PyAnySet_Check(other)) {
1722 Py_INCREF(Py_NotImplemented);
1723 return Py_NotImplemented;
1724 }
1725 result = set_symmetric_difference_update(so, other);
1726 if (result == NULL)
1727 return NULL;
1728 Py_DECREF(result);
1729 Py_INCREF(so);
1730 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001731}
1732
1733static PyObject *
1734set_issubset(PySetObject *so, PyObject *other)
1735{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001736 setentry *entry;
1737 Py_ssize_t pos = 0;
Raymond Hettingera690a992003-11-16 16:17:49 +00001738
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001739 if (!PyAnySet_Check(other)) {
1740 PyObject *tmp, *result;
1741 tmp = make_new_set(&PySet_Type, other);
1742 if (tmp == NULL)
1743 return NULL;
1744 result = set_issubset(so, tmp);
1745 Py_DECREF(tmp);
1746 return result;
1747 }
1748 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
1749 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001750
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001751 while (set_next(so, &pos, &entry)) {
1752 int rv = set_contains_entry((PySetObject *)other, entry);
1753 if (rv == -1)
1754 return NULL;
1755 if (!rv)
1756 Py_RETURN_FALSE;
1757 }
1758 Py_RETURN_TRUE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001759}
1760
1761PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
1762
1763static PyObject *
1764set_issuperset(PySetObject *so, PyObject *other)
1765{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001766 PyObject *tmp, *result;
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001767
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001768 if (!PyAnySet_Check(other)) {
1769 tmp = make_new_set(&PySet_Type, other);
1770 if (tmp == NULL)
1771 return NULL;
1772 result = set_issuperset(so, tmp);
1773 Py_DECREF(tmp);
1774 return result;
1775 }
1776 return set_issubset((PySetObject *)other, (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001777}
1778
1779PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
1780
Raymond Hettingera690a992003-11-16 16:17:49 +00001781static PyObject *
1782set_richcompare(PySetObject *v, PyObject *w, int op)
1783{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001784 PyObject *r1, *r2;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001785
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001786 if(!PyAnySet_Check(w)) {
1787 if (op == Py_EQ)
1788 Py_RETURN_FALSE;
1789 if (op == Py_NE)
1790 Py_RETURN_TRUE;
1791 PyErr_SetString(PyExc_TypeError, "can only compare to a set");
1792 return NULL;
1793 }
1794 switch (op) {
1795 case Py_EQ:
1796 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
1797 Py_RETURN_FALSE;
1798 if (v->hash != -1 &&
1799 ((PySetObject *)w)->hash != -1 &&
1800 v->hash != ((PySetObject *)w)->hash)
1801 Py_RETURN_FALSE;
1802 return set_issubset(v, w);
1803 case Py_NE:
1804 r1 = set_richcompare(v, w, Py_EQ);
1805 if (r1 == NULL)
1806 return NULL;
1807 r2 = PyBool_FromLong(PyObject_Not(r1));
1808 Py_DECREF(r1);
1809 return r2;
1810 case Py_LE:
1811 return set_issubset(v, w);
1812 case Py_GE:
1813 return set_issuperset(v, w);
1814 case Py_LT:
1815 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
1816 Py_RETURN_FALSE;
1817 return set_issubset(v, w);
1818 case Py_GT:
1819 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
1820 Py_RETURN_FALSE;
1821 return set_issuperset(v, w);
1822 }
1823 Py_INCREF(Py_NotImplemented);
1824 return Py_NotImplemented;
Raymond Hettingera690a992003-11-16 16:17:49 +00001825}
1826
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001827static int
Georg Brandl347b3002006-03-30 11:57:00 +00001828set_nocmp(PyObject *self, PyObject *other)
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001829{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001830 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
1831 return -1;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001832}
1833
Raymond Hettingera690a992003-11-16 16:17:49 +00001834static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001835set_add(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001836{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001837 if (set_add_key(so, key) == -1)
1838 return NULL;
1839 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001840}
1841
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001842PyDoc_STRVAR(add_doc,
Raymond Hettingera690a992003-11-16 16:17:49 +00001843"Add an element to a set.\n\
1844\n\
1845This has no effect if the element is already present.");
1846
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001847static int
1848set_contains(PySetObject *so, PyObject *key)
1849{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001850 PyObject *tmpkey;
1851 int rv;
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001852
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001853 rv = set_contains_key(so, key);
1854 if (rv == -1) {
1855 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1856 return -1;
1857 PyErr_Clear();
1858 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1859 if (tmpkey == NULL)
1860 return -1;
1861 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1862 rv = set_contains(so, tmpkey);
1863 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1864 Py_DECREF(tmpkey);
1865 }
1866 return rv;
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001867}
1868
1869static PyObject *
1870set_direct_contains(PySetObject *so, PyObject *key)
1871{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001872 long result;
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001873
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001874 result = set_contains(so, key);
1875 if (result == -1)
1876 return NULL;
1877 return PyBool_FromLong(result);
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001878}
1879
1880PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
1881
Raymond Hettingera690a992003-11-16 16:17:49 +00001882static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001883set_remove(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001884{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001885 PyObject *tmpkey;
1886 int rv;
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001887
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001888 rv = set_discard_key(so, key);
1889 if (rv == -1) {
1890 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1891 return NULL;
1892 PyErr_Clear();
1893 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1894 if (tmpkey == NULL)
1895 return NULL;
1896 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1897 rv = set_discard_key(so, tmpkey);
1898 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1899 Py_DECREF(tmpkey);
1900 if (rv == -1)
1901 return NULL;
1902 }
Amaury Forgeot d'Arcd78b9dc2008-10-07 20:32:10 +00001903
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001904 if (rv == DISCARD_NOTFOUND) {
1905 set_key_error(key);
1906 return NULL;
1907 }
1908 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001909}
1910
1911PyDoc_STRVAR(remove_doc,
1912"Remove an element from a set; it must be a member.\n\
1913\n\
1914If the element is not a member, raise a KeyError.");
1915
1916static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001917set_discard(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001918{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001919 PyObject *tmpkey, *result;
1920 int rv;
Raymond Hettinger0deab622003-12-13 18:53:18 +00001921
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001922 rv = set_discard_key(so, key);
1923 if (rv == -1) {
1924 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1925 return NULL;
1926 PyErr_Clear();
1927 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1928 if (tmpkey == NULL)
1929 return NULL;
1930 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1931 result = set_discard(so, tmpkey);
1932 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1933 Py_DECREF(tmpkey);
1934 return result;
1935 }
1936 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001937}
1938
1939PyDoc_STRVAR(discard_doc,
1940"Remove an element from a set if it is a member.\n\
1941\n\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001942If the element is not a member, do nothing.");
Raymond Hettingera690a992003-11-16 16:17:49 +00001943
1944static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001945set_reduce(PySetObject *so)
1946{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001947 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001948
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001949 keys = PySequence_List((PyObject *)so);
1950 if (keys == NULL)
1951 goto done;
1952 args = PyTuple_Pack(1, keys);
1953 if (args == NULL)
1954 goto done;
1955 dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
1956 if (dict == NULL) {
1957 PyErr_Clear();
1958 dict = Py_None;
1959 Py_INCREF(dict);
1960 }
1961 result = PyTuple_Pack(3, Py_TYPE(so), args, dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001962done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001963 Py_XDECREF(args);
1964 Py_XDECREF(keys);
1965 Py_XDECREF(dict);
1966 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001967}
1968
1969PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1970
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00001971static PyObject *
1972set_sizeof(PySetObject *so)
1973{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001974 Py_ssize_t res;
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00001975
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001976 res = sizeof(PySetObject);
1977 if (so->table != so->smalltable)
1978 res = res + (so->mask + 1) * sizeof(setentry);
1979 return PyInt_FromSsize_t(res);
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00001980}
1981
1982PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes");
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001983static int
1984set_init(PySetObject *self, PyObject *args, PyObject *kwds)
1985{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001986 PyObject *iterable = NULL;
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001987
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001988 if (!PyAnySet_Check(self))
1989 return -1;
1990 if (PySet_Check(self) && !_PyArg_NoKeywords("set()", kwds))
1991 return -1;
1992 if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable))
1993 return -1;
1994 set_clear_internal(self);
1995 self->hash = -1;
1996 if (iterable == NULL)
1997 return 0;
1998 return set_update_internal(self, iterable);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001999}
2000
Raymond Hettingera690a992003-11-16 16:17:49 +00002001static PySequenceMethods set_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002002 set_len, /* sq_length */
2003 0, /* sq_concat */
2004 0, /* sq_repeat */
2005 0, /* sq_item */
2006 0, /* sq_slice */
2007 0, /* sq_ass_item */
2008 0, /* sq_ass_slice */
2009 (objobjproc)set_contains, /* sq_contains */
Raymond Hettingera690a992003-11-16 16:17:49 +00002010};
2011
2012/* set object ********************************************************/
2013
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002014#ifdef Py_DEBUG
2015static PyObject *test_c_api(PySetObject *so);
2016
2017PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
2018All is well if assertions don't fail.");
2019#endif
2020
Raymond Hettingera690a992003-11-16 16:17:49 +00002021static PyMethodDef set_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002022 {"add", (PyCFunction)set_add, METH_O,
2023 add_doc},
2024 {"clear", (PyCFunction)set_clear, METH_NOARGS,
2025 clear_doc},
2026 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
2027 contains_doc},
2028 {"copy", (PyCFunction)set_copy, METH_NOARGS,
2029 copy_doc},
2030 {"discard", (PyCFunction)set_discard, METH_O,
2031 discard_doc},
2032 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
2033 difference_doc},
2034 {"difference_update", (PyCFunction)set_difference_update, METH_VARARGS,
2035 difference_update_doc},
2036 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
2037 intersection_doc},
2038 {"intersection_update",(PyCFunction)set_intersection_update_multi, METH_VARARGS,
2039 intersection_update_doc},
2040 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2041 isdisjoint_doc},
2042 {"issubset", (PyCFunction)set_issubset, METH_O,
2043 issubset_doc},
2044 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2045 issuperset_doc},
2046 {"pop", (PyCFunction)set_pop, METH_NOARGS,
2047 pop_doc},
2048 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2049 reduce_doc},
2050 {"remove", (PyCFunction)set_remove, METH_O,
2051 remove_doc},
2052 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2053 sizeof_doc},
2054 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2055 symmetric_difference_doc},
2056 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
2057 symmetric_difference_update_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002058#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002059 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
2060 test_c_api_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002062 {"union", (PyCFunction)set_union, METH_VARARGS,
2063 union_doc},
2064 {"update", (PyCFunction)set_update, METH_VARARGS,
2065 update_doc},
2066 {NULL, NULL} /* sentinel */
Raymond Hettingera690a992003-11-16 16:17:49 +00002067};
2068
2069static PyNumberMethods set_as_number = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002070 0, /*nb_add*/
2071 (binaryfunc)set_sub, /*nb_subtract*/
2072 0, /*nb_multiply*/
2073 0, /*nb_divide*/
2074 0, /*nb_remainder*/
2075 0, /*nb_divmod*/
2076 0, /*nb_power*/
2077 0, /*nb_negative*/
2078 0, /*nb_positive*/
2079 0, /*nb_absolute*/
2080 0, /*nb_nonzero*/
2081 0, /*nb_invert*/
2082 0, /*nb_lshift*/
2083 0, /*nb_rshift*/
2084 (binaryfunc)set_and, /*nb_and*/
2085 (binaryfunc)set_xor, /*nb_xor*/
2086 (binaryfunc)set_or, /*nb_or*/
2087 0, /*nb_coerce*/
2088 0, /*nb_int*/
2089 0, /*nb_long*/
2090 0, /*nb_float*/
2091 0, /*nb_oct*/
2092 0, /*nb_hex*/
2093 0, /*nb_inplace_add*/
2094 (binaryfunc)set_isub, /*nb_inplace_subtract*/
2095 0, /*nb_inplace_multiply*/
2096 0, /*nb_inplace_divide*/
2097 0, /*nb_inplace_remainder*/
2098 0, /*nb_inplace_power*/
2099 0, /*nb_inplace_lshift*/
2100 0, /*nb_inplace_rshift*/
2101 (binaryfunc)set_iand, /*nb_inplace_and*/
2102 (binaryfunc)set_ixor, /*nb_inplace_xor*/
2103 (binaryfunc)set_ior, /*nb_inplace_or*/
Raymond Hettingera690a992003-11-16 16:17:49 +00002104};
2105
2106PyDoc_STRVAR(set_doc,
Georg Brandlb36e63a2010-02-28 18:26:37 +00002107"set() -> new empty set object\n\
2108set(iterable) -> new set object\n\
Raymond Hettingera690a992003-11-16 16:17:49 +00002109\n\
Andrew M. Kuchling52740be2006-07-29 15:10:32 +00002110Build an unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002111
2112PyTypeObject PySet_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002113 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2114 "set", /* tp_name */
2115 sizeof(PySetObject), /* tp_basicsize */
2116 0, /* tp_itemsize */
2117 /* methods */
2118 (destructor)set_dealloc, /* tp_dealloc */
2119 (printfunc)set_tp_print, /* tp_print */
2120 0, /* tp_getattr */
2121 0, /* tp_setattr */
2122 set_nocmp, /* tp_compare */
2123 (reprfunc)set_repr, /* tp_repr */
2124 &set_as_number, /* tp_as_number */
2125 &set_as_sequence, /* tp_as_sequence */
2126 0, /* tp_as_mapping */
2127 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
2128 0, /* tp_call */
2129 0, /* tp_str */
2130 PyObject_GenericGetAttr, /* tp_getattro */
2131 0, /* tp_setattro */
2132 0, /* tp_as_buffer */
2133 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
2134 Py_TPFLAGS_BASETYPE, /* tp_flags */
2135 set_doc, /* tp_doc */
2136 (traverseproc)set_traverse, /* tp_traverse */
2137 (inquiry)set_clear_internal, /* tp_clear */
2138 (richcmpfunc)set_richcompare, /* tp_richcompare */
2139 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
2140 (getiterfunc)set_iter, /* tp_iter */
2141 0, /* tp_iternext */
2142 set_methods, /* tp_methods */
2143 0, /* tp_members */
2144 0, /* tp_getset */
2145 0, /* tp_base */
2146 0, /* tp_dict */
2147 0, /* tp_descr_get */
2148 0, /* tp_descr_set */
2149 0, /* tp_dictoffset */
2150 (initproc)set_init, /* tp_init */
2151 PyType_GenericAlloc, /* tp_alloc */
2152 set_new, /* tp_new */
2153 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002154};
2155
2156/* frozenset object ********************************************************/
2157
2158
2159static PyMethodDef frozenset_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002160 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
2161 contains_doc},
2162 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
2163 copy_doc},
2164 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
2165 difference_doc},
2166 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
2167 intersection_doc},
2168 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2169 isdisjoint_doc},
2170 {"issubset", (PyCFunction)set_issubset, METH_O,
2171 issubset_doc},
2172 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2173 issuperset_doc},
2174 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2175 reduce_doc},
2176 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2177 sizeof_doc},
2178 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2179 symmetric_difference_doc},
2180 {"union", (PyCFunction)set_union, METH_VARARGS,
2181 union_doc},
2182 {NULL, NULL} /* sentinel */
Raymond Hettingera690a992003-11-16 16:17:49 +00002183};
2184
2185static PyNumberMethods frozenset_as_number = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002186 0, /*nb_add*/
2187 (binaryfunc)set_sub, /*nb_subtract*/
2188 0, /*nb_multiply*/
2189 0, /*nb_divide*/
2190 0, /*nb_remainder*/
2191 0, /*nb_divmod*/
2192 0, /*nb_power*/
2193 0, /*nb_negative*/
2194 0, /*nb_positive*/
2195 0, /*nb_absolute*/
2196 0, /*nb_nonzero*/
2197 0, /*nb_invert*/
2198 0, /*nb_lshift*/
2199 0, /*nb_rshift*/
2200 (binaryfunc)set_and, /*nb_and*/
2201 (binaryfunc)set_xor, /*nb_xor*/
2202 (binaryfunc)set_or, /*nb_or*/
Raymond Hettingera690a992003-11-16 16:17:49 +00002203};
2204
2205PyDoc_STRVAR(frozenset_doc,
Georg Brandlb36e63a2010-02-28 18:26:37 +00002206"frozenset() -> empty frozenset object\n\
2207frozenset(iterable) -> frozenset object\n\
Raymond Hettingera690a992003-11-16 16:17:49 +00002208\n\
Andrew M. Kuchling52740be2006-07-29 15:10:32 +00002209Build an immutable unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002210
2211PyTypeObject PyFrozenSet_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002212 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2213 "frozenset", /* tp_name */
2214 sizeof(PySetObject), /* tp_basicsize */
2215 0, /* tp_itemsize */
2216 /* methods */
2217 (destructor)set_dealloc, /* tp_dealloc */
2218 (printfunc)set_tp_print, /* tp_print */
2219 0, /* tp_getattr */
2220 0, /* tp_setattr */
2221 set_nocmp, /* tp_compare */
2222 (reprfunc)set_repr, /* tp_repr */
2223 &frozenset_as_number, /* tp_as_number */
2224 &set_as_sequence, /* tp_as_sequence */
2225 0, /* tp_as_mapping */
2226 frozenset_hash, /* tp_hash */
2227 0, /* tp_call */
2228 0, /* tp_str */
2229 PyObject_GenericGetAttr, /* tp_getattro */
2230 0, /* tp_setattro */
2231 0, /* tp_as_buffer */
2232 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
2233 Py_TPFLAGS_BASETYPE, /* tp_flags */
2234 frozenset_doc, /* tp_doc */
2235 (traverseproc)set_traverse, /* tp_traverse */
2236 (inquiry)set_clear_internal, /* tp_clear */
2237 (richcmpfunc)set_richcompare, /* tp_richcompare */
2238 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
2239 (getiterfunc)set_iter, /* tp_iter */
2240 0, /* tp_iternext */
2241 frozenset_methods, /* tp_methods */
2242 0, /* tp_members */
2243 0, /* tp_getset */
2244 0, /* tp_base */
2245 0, /* tp_dict */
2246 0, /* tp_descr_get */
2247 0, /* tp_descr_set */
2248 0, /* tp_dictoffset */
2249 0, /* tp_init */
2250 PyType_GenericAlloc, /* tp_alloc */
2251 frozenset_new, /* tp_new */
2252 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002253};
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002254
2255
2256/***** C API functions *************************************************/
2257
2258PyObject *
2259PySet_New(PyObject *iterable)
2260{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002261 return make_new_set(&PySet_Type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002262}
2263
2264PyObject *
2265PyFrozenSet_New(PyObject *iterable)
2266{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002267 return make_new_set(&PyFrozenSet_Type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002268}
2269
Neal Norwitz8c49c822006-03-04 18:41:19 +00002270Py_ssize_t
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002271PySet_Size(PyObject *anyset)
2272{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002273 if (!PyAnySet_Check(anyset)) {
2274 PyErr_BadInternalCall();
2275 return -1;
2276 }
2277 return PySet_GET_SIZE(anyset);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002278}
2279
2280int
Barry Warsaw176014f2006-03-30 22:45:35 +00002281PySet_Clear(PyObject *set)
2282{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002283 if (!PySet_Check(set)) {
2284 PyErr_BadInternalCall();
2285 return -1;
2286 }
2287 return set_clear_internal((PySetObject *)set);
Barry Warsaw176014f2006-03-30 22:45:35 +00002288}
2289
2290int
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002291PySet_Contains(PyObject *anyset, PyObject *key)
2292{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002293 if (!PyAnySet_Check(anyset)) {
2294 PyErr_BadInternalCall();
2295 return -1;
2296 }
2297 return set_contains_key((PySetObject *)anyset, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002298}
2299
2300int
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002301PySet_Discard(PyObject *set, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002303 if (!PySet_Check(set)) {
2304 PyErr_BadInternalCall();
2305 return -1;
2306 }
2307 return set_discard_key((PySetObject *)set, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002308}
2309
2310int
Raymond Hettingerecdcb582008-01-28 20:34:33 +00002311PySet_Add(PyObject *anyset, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002312{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002313 if (!PySet_Check(anyset) &&
2314 (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
2315 PyErr_BadInternalCall();
2316 return -1;
2317 }
2318 return set_add_key((PySetObject *)anyset, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002319}
2320
Barry Warsaw176014f2006-03-30 22:45:35 +00002321int
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00002322_PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key)
Barry Warsaw176014f2006-03-30 22:45:35 +00002323{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002324 setentry *entry_ptr;
Barry Warsaw176014f2006-03-30 22:45:35 +00002325
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002326 if (!PyAnySet_Check(set)) {
2327 PyErr_BadInternalCall();
2328 return -1;
2329 }
2330 if (set_next((PySetObject *)set, pos, &entry_ptr) == 0)
2331 return 0;
2332 *key = entry_ptr->key;
2333 return 1;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00002334}
2335
2336int
2337_PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash)
2338{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002339 setentry *entry;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00002340
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002341 if (!PyAnySet_Check(set)) {
2342 PyErr_BadInternalCall();
2343 return -1;
2344 }
2345 if (set_next((PySetObject *)set, pos, &entry) == 0)
2346 return 0;
2347 *key = entry->key;
2348 *hash = entry->hash;
2349 return 1;
Barry Warsaw176014f2006-03-30 22:45:35 +00002350}
2351
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002352PyObject *
2353PySet_Pop(PyObject *set)
2354{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002355 if (!PySet_Check(set)) {
2356 PyErr_BadInternalCall();
2357 return NULL;
2358 }
2359 return set_pop((PySetObject *)set);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002360}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002361
Barry Warsaw176014f2006-03-30 22:45:35 +00002362int
2363_PySet_Update(PyObject *set, PyObject *iterable)
2364{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002365 if (!PySet_Check(set)) {
2366 PyErr_BadInternalCall();
2367 return -1;
2368 }
2369 return set_update_internal((PySetObject *)set, iterable);
Barry Warsaw176014f2006-03-30 22:45:35 +00002370}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002371
2372#ifdef Py_DEBUG
2373
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002374/* Test code to be called with any three element set.
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002375 Returns True and original set is restored. */
2376
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002377#define assertRaises(call_return_value, exception) \
2378 do { \
2379 assert(call_return_value); \
2380 assert(PyErr_ExceptionMatches(exception)); \
2381 PyErr_Clear(); \
2382 } while(0)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002383
2384static PyObject *
2385test_c_api(PySetObject *so)
2386{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002387 Py_ssize_t count;
2388 char *s;
2389 Py_ssize_t i;
2390 PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x;
2391 PyObject *ob = (PyObject *)so;
2392 PyObject *str;
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002393
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002394 /* Verify preconditions */
2395 assert(PyAnySet_Check(ob));
2396 assert(PyAnySet_CheckExact(ob));
2397 assert(!PyFrozenSet_CheckExact(ob));
Victor Stinner17d90542010-03-13 00:13:22 +00002398
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002399 /* so.clear(); so |= set("abc"); */
2400 str = PyString_FromString("abc");
2401 if (str == NULL)
2402 return NULL;
2403 set_clear_internal(so);
2404 if (set_update_internal(so, str) == -1) {
2405 Py_DECREF(str);
2406 return NULL;
2407 }
2408 Py_DECREF(str);
Victor Stinner17d90542010-03-13 00:13:22 +00002409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002410 /* Exercise type/size checks */
2411 assert(PySet_Size(ob) == 3);
2412 assert(PySet_GET_SIZE(ob) == 3);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002414 /* Raise TypeError for non-iterable constructor arguments */
2415 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2416 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002417
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002418 /* Raise TypeError for unhashable key */
2419 dup = PySet_New(ob);
2420 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2421 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2422 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 /* Exercise successful pop, contains, add, and discard */
2425 elem = PySet_Pop(ob);
2426 assert(PySet_Contains(ob, elem) == 0);
2427 assert(PySet_GET_SIZE(ob) == 2);
2428 assert(PySet_Add(ob, elem) == 0);
2429 assert(PySet_Contains(ob, elem) == 1);
2430 assert(PySet_GET_SIZE(ob) == 3);
2431 assert(PySet_Discard(ob, elem) == 1);
2432 assert(PySet_GET_SIZE(ob) == 2);
2433 assert(PySet_Discard(ob, elem) == 0);
2434 assert(PySet_GET_SIZE(ob) == 2);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002435
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002436 /* Exercise clear */
2437 dup2 = PySet_New(dup);
2438 assert(PySet_Clear(dup2) == 0);
2439 assert(PySet_Size(dup2) == 0);
2440 Py_DECREF(dup2);
Barry Warsaw176014f2006-03-30 22:45:35 +00002441
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002442 /* Raise SystemError on clear or update of frozen set */
2443 f = PyFrozenSet_New(dup);
2444 assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
2445 assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
2446 assert(PySet_Add(f, elem) == 0);
2447 Py_INCREF(f);
2448 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2449 Py_DECREF(f);
2450 Py_DECREF(f);
Barry Warsaw176014f2006-03-30 22:45:35 +00002451
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002452 /* Exercise direct iteration */
2453 i = 0, count = 0;
2454 while (_PySet_Next((PyObject *)dup, &i, &x)) {
2455 s = PyString_AsString(x);
2456 assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c'));
2457 count++;
2458 }
2459 assert(count == 3);
Barry Warsaw176014f2006-03-30 22:45:35 +00002460
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002461 /* Exercise updates */
2462 dup2 = PySet_New(NULL);
2463 assert(_PySet_Update(dup2, dup) == 0);
2464 assert(PySet_Size(dup2) == 3);
2465 assert(_PySet_Update(dup2, dup) == 0);
2466 assert(PySet_Size(dup2) == 3);
2467 Py_DECREF(dup2);
Barry Warsaw176014f2006-03-30 22:45:35 +00002468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002469 /* Raise SystemError when self argument is not a set or frozenset. */
2470 t = PyTuple_New(0);
2471 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2472 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2473 Py_DECREF(t);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002475 /* Raise SystemError when self argument is not a set. */
2476 f = PyFrozenSet_New(dup);
2477 assert(PySet_Size(f) == 3);
2478 assert(PyFrozenSet_CheckExact(f));
2479 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2480 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2481 Py_DECREF(f);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002482
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002483 /* Raise KeyError when popping from an empty set */
2484 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
2485 Py_DECREF(ob);
2486 assert(PySet_GET_SIZE(ob) == 0);
2487 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002488
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002489 /* Restore the set from the copy using the PyNumber API */
2490 assert(PyNumber_InPlaceOr(ob, dup) == ob);
2491 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002492
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002493 /* Verify constructors accept NULL arguments */
2494 f = PySet_New(NULL);
2495 assert(f != NULL);
2496 assert(PySet_GET_SIZE(f) == 0);
2497 Py_DECREF(f);
2498 f = PyFrozenSet_New(NULL);
2499 assert(f != NULL);
2500 assert(PyFrozenSet_CheckExact(f));
2501 assert(PySet_GET_SIZE(f) == 0);
2502 Py_DECREF(f);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002504 Py_DECREF(elem);
2505 Py_DECREF(dup);
2506 Py_RETURN_TRUE;
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002507}
2508
Raymond Hettinger9bda1d62005-09-16 07:14:21 +00002509#undef assertRaises
2510
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002511#endif