blob: 0041a10106fa6b69479cc97f588b8f7f11805279 [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
Raymond Hettingera9d99362005-08-05 00:01:15 +00006 Copyright (c) 2003-5 Python Software Foundation.
7 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
13/* This must be >= 1. */
14#define PERTURB_SHIFT 5
15
16/* Object used as dummy key to fill deleted entries */
Raymond Hettingera9d99362005-08-05 00:01:15 +000017static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000018
Raymond Hettingerbc841a12005-08-07 13:02:53 +000019#define INIT_NONZERO_SET_SLOTS(so) do { \
20 (so)->table = (so)->smalltable; \
21 (so)->mask = PySet_MINSIZE - 1; \
22 (so)->hash = -1; \
23 } while(0)
24
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000025#define EMPTY_TO_MINSIZE(so) do { \
26 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \
27 (so)->used = (so)->fill = 0; \
Raymond Hettingerbc841a12005-08-07 13:02:53 +000028 INIT_NONZERO_SET_SLOTS(so); \
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000029 } while(0)
30
Raymond Hettingerbc841a12005-08-07 13:02:53 +000031/* Reuse scheme to save calls to malloc, free, and memset */
32#define MAXFREESETS 80
33static PySetObject *free_sets[MAXFREESETS];
34static int num_free_sets = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000035
36/*
37The basic lookup function used by all operations.
38This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
39Open addressing is preferred over chaining since the link overhead for
40chaining would be substantial (100% with typical malloc overhead).
41
42The initial probe index is computed as hash mod the table size. Subsequent
Raymond Hettingerbc841a12005-08-07 13:02:53 +000043probe indices are computed as explained in Objects/dictobject.c.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000044
45All arithmetic on hash should ignore overflow.
46
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000047Unlike the dictionary implementation, the lookkey functions can return
48NULL if the rich comparison returns an error.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000049*/
50
51static setentry *
52set_lookkey(PySetObject *so, PyObject *key, register long hash)
53{
Martin v. Löwis18e16552006-02-15 17:27:45 +000054 register Py_ssize_t i;
55 register size_t perturb;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000056 register setentry *freeslot;
57 register unsigned int mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000058 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000059 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000060 register int cmp;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000061 PyObject *startkey;
62
63 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000064 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000065 if (entry->key == NULL || entry->key == key)
66 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000067
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000068 if (entry->key == dummy)
69 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000070 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000071 if (entry->hash == hash) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000072 startkey = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000073 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
74 if (cmp < 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000075 return NULL;
Raymond Hettingera580c472005-08-05 17:19:54 +000076 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000077 if (cmp > 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000078 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000079 }
80 else {
81 /* The compare did major nasty stuff to the
82 * set: start over.
83 */
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000084 return set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000085 }
86 }
87 freeslot = NULL;
88 }
89
90 /* In the loop, key == dummy is by far (factor of 100s) the
91 least likely outcome, so test for that last. */
92 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
93 i = (i << 2) + i + perturb + 1;
Raymond Hettingera580c472005-08-05 17:19:54 +000094 entry = &table[i & mask];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000095 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000096 if (freeslot != NULL)
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000097 entry = freeslot;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000098 break;
99 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000100 if (entry->key == key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000101 break;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000102 if (entry->hash == hash && entry->key != dummy) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000103 startkey = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000104 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
105 if (cmp < 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000106 return NULL;
Raymond Hettingera580c472005-08-05 17:19:54 +0000107 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000108 if (cmp > 0)
109 break;
110 }
111 else {
112 /* The compare did major nasty stuff to the
113 * set: start over.
114 */
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000115 return set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000116 }
117 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000118 else if (entry->key == dummy && freeslot == NULL)
119 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000120 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000121 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000122}
123
124/*
125 * Hacked up version of set_lookkey which can assume keys are always strings;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000126 * This means we can always use _PyString_Eq directly and not have to check to
127 * see if the comparison altered the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000128 */
129static setentry *
130set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
131{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000132 register Py_ssize_t i;
133 register size_t perturb;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000134 register setentry *freeslot;
135 register unsigned int mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000136 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000137 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000138
139 /* Make sure this function doesn't have to handle non-string keys,
140 including subclasses of str; e.g., one reason to subclass
141 strings is to override __eq__, and for speed we don't cater to
142 that here. */
143 if (!PyString_CheckExact(key)) {
144 so->lookup = set_lookkey;
145 return set_lookkey(so, key, hash);
146 }
147 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000148 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000149 if (entry->key == NULL || entry->key == key)
150 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000151 if (entry->key == dummy)
152 freeslot = entry;
153 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000154 if (entry->hash == hash && _PyString_Eq(entry->key, key))
155 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000156 freeslot = NULL;
157 }
158
159 /* In the loop, key == dummy is by far (factor of 100s) the
160 least likely outcome, so test for that last. */
161 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
162 i = (i << 2) + i + perturb + 1;
163 entry = &table[i & mask];
164 if (entry->key == NULL)
165 return freeslot == NULL ? entry : freeslot;
166 if (entry->key == key
167 || (entry->hash == hash
168 && entry->key != dummy
169 && _PyString_Eq(entry->key, key)))
170 return entry;
171 if (entry->key == dummy && freeslot == NULL)
172 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000173 }
174}
175
176/*
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000177Internal routine to insert a new key into the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000178Used both by the internal resize routine and by the public insert routine.
179Eats a reference to key.
180*/
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000181static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000182set_insert_key(register PySetObject *so, PyObject *key, long hash)
183{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000184 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000185 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
186
187 assert(so->lookup != NULL);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000188 entry = so->lookup(so, key, hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000189 if (entry == NULL)
190 return -1;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000191 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000192 /* UNUSED */
193 so->fill++;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000194 entry->key = key;
195 entry->hash = hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000196 so->used++;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000197 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000198 /* DUMMY */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000199 entry->key = key;
200 entry->hash = hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000201 so->used++;
202 Py_DECREF(dummy);
203 } else {
204 /* ACTIVE */
205 Py_DECREF(key);
206 }
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000207 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000208}
209
210/*
211Restructure the table by allocating a new table and reinserting all
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000212keys again. When entries have been deleted, the new table may
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000213actually be smaller than the old one.
214*/
215static int
216set_table_resize(PySetObject *so, int minused)
217{
218 int newsize;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000219 setentry *oldtable, *newtable, *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000220 int i;
221 int is_oldtable_malloced;
222 setentry small_copy[PySet_MINSIZE];
223
224 assert(minused >= 0);
225
226 /* Find the smallest table size > minused. */
227 for (newsize = PySet_MINSIZE;
228 newsize <= minused && newsize > 0;
229 newsize <<= 1)
230 ;
231 if (newsize <= 0) {
232 PyErr_NoMemory();
233 return -1;
234 }
235
236 /* Get space for a new table. */
237 oldtable = so->table;
238 assert(oldtable != NULL);
239 is_oldtable_malloced = oldtable != so->smalltable;
240
241 if (newsize == PySet_MINSIZE) {
242 /* A large table is shrinking, or we can't get any smaller. */
243 newtable = so->smalltable;
244 if (newtable == oldtable) {
245 if (so->fill == so->used) {
246 /* No dummies, so no point doing anything. */
247 return 0;
248 }
249 /* We're not going to resize it, but rebuild the
250 table anyway to purge old dummy entries.
251 Subtle: This is *necessary* if fill==size,
252 as set_lookkey needs at least one virgin slot to
253 terminate failing searches. If fill < size, it's
254 merely desirable, as dummies slow searches. */
255 assert(so->fill > so->used);
256 memcpy(small_copy, oldtable, sizeof(small_copy));
257 oldtable = small_copy;
258 }
259 }
260 else {
261 newtable = PyMem_NEW(setentry, newsize);
262 if (newtable == NULL) {
263 PyErr_NoMemory();
264 return -1;
265 }
266 }
267
268 /* Make the set empty, using the new table. */
269 assert(newtable != oldtable);
270 so->table = newtable;
271 so->mask = newsize - 1;
272 memset(newtable, 0, sizeof(setentry) * newsize);
273 so->used = 0;
274 i = so->fill;
275 so->fill = 0;
276
277 /* Copy the data over; this is refcount-neutral for active entries;
278 dummy entries aren't copied over, of course */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000279 for (entry = oldtable; i > 0; entry++) {
280 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000281 /* UNUSED */
282 ;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000283 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000284 /* DUMMY */
285 --i;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000286 assert(entry->key == dummy);
287 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000288 } else {
289 /* ACTIVE */
290 --i;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000291 if(set_insert_key(so, entry->key, entry->hash) == -1) {
292 if (is_oldtable_malloced)
293 PyMem_DEL(oldtable);
294 return -1;
295 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000296 }
297 }
298
299 if (is_oldtable_malloced)
300 PyMem_DEL(oldtable);
301 return 0;
302}
303
Raymond Hettingerc991db22005-08-11 07:58:45 +0000304/* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
305
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000306static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000307set_add_entry(register PySetObject *so, setentry *entry)
308{
309 register int n_used;
310
311 assert(so->fill <= so->mask); /* at least one empty slot */
312 n_used = so->used;
313 Py_INCREF(entry->key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000314 if (set_insert_key(so, entry->key, entry->hash) == -1)
315 return -1;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000316 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
317 return 0;
318 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
319}
320
321static int
322set_add_key(register PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000323{
324 register long hash;
325 register int n_used;
326
Raymond Hettingerc991db22005-08-11 07:58:45 +0000327 if (!PyString_CheckExact(key) ||
328 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000329 hash = PyObject_Hash(key);
330 if (hash == -1)
331 return -1;
332 }
333 assert(so->fill <= so->mask); /* at least one empty slot */
334 n_used = so->used;
335 Py_INCREF(key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000336 if (set_insert_key(so, key, hash) == -1) {
337 Py_DECREF(key);
338 return -1;
339 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000340 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
341 return 0;
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000342 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000343}
344
345#define DISCARD_NOTFOUND 0
346#define DISCARD_FOUND 1
347
348static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000349set_discard_entry(PySetObject *so, setentry *oldentry)
350{ register setentry *entry;
351 PyObject *old_key;
352
353 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000354 if (entry == NULL)
355 return -1;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000356 if (entry->key == NULL || entry->key == dummy)
357 return DISCARD_NOTFOUND;
358 old_key = entry->key;
359 Py_INCREF(dummy);
360 entry->key = dummy;
361 so->used--;
362 Py_DECREF(old_key);
363 return DISCARD_FOUND;
364}
365
366static int
367set_discard_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000368{
369 register long hash;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000370 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000371 PyObject *old_key;
372
373 assert (PyAnySet_Check(so));
374 if (!PyString_CheckExact(key) ||
375 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
376 hash = PyObject_Hash(key);
377 if (hash == -1)
378 return -1;
379 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000380 entry = (so->lookup)(so, key, hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000381 if (entry == NULL)
382 return -1;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000383 if (entry->key == NULL || entry->key == dummy)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000384 return DISCARD_NOTFOUND;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000385 old_key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000386 Py_INCREF(dummy);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000387 entry->key = dummy;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000388 so->used--;
389 Py_DECREF(old_key);
390 return DISCARD_FOUND;
391}
392
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000393static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000394set_clear_internal(PySetObject *so)
395{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000396 setentry *entry, *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000397 int table_is_malloced;
398 int fill;
399 setentry small_copy[PySet_MINSIZE];
400#ifdef Py_DEBUG
401 int i, n;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000402 assert (PyAnySet_Check(so));
Raymond Hettingera580c472005-08-05 17:19:54 +0000403
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000404 n = so->mask + 1;
405 i = 0;
406#endif
407
408 table = so->table;
409 assert(table != NULL);
410 table_is_malloced = table != so->smalltable;
411
412 /* This is delicate. During the process of clearing the set,
413 * decrefs can cause the set to mutate. To avoid fatal confusion
414 * (voice of experience), we have to make the set empty before
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000415 * clearing the slots, and never refer to anything via so->ref while
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000416 * clearing.
417 */
418 fill = so->fill;
419 if (table_is_malloced)
420 EMPTY_TO_MINSIZE(so);
421
422 else if (fill > 0) {
423 /* It's a small table with something that needs to be cleared.
424 * Afraid the only safe way is to copy the set entries into
425 * another small table first.
426 */
427 memcpy(small_copy, table, sizeof(small_copy));
428 table = small_copy;
429 EMPTY_TO_MINSIZE(so);
430 }
431 /* else it's a small table that's already empty */
432
433 /* Now we can finally clear things. If C had refcounts, we could
434 * assert that the refcount on table is 1 now, i.e. that this function
435 * has unique access to it, so decref side-effects can't alter it.
436 */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000437 for (entry = table; fill > 0; ++entry) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000438#ifdef Py_DEBUG
439 assert(i < n);
440 ++i;
441#endif
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000442 if (entry->key) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000443 --fill;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000444 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000445 }
446#ifdef Py_DEBUG
447 else
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000448 assert(entry->key == NULL || entry->key == dummy);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000449#endif
450 }
451
452 if (table_is_malloced)
453 PyMem_DEL(table);
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000454 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000455}
456
457/*
458 * Iterate over a set table. Use like so:
459 *
Raymond Hettingerd7946662005-08-01 21:39:29 +0000460 * int pos;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000461 * setentry *entry;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000462 * pos = 0; # important! pos should not otherwise be changed by you
Raymond Hettingerc991db22005-08-11 07:58:45 +0000463 * while (set_next(yourset, &pos, &entry)) {
464 * Refer to borrowed reference in entry->key.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000465 * }
466 *
Raymond Hettingerc991db22005-08-11 07:58:45 +0000467 * CAUTION: In general, it isn't safe to use set_next in a loop that
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000468 * mutates the table.
469 */
470static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000472{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 Py_ssize_t i;
474 int mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000475 register setentry *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000476
477 assert (PyAnySet_Check(so));
Raymond Hettingerc991db22005-08-11 07:58:45 +0000478 i = *pos_ptr;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000479 assert(i >= 0);
Raymond Hettingerc991db22005-08-11 07:58:45 +0000480 table = so->table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000481 mask = so->mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000482 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000483 i++;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000484 *pos_ptr = i+1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000485 if (i > mask)
486 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000487 assert(table[i].key != NULL);
488 *entry_ptr = &table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000489 return 1;
490}
491
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000492static void
493set_dealloc(PySetObject *so)
494{
495 register setentry *entry;
496 int fill = so->fill;
497 PyObject_GC_UnTrack(so);
498 Py_TRASHCAN_SAFE_BEGIN(so)
499 if (so->weakreflist != NULL)
500 PyObject_ClearWeakRefs((PyObject *) so);
501
502 for (entry = so->table; fill > 0; entry++) {
503 if (entry->key) {
504 --fill;
505 Py_DECREF(entry->key);
506 }
507 }
508 if (so->table != so->smalltable)
509 PyMem_DEL(so->table);
510 if (num_free_sets < MAXFREESETS && PyAnySet_CheckExact(so))
511 free_sets[num_free_sets++] = so;
512 else
513 so->ob_type->tp_free(so);
514 Py_TRASHCAN_SAFE_END(so)
515}
516
517static int
518set_tp_print(PySetObject *so, FILE *fp, int flags)
519{
520 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000521 Py_ssize_t pos=0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000522 char *emit = ""; /* No separator emitted on first pass */
523 char *separator = ", ";
524
525 fprintf(fp, "%s([", so->ob_type->tp_name);
526 while (set_next(so, &pos, &entry)) {
527 fputs(emit, fp);
528 emit = separator;
529 if (PyObject_Print(entry->key, fp, 0) != 0)
530 return -1;
531 }
532 fputs("])", fp);
533 return 0;
534}
535
536static PyObject *
537set_repr(PySetObject *so)
538{
539 PyObject *keys, *result, *listrepr;
540
541 keys = PySequence_List((PyObject *)so);
542 if (keys == NULL)
543 return NULL;
544 listrepr = PyObject_Repr(keys);
545 Py_DECREF(keys);
546 if (listrepr == NULL)
547 return NULL;
548
549 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
550 PyString_AS_STRING(listrepr));
551 Py_DECREF(listrepr);
552 return result;
553}
554
Martin v. Löwis18e16552006-02-15 17:27:45 +0000555static Py_ssize_t
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000556set_len(PyObject *so)
557{
558 return ((PySetObject *)so)->used;
559}
560
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000561static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000562set_merge(PySetObject *so, PyObject *otherset)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000563{
Raymond Hettingerd7946662005-08-01 21:39:29 +0000564 PySetObject *other;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000565 register int i;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000566 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000567
568 assert (PyAnySet_Check(so));
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000569 assert (PyAnySet_Check(otherset));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000570
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000571 other = (PySetObject*)otherset;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000572 if (other == so || other->used == 0)
573 /* a.update(a) or a.update({}); nothing to do */
574 return 0;
575 /* Do one big resize at the start, rather than
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000576 * incrementally resizing as we insert new keys. Expect
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000577 * that there will be no (or few) overlapping keys.
578 */
579 if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
580 if (set_table_resize(so, (so->used + other->used)*2) != 0)
581 return -1;
582 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000583 for (i = 0; i <= other->mask; i++) {
584 entry = &other->table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000585 if (entry->key != NULL &&
586 entry->key != dummy) {
587 Py_INCREF(entry->key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000588 if (set_insert_key(so, entry->key, entry->hash) == -1) {
589 Py_DECREF(entry->key);
590 return -1;
591 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000592 }
593 }
594 return 0;
595}
596
597static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000598set_contains_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000599{
600 long hash;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000601 setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000602
603 if (!PyString_CheckExact(key) ||
604 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
605 hash = PyObject_Hash(key);
606 if (hash == -1)
607 return -1;
608 }
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000609 entry = (so->lookup)(so, key, hash);
610 if (entry == NULL)
611 return -1;
612 key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000613 return key != NULL && key != dummy;
614}
615
Raymond Hettingerc991db22005-08-11 07:58:45 +0000616static int
617set_contains_entry(PySetObject *so, setentry *entry)
618{
619 PyObject *key;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000620 setentry *lu_entry;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000621
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000622 lu_entry = (so->lookup)(so, entry->key, entry->hash);
623 if (lu_entry == NULL)
624 return -1;
625 key = lu_entry->key;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000626 return key != NULL && key != dummy;
627}
628
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000629static PyObject *
630set_pop(PySetObject *so)
631{
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000632 register int i = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000633 register setentry *entry;
634 PyObject *key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000635
636 assert (PyAnySet_Check(so));
637 if (so->used == 0) {
638 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
639 return NULL;
640 }
641
642 /* Set entry to "the first" unused or dummy set entry. We abuse
643 * the hash field of slot 0 to hold a search finger:
644 * If slot 0 has a value, use slot 0.
645 * Else slot 0 is being used to hold a search finger,
646 * and we use its hash value as the first index to look.
647 */
648 entry = &so->table[0];
649 if (entry->key == NULL || entry->key == dummy) {
650 i = (int)entry->hash;
651 /* The hash field may be a real hash value, or it may be a
652 * legit search finger, or it may be a once-legit search
653 * finger that's out of bounds now because it wrapped around
654 * or the table shrunk -- simply make sure it's in bounds now.
655 */
656 if (i > so->mask || i < 1)
657 i = 1; /* skip slot 0 */
658 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
659 i++;
660 if (i > so->mask)
661 i = 1;
662 }
663 }
664 key = entry->key;
665 Py_INCREF(dummy);
666 entry->key = dummy;
667 so->used--;
668 so->table[0].hash = i + 1; /* next place to start */
669 return key;
670}
671
672PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
673
674static int
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000675set_traverse(PySetObject *so, visitproc visit, void *arg)
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000676{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000677 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000678 setentry *entry;
679
680 while (set_next(so, &pos, &entry))
681 Py_VISIT(entry->key);
682 return 0;
683}
684
685static long
686frozenset_hash(PyObject *self)
687{
688 PySetObject *so = (PySetObject *)self;
689 long h, hash = 1927868237L;
690 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000692
693 if (so->hash != -1)
694 return so->hash;
695
696 hash *= PySet_GET_SIZE(self) + 1;
697 while (set_next(so, &pos, &entry)) {
698 /* Work to increase the bit dispersion for closely spaced hash
699 values. The is important because some use cases have many
700 combinations of a small number of elements with nearby
701 hashes so that many distinct combinations collapse to only
702 a handful of distinct hash values. */
703 h = entry->hash;
704 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
705 }
706 hash = hash * 69069L + 907133923L;
707 if (hash == -1)
708 hash = 590923713L;
709 so->hash = hash;
710 return hash;
711}
712
713static long
714set_nohash(PyObject *self)
715{
716 PyErr_SetString(PyExc_TypeError, "set objects are unhashable");
717 return -1;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000718}
719
Raymond Hettingera9d99362005-08-05 00:01:15 +0000720/***** Set iterator type ***********************************************/
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000721
Raymond Hettingerd7946662005-08-01 21:39:29 +0000722static PyTypeObject PySetIter_Type; /* Forward */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000723
724typedef struct {
725 PyObject_HEAD
726 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
727 int si_used;
728 int si_pos;
729 long len;
730} setiterobject;
731
732static PyObject *
733set_iter(PySetObject *so)
734{
735 setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
736 if (si == NULL)
737 return NULL;
738 Py_INCREF(so);
739 si->si_set = so;
740 si->si_used = so->used;
741 si->si_pos = 0;
742 si->len = so->used;
743 return (PyObject *)si;
744}
745
746static void
747setiter_dealloc(setiterobject *si)
748{
749 Py_XDECREF(si->si_set);
750 PyObject_Del(si);
751}
752
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000753static PyObject *
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000754setiter_len(setiterobject *si)
755{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000756 long len = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000757 if (si->si_set != NULL && si->si_used == si->si_set->used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000758 len = si->len;
759 return PyInt_FromLong(len);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000760}
761
Armin Rigof5b3e362006-02-11 21:32:43 +0000762PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000763
764static PyMethodDef setiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000765 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000766 {NULL, NULL} /* sentinel */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000767};
768
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000769static PyObject *setiter_iternext(setiterobject *si)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000770{
771 PyObject *key;
772 register int i, mask;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000773 register setentry *entry;
774 PySetObject *so = si->si_set;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000775
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000776 if (so == NULL)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000777 return NULL;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000778 assert (PyAnySet_Check(so));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000779
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000780 if (si->si_used != so->used) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000781 PyErr_SetString(PyExc_RuntimeError,
782 "Set changed size during iteration");
783 si->si_used = -1; /* Make this state sticky */
784 return NULL;
785 }
786
787 i = si->si_pos;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000788 assert(i>=0);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000789 entry = so->table;
790 mask = so->mask;
791 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000792 i++;
793 si->si_pos = i+1;
794 if (i > mask)
795 goto fail;
796 si->len--;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000797 key = entry[i].key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000798 Py_INCREF(key);
799 return key;
800
801fail:
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000802 Py_DECREF(so);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000803 si->si_set = NULL;
804 return NULL;
805}
806
Hye-Shik Change2956762005-08-01 05:26:41 +0000807static PyTypeObject PySetIter_Type = {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000808 PyObject_HEAD_INIT(&PyType_Type)
809 0, /* ob_size */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000810 "setiterator", /* tp_name */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000811 sizeof(setiterobject), /* tp_basicsize */
812 0, /* tp_itemsize */
813 /* methods */
814 (destructor)setiter_dealloc, /* tp_dealloc */
815 0, /* tp_print */
816 0, /* tp_getattr */
817 0, /* tp_setattr */
818 0, /* tp_compare */
819 0, /* tp_repr */
820 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000821 0, /* tp_as_sequence */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000822 0, /* tp_as_mapping */
823 0, /* tp_hash */
824 0, /* tp_call */
825 0, /* tp_str */
826 PyObject_GenericGetAttr, /* tp_getattro */
827 0, /* tp_setattro */
828 0, /* tp_as_buffer */
829 Py_TPFLAGS_DEFAULT, /* tp_flags */
830 0, /* tp_doc */
831 0, /* tp_traverse */
832 0, /* tp_clear */
833 0, /* tp_richcompare */
834 0, /* tp_weaklistoffset */
835 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000836 (iternextfunc)setiter_iternext, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000837 setiter_methods, /* tp_methods */
838 0,
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000839};
840
Raymond Hettingerd7946662005-08-01 21:39:29 +0000841static int
Raymond Hettingerd7946662005-08-01 21:39:29 +0000842set_update_internal(PySetObject *so, PyObject *other)
Raymond Hettingera690a992003-11-16 16:17:49 +0000843{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000844 PyObject *key, *it;
Raymond Hettingera690a992003-11-16 16:17:49 +0000845
Raymond Hettingerd7946662005-08-01 21:39:29 +0000846 if (PyAnySet_Check(other))
Raymond Hettingerc991db22005-08-11 07:58:45 +0000847 return set_merge(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +0000848
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000849 if (PyDict_Check(other)) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000850 PyObject *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000851 Py_ssize_t pos = 0;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000852 while (PyDict_Next(other, &pos, &key, &value)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +0000853 if (set_add_key(so, key) == -1)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000854 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000855 }
Raymond Hettingerd7946662005-08-01 21:39:29 +0000856 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000857 }
858
Raymond Hettingera38123e2003-11-24 22:18:49 +0000859 it = PyObject_GetIter(other);
860 if (it == NULL)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000861 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000862
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000863 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettingerc991db22005-08-11 07:58:45 +0000864 if (set_add_key(so, key) == -1) {
Raymond Hettingera38123e2003-11-24 22:18:49 +0000865 Py_DECREF(it);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000866 Py_DECREF(key);
Raymond Hettingerd7946662005-08-01 21:39:29 +0000867 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000868 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000869 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +0000870 }
Raymond Hettingera38123e2003-11-24 22:18:49 +0000871 Py_DECREF(it);
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000872 if (PyErr_Occurred())
Raymond Hettingerd7946662005-08-01 21:39:29 +0000873 return -1;
874 return 0;
875}
876
877static PyObject *
878set_update(PySetObject *so, PyObject *other)
879{
880 if (set_update_internal(so, other) == -1)
Raymond Hettingera38123e2003-11-24 22:18:49 +0000881 return NULL;
882 Py_RETURN_NONE;
883}
884
885PyDoc_STRVAR(update_doc,
886"Update a set with the union of itself and another.");
887
888static PyObject *
889make_new_set(PyTypeObject *type, PyObject *iterable)
890{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000891 register PySetObject *so = NULL;
Raymond Hettingera38123e2003-11-24 22:18:49 +0000892
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000893 if (dummy == NULL) { /* Auto-initialize dummy */
894 dummy = PyString_FromString("<dummy key>");
895 if (dummy == NULL)
896 return NULL;
897 }
Raymond Hettingera690a992003-11-16 16:17:49 +0000898
899 /* create PySetObject structure */
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000900 if (num_free_sets &&
901 (type == &PySet_Type || type == &PyFrozenSet_Type)) {
902 so = free_sets[--num_free_sets];
903 assert (so != NULL && PyAnySet_CheckExact(so));
904 so->ob_type = type;
905 _Py_NewReference((PyObject *)so);
906 EMPTY_TO_MINSIZE(so);
907 PyObject_GC_Track(so);
908 } else {
909 so = (PySetObject *)type->tp_alloc(type, 0);
910 if (so == NULL)
911 return NULL;
912 /* tp_alloc has already zeroed the structure */
913 assert(so->table == NULL && so->fill == 0 && so->used == 0);
914 INIT_NONZERO_SET_SLOTS(so);
915 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000916
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000917 so->lookup = set_lookkey_string;
Raymond Hettinger691d8052004-05-30 07:26:47 +0000918 so->weakreflist = NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +0000919
Raymond Hettingera38123e2003-11-24 22:18:49 +0000920 if (iterable != NULL) {
Raymond Hettingerd7946662005-08-01 21:39:29 +0000921 if (set_update_internal(so, iterable) == -1) {
Raymond Hettingera38123e2003-11-24 22:18:49 +0000922 Py_DECREF(so);
923 return NULL;
924 }
Raymond Hettingera38123e2003-11-24 22:18:49 +0000925 }
926
Raymond Hettingera690a992003-11-16 16:17:49 +0000927 return (PyObject *)so;
928}
929
Raymond Hettingerd7946662005-08-01 21:39:29 +0000930/* The empty frozenset is a singleton */
931static PyObject *emptyfrozenset = NULL;
932
Raymond Hettingera690a992003-11-16 16:17:49 +0000933static PyObject *
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000934frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Raymond Hettingera690a992003-11-16 16:17:49 +0000935{
Raymond Hettingerd7946662005-08-01 21:39:29 +0000936 PyObject *iterable = NULL, *result;
Raymond Hettingera690a992003-11-16 16:17:49 +0000937
Georg Brandl02c42872005-08-26 06:42:30 +0000938 if (!_PyArg_NoKeywords("frozenset()", kwds))
939 return NULL;
940
Raymond Hettingera690a992003-11-16 16:17:49 +0000941 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
942 return NULL;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000943
944 if (type != &PyFrozenSet_Type)
945 return make_new_set(type, iterable);
946
947 if (iterable != NULL) {
948 /* frozenset(f) is idempotent */
949 if (PyFrozenSet_CheckExact(iterable)) {
950 Py_INCREF(iterable);
951 return iterable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000952 }
Raymond Hettingerd7946662005-08-01 21:39:29 +0000953 result = make_new_set(type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +0000954 if (result == NULL || PySet_GET_SIZE(result))
Raymond Hettingerd7946662005-08-01 21:39:29 +0000955 return result;
956 Py_DECREF(result);
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000957 }
Raymond Hettingerd7946662005-08-01 21:39:29 +0000958 /* The empty frozenset is a singleton */
959 if (emptyfrozenset == NULL)
960 emptyfrozenset = make_new_set(type, NULL);
961 Py_XINCREF(emptyfrozenset);
962 return emptyfrozenset;
963}
964
965void
966PySet_Fini(void)
967{
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000968 PySetObject *so;
969
970 while (num_free_sets) {
971 num_free_sets--;
972 so = free_sets[num_free_sets];
973 PyObject_GC_Del(so);
974 }
Raymond Hettingera9d99362005-08-05 00:01:15 +0000975 Py_XDECREF(dummy);
Raymond Hettingerd7946662005-08-01 21:39:29 +0000976 Py_XDECREF(emptyfrozenset);
Raymond Hettingera690a992003-11-16 16:17:49 +0000977}
978
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000979static PyObject *
980set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
981{
Georg Brandl02c42872005-08-26 06:42:30 +0000982 if (!_PyArg_NoKeywords("set()", kwds))
983 return NULL;
984
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000985 return make_new_set(type, NULL);
986}
987
Raymond Hettinger934d63e2005-07-31 01:33:10 +0000988/* set_swap_bodies() switches the contents of any two sets by moving their
989 internal data pointers and, if needed, copying the internal smalltables.
990 Semantically equivalent to:
991
992 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
993
994 The function always succeeds and it leaves both objects in a stable state.
995 Useful for creating temporary frozensets from sets for membership testing
996 in __contains__(), discard(), and remove(). Also useful for operations
997 that update in-place (by allowing an intermediate result to be swapped
Raymond Hettinger9dcb17c2005-07-31 13:09:28 +0000998 into one of the original inputs).
Raymond Hettinger934d63e2005-07-31 01:33:10 +0000999*/
1000
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001001static void
1002set_swap_bodies(PySetObject *a, PySetObject *b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001003{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001004 int t;
1005 setentry *u;
1006 setentry *(*f)(PySetObject *so, PyObject *key, long hash);
1007 setentry tab[PySet_MINSIZE];
1008 long h;
1009
1010 t = a->fill; a->fill = b->fill; b->fill = t;
1011 t = a->used; a->used = b->used; b->used = t;
1012 t = a->mask; a->mask = b->mask; b->mask = t;
1013
1014 u = a->table;
1015 if (a->table == a->smalltable)
1016 u = b->smalltable;
1017 a->table = b->table;
1018 if (b->table == b->smalltable)
1019 a->table = a->smalltable;
1020 b->table = u;
1021
1022 f = a->lookup; a->lookup = b->lookup; b->lookup = f;
1023
1024 if (a->table == a->smalltable || b->table == b->smalltable) {
1025 memcpy(tab, a->smalltable, sizeof(tab));
1026 memcpy(a->smalltable, b->smalltable, sizeof(tab));
1027 memcpy(b->smalltable, tab, sizeof(tab));
1028 }
1029
Raymond Hettingera580c472005-08-05 17:19:54 +00001030 if (PyType_IsSubtype(a->ob_type, &PyFrozenSet_Type) &&
1031 PyType_IsSubtype(b->ob_type, &PyFrozenSet_Type)) {
1032 h = a->hash; a->hash = b->hash; b->hash = h;
1033 } else {
1034 a->hash = -1;
1035 b->hash = -1;
1036 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001037}
1038
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001039static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001040set_copy(PySetObject *so)
1041{
Raymond Hettingera38123e2003-11-24 22:18:49 +00001042 return make_new_set(so->ob_type, (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001043}
1044
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001045static PyObject *
1046frozenset_copy(PySetObject *so)
1047{
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001048 if (PyFrozenSet_CheckExact(so)) {
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001049 Py_INCREF(so);
1050 return (PyObject *)so;
1051 }
1052 return set_copy(so);
1053}
1054
Raymond Hettingera690a992003-11-16 16:17:49 +00001055PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
1056
1057static PyObject *
Raymond Hettingerc991db22005-08-11 07:58:45 +00001058set_clear(PySetObject *so)
1059{
1060 set_clear_internal(so);
1061 Py_RETURN_NONE;
1062}
1063
1064PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
1065
1066static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001067set_union(PySetObject *so, PyObject *other)
1068{
1069 PySetObject *result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001070
1071 result = (PySetObject *)set_copy(so);
1072 if (result == NULL)
1073 return NULL;
Raymond Hettingerd8e13382005-08-17 12:27:17 +00001074 if ((PyObject *)so == other)
1075 return (PyObject *)result;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001076 if (set_update_internal(result, other) == -1) {
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001077 Py_DECREF(result);
1078 return NULL;
1079 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001080 return (PyObject *)result;
1081}
1082
1083PyDoc_STRVAR(union_doc,
1084 "Return the union of two sets as a new set.\n\
1085\n\
1086(i.e. all elements that are in either set.)");
1087
1088static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001089set_or(PySetObject *so, PyObject *other)
1090{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001091 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001092 Py_INCREF(Py_NotImplemented);
1093 return Py_NotImplemented;
1094 }
1095 return set_union(so, other);
1096}
1097
1098static PyObject *
1099set_ior(PySetObject *so, PyObject *other)
1100{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001101 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001102 Py_INCREF(Py_NotImplemented);
1103 return Py_NotImplemented;
1104 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001105 if (set_update_internal(so, other) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001106 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001107 Py_INCREF(so);
1108 return (PyObject *)so;
1109}
1110
1111static PyObject *
1112set_intersection(PySetObject *so, PyObject *other)
1113{
1114 PySetObject *result;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001115 PyObject *key, *it, *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001116
Raymond Hettingerd8e13382005-08-17 12:27:17 +00001117 if ((PyObject *)so == other)
1118 return set_copy(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001119
Raymond Hettingera690a992003-11-16 16:17:49 +00001120 result = (PySetObject *)make_new_set(so->ob_type, NULL);
1121 if (result == NULL)
1122 return NULL;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001123
Raymond Hettingerc991db22005-08-11 07:58:45 +00001124 if (PyAnySet_Check(other)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001125 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001126 setentry *entry;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001127
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001128 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001129 tmp = (PyObject *)so;
1130 so = (PySetObject *)other;
1131 other = tmp;
1132 }
1133
Raymond Hettingerc991db22005-08-11 07:58:45 +00001134 while (set_next((PySetObject *)other, &pos, &entry)) {
1135 if (set_contains_entry(so, entry)) {
1136 if (set_add_entry(result, entry) == -1) {
Raymond Hettingera3b11e72003-12-31 14:08:58 +00001137 Py_DECREF(result);
1138 return NULL;
1139 }
1140 }
1141 }
1142 return (PyObject *)result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001143 }
1144
Raymond Hettingera690a992003-11-16 16:17:49 +00001145 it = PyObject_GetIter(other);
1146 if (it == NULL) {
1147 Py_DECREF(result);
1148 return NULL;
1149 }
1150
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001151 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001152 if (set_contains_key(so, key)) {
1153 if (set_add_key(result, key) == -1) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001154 Py_DECREF(it);
1155 Py_DECREF(result);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001156 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +00001157 return NULL;
1158 }
1159 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001160 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +00001161 }
1162 Py_DECREF(it);
1163 if (PyErr_Occurred()) {
1164 Py_DECREF(result);
1165 return NULL;
1166 }
1167 return (PyObject *)result;
1168}
1169
1170PyDoc_STRVAR(intersection_doc,
1171"Return the intersection of two sets as a new set.\n\
1172\n\
1173(i.e. all elements that are in both sets.)");
1174
1175static PyObject *
1176set_intersection_update(PySetObject *so, PyObject *other)
1177{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001178 PyObject *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001179
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001180 tmp = set_intersection(so, other);
1181 if (tmp == NULL)
Raymond Hettingera690a992003-11-16 16:17:49 +00001182 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001183 set_swap_bodies(so, (PySetObject *)tmp);
Raymond Hettingera690a992003-11-16 16:17:49 +00001184 Py_DECREF(tmp);
1185 Py_RETURN_NONE;
1186}
1187
1188PyDoc_STRVAR(intersection_update_doc,
1189"Update a set with the intersection of itself and another.");
1190
1191static PyObject *
1192set_and(PySetObject *so, PyObject *other)
1193{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001194 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001195 Py_INCREF(Py_NotImplemented);
1196 return Py_NotImplemented;
1197 }
1198 return set_intersection(so, other);
1199}
1200
1201static PyObject *
1202set_iand(PySetObject *so, PyObject *other)
1203{
1204 PyObject *result;
1205
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001206 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001207 Py_INCREF(Py_NotImplemented);
1208 return Py_NotImplemented;
1209 }
1210 result = set_intersection_update(so, other);
1211 if (result == NULL)
1212 return NULL;
1213 Py_DECREF(result);
1214 Py_INCREF(so);
1215 return (PyObject *)so;
1216}
1217
Neal Norwitz6576bd82005-11-13 18:41:28 +00001218static int
Raymond Hettingerc991db22005-08-11 07:58:45 +00001219set_difference_update_internal(PySetObject *so, PyObject *other)
1220{
1221 if ((PyObject *)so == other)
1222 return set_clear_internal(so);
1223
1224 if (PyAnySet_Check(other)) {
1225 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001226 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001227
1228 while (set_next((PySetObject *)other, &pos, &entry))
1229 set_discard_entry(so, entry);
1230 } else {
1231 PyObject *key, *it;
1232 it = PyObject_GetIter(other);
1233 if (it == NULL)
1234 return -1;
1235
1236 while ((key = PyIter_Next(it)) != NULL) {
1237 if (set_discard_key(so, key) == -1) {
1238 Py_DECREF(it);
1239 Py_DECREF(key);
1240 return -1;
1241 }
1242 Py_DECREF(key);
1243 }
1244 Py_DECREF(it);
1245 if (PyErr_Occurred())
1246 return -1;
1247 }
1248 /* If more than 1/5 are dummies, then resize them away. */
1249 if ((so->fill - so->used) * 5 < so->mask)
1250 return 0;
1251 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
1252}
1253
Raymond Hettingera690a992003-11-16 16:17:49 +00001254static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001255set_difference_update(PySetObject *so, PyObject *other)
1256{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001257 if (set_difference_update_internal(so, other) != -1)
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001258 Py_RETURN_NONE;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001259 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001260}
1261
1262PyDoc_STRVAR(difference_update_doc,
1263"Remove all elements of another set from this set.");
1264
1265static PyObject *
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001266set_difference(PySetObject *so, PyObject *other)
1267{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001268 PyObject *result;
1269 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001270 Py_ssize_t pos = 0;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001271
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001272 if (!PyAnySet_Check(other) && !PyDict_Check(other)) {
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001273 result = set_copy(so);
1274 if (result == NULL)
Raymond Hettingerc991db22005-08-11 07:58:45 +00001275 return NULL;
1276 if (set_difference_update_internal((PySetObject *)result, other) != -1)
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001277 return result;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001278 Py_DECREF(result);
1279 return NULL;
1280 }
1281
1282 result = make_new_set(so->ob_type, NULL);
1283 if (result == NULL)
1284 return NULL;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001285
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001286 if (PyDict_Check(other)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001287 while (set_next(so, &pos, &entry)) {
1288 setentry entrycopy;
1289 entrycopy.hash = entry->hash;
1290 entrycopy.key = entry->key;
1291 if (!PyDict_Contains(other, entry->key)) {
1292 if (set_add_entry((PySetObject *)result, &entrycopy) == -1)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001293 return NULL;
1294 }
1295 }
1296 return result;
1297 }
1298
Raymond Hettingerc991db22005-08-11 07:58:45 +00001299 while (set_next(so, &pos, &entry)) {
1300 if (!set_contains_entry((PySetObject *)other, entry)) {
1301 if (set_add_entry((PySetObject *)result, entry) == -1)
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001302 return NULL;
1303 }
1304 }
1305 return result;
1306}
1307
1308PyDoc_STRVAR(difference_doc,
1309"Return the difference of two sets as a new set.\n\
1310\n\
1311(i.e. all elements that are in this set but not the other.)");
1312static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001313set_sub(PySetObject *so, PyObject *other)
1314{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001315 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001316 Py_INCREF(Py_NotImplemented);
1317 return Py_NotImplemented;
1318 }
1319 return set_difference(so, other);
1320}
1321
1322static PyObject *
1323set_isub(PySetObject *so, PyObject *other)
1324{
1325 PyObject *result;
1326
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001327 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001328 Py_INCREF(Py_NotImplemented);
1329 return Py_NotImplemented;
1330 }
1331 result = set_difference_update(so, other);
1332 if (result == NULL)
1333 return NULL;
1334 Py_DECREF(result);
1335 Py_INCREF(so);
1336 return (PyObject *)so;
1337}
1338
1339static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001340set_symmetric_difference_update(PySetObject *so, PyObject *other)
1341{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001342 PySetObject *otherset;
1343 PyObject *key;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001344 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001345 setentry *entry;
1346
1347 if ((PyObject *)so == other)
1348 return set_clear(so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001349
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001350 if (PyDict_Check(other)) {
1351 PyObject *value;
1352 int rv;
1353 while (PyDict_Next(other, &pos, &key, &value)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001354 rv = set_discard_key(so, key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001355 if (rv == -1)
1356 return NULL;
1357 if (rv == DISCARD_NOTFOUND) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001358 if (set_add_key(so, key) == -1)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001359 return NULL;
1360 }
1361 }
1362 Py_RETURN_NONE;
1363 }
1364
1365 if (PyAnySet_Check(other)) {
1366 Py_INCREF(other);
1367 otherset = (PySetObject *)other;
1368 } else {
Raymond Hettingera690a992003-11-16 16:17:49 +00001369 otherset = (PySetObject *)make_new_set(so->ob_type, other);
1370 if (otherset == NULL)
1371 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001372 }
1373
Raymond Hettingerc991db22005-08-11 07:58:45 +00001374 while (set_next(otherset, &pos, &entry)) {
1375 int rv = set_discard_entry(so, entry);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001376 if (rv == -1) {
1377 Py_XDECREF(otherset);
1378 return NULL;
1379 }
1380 if (rv == DISCARD_NOTFOUND) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001381 if (set_add_entry(so, entry) == -1) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001382 Py_XDECREF(otherset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001383 return NULL;
1384 }
1385 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001386 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001387 Py_DECREF(otherset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001388 Py_RETURN_NONE;
1389}
1390
1391PyDoc_STRVAR(symmetric_difference_update_doc,
1392"Update a set with the symmetric difference of itself and another.");
1393
1394static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001395set_symmetric_difference(PySetObject *so, PyObject *other)
1396{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001397 PyObject *rv;
1398 PySetObject *otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001399
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001400 otherset = (PySetObject *)make_new_set(so->ob_type, other);
1401 if (otherset == NULL)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001402 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001403 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1404 if (rv == NULL)
1405 return NULL;
1406 Py_DECREF(rv);
1407 return (PyObject *)otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001408}
1409
1410PyDoc_STRVAR(symmetric_difference_doc,
1411"Return the symmetric difference of two sets as a new set.\n\
1412\n\
1413(i.e. all elements that are in exactly one of the sets.)");
1414
1415static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001416set_xor(PySetObject *so, PyObject *other)
1417{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001418 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001419 Py_INCREF(Py_NotImplemented);
1420 return Py_NotImplemented;
1421 }
1422 return set_symmetric_difference(so, other);
1423}
1424
1425static PyObject *
1426set_ixor(PySetObject *so, PyObject *other)
1427{
1428 PyObject *result;
1429
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001430 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001431 Py_INCREF(Py_NotImplemented);
1432 return Py_NotImplemented;
1433 }
1434 result = set_symmetric_difference_update(so, other);
1435 if (result == NULL)
1436 return NULL;
1437 Py_DECREF(result);
1438 Py_INCREF(so);
1439 return (PyObject *)so;
1440}
1441
1442static PyObject *
1443set_issubset(PySetObject *so, PyObject *other)
1444{
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001445 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001446 Py_ssize_t pos = 0;
Raymond Hettingera690a992003-11-16 16:17:49 +00001447
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001448 if (!PyAnySet_Check(other)) {
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001449 PyObject *tmp, *result;
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001450 tmp = make_new_set(&PySet_Type, other);
1451 if (tmp == NULL)
1452 return NULL;
1453 result = set_issubset(so, tmp);
1454 Py_DECREF(tmp);
1455 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001456 }
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001457 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
Raymond Hettingera690a992003-11-16 16:17:49 +00001458 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001459
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001460 while (set_next(so, &pos, &entry)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001461 if (!set_contains_entry((PySetObject *)other, entry))
Raymond Hettingera690a992003-11-16 16:17:49 +00001462 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001463 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001464 Py_RETURN_TRUE;
1465}
1466
1467PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
1468
1469static PyObject *
1470set_issuperset(PySetObject *so, PyObject *other)
1471{
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001472 PyObject *tmp, *result;
1473
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001474 if (!PyAnySet_Check(other)) {
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001475 tmp = make_new_set(&PySet_Type, other);
1476 if (tmp == NULL)
1477 return NULL;
1478 result = set_issuperset(so, tmp);
1479 Py_DECREF(tmp);
1480 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001481 }
1482 return set_issubset((PySetObject *)other, (PyObject *)so);
1483}
1484
1485PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
1486
Raymond Hettingera690a992003-11-16 16:17:49 +00001487static PyObject *
1488set_richcompare(PySetObject *v, PyObject *w, int op)
1489{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001490 PyObject *r1, *r2;
1491
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001492 if(!PyAnySet_Check(w)) {
1493 if (op == Py_EQ)
1494 Py_RETURN_FALSE;
1495 if (op == Py_NE)
1496 Py_RETURN_TRUE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001497 PyErr_SetString(PyExc_TypeError, "can only compare to a set");
1498 return NULL;
1499 }
1500 switch (op) {
1501 case Py_EQ:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001502 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
Raymond Hettingera690a992003-11-16 16:17:49 +00001503 Py_RETURN_FALSE;
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001504 if (v->hash != -1 &&
1505 ((PySetObject *)w)->hash != -1 &&
1506 v->hash != ((PySetObject *)w)->hash)
1507 Py_RETURN_FALSE;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001508 return set_issubset(v, w);
1509 case Py_NE:
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001510 r1 = set_richcompare(v, w, Py_EQ);
1511 if (r1 == NULL)
1512 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001513 r2 = PyBool_FromLong(PyObject_Not(r1));
1514 Py_DECREF(r1);
1515 return r2;
1516 case Py_LE:
1517 return set_issubset(v, w);
1518 case Py_GE:
1519 return set_issuperset(v, w);
1520 case Py_LT:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001521 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001522 Py_RETURN_FALSE;
1523 return set_issubset(v, w);
1524 case Py_GT:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001525 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001526 Py_RETURN_FALSE;
1527 return set_issuperset(v, w);
Raymond Hettingera690a992003-11-16 16:17:49 +00001528 }
1529 Py_INCREF(Py_NotImplemented);
1530 return Py_NotImplemented;
1531}
1532
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001533static int
1534set_nocmp(PyObject *self)
1535{
1536 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
1537 return -1;
1538}
1539
Raymond Hettingera690a992003-11-16 16:17:49 +00001540static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001541set_add(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001542{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001543 if (set_add_key(so, key) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001544 return NULL;
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001545 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001546}
1547
1548PyDoc_STRVAR(add_doc,
1549"Add an element to a set.\n\
1550\n\
1551This has no effect if the element is already present.");
1552
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001553static int
1554set_contains(PySetObject *so, PyObject *key)
1555{
1556 PyObject *tmpkey;
1557 int rv;
1558
1559 rv = set_contains_key(so, key);
1560 if (rv == -1) {
1561 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1562 return -1;
1563 PyErr_Clear();
1564 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1565 if (tmpkey == NULL)
1566 return -1;
1567 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1568 rv = set_contains(so, tmpkey);
1569 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1570 Py_DECREF(tmpkey);
1571 }
1572 return rv;
1573}
1574
1575static PyObject *
1576set_direct_contains(PySetObject *so, PyObject *key)
1577{
1578 long result;
1579
1580 result = set_contains(so, key);
1581 if (result == -1)
1582 return NULL;
1583 return PyBool_FromLong(result);
1584}
1585
1586PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
1587
Raymond Hettingera690a992003-11-16 16:17:49 +00001588static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001589set_remove(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001590{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001591 PyObject *tmpkey, *result;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001592 int rv;
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001593
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001594 rv = set_discard_key(so, key);
1595 if (rv == -1) {
1596 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1597 return NULL;
1598 PyErr_Clear();
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001599 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1600 if (tmpkey == NULL)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001601 return NULL;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001602 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001603 result = set_remove(so, tmpkey);
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001604 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001605 Py_DECREF(tmpkey);
Raymond Hettinger0deab622003-12-13 18:53:18 +00001606 return result;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001607 } else if (rv == DISCARD_NOTFOUND) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001608 PyErr_SetObject(PyExc_KeyError, key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001609 return NULL;
1610 }
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001611 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001612}
1613
1614PyDoc_STRVAR(remove_doc,
1615"Remove an element from a set; it must be a member.\n\
1616\n\
1617If the element is not a member, raise a KeyError.");
1618
1619static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001620set_discard(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001621{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001622 PyObject *tmpkey, *result;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001623 int rv;
Raymond Hettinger0deab622003-12-13 18:53:18 +00001624
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001625 rv = set_discard_key(so, key);
1626 if (rv == -1) {
1627 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1628 return NULL;
1629 PyErr_Clear();
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001630 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1631 if (tmpkey == NULL)
Raymond Hettinger0deab622003-12-13 18:53:18 +00001632 return NULL;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001633 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001634 result = set_discard(so, tmpkey);
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001635 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001636 Py_DECREF(tmpkey);
Raymond Hettinger0deab622003-12-13 18:53:18 +00001637 return result;
1638 }
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001639 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001640}
1641
1642PyDoc_STRVAR(discard_doc,
1643"Remove an element from a set if it is a member.\n\
1644\n\
1645If the element is not a member, do nothing.");
1646
1647static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001648set_reduce(PySetObject *so)
1649{
Raymond Hettinger15056a52004-11-09 07:25:31 +00001650 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001651
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001652 keys = PySequence_List((PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001653 if (keys == NULL)
1654 goto done;
1655 args = PyTuple_Pack(1, keys);
1656 if (args == NULL)
1657 goto done;
Raymond Hettinger15056a52004-11-09 07:25:31 +00001658 dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
1659 if (dict == NULL) {
1660 PyErr_Clear();
1661 dict = Py_None;
1662 Py_INCREF(dict);
1663 }
1664 result = PyTuple_Pack(3, so->ob_type, args, dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001665done:
1666 Py_XDECREF(args);
1667 Py_XDECREF(keys);
Raymond Hettinger15056a52004-11-09 07:25:31 +00001668 Py_XDECREF(dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001669 return result;
1670}
1671
1672PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1673
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001674static int
1675set_init(PySetObject *self, PyObject *args, PyObject *kwds)
1676{
1677 PyObject *iterable = NULL;
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001678
1679 if (!PyAnySet_Check(self))
1680 return -1;
1681 if (!PyArg_UnpackTuple(args, self->ob_type->tp_name, 0, 1, &iterable))
1682 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001683 set_clear_internal(self);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001684 self->hash = -1;
1685 if (iterable == NULL)
1686 return 0;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001687 return set_update_internal(self, iterable);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001688}
1689
Raymond Hettingera690a992003-11-16 16:17:49 +00001690static PySequenceMethods set_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001691 (lenfunc)set_len, /* sq_length */
Raymond Hettingera690a992003-11-16 16:17:49 +00001692 0, /* sq_concat */
1693 0, /* sq_repeat */
1694 0, /* sq_item */
1695 0, /* sq_slice */
1696 0, /* sq_ass_item */
1697 0, /* sq_ass_slice */
1698 (objobjproc)set_contains, /* sq_contains */
1699};
1700
1701/* set object ********************************************************/
1702
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001703#ifdef Py_DEBUG
1704static PyObject *test_c_api(PySetObject *so);
1705
1706PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
1707All is well if assertions don't fail.");
1708#endif
1709
Raymond Hettingera690a992003-11-16 16:17:49 +00001710static PyMethodDef set_methods[] = {
1711 {"add", (PyCFunction)set_add, METH_O,
1712 add_doc},
1713 {"clear", (PyCFunction)set_clear, METH_NOARGS,
1714 clear_doc},
Raymond Hettinger0deab622003-12-13 18:53:18 +00001715 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001716 contains_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00001717 {"copy", (PyCFunction)set_copy, METH_NOARGS,
1718 copy_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00001719 {"discard", (PyCFunction)set_discard, METH_O,
1720 discard_doc},
1721 {"difference", (PyCFunction)set_difference, METH_O,
1722 difference_doc},
1723 {"difference_update", (PyCFunction)set_difference_update, METH_O,
1724 difference_update_doc},
1725 {"intersection",(PyCFunction)set_intersection, METH_O,
1726 intersection_doc},
1727 {"intersection_update",(PyCFunction)set_intersection_update, METH_O,
1728 intersection_update_doc},
1729 {"issubset", (PyCFunction)set_issubset, METH_O,
1730 issubset_doc},
1731 {"issuperset", (PyCFunction)set_issuperset, METH_O,
1732 issuperset_doc},
1733 {"pop", (PyCFunction)set_pop, METH_NOARGS,
1734 pop_doc},
1735 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
1736 reduce_doc},
1737 {"remove", (PyCFunction)set_remove, METH_O,
1738 remove_doc},
1739 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
1740 symmetric_difference_doc},
1741 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
1742 symmetric_difference_update_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001743#ifdef Py_DEBUG
1744 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
1745 test_c_api_doc},
1746#endif
Raymond Hettingera690a992003-11-16 16:17:49 +00001747 {"union", (PyCFunction)set_union, METH_O,
1748 union_doc},
Raymond Hettingera38123e2003-11-24 22:18:49 +00001749 {"update", (PyCFunction)set_update, METH_O,
1750 update_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00001751 {NULL, NULL} /* sentinel */
1752};
1753
1754static PyNumberMethods set_as_number = {
1755 0, /*nb_add*/
1756 (binaryfunc)set_sub, /*nb_subtract*/
1757 0, /*nb_multiply*/
1758 0, /*nb_divide*/
1759 0, /*nb_remainder*/
1760 0, /*nb_divmod*/
1761 0, /*nb_power*/
1762 0, /*nb_negative*/
1763 0, /*nb_positive*/
1764 0, /*nb_absolute*/
1765 0, /*nb_nonzero*/
1766 0, /*nb_invert*/
1767 0, /*nb_lshift*/
1768 0, /*nb_rshift*/
1769 (binaryfunc)set_and, /*nb_and*/
1770 (binaryfunc)set_xor, /*nb_xor*/
1771 (binaryfunc)set_or, /*nb_or*/
1772 0, /*nb_coerce*/
1773 0, /*nb_int*/
1774 0, /*nb_long*/
1775 0, /*nb_float*/
1776 0, /*nb_oct*/
1777 0, /*nb_hex*/
1778 0, /*nb_inplace_add*/
1779 (binaryfunc)set_isub, /*nb_inplace_subtract*/
1780 0, /*nb_inplace_multiply*/
1781 0, /*nb_inplace_divide*/
1782 0, /*nb_inplace_remainder*/
1783 0, /*nb_inplace_power*/
1784 0, /*nb_inplace_lshift*/
1785 0, /*nb_inplace_rshift*/
1786 (binaryfunc)set_iand, /*nb_inplace_and*/
1787 (binaryfunc)set_ixor, /*nb_inplace_xor*/
1788 (binaryfunc)set_ior, /*nb_inplace_or*/
1789};
1790
1791PyDoc_STRVAR(set_doc,
1792"set(iterable) --> set object\n\
1793\n\
1794Build an unordered collection.");
1795
1796PyTypeObject PySet_Type = {
1797 PyObject_HEAD_INIT(&PyType_Type)
1798 0, /* ob_size */
1799 "set", /* tp_name */
1800 sizeof(PySetObject), /* tp_basicsize */
1801 0, /* tp_itemsize */
1802 /* methods */
1803 (destructor)set_dealloc, /* tp_dealloc */
1804 (printfunc)set_tp_print, /* tp_print */
1805 0, /* tp_getattr */
1806 0, /* tp_setattr */
1807 (cmpfunc)set_nocmp, /* tp_compare */
1808 (reprfunc)set_repr, /* tp_repr */
1809 &set_as_number, /* tp_as_number */
1810 &set_as_sequence, /* tp_as_sequence */
1811 0, /* tp_as_mapping */
1812 set_nohash, /* tp_hash */
1813 0, /* tp_call */
1814 0, /* tp_str */
1815 PyObject_GenericGetAttr, /* tp_getattro */
1816 0, /* tp_setattro */
1817 0, /* tp_as_buffer */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001818 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001819 Py_TPFLAGS_BASETYPE, /* tp_flags */
Raymond Hettingera690a992003-11-16 16:17:49 +00001820 set_doc, /* tp_doc */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001821 (traverseproc)set_traverse, /* tp_traverse */
Raymond Hettingerfe889f32005-08-06 05:43:39 +00001822 (inquiry)set_clear_internal, /* tp_clear */
Raymond Hettingera690a992003-11-16 16:17:49 +00001823 (richcmpfunc)set_richcompare, /* tp_richcompare */
Raymond Hettinger691d8052004-05-30 07:26:47 +00001824 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001825 (getiterfunc)set_iter, /* tp_iter */
Raymond Hettingera690a992003-11-16 16:17:49 +00001826 0, /* tp_iternext */
1827 set_methods, /* tp_methods */
1828 0, /* tp_members */
1829 0, /* tp_getset */
1830 0, /* tp_base */
1831 0, /* tp_dict */
1832 0, /* tp_descr_get */
1833 0, /* tp_descr_set */
1834 0, /* tp_dictoffset */
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001835 (initproc)set_init, /* tp_init */
Raymond Hettingera690a992003-11-16 16:17:49 +00001836 PyType_GenericAlloc, /* tp_alloc */
1837 set_new, /* tp_new */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001838 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00001839};
1840
1841/* frozenset object ********************************************************/
1842
1843
1844static PyMethodDef frozenset_methods[] = {
Raymond Hettinger0deab622003-12-13 18:53:18 +00001845 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001846 contains_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001847 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00001848 copy_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001849 {"difference", (PyCFunction)set_difference, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00001850 difference_doc},
1851 {"intersection",(PyCFunction)set_intersection, METH_O,
1852 intersection_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001853 {"issubset", (PyCFunction)set_issubset, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00001854 issubset_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001855 {"issuperset", (PyCFunction)set_issuperset, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00001856 issuperset_doc},
1857 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
1858 reduce_doc},
1859 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
1860 symmetric_difference_doc},
1861 {"union", (PyCFunction)set_union, METH_O,
1862 union_doc},
1863 {NULL, NULL} /* sentinel */
1864};
1865
1866static PyNumberMethods frozenset_as_number = {
1867 0, /*nb_add*/
1868 (binaryfunc)set_sub, /*nb_subtract*/
1869 0, /*nb_multiply*/
1870 0, /*nb_divide*/
1871 0, /*nb_remainder*/
1872 0, /*nb_divmod*/
1873 0, /*nb_power*/
1874 0, /*nb_negative*/
1875 0, /*nb_positive*/
1876 0, /*nb_absolute*/
1877 0, /*nb_nonzero*/
1878 0, /*nb_invert*/
1879 0, /*nb_lshift*/
1880 0, /*nb_rshift*/
1881 (binaryfunc)set_and, /*nb_and*/
1882 (binaryfunc)set_xor, /*nb_xor*/
1883 (binaryfunc)set_or, /*nb_or*/
1884};
1885
1886PyDoc_STRVAR(frozenset_doc,
1887"frozenset(iterable) --> frozenset object\n\
1888\n\
1889Build an immutable unordered collection.");
1890
1891PyTypeObject PyFrozenSet_Type = {
1892 PyObject_HEAD_INIT(&PyType_Type)
1893 0, /* ob_size */
1894 "frozenset", /* tp_name */
1895 sizeof(PySetObject), /* tp_basicsize */
Raymond Hettingera3b11e72003-12-31 14:08:58 +00001896 0, /* tp_itemsize */
1897 /* methods */
Raymond Hettingera690a992003-11-16 16:17:49 +00001898 (destructor)set_dealloc, /* tp_dealloc */
1899 (printfunc)set_tp_print, /* tp_print */
1900 0, /* tp_getattr */
1901 0, /* tp_setattr */
1902 (cmpfunc)set_nocmp, /* tp_compare */
1903 (reprfunc)set_repr, /* tp_repr */
1904 &frozenset_as_number, /* tp_as_number */
1905 &set_as_sequence, /* tp_as_sequence */
1906 0, /* tp_as_mapping */
1907 frozenset_hash, /* tp_hash */
1908 0, /* tp_call */
1909 0, /* tp_str */
1910 PyObject_GenericGetAttr, /* tp_getattro */
1911 0, /* tp_setattro */
1912 0, /* tp_as_buffer */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001913 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001914 Py_TPFLAGS_BASETYPE, /* tp_flags */
Raymond Hettingera690a992003-11-16 16:17:49 +00001915 frozenset_doc, /* tp_doc */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001916 (traverseproc)set_traverse, /* tp_traverse */
Raymond Hettingerfe889f32005-08-06 05:43:39 +00001917 (inquiry)set_clear_internal, /* tp_clear */
Raymond Hettingera690a992003-11-16 16:17:49 +00001918 (richcmpfunc)set_richcompare, /* tp_richcompare */
Raymond Hettinger691d8052004-05-30 07:26:47 +00001919 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
Raymond Hettingera690a992003-11-16 16:17:49 +00001920 (getiterfunc)set_iter, /* tp_iter */
1921 0, /* tp_iternext */
1922 frozenset_methods, /* tp_methods */
1923 0, /* tp_members */
1924 0, /* tp_getset */
1925 0, /* tp_base */
1926 0, /* tp_dict */
1927 0, /* tp_descr_get */
1928 0, /* tp_descr_set */
1929 0, /* tp_dictoffset */
1930 0, /* tp_init */
1931 PyType_GenericAlloc, /* tp_alloc */
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001932 frozenset_new, /* tp_new */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001933 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00001934};
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001935
1936
1937/***** C API functions *************************************************/
1938
1939PyObject *
1940PySet_New(PyObject *iterable)
1941{
1942 return make_new_set(&PySet_Type, iterable);
1943}
1944
1945PyObject *
1946PyFrozenSet_New(PyObject *iterable)
1947{
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001948 PyObject *args, *result;
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001949
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001950 if (iterable == NULL)
1951 args = PyTuple_New(0);
1952 else
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001953 args = PyTuple_Pack(1, iterable);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001954 if (args == NULL)
1955 return NULL;
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001956 result = frozenset_new(&PyFrozenSet_Type, args, NULL);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001957 Py_DECREF(args);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001958 return result;
1959}
1960
1961int
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001962PySet_Size(PyObject *anyset)
1963{
1964 if (!PyAnySet_Check(anyset)) {
1965 PyErr_BadInternalCall();
1966 return -1;
1967 }
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001968 return PySet_GET_SIZE(anyset);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001969}
1970
1971int
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001972PySet_Contains(PyObject *anyset, PyObject *key)
1973{
1974 if (!PyAnySet_Check(anyset)) {
1975 PyErr_BadInternalCall();
1976 return -1;
1977 }
1978 return set_contains_key((PySetObject *)anyset, key);
1979}
1980
1981int
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001982PySet_Discard(PyObject *set, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001983{
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001984 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001985 PyErr_BadInternalCall();
1986 return -1;
1987 }
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001988 return set_discard_key((PySetObject *)set, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001989}
1990
1991int
1992PySet_Add(PyObject *set, PyObject *key)
1993{
1994 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
1995 PyErr_BadInternalCall();
1996 return -1;
1997 }
1998 return set_add_key((PySetObject *)set, key);
1999}
2000
2001PyObject *
2002PySet_Pop(PyObject *set)
2003{
2004 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
2005 PyErr_BadInternalCall();
2006 return NULL;
2007 }
2008 return set_pop((PySetObject *)set);
2009}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002010
2011
2012#ifdef Py_DEBUG
2013
2014/* Test code to be called with any three element set.
2015 Returns True and original set is restored. */
2016
2017#define assertRaises(call_return_value, exception) \
2018 do { \
2019 assert(call_return_value); \
2020 assert(PyErr_ExceptionMatches(exception)); \
2021 PyErr_Clear(); \
2022 } while(0)
2023
2024static PyObject *
2025test_c_api(PySetObject *so)
2026{
2027 PyObject *elem, *dup, *t, *f, *ob = (PyObject *)so;
2028
2029 /* Verify preconditions and exercise type/size checks */
2030 assert(PyAnySet_Check(ob));
2031 assert(PyAnySet_CheckExact(ob));
2032 assert(!PyFrozenSet_CheckExact(ob));
2033 assert(PySet_Size(ob) == 3);
2034 assert(PySet_GET_SIZE(ob) == 3);
2035
2036 /* Raise TypeError for non-iterable constructor arguments */
2037 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2038 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
2039
2040 /* Raise TypeError for unhashable key */
2041 dup = PySet_New(ob);
2042 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2043 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2044 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
2045
2046 /* Exercise successful pop, contains, add, and discard */
2047 elem = PySet_Pop(ob);
2048 assert(PySet_Contains(ob, elem) == 0);
2049 assert(PySet_GET_SIZE(ob) == 2);
2050 assert(PySet_Add(ob, elem) == 0);
2051 assert(PySet_Contains(ob, elem) == 1);
2052 assert(PySet_GET_SIZE(ob) == 3);
2053 assert(PySet_Discard(ob, elem) == 1);
2054 assert(PySet_GET_SIZE(ob) == 2);
2055 assert(PySet_Discard(ob, elem) == 0);
2056 assert(PySet_GET_SIZE(ob) == 2);
2057
2058 /* Raise SystemError when self argument is not a set or frozenset. */
2059 t = PyTuple_New(0);
2060 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2061 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2062 Py_DECREF(t);
2063
2064 /* Raise SystemError when self argument is not a set. */
2065 f = PyFrozenSet_New(dup);
2066 assert(PySet_Size(f) == 3);
2067 assert(PyFrozenSet_CheckExact(f));
2068 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2069 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2070 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2071 Py_DECREF(f);
2072
2073 /* Raise KeyError when popping from an empty set */
Raymond Hettingerd8e13382005-08-17 12:27:17 +00002074 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
2075 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002076 assert(PySet_GET_SIZE(ob) == 0);
2077 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
2078
Raymond Hettingerd8e13382005-08-17 12:27:17 +00002079 /* Restore the set from the copy using the PyNumber API */
2080 assert(PyNumber_InPlaceOr(ob, dup) == ob);
2081 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002082
2083 /* Verify constructors accept NULL arguments */
2084 f = PySet_New(NULL);
2085 assert(f != NULL);
2086 assert(PySet_GET_SIZE(f) == 0);
2087 Py_DECREF(f);
2088 f = PyFrozenSet_New(NULL);
2089 assert(f != NULL);
2090 assert(PyFrozenSet_CheckExact(f));
2091 assert(PySet_GET_SIZE(f) == 0);
2092 Py_DECREF(f);
2093
2094 Py_DECREF(elem);
2095 Py_DECREF(dup);
2096 Py_RETURN_TRUE;
2097}
2098
Raymond Hettinger9bda1d62005-09-16 07:14:21 +00002099#undef assertRaises
2100
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002101#endif