blob: 075f8e770631f6522ef1d77f13f8fee8ff97ca2e [file] [log] [blame]
Raymond Hettingerc991db22005-08-11 07:58:45 +00001
Raymond Hettingera9d99362005-08-05 00:01:15 +00002/* set object implementation
3 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{
19 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);
25}
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{
37 return dummy;
38}
39#endif
40
Raymond Hettingerbc841a12005-08-07 13:02:53 +000041#define INIT_NONZERO_SET_SLOTS(so) do { \
42 (so)->table = (so)->smalltable; \
43 (so)->mask = PySet_MINSIZE - 1; \
44 (so)->hash = -1; \
45 } while(0)
46
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000047#define EMPTY_TO_MINSIZE(so) do { \
48 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \
49 (so)->used = (so)->fill = 0; \
Raymond Hettingerbc841a12005-08-07 13:02:53 +000050 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{
Martin v. Löwis18e16552006-02-15 17:27:45 +000078 register Py_ssize_t i;
79 register size_t perturb;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000080 register setentry *freeslot;
Neal Norwitz0f2783c2006-06-19 05:40:44 +000081 register size_t mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000082 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000083 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000084 register int cmp;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000085 PyObject *startkey;
86
87 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000088 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000089 if (entry->key == NULL || entry->key == key)
90 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000091
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000092 if (entry->key == dummy)
93 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000094 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000095 if (entry->hash == hash) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000096 startkey = entry->key;
Raymond Hettingerd99bee72008-05-30 06:49:47 +000097 Py_INCREF(startkey);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000098 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Raymond Hettingerd99bee72008-05-30 06:49:47 +000099 Py_DECREF(startkey);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000100 if (cmp < 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000101 return NULL;
Raymond Hettingera580c472005-08-05 17:19:54 +0000102 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000103 if (cmp > 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000104 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000105 }
106 else {
107 /* The compare did major nasty stuff to the
108 * set: start over.
109 */
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000110 return set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000111 }
112 }
113 freeslot = NULL;
114 }
115
116 /* 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;
Raymond Hettingera580c472005-08-05 17:19:54 +0000120 entry = &table[i & mask];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000121 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000122 if (freeslot != NULL)
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000123 entry = freeslot;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000124 break;
125 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000126 if (entry->key == key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000127 break;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000128 if (entry->hash == hash && entry->key != dummy) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000129 startkey = entry->key;
Raymond Hettingerd99bee72008-05-30 06:49:47 +0000130 Py_INCREF(startkey);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000131 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Raymond Hettingerd99bee72008-05-30 06:49:47 +0000132 Py_DECREF(startkey);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000133 if (cmp < 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000134 return NULL;
Raymond Hettingera580c472005-08-05 17:19:54 +0000135 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000136 if (cmp > 0)
137 break;
138 }
139 else {
140 /* The compare did major nasty stuff to the
141 * set: start over.
142 */
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000143 return set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000144 }
145 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000146 else if (entry->key == dummy && freeslot == NULL)
147 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000148 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000149 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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000160 register Py_ssize_t i;
161 register size_t perturb;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000162 register setentry *freeslot;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000163 register size_t mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000164 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000165 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000166
167 /* 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. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000171 if (!PyString_CheckExact(key)) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000172 so->lookup = set_lookkey;
173 return set_lookkey(so, key, hash);
174 }
175 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000176 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000177 if (entry->key == NULL || entry->key == key)
178 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000179 if (entry->key == dummy)
180 freeslot = entry;
181 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000182 if (entry->hash == hash && _PyString_Eq(entry->key, key))
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000183 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000184 freeslot = NULL;
185 }
186
187 /* 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
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000197 && _PyString_Eq(entry->key, key)))
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000198 return entry;
199 if (entry->key == dummy && freeslot == NULL)
200 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000201 }
Neal Norwitza5ccda92006-10-28 21:16:54 +0000202 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{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000214 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000215 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
216
217 assert(so->lookup != NULL);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000218 entry = so->lookup(so, key, hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000219 if (entry == NULL)
220 return -1;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000221 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000222 /* UNUSED */
223 so->fill++;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000224 entry->key = key;
225 entry->hash = hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000226 so->used++;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000227 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000228 /* DUMMY */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000229 entry->key = key;
230 entry->hash = hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000231 so->used++;
232 Py_DECREF(dummy);
233 } else {
234 /* ACTIVE */
235 Py_DECREF(key);
236 }
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000237 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{
251 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;
256
257 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++;
267}
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{
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000277 Py_ssize_t newsize;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000278 setentry *oldtable, *newtable, *entry;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000279 Py_ssize_t i;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000280 int is_oldtable_malloced;
281 setentry small_copy[PySet_MINSIZE];
282
283 assert(minused >= 0);
284
285 /* 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 }
294
295 /* Get space for a new table. */
296 oldtable = so->table;
297 assert(oldtable != NULL);
298 is_oldtable_malloced = oldtable != so->smalltable;
299
300 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 }
326
327 /* 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;
335
336 /* Copy the data over; this is refcount-neutral for active entries;
337 dummy entries aren't copied over, of course */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000338 for (entry = oldtable; i > 0; entry++) {
339 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000340 /* UNUSED */
341 ;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000342 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000343 /* DUMMY */
344 --i;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000345 assert(entry->key == dummy);
346 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000347 } else {
348 /* ACTIVE */
349 --i;
Raymond Hettinger0c850862006-12-08 04:24:33 +0000350 set_insert_clean(so, entry->key, entry->hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000351 }
352 }
353
354 if (is_oldtable_malloced)
355 PyMem_DEL(oldtable);
356 return 0;
357}
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{
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000364 register Py_ssize_t n_used;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000365
366 assert(so->fill <= so->mask); /* at least one empty slot */
367 n_used = so->used;
368 Py_INCREF(entry->key);
Raymond Hettingerc563a1c2006-09-07 02:42:48 +0000369 if (set_insert_key(so, entry->key, entry->hash) == -1) {
370 Py_DECREF(entry->key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000371 return -1;
Raymond Hettingerc563a1c2006-09-07 02:42:48 +0000372 }
Raymond Hettingerc991db22005-08-11 07:58:45 +0000373 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);
376}
377
378static int
379set_add_key(register PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000380{
381 register long hash;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000382 register Py_ssize_t n_used;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000383
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000384 if (!PyString_CheckExact(key) ||
385 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000386 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);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000393 if (set_insert_key(so, key, hash) == -1) {
394 Py_DECREF(key);
395 return -1;
396 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000397 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
398 return 0;
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000399 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)
407{ register setentry *entry;
408 PyObject *old_key;
409
410 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000411 if (entry == NULL)
412 return -1;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000413 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;
421}
422
423static int
424set_discard_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000425{
426 register long hash;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000427 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000428 PyObject *old_key;
429
430 assert (PyAnySet_Check(so));
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000431 if (!PyString_CheckExact(key) ||
432 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000433 hash = PyObject_Hash(key);
434 if (hash == -1)
435 return -1;
436 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000437 entry = (so->lookup)(so, key, hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000438 if (entry == NULL)
439 return -1;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000440 if (entry->key == NULL || entry->key == dummy)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000441 return DISCARD_NOTFOUND;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000442 old_key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000443 Py_INCREF(dummy);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000444 entry->key = dummy;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000445 so->used--;
446 Py_DECREF(old_key);
447 return DISCARD_FOUND;
448}
449
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000450static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000451set_clear_internal(PySetObject *so)
452{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000453 setentry *entry, *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000454 int table_is_malloced;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000455 Py_ssize_t fill;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000456 setentry small_copy[PySet_MINSIZE];
457#ifdef Py_DEBUG
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000458 Py_ssize_t i, n;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000459 assert (PyAnySet_Check(so));
Raymond Hettingera580c472005-08-05 17:19:54 +0000460
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000461 n = so->mask + 1;
462 i = 0;
463#endif
464
465 table = so->table;
466 assert(table != NULL);
467 table_is_malloced = table != so->smalltable;
468
469 /* 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
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000472 * clearing the slots, and never refer to anything via so->ref while
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000473 * clearing.
474 */
475 fill = so->fill;
476 if (table_is_malloced)
477 EMPTY_TO_MINSIZE(so);
478
479 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 */
489
490 /* 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 */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000494 for (entry = table; fill > 0; ++entry) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000495#ifdef Py_DEBUG
496 assert(i < n);
497 ++i;
498#endif
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000499 if (entry->key) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000500 --fill;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000501 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000502 }
503#ifdef Py_DEBUG
504 else
Raymond Hettinger334b5b22006-03-26 03:11:29 +0000505 assert(entry->key == NULL);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000506#endif
507 }
508
509 if (table_is_malloced)
510 PyMem_DEL(table);
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000511 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
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000525 * mutates the table.
526 */
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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000530 Py_ssize_t i;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000531 Py_ssize_t mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000532 register setentry *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000533
534 assert (PyAnySet_Check(so));
Raymond Hettingerc991db22005-08-11 07:58:45 +0000535 i = *pos_ptr;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000536 assert(i >= 0);
Raymond Hettingerc991db22005-08-11 07:58:45 +0000537 table = so->table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000538 mask = so->mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000539 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000540 i++;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000541 *pos_ptr = i+1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000542 if (i > mask)
543 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000544 assert(table[i].key != NULL);
545 *entry_ptr = &table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000546 return 1;
547}
548
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000549static void
550set_dealloc(PySetObject *so)
551{
552 register setentry *entry;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000553 Py_ssize_t fill = so->fill;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000554 PyObject_GC_UnTrack(so);
555 Py_TRASHCAN_SAFE_BEGIN(so)
556 if (so->weakreflist != NULL)
557 PyObject_ClearWeakRefs((PyObject *) so);
558
559 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);
Christian Heimes5b970ad2008-02-06 13:33:44 +0000567 if (numfree < PySet_MAXFREELIST && PyAnySet_CheckExact(so))
568 free_list[numfree++] = so;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000569 else
Christian Heimese93237d2007-12-19 02:37:44 +0000570 Py_TYPE(so)->tp_free(so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000571 Py_TRASHCAN_SAFE_END(so)
572}
573
574static int
575set_tp_print(PySetObject *so, FILE *fp, int flags)
576{
577 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000578 Py_ssize_t pos=0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000579 char *emit = ""; /* No separator emitted on first pass */
580 char *separator = ", ";
Raymond Hettinger53999102006-12-30 04:01:17 +0000581 int status = Py_ReprEnter((PyObject*)so);
582
583 if (status != 0) {
584 if (status < 0)
585 return status;
Brett Cannon01531592007-09-17 03:28:34 +0000586 Py_BEGIN_ALLOW_THREADS
Raymond Hettinger53999102006-12-30 04:01:17 +0000587 fprintf(fp, "%s(...)", so->ob_type->tp_name);
Brett Cannon01531592007-09-17 03:28:34 +0000588 Py_END_ALLOW_THREADS
Raymond Hettinger53999102006-12-30 04:01:17 +0000589 return 0;
590 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000591
Brett Cannon01531592007-09-17 03:28:34 +0000592 Py_BEGIN_ALLOW_THREADS
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000593 fprintf(fp, "%s([", so->ob_type->tp_name);
Brett Cannon01531592007-09-17 03:28:34 +0000594 Py_END_ALLOW_THREADS
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000595 while (set_next(so, &pos, &entry)) {
Brett Cannon01531592007-09-17 03:28:34 +0000596 Py_BEGIN_ALLOW_THREADS
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000597 fputs(emit, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000598 Py_END_ALLOW_THREADS
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000599 emit = separator;
Raymond Hettinger53999102006-12-30 04:01:17 +0000600 if (PyObject_Print(entry->key, fp, 0) != 0) {
601 Py_ReprLeave((PyObject*)so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000602 return -1;
Raymond Hettinger53999102006-12-30 04:01:17 +0000603 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000604 }
Brett Cannon01531592007-09-17 03:28:34 +0000605 Py_BEGIN_ALLOW_THREADS
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000606 fputs("])", fp);
Brett Cannon01531592007-09-17 03:28:34 +0000607 Py_END_ALLOW_THREADS
Raymond Hettinger53999102006-12-30 04:01:17 +0000608 Py_ReprLeave((PyObject*)so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000609 return 0;
610}
611
612static PyObject *
613set_repr(PySetObject *so)
614{
Raymond Hettinger53999102006-12-30 04:01:17 +0000615 PyObject *keys, *result=NULL, *listrepr;
616 int status = Py_ReprEnter((PyObject*)so);
617
618 if (status != 0) {
619 if (status < 0)
620 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000621 return PyString_FromFormat("%s(...)", so->ob_type->tp_name);
Raymond Hettinger53999102006-12-30 04:01:17 +0000622 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000623
624 keys = PySequence_List((PyObject *)so);
625 if (keys == NULL)
Raymond Hettinger53999102006-12-30 04:01:17 +0000626 goto done;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000627 listrepr = PyObject_Repr(keys);
628 Py_DECREF(keys);
629 if (listrepr == NULL)
Raymond Hettinger53999102006-12-30 04:01:17 +0000630 goto done;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000631
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000632 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
633 PyString_AS_STRING(listrepr));
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000634 Py_DECREF(listrepr);
Raymond Hettinger53999102006-12-30 04:01:17 +0000635done:
636 Py_ReprLeave((PyObject*)so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000637 return result;
638}
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{
643 return ((PySetObject *)so)->used;
644}
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{
Raymond Hettingerd7946662005-08-01 21:39:29 +0000649 PySetObject *other;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000650 register Py_ssize_t i;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000651 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000652
653 assert (PyAnySet_Check(so));
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000654 assert (PyAnySet_Check(otherset));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000655
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000656 other = (PySetObject*)otherset;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000657 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
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000661 * incrementally resizing as we insert new keys. Expect
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000662 * 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 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000668 for (i = 0; i <= other->mask; i++) {
669 entry = &other->table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000670 if (entry->key != NULL &&
671 entry->key != dummy) {
672 Py_INCREF(entry->key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000673 if (set_insert_key(so, entry->key, entry->hash) == -1) {
674 Py_DECREF(entry->key);
675 return -1;
676 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000677 }
678 }
679 return 0;
680}
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{
685 long hash;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000686 setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000687
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000688 if (!PyString_CheckExact(key) ||
689 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000690 hash = PyObject_Hash(key);
691 if (hash == -1)
692 return -1;
693 }
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000694 entry = (so->lookup)(so, key, hash);
695 if (entry == NULL)
696 return -1;
697 key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000698 return key != NULL && key != dummy;
699}
700
Raymond Hettingerc991db22005-08-11 07:58:45 +0000701static int
702set_contains_entry(PySetObject *so, setentry *entry)
703{
704 PyObject *key;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000705 setentry *lu_entry;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000706
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000707 lu_entry = (so->lookup)(so, entry->key, entry->hash);
708 if (lu_entry == NULL)
709 return -1;
710 key = lu_entry->key;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000711 return key != NULL && key != dummy;
712}
713
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000714static PyObject *
715set_pop(PySetObject *so)
716{
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000717 register Py_ssize_t i = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000718 register setentry *entry;
719 PyObject *key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000720
721 assert (PyAnySet_Check(so));
722 if (so->used == 0) {
723 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
724 return NULL;
725 }
726
727 /* 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) {
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000735 i = entry->hash;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000736 /* 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;
755}
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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000763 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000764 setentry *entry;
765
766 while (set_next(so, &pos, &entry))
767 Py_VISIT(entry->key);
768 return 0;
769}
770
771static long
772frozenset_hash(PyObject *self)
773{
774 PySetObject *so = (PySetObject *)self;
775 long h, hash = 1927868237L;
776 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000777 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000778
779 if (so->hash != -1)
780 return so->hash;
781
782 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;
797}
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 {
802 PyObject_HEAD
803 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000804 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{
812 Py_XDECREF(si->si_set);
813 PyObject_Del(si);
814}
815
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000816static PyObject *
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000817setiter_len(setiterobject *si)
818{
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000819 Py_ssize_t len = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000820 if (si->si_set != NULL && si->si_used == si->si_set->used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000821 len = si->len;
822 return PyInt_FromLong(len);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000823}
824
Armin Rigof5b3e362006-02-11 21:32:43 +0000825PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000826
827static PyMethodDef setiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000828 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000829 {NULL, NULL} /* sentinel */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000830};
831
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000832static PyObject *setiter_iternext(setiterobject *si)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000833{
834 PyObject *key;
Neal Norwitz0f2783c2006-06-19 05:40:44 +0000835 register Py_ssize_t i, mask;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000836 register setentry *entry;
837 PySetObject *so = si->si_set;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000838
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000839 if (so == NULL)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000840 return NULL;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000841 assert (PyAnySet_Check(so));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000842
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000843 if (si->si_used != so->used) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000844 PyErr_SetString(PyExc_RuntimeError,
845 "Set changed size during iteration");
846 si->si_used = -1; /* Make this state sticky */
847 return NULL;
848 }
849
850 i = si->si_pos;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000851 assert(i>=0);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000852 entry = so->table;
853 mask = so->mask;
854 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000855 i++;
856 si->si_pos = i+1;
857 if (i > mask)
858 goto fail;
859 si->len--;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000860 key = entry[i].key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000861 Py_INCREF(key);
862 return key;
863
864fail:
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000865 Py_DECREF(so);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000866 si->si_set = NULL;
867 return NULL;
868}
869
Hye-Shik Change2956762005-08-01 05:26:41 +0000870static PyTypeObject PySetIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000871 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000872 "setiterator", /* tp_name */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000873 sizeof(setiterobject), /* tp_basicsize */
874 0, /* tp_itemsize */
875 /* methods */
876 (destructor)setiter_dealloc, /* tp_dealloc */
877 0, /* tp_print */
878 0, /* tp_getattr */
879 0, /* tp_setattr */
880 0, /* tp_compare */
881 0, /* tp_repr */
882 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000883 0, /* tp_as_sequence */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000884 0, /* tp_as_mapping */
885 0, /* tp_hash */
886 0, /* tp_call */
887 0, /* tp_str */
888 PyObject_GenericGetAttr, /* tp_getattro */
889 0, /* tp_setattro */
890 0, /* tp_as_buffer */
891 Py_TPFLAGS_DEFAULT, /* tp_flags */
892 0, /* tp_doc */
893 0, /* tp_traverse */
894 0, /* tp_clear */
895 0, /* tp_richcompare */
896 0, /* tp_weaklistoffset */
897 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000898 (iternextfunc)setiter_iternext, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000899 setiter_methods, /* tp_methods */
900 0,
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000901};
902
Martin v. Löwis72d20672006-04-11 09:04:12 +0000903static PyObject *
904set_iter(PySetObject *so)
905{
906 setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
907 if (si == NULL)
908 return NULL;
909 Py_INCREF(so);
910 si->si_set = so;
911 si->si_used = so->used;
912 si->si_pos = 0;
913 si->len = so->used;
914 return (PyObject *)si;
915}
916
Raymond Hettingerd7946662005-08-01 21:39:29 +0000917static int
Raymond Hettingerd7946662005-08-01 21:39:29 +0000918set_update_internal(PySetObject *so, PyObject *other)
Raymond Hettingera690a992003-11-16 16:17:49 +0000919{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000920 PyObject *key, *it;
Raymond Hettingera690a992003-11-16 16:17:49 +0000921
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +0000922 if (PyAnySet_Check(other))
Raymond Hettingerc991db22005-08-11 07:58:45 +0000923 return set_merge(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +0000924
Raymond Hettingerdb67aef2007-02-01 21:02:59 +0000925 if (PyDict_CheckExact(other)) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000926 PyObject *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000927 Py_ssize_t pos = 0;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000928 long hash;
Raymond Hettinger15cade02007-02-19 20:44:04 +0000929 Py_ssize_t dictsize = PyDict_Size(other);
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000930
Raymond Hettinger15cade02007-02-19 20:44:04 +0000931 /* Do one big resize at the start, rather than
932 * incrementally resizing as we insert new keys. Expect
933 * that there will be no (or few) overlapping keys.
934 */
935 if (dictsize == -1)
936 return -1;
937 if ((so->fill + dictsize)*3 >= (so->mask+1)*2) {
938 if (set_table_resize(so, (so->used + dictsize)*2) != 0)
939 return -1;
940 }
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000941 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
942 setentry an_entry;
943
944 an_entry.hash = hash;
945 an_entry.key = key;
946 if (set_add_entry(so, &an_entry) == -1)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000947 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000948 }
Raymond Hettingerd7946662005-08-01 21:39:29 +0000949 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000950 }
951
Raymond Hettingera38123e2003-11-24 22:18:49 +0000952 it = PyObject_GetIter(other);
953 if (it == NULL)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000954 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000955
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000956 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettingerc991db22005-08-11 07:58:45 +0000957 if (set_add_key(so, key) == -1) {
Raymond Hettingera38123e2003-11-24 22:18:49 +0000958 Py_DECREF(it);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000959 Py_DECREF(key);
Raymond Hettingerd7946662005-08-01 21:39:29 +0000960 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000961 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000962 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +0000963 }
Raymond Hettingera38123e2003-11-24 22:18:49 +0000964 Py_DECREF(it);
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000965 if (PyErr_Occurred())
Raymond Hettingerd7946662005-08-01 21:39:29 +0000966 return -1;
967 return 0;
968}
969
970static PyObject *
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000971set_update(PySetObject *so, PyObject *args)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000972{
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000973 Py_ssize_t i;
974
975 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
976 PyObject *other = PyTuple_GET_ITEM(args, i);
977 if (set_update_internal(so, other) == -1)
978 return NULL;
979 }
Raymond Hettingera38123e2003-11-24 22:18:49 +0000980 Py_RETURN_NONE;
981}
982
983PyDoc_STRVAR(update_doc,
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000984"Update a set with the union of itself and others.");
Raymond Hettingera38123e2003-11-24 22:18:49 +0000985
986static PyObject *
987make_new_set(PyTypeObject *type, PyObject *iterable)
988{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000989 register PySetObject *so = NULL;
Raymond Hettingera38123e2003-11-24 22:18:49 +0000990
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000991 if (dummy == NULL) { /* Auto-initialize dummy */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000992 dummy = PyString_FromString("<dummy key>");
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000993 if (dummy == NULL)
994 return NULL;
995 }
Raymond Hettingera690a992003-11-16 16:17:49 +0000996
997 /* create PySetObject structure */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000998 if (numfree &&
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000999 (type == &PySet_Type || type == &PyFrozenSet_Type)) {
Christian Heimes5b970ad2008-02-06 13:33:44 +00001000 so = free_list[--numfree];
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001001 assert (so != NULL && PyAnySet_CheckExact(so));
Christian Heimese93237d2007-12-19 02:37:44 +00001002 Py_TYPE(so) = type;
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001003 _Py_NewReference((PyObject *)so);
1004 EMPTY_TO_MINSIZE(so);
1005 PyObject_GC_Track(so);
1006 } else {
1007 so = (PySetObject *)type->tp_alloc(type, 0);
1008 if (so == NULL)
1009 return NULL;
1010 /* tp_alloc has already zeroed the structure */
1011 assert(so->table == NULL && so->fill == 0 && so->used == 0);
1012 INIT_NONZERO_SET_SLOTS(so);
1013 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001014
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001015 so->lookup = set_lookkey_string;
Raymond Hettinger691d8052004-05-30 07:26:47 +00001016 so->weakreflist = NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001017
Raymond Hettingera38123e2003-11-24 22:18:49 +00001018 if (iterable != NULL) {
Raymond Hettingerd7946662005-08-01 21:39:29 +00001019 if (set_update_internal(so, iterable) == -1) {
Raymond Hettingera38123e2003-11-24 22:18:49 +00001020 Py_DECREF(so);
1021 return NULL;
1022 }
Raymond Hettingera38123e2003-11-24 22:18:49 +00001023 }
1024
Raymond Hettingera690a992003-11-16 16:17:49 +00001025 return (PyObject *)so;
1026}
1027
Raymond Hettingerd7946662005-08-01 21:39:29 +00001028/* The empty frozenset is a singleton */
1029static PyObject *emptyfrozenset = NULL;
1030
Raymond Hettingera690a992003-11-16 16:17:49 +00001031static PyObject *
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001032frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Raymond Hettingera690a992003-11-16 16:17:49 +00001033{
Raymond Hettingerd7946662005-08-01 21:39:29 +00001034 PyObject *iterable = NULL, *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001035
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +00001036 if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001037 return NULL;
1038
Raymond Hettingera690a992003-11-16 16:17:49 +00001039 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
1040 return NULL;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001041
1042 if (type != &PyFrozenSet_Type)
1043 return make_new_set(type, iterable);
1044
1045 if (iterable != NULL) {
1046 /* frozenset(f) is idempotent */
1047 if (PyFrozenSet_CheckExact(iterable)) {
1048 Py_INCREF(iterable);
1049 return iterable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001050 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001051 result = make_new_set(type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001052 if (result == NULL || PySet_GET_SIZE(result))
Raymond Hettingerd7946662005-08-01 21:39:29 +00001053 return result;
1054 Py_DECREF(result);
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001055 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001056 /* The empty frozenset is a singleton */
1057 if (emptyfrozenset == NULL)
1058 emptyfrozenset = make_new_set(type, NULL);
1059 Py_XINCREF(emptyfrozenset);
1060 return emptyfrozenset;
1061}
1062
1063void
1064PySet_Fini(void)
1065{
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001066 PySetObject *so;
1067
Christian Heimes5b970ad2008-02-06 13:33:44 +00001068 while (numfree) {
1069 numfree--;
1070 so = free_list[numfree];
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001071 PyObject_GC_Del(so);
1072 }
Martin v. Löwised8f7832006-04-15 12:47:23 +00001073 Py_CLEAR(dummy);
1074 Py_CLEAR(emptyfrozenset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001075}
1076
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001077static PyObject *
1078set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1079{
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +00001080 if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001081 return NULL;
1082
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001083 return make_new_set(type, NULL);
1084}
1085
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001086/* set_swap_bodies() switches the contents of any two sets by moving their
1087 internal data pointers and, if needed, copying the internal smalltables.
1088 Semantically equivalent to:
1089
1090 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
1091
1092 The function always succeeds and it leaves both objects in a stable state.
1093 Useful for creating temporary frozensets from sets for membership testing
1094 in __contains__(), discard(), and remove(). Also useful for operations
1095 that update in-place (by allowing an intermediate result to be swapped
Raymond Hettinger9dcb17c2005-07-31 13:09:28 +00001096 into one of the original inputs).
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001097*/
1098
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001099static void
1100set_swap_bodies(PySetObject *a, PySetObject *b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001101{
Neal Norwitz0f2783c2006-06-19 05:40:44 +00001102 Py_ssize_t t;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001103 setentry *u;
1104 setentry *(*f)(PySetObject *so, PyObject *key, long hash);
1105 setentry tab[PySet_MINSIZE];
1106 long h;
1107
1108 t = a->fill; a->fill = b->fill; b->fill = t;
1109 t = a->used; a->used = b->used; b->used = t;
1110 t = a->mask; a->mask = b->mask; b->mask = t;
1111
1112 u = a->table;
1113 if (a->table == a->smalltable)
1114 u = b->smalltable;
1115 a->table = b->table;
1116 if (b->table == b->smalltable)
1117 a->table = a->smalltable;
1118 b->table = u;
1119
1120 f = a->lookup; a->lookup = b->lookup; b->lookup = f;
1121
1122 if (a->table == a->smalltable || b->table == b->smalltable) {
1123 memcpy(tab, a->smalltable, sizeof(tab));
1124 memcpy(a->smalltable, b->smalltable, sizeof(tab));
1125 memcpy(b->smalltable, tab, sizeof(tab));
1126 }
1127
Christian Heimese93237d2007-12-19 02:37:44 +00001128 if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) &&
1129 PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) {
Raymond Hettingera580c472005-08-05 17:19:54 +00001130 h = a->hash; a->hash = b->hash; b->hash = h;
1131 } else {
1132 a->hash = -1;
1133 b->hash = -1;
1134 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001135}
1136
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001137static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001138set_copy(PySetObject *so)
1139{
Christian Heimese93237d2007-12-19 02:37:44 +00001140 return make_new_set(Py_TYPE(so), (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001141}
1142
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001143static PyObject *
1144frozenset_copy(PySetObject *so)
1145{
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001146 if (PyFrozenSet_CheckExact(so)) {
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001147 Py_INCREF(so);
1148 return (PyObject *)so;
1149 }
1150 return set_copy(so);
1151}
1152
Raymond Hettingera690a992003-11-16 16:17:49 +00001153PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
1154
1155static PyObject *
Raymond Hettingerc991db22005-08-11 07:58:45 +00001156set_clear(PySetObject *so)
1157{
1158 set_clear_internal(so);
1159 Py_RETURN_NONE;
1160}
1161
1162PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
1163
1164static PyObject *
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001165set_union(PySetObject *so, PyObject *args)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001166{
1167 PySetObject *result;
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00001168 PyObject *other;
1169 Py_ssize_t i;
1170
1171 result = (PySetObject *)set_copy(so);
1172 if (result == NULL)
1173 return NULL;
1174
1175 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1176 other = PyTuple_GET_ITEM(args, i);
1177 if ((PyObject *)so == other)
1178 return (PyObject *)result;
1179 if (set_update_internal(result, other) == -1) {
1180 Py_DECREF(result);
1181 return NULL;
1182 }
1183 }
1184 return (PyObject *)result;
1185}
1186
1187PyDoc_STRVAR(union_doc,
1188 "Return the union of sets as a new set.\n\
1189\n\
1190(i.e. all elements that are in either set.)");
1191
1192static PyObject *
1193set_or(PySetObject *so, PyObject *other)
1194{
1195 PySetObject *result;
1196
1197 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1198 Py_INCREF(Py_NotImplemented);
1199 return Py_NotImplemented;
1200 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001201
1202 result = (PySetObject *)set_copy(so);
1203 if (result == NULL)
1204 return NULL;
Raymond Hettingerd8e13382005-08-17 12:27:17 +00001205 if ((PyObject *)so == other)
1206 return (PyObject *)result;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001207 if (set_update_internal(result, other) == -1) {
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001208 Py_DECREF(result);
1209 return NULL;
1210 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001211 return (PyObject *)result;
1212}
1213
Raymond Hettingera690a992003-11-16 16:17:49 +00001214static PyObject *
1215set_ior(PySetObject *so, PyObject *other)
1216{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001217 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001218 Py_INCREF(Py_NotImplemented);
1219 return Py_NotImplemented;
1220 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001221 if (set_update_internal(so, other) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001222 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001223 Py_INCREF(so);
1224 return (PyObject *)so;
1225}
1226
1227static PyObject *
1228set_intersection(PySetObject *so, PyObject *other)
1229{
1230 PySetObject *result;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001231 PyObject *key, *it, *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001232
Raymond Hettingerd8e13382005-08-17 12:27:17 +00001233 if ((PyObject *)so == other)
1234 return set_copy(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001235
Christian Heimese93237d2007-12-19 02:37:44 +00001236 result = (PySetObject *)make_new_set(Py_TYPE(so), NULL);
Raymond Hettingera690a992003-11-16 16:17:49 +00001237 if (result == NULL)
1238 return NULL;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001239
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001240 if (PyAnySet_Check(other)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001241 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001242 setentry *entry;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001243
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001244 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001245 tmp = (PyObject *)so;
1246 so = (PySetObject *)other;
1247 other = tmp;
1248 }
1249
Raymond Hettingerc991db22005-08-11 07:58:45 +00001250 while (set_next((PySetObject *)other, &pos, &entry)) {
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001251 int rv = set_contains_entry(so, entry);
1252 if (rv == -1) {
1253 Py_DECREF(result);
1254 return NULL;
1255 }
1256 if (rv) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001257 if (set_add_entry(result, entry) == -1) {
Raymond Hettingera3b11e72003-12-31 14:08:58 +00001258 Py_DECREF(result);
1259 return NULL;
1260 }
1261 }
1262 }
1263 return (PyObject *)result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001264 }
1265
Raymond Hettingera690a992003-11-16 16:17:49 +00001266 it = PyObject_GetIter(other);
1267 if (it == NULL) {
1268 Py_DECREF(result);
1269 return NULL;
1270 }
1271
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001272 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001273 int rv;
1274 setentry entry;
1275 long hash = PyObject_Hash(key);
1276
1277 if (hash == -1) {
1278 Py_DECREF(it);
1279 Py_DECREF(result);
1280 Py_DECREF(key);
1281 return NULL;
1282 }
1283 entry.hash = hash;
1284 entry.key = key;
1285 rv = set_contains_entry(so, &entry);
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001286 if (rv == -1) {
1287 Py_DECREF(it);
1288 Py_DECREF(result);
1289 Py_DECREF(key);
1290 return NULL;
1291 }
1292 if (rv) {
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001293 if (set_add_entry(result, &entry) == -1) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001294 Py_DECREF(it);
1295 Py_DECREF(result);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001296 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +00001297 return NULL;
1298 }
1299 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001300 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +00001301 }
1302 Py_DECREF(it);
1303 if (PyErr_Occurred()) {
1304 Py_DECREF(result);
1305 return NULL;
1306 }
1307 return (PyObject *)result;
1308}
1309
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001310static PyObject *
1311set_intersection_multi(PySetObject *so, PyObject *args)
1312{
1313 Py_ssize_t i;
1314 PyObject *result = (PyObject *)so;
1315
Raymond Hettinger610a93e2008-06-11 00:44:47 +00001316 if (PyTuple_GET_SIZE(args) == 0)
1317 return set_copy(so);
1318
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001319 Py_INCREF(so);
1320 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1321 PyObject *other = PyTuple_GET_ITEM(args, i);
1322 PyObject *newresult = set_intersection((PySetObject *)result, other);
1323 if (newresult == NULL) {
1324 Py_DECREF(result);
1325 return NULL;
1326 }
1327 Py_DECREF(result);
1328 result = newresult;
1329 }
1330 return result;
1331}
1332
Raymond Hettingera690a992003-11-16 16:17:49 +00001333PyDoc_STRVAR(intersection_doc,
1334"Return the intersection of two sets as a new set.\n\
1335\n\
1336(i.e. all elements that are in both sets.)");
1337
1338static PyObject *
1339set_intersection_update(PySetObject *so, PyObject *other)
1340{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001341 PyObject *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001342
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001343 tmp = set_intersection(so, other);
1344 if (tmp == NULL)
Raymond Hettingera690a992003-11-16 16:17:49 +00001345 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001346 set_swap_bodies(so, (PySetObject *)tmp);
Raymond Hettingera690a992003-11-16 16:17:49 +00001347 Py_DECREF(tmp);
1348 Py_RETURN_NONE;
1349}
1350
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00001351static PyObject *
1352set_intersection_update_multi(PySetObject *so, PyObject *args)
1353{
1354 PyObject *tmp;
1355
1356 tmp = set_intersection_multi(so, args);
1357 if (tmp == NULL)
1358 return NULL;
1359 set_swap_bodies(so, (PySetObject *)tmp);
1360 Py_DECREF(tmp);
1361 Py_RETURN_NONE;
1362}
1363
Raymond Hettingera690a992003-11-16 16:17:49 +00001364PyDoc_STRVAR(intersection_update_doc,
1365"Update a set with the intersection of itself and another.");
1366
1367static PyObject *
1368set_and(PySetObject *so, PyObject *other)
1369{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001370 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001371 Py_INCREF(Py_NotImplemented);
1372 return Py_NotImplemented;
1373 }
1374 return set_intersection(so, other);
1375}
1376
1377static PyObject *
1378set_iand(PySetObject *so, PyObject *other)
1379{
1380 PyObject *result;
1381
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001382 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001383 Py_INCREF(Py_NotImplemented);
1384 return Py_NotImplemented;
1385 }
1386 result = set_intersection_update(so, other);
1387 if (result == NULL)
1388 return NULL;
1389 Py_DECREF(result);
1390 Py_INCREF(so);
1391 return (PyObject *)so;
1392}
1393
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001394static PyObject *
1395set_isdisjoint(PySetObject *so, PyObject *other)
1396{
1397 PyObject *key, *it, *tmp;
1398
1399 if ((PyObject *)so == other) {
1400 if (PySet_GET_SIZE(so) == 0)
1401 Py_RETURN_TRUE;
1402 else
1403 Py_RETURN_FALSE;
1404 }
1405
1406 if (PyAnySet_CheckExact(other)) {
1407 Py_ssize_t pos = 0;
1408 setentry *entry;
1409
1410 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1411 tmp = (PyObject *)so;
1412 so = (PySetObject *)other;
1413 other = tmp;
1414 }
1415 while (set_next((PySetObject *)other, &pos, &entry)) {
1416 int rv = set_contains_entry(so, entry);
1417 if (rv == -1)
1418 return NULL;
1419 if (rv)
1420 Py_RETURN_FALSE;
1421 }
1422 Py_RETURN_TRUE;
1423 }
1424
1425 it = PyObject_GetIter(other);
1426 if (it == NULL)
1427 return NULL;
1428
1429 while ((key = PyIter_Next(it)) != NULL) {
1430 int rv;
1431 setentry entry;
1432 long hash = PyObject_Hash(key);
1433
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001434 if (hash == -1) {
Raymond Hettingere8d58ba2007-11-08 18:47:51 +00001435 Py_DECREF(key);
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001436 Py_DECREF(it);
1437 return NULL;
1438 }
1439 entry.hash = hash;
1440 entry.key = key;
1441 rv = set_contains_entry(so, &entry);
Raymond Hettingere8d58ba2007-11-08 18:47:51 +00001442 Py_DECREF(key);
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001443 if (rv == -1) {
1444 Py_DECREF(it);
1445 return NULL;
1446 }
1447 if (rv) {
1448 Py_DECREF(it);
1449 Py_RETURN_FALSE;
1450 }
1451 }
1452 Py_DECREF(it);
1453 if (PyErr_Occurred())
1454 return NULL;
1455 Py_RETURN_TRUE;
1456}
1457
1458PyDoc_STRVAR(isdisjoint_doc,
1459"Return True if two sets have a null intersection.");
1460
Neal Norwitz6576bd82005-11-13 18:41:28 +00001461static int
Raymond Hettingerc991db22005-08-11 07:58:45 +00001462set_difference_update_internal(PySetObject *so, PyObject *other)
1463{
1464 if ((PyObject *)so == other)
1465 return set_clear_internal(so);
1466
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001467 if (PyAnySet_Check(other)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001468 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001469 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001470
1471 while (set_next((PySetObject *)other, &pos, &entry))
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001472 if (set_discard_entry(so, entry) == -1)
1473 return -1;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001474 } else {
1475 PyObject *key, *it;
1476 it = PyObject_GetIter(other);
1477 if (it == NULL)
1478 return -1;
1479
1480 while ((key = PyIter_Next(it)) != NULL) {
1481 if (set_discard_key(so, key) == -1) {
1482 Py_DECREF(it);
1483 Py_DECREF(key);
1484 return -1;
1485 }
1486 Py_DECREF(key);
1487 }
1488 Py_DECREF(it);
1489 if (PyErr_Occurred())
1490 return -1;
1491 }
1492 /* If more than 1/5 are dummies, then resize them away. */
1493 if ((so->fill - so->used) * 5 < so->mask)
1494 return 0;
1495 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
1496}
1497
Raymond Hettingera690a992003-11-16 16:17:49 +00001498static PyObject *
Raymond Hettinger4267be62008-06-11 10:30:54 +00001499set_difference_update(PySetObject *so, PyObject *args)
Raymond Hettingera690a992003-11-16 16:17:49 +00001500{
Raymond Hettinger4267be62008-06-11 10:30:54 +00001501 Py_ssize_t i;
1502
1503 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1504 PyObject *other = PyTuple_GET_ITEM(args, i);
1505 if (set_difference_update_internal(so, other) == -1)
1506 return NULL;
1507 }
1508 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001509}
1510
1511PyDoc_STRVAR(difference_update_doc,
1512"Remove all elements of another set from this set.");
1513
1514static PyObject *
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001515set_difference(PySetObject *so, PyObject *other)
1516{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001517 PyObject *result;
1518 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001519 Py_ssize_t pos = 0;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001520
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001521 if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) {
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001522 result = set_copy(so);
1523 if (result == NULL)
Raymond Hettingerc991db22005-08-11 07:58:45 +00001524 return NULL;
1525 if (set_difference_update_internal((PySetObject *)result, other) != -1)
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001526 return result;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001527 Py_DECREF(result);
1528 return NULL;
1529 }
1530
Christian Heimese93237d2007-12-19 02:37:44 +00001531 result = make_new_set(Py_TYPE(so), NULL);
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001532 if (result == NULL)
1533 return NULL;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001534
Raymond Hettingerdb67aef2007-02-01 21:02:59 +00001535 if (PyDict_CheckExact(other)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001536 while (set_next(so, &pos, &entry)) {
1537 setentry entrycopy;
1538 entrycopy.hash = entry->hash;
1539 entrycopy.key = entry->key;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00001540 if (!_PyDict_Contains(other, entry->key, entry->hash)) {
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001541 if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
1542 Py_DECREF(result);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001543 return NULL;
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001544 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001545 }
1546 }
1547 return result;
1548 }
1549
Raymond Hettingerc991db22005-08-11 07:58:45 +00001550 while (set_next(so, &pos, &entry)) {
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001551 int rv = set_contains_entry((PySetObject *)other, entry);
1552 if (rv == -1) {
1553 Py_DECREF(result);
1554 return NULL;
1555 }
1556 if (!rv) {
1557 if (set_add_entry((PySetObject *)result, entry) == -1) {
1558 Py_DECREF(result);
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001559 return NULL;
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001560 }
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001561 }
1562 }
1563 return result;
1564}
1565
Raymond Hettinger4267be62008-06-11 10:30:54 +00001566static PyObject *
1567set_difference_multi(PySetObject *so, PyObject *args)
1568{
1569 Py_ssize_t i;
1570 PyObject *result, *other;
1571
1572 if (PyTuple_GET_SIZE(args) == 0)
1573 return set_copy(so);
1574
1575 other = PyTuple_GET_ITEM(args, 0);
1576 result = set_difference(so, other);
1577 if (result == NULL)
1578 return NULL;
1579
1580 for (i=1 ; i<PyTuple_GET_SIZE(args) ; i++) {
1581 other = PyTuple_GET_ITEM(args, i);
1582 if (set_difference_update_internal((PySetObject *)result, other) == -1) {
1583 Py_DECREF(result);
1584 return NULL;
1585 }
1586 }
1587 return result;
1588}
1589
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001590PyDoc_STRVAR(difference_doc,
Raymond Hettinger4267be62008-06-11 10:30:54 +00001591"Return the difference of two or more sets as a new set.\n\
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001592\n\
Raymond Hettinger4267be62008-06-11 10:30:54 +00001593(i.e. all elements that are in this set but not the others.)");
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001594static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001595set_sub(PySetObject *so, PyObject *other)
1596{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001597 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001598 Py_INCREF(Py_NotImplemented);
1599 return Py_NotImplemented;
1600 }
1601 return set_difference(so, other);
1602}
1603
1604static PyObject *
1605set_isub(PySetObject *so, PyObject *other)
1606{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001607 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001608 Py_INCREF(Py_NotImplemented);
1609 return Py_NotImplemented;
1610 }
Raymond Hettinger4267be62008-06-11 10:30:54 +00001611 if (set_difference_update_internal(so, other) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001612 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001613 Py_INCREF(so);
1614 return (PyObject *)so;
1615}
1616
1617static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001618set_symmetric_difference_update(PySetObject *so, PyObject *other)
1619{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001620 PySetObject *otherset;
1621 PyObject *key;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001622 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001623 setentry *entry;
1624
1625 if ((PyObject *)so == other)
1626 return set_clear(so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001627
Raymond Hettingerdb67aef2007-02-01 21:02:59 +00001628 if (PyDict_CheckExact(other)) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001629 PyObject *value;
1630 int rv;
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +00001631 long hash;
1632 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001633 setentry an_entry;
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001634
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001635 an_entry.hash = hash;
1636 an_entry.key = key;
1637 rv = set_discard_entry(so, &an_entry);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001638 if (rv == -1)
1639 return NULL;
1640 if (rv == DISCARD_NOTFOUND) {
Raymond Hettingerf31e1752006-12-08 03:17:18 +00001641 if (set_add_entry(so, &an_entry) == -1)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001642 return NULL;
1643 }
1644 }
1645 Py_RETURN_NONE;
1646 }
1647
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001648 if (PyAnySet_Check(other)) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001649 Py_INCREF(other);
1650 otherset = (PySetObject *)other;
1651 } else {
Christian Heimese93237d2007-12-19 02:37:44 +00001652 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001653 if (otherset == NULL)
1654 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001655 }
1656
Raymond Hettingerc991db22005-08-11 07:58:45 +00001657 while (set_next(otherset, &pos, &entry)) {
1658 int rv = set_discard_entry(so, entry);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001659 if (rv == -1) {
Neal Norwitz04e39ec2006-07-17 00:57:15 +00001660 Py_DECREF(otherset);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001661 return NULL;
1662 }
1663 if (rv == DISCARD_NOTFOUND) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001664 if (set_add_entry(so, entry) == -1) {
Neal Norwitz04e39ec2006-07-17 00:57:15 +00001665 Py_DECREF(otherset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001666 return NULL;
1667 }
1668 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001669 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001670 Py_DECREF(otherset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001671 Py_RETURN_NONE;
1672}
1673
1674PyDoc_STRVAR(symmetric_difference_update_doc,
1675"Update a set with the symmetric difference of itself and another.");
1676
1677static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001678set_symmetric_difference(PySetObject *so, PyObject *other)
1679{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001680 PyObject *rv;
1681 PySetObject *otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001682
Christian Heimese93237d2007-12-19 02:37:44 +00001683 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001684 if (otherset == NULL)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001685 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001686 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1687 if (rv == NULL)
1688 return NULL;
1689 Py_DECREF(rv);
1690 return (PyObject *)otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001691}
1692
1693PyDoc_STRVAR(symmetric_difference_doc,
1694"Return the symmetric difference of two sets as a new set.\n\
1695\n\
1696(i.e. all elements that are in exactly one of the sets.)");
1697
1698static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001699set_xor(PySetObject *so, PyObject *other)
1700{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001701 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001702 Py_INCREF(Py_NotImplemented);
1703 return Py_NotImplemented;
1704 }
1705 return set_symmetric_difference(so, other);
1706}
1707
1708static PyObject *
1709set_ixor(PySetObject *so, PyObject *other)
1710{
1711 PyObject *result;
1712
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001713 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001714 Py_INCREF(Py_NotImplemented);
1715 return Py_NotImplemented;
1716 }
1717 result = set_symmetric_difference_update(so, other);
1718 if (result == NULL)
1719 return NULL;
1720 Py_DECREF(result);
1721 Py_INCREF(so);
1722 return (PyObject *)so;
1723}
1724
1725static PyObject *
1726set_issubset(PySetObject *so, PyObject *other)
1727{
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001728 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001729 Py_ssize_t pos = 0;
Raymond Hettingera690a992003-11-16 16:17:49 +00001730
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001731 if (!PyAnySet_Check(other)) {
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001732 PyObject *tmp, *result;
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001733 tmp = make_new_set(&PySet_Type, other);
1734 if (tmp == NULL)
1735 return NULL;
1736 result = set_issubset(so, tmp);
1737 Py_DECREF(tmp);
1738 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001739 }
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001740 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
Raymond Hettingera690a992003-11-16 16:17:49 +00001741 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001742
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001743 while (set_next(so, &pos, &entry)) {
Raymond Hettingerc563a1c2006-09-07 02:42:48 +00001744 int rv = set_contains_entry((PySetObject *)other, entry);
1745 if (rv == -1)
1746 return NULL;
1747 if (!rv)
Raymond Hettingera690a992003-11-16 16:17:49 +00001748 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001749 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001750 Py_RETURN_TRUE;
1751}
1752
1753PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
1754
1755static PyObject *
1756set_issuperset(PySetObject *so, PyObject *other)
1757{
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001758 PyObject *tmp, *result;
1759
Raymond Hettinger3dbd4c52008-01-25 19:24:46 +00001760 if (!PyAnySet_Check(other)) {
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001761 tmp = make_new_set(&PySet_Type, other);
1762 if (tmp == NULL)
1763 return NULL;
1764 result = set_issuperset(so, tmp);
1765 Py_DECREF(tmp);
1766 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001767 }
1768 return set_issubset((PySetObject *)other, (PyObject *)so);
1769}
1770
1771PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
1772
Raymond Hettingera690a992003-11-16 16:17:49 +00001773static PyObject *
1774set_richcompare(PySetObject *v, PyObject *w, int op)
1775{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001776 PyObject *r1, *r2;
1777
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001778 if(!PyAnySet_Check(w)) {
1779 if (op == Py_EQ)
1780 Py_RETURN_FALSE;
1781 if (op == Py_NE)
1782 Py_RETURN_TRUE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001783 PyErr_SetString(PyExc_TypeError, "can only compare to a set");
1784 return NULL;
1785 }
1786 switch (op) {
1787 case Py_EQ:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001788 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
Raymond Hettingera690a992003-11-16 16:17:49 +00001789 Py_RETURN_FALSE;
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001790 if (v->hash != -1 &&
1791 ((PySetObject *)w)->hash != -1 &&
1792 v->hash != ((PySetObject *)w)->hash)
1793 Py_RETURN_FALSE;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001794 return set_issubset(v, w);
1795 case Py_NE:
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001796 r1 = set_richcompare(v, w, Py_EQ);
1797 if (r1 == NULL)
1798 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001799 r2 = PyBool_FromLong(PyObject_Not(r1));
1800 Py_DECREF(r1);
1801 return r2;
1802 case Py_LE:
1803 return set_issubset(v, w);
1804 case Py_GE:
1805 return set_issuperset(v, w);
1806 case Py_LT:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001807 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001808 Py_RETURN_FALSE;
1809 return set_issubset(v, w);
1810 case Py_GT:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001811 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001812 Py_RETURN_FALSE;
1813 return set_issuperset(v, w);
Raymond Hettingera690a992003-11-16 16:17:49 +00001814 }
1815 Py_INCREF(Py_NotImplemented);
1816 return Py_NotImplemented;
1817}
1818
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001819static int
Georg Brandl347b3002006-03-30 11:57:00 +00001820set_nocmp(PyObject *self, PyObject *other)
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001821{
1822 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
1823 return -1;
1824}
1825
Raymond Hettingera690a992003-11-16 16:17:49 +00001826static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001827set_add(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001828{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001829 if (set_add_key(so, key) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001830 return NULL;
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001831 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001832}
1833
1834PyDoc_STRVAR(add_doc,
1835"Add an element to a set.\n\
1836\n\
1837This has no effect if the element is already present.");
1838
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001839static int
1840set_contains(PySetObject *so, PyObject *key)
1841{
1842 PyObject *tmpkey;
1843 int rv;
1844
1845 rv = set_contains_key(so, key);
1846 if (rv == -1) {
Raymond Hettingerc5a1cc52008-05-08 04:35:20 +00001847 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001848 return -1;
1849 PyErr_Clear();
1850 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1851 if (tmpkey == NULL)
1852 return -1;
1853 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1854 rv = set_contains(so, tmpkey);
1855 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1856 Py_DECREF(tmpkey);
1857 }
1858 return rv;
1859}
1860
1861static PyObject *
1862set_direct_contains(PySetObject *so, PyObject *key)
1863{
1864 long result;
1865
1866 result = set_contains(so, key);
1867 if (result == -1)
1868 return NULL;
1869 return PyBool_FromLong(result);
1870}
1871
1872PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
1873
Raymond Hettingera690a992003-11-16 16:17:49 +00001874static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001875set_remove(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001876{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001877 PyObject *tmpkey, *result;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001878 int rv;
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001879
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001880 rv = set_discard_key(so, key);
1881 if (rv == -1) {
Raymond Hettingerc5a1cc52008-05-08 04:35:20 +00001882 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001883 return NULL;
1884 PyErr_Clear();
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001885 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1886 if (tmpkey == NULL)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001887 return NULL;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001888 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001889 result = set_remove(so, tmpkey);
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001890 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001891 Py_DECREF(tmpkey);
Raymond Hettinger0deab622003-12-13 18:53:18 +00001892 return result;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001893 } else if (rv == DISCARD_NOTFOUND) {
Raymond Hettinger9c14ffb2006-12-08 04:57:50 +00001894 set_key_error(key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001895 return NULL;
1896 }
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001897 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001898}
1899
1900PyDoc_STRVAR(remove_doc,
1901"Remove an element from a set; it must be a member.\n\
1902\n\
1903If the element is not a member, raise a KeyError.");
1904
1905static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001906set_discard(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001907{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001908 PyObject *tmpkey, *result;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001909 int rv;
Raymond Hettinger0deab622003-12-13 18:53:18 +00001910
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001911 rv = set_discard_key(so, key);
1912 if (rv == -1) {
Raymond Hettingerc5a1cc52008-05-08 04:35:20 +00001913 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001914 return NULL;
1915 PyErr_Clear();
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001916 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1917 if (tmpkey == NULL)
Raymond Hettinger0deab622003-12-13 18:53:18 +00001918 return NULL;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001919 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001920 result = set_discard(so, tmpkey);
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001921 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001922 Py_DECREF(tmpkey);
Raymond Hettinger0deab622003-12-13 18:53:18 +00001923 return result;
1924 }
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001925 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001926}
1927
1928PyDoc_STRVAR(discard_doc,
1929"Remove an element from a set if it is a member.\n\
1930\n\
1931If the element is not a member, do nothing.");
1932
1933static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001934set_reduce(PySetObject *so)
1935{
Raymond Hettinger15056a52004-11-09 07:25:31 +00001936 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001937
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001938 keys = PySequence_List((PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001939 if (keys == NULL)
1940 goto done;
1941 args = PyTuple_Pack(1, keys);
1942 if (args == NULL)
1943 goto done;
Raymond Hettinger15056a52004-11-09 07:25:31 +00001944 dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
1945 if (dict == NULL) {
1946 PyErr_Clear();
1947 dict = Py_None;
1948 Py_INCREF(dict);
1949 }
Christian Heimese93237d2007-12-19 02:37:44 +00001950 result = PyTuple_Pack(3, Py_TYPE(so), args, dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001951done:
1952 Py_XDECREF(args);
1953 Py_XDECREF(keys);
Raymond Hettinger15056a52004-11-09 07:25:31 +00001954 Py_XDECREF(dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001955 return result;
1956}
1957
1958PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1959
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00001960static PyObject *
1961set_sizeof(PySetObject *so)
1962{
1963 Py_ssize_t res;
1964
1965 res = sizeof(PySetObject);
1966 if (so->table != so->smalltable)
1967 res = res + (so->mask + 1) * sizeof(setentry);
1968 return PyInt_FromSsize_t(res);
1969}
1970
1971PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes");
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001972static int
1973set_init(PySetObject *self, PyObject *args, PyObject *kwds)
1974{
1975 PyObject *iterable = NULL;
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001976
1977 if (!PyAnySet_Check(self))
1978 return -1;
Christian Heimese93237d2007-12-19 02:37:44 +00001979 if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001980 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001981 set_clear_internal(self);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001982 self->hash = -1;
1983 if (iterable == NULL)
1984 return 0;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001985 return set_update_internal(self, iterable);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001986}
1987
Raymond Hettingera690a992003-11-16 16:17:49 +00001988static PySequenceMethods set_as_sequence = {
Georg Brandl347b3002006-03-30 11:57:00 +00001989 set_len, /* sq_length */
Raymond Hettingera690a992003-11-16 16:17:49 +00001990 0, /* sq_concat */
1991 0, /* sq_repeat */
1992 0, /* sq_item */
1993 0, /* sq_slice */
1994 0, /* sq_ass_item */
1995 0, /* sq_ass_slice */
1996 (objobjproc)set_contains, /* sq_contains */
1997};
1998
1999/* set object ********************************************************/
2000
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002001#ifdef Py_DEBUG
2002static PyObject *test_c_api(PySetObject *so);
2003
2004PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
2005All is well if assertions don't fail.");
2006#endif
2007
Raymond Hettingera690a992003-11-16 16:17:49 +00002008static PyMethodDef set_methods[] = {
2009 {"add", (PyCFunction)set_add, METH_O,
2010 add_doc},
2011 {"clear", (PyCFunction)set_clear, METH_NOARGS,
2012 clear_doc},
Raymond Hettinger0deab622003-12-13 18:53:18 +00002013 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002014 contains_doc},
Raymond Hettingera37430a2008-02-12 19:05:36 +00002015 {"copy", (PyCFunction)set_copy, METH_NOARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002016 copy_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00002017 {"discard", (PyCFunction)set_discard, METH_O,
2018 discard_doc},
Raymond Hettinger4267be62008-06-11 10:30:54 +00002019 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002020 difference_doc},
Raymond Hettinger4267be62008-06-11 10:30:54 +00002021 {"difference_update", (PyCFunction)set_difference_update, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002022 difference_update_doc},
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00002023 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002024 intersection_doc},
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00002025 {"intersection_update",(PyCFunction)set_intersection_update_multi, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002026 intersection_update_doc},
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00002027 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2028 isdisjoint_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00002029 {"issubset", (PyCFunction)set_issubset, METH_O,
2030 issubset_doc},
2031 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2032 issuperset_doc},
2033 {"pop", (PyCFunction)set_pop, METH_NOARGS,
2034 pop_doc},
2035 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2036 reduce_doc},
2037 {"remove", (PyCFunction)set_remove, METH_O,
2038 remove_doc},
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00002039 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2040 sizeof_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00002041 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2042 symmetric_difference_doc},
2043 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
2044 symmetric_difference_update_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002045#ifdef Py_DEBUG
2046 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
2047 test_c_api_doc},
2048#endif
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00002049 {"union", (PyCFunction)set_union, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002050 union_doc},
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00002051 {"update", (PyCFunction)set_update, METH_VARARGS,
Raymond Hettingera38123e2003-11-24 22:18:49 +00002052 update_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00002053 {NULL, NULL} /* sentinel */
2054};
2055
2056static PyNumberMethods set_as_number = {
2057 0, /*nb_add*/
2058 (binaryfunc)set_sub, /*nb_subtract*/
2059 0, /*nb_multiply*/
2060 0, /*nb_divide*/
2061 0, /*nb_remainder*/
2062 0, /*nb_divmod*/
2063 0, /*nb_power*/
2064 0, /*nb_negative*/
2065 0, /*nb_positive*/
2066 0, /*nb_absolute*/
2067 0, /*nb_nonzero*/
2068 0, /*nb_invert*/
2069 0, /*nb_lshift*/
2070 0, /*nb_rshift*/
2071 (binaryfunc)set_and, /*nb_and*/
2072 (binaryfunc)set_xor, /*nb_xor*/
2073 (binaryfunc)set_or, /*nb_or*/
2074 0, /*nb_coerce*/
2075 0, /*nb_int*/
2076 0, /*nb_long*/
2077 0, /*nb_float*/
2078 0, /*nb_oct*/
2079 0, /*nb_hex*/
2080 0, /*nb_inplace_add*/
2081 (binaryfunc)set_isub, /*nb_inplace_subtract*/
2082 0, /*nb_inplace_multiply*/
2083 0, /*nb_inplace_divide*/
2084 0, /*nb_inplace_remainder*/
2085 0, /*nb_inplace_power*/
2086 0, /*nb_inplace_lshift*/
2087 0, /*nb_inplace_rshift*/
2088 (binaryfunc)set_iand, /*nb_inplace_and*/
2089 (binaryfunc)set_ixor, /*nb_inplace_xor*/
2090 (binaryfunc)set_ior, /*nb_inplace_or*/
2091};
2092
2093PyDoc_STRVAR(set_doc,
2094"set(iterable) --> set object\n\
2095\n\
Andrew M. Kuchling52740be2006-07-29 15:10:32 +00002096Build an unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002097
2098PyTypeObject PySet_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002099 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettingera690a992003-11-16 16:17:49 +00002100 "set", /* tp_name */
2101 sizeof(PySetObject), /* tp_basicsize */
2102 0, /* tp_itemsize */
2103 /* methods */
2104 (destructor)set_dealloc, /* tp_dealloc */
2105 (printfunc)set_tp_print, /* tp_print */
2106 0, /* tp_getattr */
2107 0, /* tp_setattr */
Georg Brandl347b3002006-03-30 11:57:00 +00002108 set_nocmp, /* tp_compare */
Raymond Hettingera690a992003-11-16 16:17:49 +00002109 (reprfunc)set_repr, /* tp_repr */
2110 &set_as_number, /* tp_as_number */
2111 &set_as_sequence, /* tp_as_sequence */
2112 0, /* tp_as_mapping */
Nick Coghlan53663a62008-07-15 14:27:37 +00002113 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
Raymond Hettingera690a992003-11-16 16:17:49 +00002114 0, /* tp_call */
2115 0, /* tp_str */
2116 PyObject_GenericGetAttr, /* tp_getattro */
2117 0, /* tp_setattro */
2118 0, /* tp_as_buffer */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002119 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00002120 Py_TPFLAGS_BASETYPE, /* tp_flags */
Raymond Hettingera690a992003-11-16 16:17:49 +00002121 set_doc, /* tp_doc */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002122 (traverseproc)set_traverse, /* tp_traverse */
Raymond Hettingerfe889f32005-08-06 05:43:39 +00002123 (inquiry)set_clear_internal, /* tp_clear */
Raymond Hettingera690a992003-11-16 16:17:49 +00002124 (richcmpfunc)set_richcompare, /* tp_richcompare */
Raymond Hettinger691d8052004-05-30 07:26:47 +00002125 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00002126 (getiterfunc)set_iter, /* tp_iter */
Raymond Hettingera690a992003-11-16 16:17:49 +00002127 0, /* tp_iternext */
2128 set_methods, /* tp_methods */
2129 0, /* tp_members */
2130 0, /* tp_getset */
2131 0, /* tp_base */
2132 0, /* tp_dict */
2133 0, /* tp_descr_get */
2134 0, /* tp_descr_set */
2135 0, /* tp_dictoffset */
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00002136 (initproc)set_init, /* tp_init */
Raymond Hettingera690a992003-11-16 16:17:49 +00002137 PyType_GenericAlloc, /* tp_alloc */
2138 set_new, /* tp_new */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002139 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002140};
2141
2142/* frozenset object ********************************************************/
2143
2144
2145static PyMethodDef frozenset_methods[] = {
Raymond Hettinger0deab622003-12-13 18:53:18 +00002146 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002147 contains_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00002148 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002149 copy_doc},
Raymond Hettinger4267be62008-06-11 10:30:54 +00002150 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002151 difference_doc},
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +00002152 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002153 intersection_doc},
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00002154 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2155 isdisjoint_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00002156 {"issubset", (PyCFunction)set_issubset, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00002157 issubset_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00002158 {"issuperset", (PyCFunction)set_issuperset, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00002159 issuperset_doc},
2160 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2161 reduce_doc},
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00002162 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2163 sizeof_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00002164 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2165 symmetric_difference_doc},
Raymond Hettingeree4bcad2008-06-09 08:33:37 +00002166 {"union", (PyCFunction)set_union, METH_VARARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00002167 union_doc},
2168 {NULL, NULL} /* sentinel */
2169};
2170
2171static PyNumberMethods frozenset_as_number = {
2172 0, /*nb_add*/
2173 (binaryfunc)set_sub, /*nb_subtract*/
2174 0, /*nb_multiply*/
2175 0, /*nb_divide*/
2176 0, /*nb_remainder*/
2177 0, /*nb_divmod*/
2178 0, /*nb_power*/
2179 0, /*nb_negative*/
2180 0, /*nb_positive*/
2181 0, /*nb_absolute*/
2182 0, /*nb_nonzero*/
2183 0, /*nb_invert*/
2184 0, /*nb_lshift*/
2185 0, /*nb_rshift*/
2186 (binaryfunc)set_and, /*nb_and*/
2187 (binaryfunc)set_xor, /*nb_xor*/
2188 (binaryfunc)set_or, /*nb_or*/
2189};
2190
2191PyDoc_STRVAR(frozenset_doc,
2192"frozenset(iterable) --> frozenset object\n\
2193\n\
Andrew M. Kuchling52740be2006-07-29 15:10:32 +00002194Build an immutable unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002195
2196PyTypeObject PyFrozenSet_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002197 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettingera690a992003-11-16 16:17:49 +00002198 "frozenset", /* tp_name */
2199 sizeof(PySetObject), /* tp_basicsize */
Raymond Hettingera3b11e72003-12-31 14:08:58 +00002200 0, /* tp_itemsize */
2201 /* methods */
Raymond Hettingera690a992003-11-16 16:17:49 +00002202 (destructor)set_dealloc, /* tp_dealloc */
2203 (printfunc)set_tp_print, /* tp_print */
2204 0, /* tp_getattr */
2205 0, /* tp_setattr */
Georg Brandl347b3002006-03-30 11:57:00 +00002206 set_nocmp, /* tp_compare */
Raymond Hettingera690a992003-11-16 16:17:49 +00002207 (reprfunc)set_repr, /* tp_repr */
2208 &frozenset_as_number, /* tp_as_number */
2209 &set_as_sequence, /* tp_as_sequence */
2210 0, /* tp_as_mapping */
2211 frozenset_hash, /* tp_hash */
2212 0, /* tp_call */
2213 0, /* tp_str */
2214 PyObject_GenericGetAttr, /* tp_getattro */
2215 0, /* tp_setattro */
2216 0, /* tp_as_buffer */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002217 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00002218 Py_TPFLAGS_BASETYPE, /* tp_flags */
Raymond Hettingera690a992003-11-16 16:17:49 +00002219 frozenset_doc, /* tp_doc */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002220 (traverseproc)set_traverse, /* tp_traverse */
Raymond Hettingerfe889f32005-08-06 05:43:39 +00002221 (inquiry)set_clear_internal, /* tp_clear */
Raymond Hettingera690a992003-11-16 16:17:49 +00002222 (richcmpfunc)set_richcompare, /* tp_richcompare */
Raymond Hettinger691d8052004-05-30 07:26:47 +00002223 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
Raymond Hettingera690a992003-11-16 16:17:49 +00002224 (getiterfunc)set_iter, /* tp_iter */
2225 0, /* tp_iternext */
2226 frozenset_methods, /* tp_methods */
2227 0, /* tp_members */
2228 0, /* tp_getset */
2229 0, /* tp_base */
2230 0, /* tp_dict */
2231 0, /* tp_descr_get */
2232 0, /* tp_descr_set */
2233 0, /* tp_dictoffset */
2234 0, /* tp_init */
2235 PyType_GenericAlloc, /* tp_alloc */
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00002236 frozenset_new, /* tp_new */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002237 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002238};
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002239
2240
2241/***** C API functions *************************************************/
2242
2243PyObject *
2244PySet_New(PyObject *iterable)
2245{
2246 return make_new_set(&PySet_Type, iterable);
2247}
2248
2249PyObject *
2250PyFrozenSet_New(PyObject *iterable)
2251{
Raymond Hettingerecdcb582008-01-28 20:34:33 +00002252 return make_new_set(&PyFrozenSet_Type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002253}
2254
Neal Norwitz8c49c822006-03-04 18:41:19 +00002255Py_ssize_t
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002256PySet_Size(PyObject *anyset)
2257{
2258 if (!PyAnySet_Check(anyset)) {
2259 PyErr_BadInternalCall();
2260 return -1;
2261 }
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00002262 return PySet_GET_SIZE(anyset);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002263}
2264
2265int
Barry Warsaw176014f2006-03-30 22:45:35 +00002266PySet_Clear(PyObject *set)
2267{
Raymond Hettinger7759a0c2008-01-28 21:47:42 +00002268 if (!PySet_Check(set)) {
Barry Warsaw176014f2006-03-30 22:45:35 +00002269 PyErr_BadInternalCall();
2270 return -1;
2271 }
2272 return set_clear_internal((PySetObject *)set);
2273}
2274
2275int
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002276PySet_Contains(PyObject *anyset, PyObject *key)
2277{
2278 if (!PyAnySet_Check(anyset)) {
2279 PyErr_BadInternalCall();
2280 return -1;
2281 }
2282 return set_contains_key((PySetObject *)anyset, key);
2283}
2284
2285int
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002286PySet_Discard(PyObject *set, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002287{
Raymond Hettinger7759a0c2008-01-28 21:47:42 +00002288 if (!PySet_Check(set)) {
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002289 PyErr_BadInternalCall();
2290 return -1;
2291 }
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002292 return set_discard_key((PySetObject *)set, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002293}
2294
2295int
Raymond Hettingerecdcb582008-01-28 20:34:33 +00002296PySet_Add(PyObject *anyset, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002297{
Amaury Forgeot d'Arccab3d982008-02-03 22:51:43 +00002298 if (!PySet_Check(anyset) &&
2299 (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
Raymond Hettingerdee3f652008-01-26 09:31:11 +00002300 PyErr_BadInternalCall();
2301 return -1;
2302 }
Raymond Hettingerecdcb582008-01-28 20:34:33 +00002303 return set_add_key((PySetObject *)anyset, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002304}
2305
Barry Warsaw176014f2006-03-30 22:45:35 +00002306int
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00002307_PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key)
Barry Warsaw176014f2006-03-30 22:45:35 +00002308{
2309 setentry *entry_ptr;
2310
2311 if (!PyAnySet_Check(set)) {
2312 PyErr_BadInternalCall();
2313 return -1;
2314 }
2315 if (set_next((PySetObject *)set, pos, &entry_ptr) == 0)
2316 return 0;
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +00002317 *key = entry_ptr->key;
2318 return 1;
2319}
2320
2321int
2322_PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash)
2323{
2324 setentry *entry;
2325
2326 if (!PyAnySet_Check(set)) {
2327 PyErr_BadInternalCall();
2328 return -1;
2329 }
2330 if (set_next((PySetObject *)set, pos, &entry) == 0)
2331 return 0;
2332 *key = entry->key;
2333 *hash = entry->hash;
Barry Warsaw176014f2006-03-30 22:45:35 +00002334 return 1;
2335}
2336
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002337PyObject *
2338PySet_Pop(PyObject *set)
2339{
Raymond Hettinger7759a0c2008-01-28 21:47:42 +00002340 if (!PySet_Check(set)) {
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002341 PyErr_BadInternalCall();
2342 return NULL;
2343 }
2344 return set_pop((PySetObject *)set);
2345}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002346
Barry Warsaw176014f2006-03-30 22:45:35 +00002347int
2348_PySet_Update(PyObject *set, PyObject *iterable)
2349{
Raymond Hettinger7759a0c2008-01-28 21:47:42 +00002350 if (!PySet_Check(set)) {
Barry Warsaw176014f2006-03-30 22:45:35 +00002351 PyErr_BadInternalCall();
2352 return -1;
2353 }
2354 return set_update_internal((PySetObject *)set, iterable);
2355}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002356
2357#ifdef Py_DEBUG
2358
2359/* Test code to be called with any three element set.
2360 Returns True and original set is restored. */
2361
2362#define assertRaises(call_return_value, exception) \
2363 do { \
2364 assert(call_return_value); \
2365 assert(PyErr_ExceptionMatches(exception)); \
2366 PyErr_Clear(); \
2367 } while(0)
2368
2369static PyObject *
2370test_c_api(PySetObject *so)
2371{
Neal Norwitz0f2783c2006-06-19 05:40:44 +00002372 Py_ssize_t count;
Barry Warsaw176014f2006-03-30 22:45:35 +00002373 char *s;
2374 Py_ssize_t i;
Guido van Rossum360496d2007-05-10 17:20:15 +00002375 PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x;
Barry Warsaw176014f2006-03-30 22:45:35 +00002376 PyObject *ob = (PyObject *)so;
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002377
2378 /* Verify preconditions and exercise type/size checks */
2379 assert(PyAnySet_Check(ob));
2380 assert(PyAnySet_CheckExact(ob));
2381 assert(!PyFrozenSet_CheckExact(ob));
2382 assert(PySet_Size(ob) == 3);
2383 assert(PySet_GET_SIZE(ob) == 3);
2384
2385 /* Raise TypeError for non-iterable constructor arguments */
2386 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2387 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
2388
2389 /* Raise TypeError for unhashable key */
2390 dup = PySet_New(ob);
2391 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2392 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2393 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
2394
2395 /* Exercise successful pop, contains, add, and discard */
2396 elem = PySet_Pop(ob);
2397 assert(PySet_Contains(ob, elem) == 0);
2398 assert(PySet_GET_SIZE(ob) == 2);
2399 assert(PySet_Add(ob, elem) == 0);
2400 assert(PySet_Contains(ob, elem) == 1);
2401 assert(PySet_GET_SIZE(ob) == 3);
2402 assert(PySet_Discard(ob, elem) == 1);
2403 assert(PySet_GET_SIZE(ob) == 2);
2404 assert(PySet_Discard(ob, elem) == 0);
2405 assert(PySet_GET_SIZE(ob) == 2);
2406
Barry Warsaw176014f2006-03-30 22:45:35 +00002407 /* Exercise clear */
2408 dup2 = PySet_New(dup);
2409 assert(PySet_Clear(dup2) == 0);
2410 assert(PySet_Size(dup2) == 0);
2411 Py_DECREF(dup2);
2412
2413 /* Raise SystemError on clear or update of frozen set */
2414 f = PyFrozenSet_New(dup);
2415 assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
2416 assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
Amaury Forgeot d'Arccab3d982008-02-03 22:51:43 +00002417 assert(PySet_Add(f, elem) == 0);
2418 Py_INCREF(f);
2419 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2420 Py_DECREF(f);
Barry Warsaw176014f2006-03-30 22:45:35 +00002421 Py_DECREF(f);
2422
2423 /* Exercise direct iteration */
2424 i = 0, count = 0;
Guido van Rossum360496d2007-05-10 17:20:15 +00002425 while (_PySet_Next((PyObject *)dup, &i, &x)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002426 s = PyString_AsString(x);
Barry Warsaw176014f2006-03-30 22:45:35 +00002427 assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c'));
2428 count++;
2429 }
2430 assert(count == 3);
2431
2432 /* Exercise updates */
2433 dup2 = PySet_New(NULL);
2434 assert(_PySet_Update(dup2, dup) == 0);
2435 assert(PySet_Size(dup2) == 3);
2436 assert(_PySet_Update(dup2, dup) == 0);
2437 assert(PySet_Size(dup2) == 3);
2438 Py_DECREF(dup2);
2439
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002440 /* Raise SystemError when self argument is not a set or frozenset. */
2441 t = PyTuple_New(0);
2442 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2443 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2444 Py_DECREF(t);
2445
2446 /* Raise SystemError when self argument is not a set. */
2447 f = PyFrozenSet_New(dup);
2448 assert(PySet_Size(f) == 3);
2449 assert(PyFrozenSet_CheckExact(f));
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002450 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2451 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2452 Py_DECREF(f);
2453
2454 /* Raise KeyError when popping from an empty set */
Raymond Hettingerd8e13382005-08-17 12:27:17 +00002455 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
2456 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002457 assert(PySet_GET_SIZE(ob) == 0);
2458 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
2459
Raymond Hettingerd8e13382005-08-17 12:27:17 +00002460 /* Restore the set from the copy using the PyNumber API */
2461 assert(PyNumber_InPlaceOr(ob, dup) == ob);
2462 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002463
2464 /* Verify constructors accept NULL arguments */
2465 f = PySet_New(NULL);
2466 assert(f != NULL);
2467 assert(PySet_GET_SIZE(f) == 0);
2468 Py_DECREF(f);
2469 f = PyFrozenSet_New(NULL);
2470 assert(f != NULL);
2471 assert(PyFrozenSet_CheckExact(f));
2472 assert(PySet_GET_SIZE(f) == 0);
2473 Py_DECREF(f);
2474
2475 Py_DECREF(elem);
2476 Py_DECREF(dup);
2477 Py_RETURN_TRUE;
2478}
2479
Raymond Hettinger9bda1d62005-09-16 07:14:21 +00002480#undef assertRaises
2481
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002482#endif