blob: dbfa79cc3e712b393fcdafbda58a6c48a86bd2b4 [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 Hettingerbc841a12005-08-07 13:02:53 +000047The lookup function always succeeds and nevers return NULL. This simplifies
48and speeds client functions which do won't have to test for and handle
49errors. To meet that requirement, any errors generated by a user defined
50__cmp__() function are simply cleared and ignored.
51Previously outstanding exceptions are maintained.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000052*/
53
54static setentry *
55set_lookkey(PySetObject *so, PyObject *key, register long hash)
56{
57 register int i;
58 register unsigned int perturb;
59 register setentry *freeslot;
60 register unsigned int mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000061 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000062 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000063 register int restore_error;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +000064 register int checked_error;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000065 register int cmp;
66 PyObject *err_type, *err_value, *err_tb;
67 PyObject *startkey;
68
69 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000070 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000071 if (entry->key == NULL || entry->key == key)
72 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000073
Raymond Hettingered6c1ef2005-08-13 08:28:03 +000074 restore_error = checked_error = 0;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000075 if (entry->key == dummy)
76 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000077 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000078 if (entry->hash == hash) {
Raymond Hettingered6c1ef2005-08-13 08:28:03 +000079 /* error can't have been checked yet */
80 checked_error = 1;
Raymond Hettinger5ba0cbe2005-08-06 18:31:24 +000081 if (_PyErr_OCCURRED()) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000082 restore_error = 1;
83 PyErr_Fetch(&err_type, &err_value, &err_tb);
84 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000085 startkey = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000086 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
87 if (cmp < 0)
88 PyErr_Clear();
Raymond Hettingera580c472005-08-05 17:19:54 +000089 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000090 if (cmp > 0)
91 goto Done;
92 }
93 else {
94 /* The compare did major nasty stuff to the
95 * set: start over.
96 */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000097 entry = set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000098 goto Done;
99 }
100 }
101 freeslot = NULL;
102 }
103
104 /* In the loop, key == dummy is by far (factor of 100s) the
105 least likely outcome, so test for that last. */
106 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
107 i = (i << 2) + i + perturb + 1;
Raymond Hettingera580c472005-08-05 17:19:54 +0000108 entry = &table[i & mask];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000109 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000110 if (freeslot != NULL)
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000111 entry = freeslot;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000112 break;
113 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000114 if (entry->key == key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000115 break;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000116 if (entry->hash == hash && entry->key != dummy) {
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000117 if (!checked_error) {
118 checked_error = 1;
119 if (_PyErr_OCCURRED()) {
120 restore_error = 1;
121 PyErr_Fetch(&err_type, &err_value,
122 &err_tb);
123 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000124 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000125 startkey = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000126 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
127 if (cmp < 0)
128 PyErr_Clear();
Raymond Hettingera580c472005-08-05 17:19:54 +0000129 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000130 if (cmp > 0)
131 break;
132 }
133 else {
134 /* The compare did major nasty stuff to the
135 * set: start over.
136 */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000137 entry = set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000138 break;
139 }
140 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000141 else if (entry->key == dummy && freeslot == NULL)
142 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000143 }
144
145Done:
146 if (restore_error)
147 PyErr_Restore(err_type, err_value, err_tb);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000148 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000149}
150
151/*
152 * Hacked up version of set_lookkey which can assume keys are always strings;
153 * this assumption allows testing for errors during PyObject_Compare() to
154 * be dropped; string-string comparisons never raise exceptions. This also
155 * means we don't need to go through PyObject_Compare(); we can always use
156 * _PyString_Eq directly.
157 *
158 * This is valuable because the general-case error handling in set_lookkey() is
159 * expensive, and sets with pure-string keys may be very common.
160 */
161static setentry *
162set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
163{
164 register int i;
165 register unsigned int perturb;
166 register setentry *freeslot;
167 register unsigned int mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000168 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000169 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000170
171 /* Make sure this function doesn't have to handle non-string keys,
172 including subclasses of str; e.g., one reason to subclass
173 strings is to override __eq__, and for speed we don't cater to
174 that here. */
175 if (!PyString_CheckExact(key)) {
176 so->lookup = set_lookkey;
177 return set_lookkey(so, key, hash);
178 }
179 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000180 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000181 if (entry->key == NULL || entry->key == key)
182 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000183 if (entry->key == dummy)
184 freeslot = entry;
185 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000186 if (entry->hash == hash && _PyString_Eq(entry->key, key))
187 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000188 freeslot = NULL;
189 }
190
191 /* In the loop, key == dummy is by far (factor of 100s) the
192 least likely outcome, so test for that last. */
193 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
194 i = (i << 2) + i + perturb + 1;
195 entry = &table[i & mask];
196 if (entry->key == NULL)
197 return freeslot == NULL ? entry : freeslot;
198 if (entry->key == key
199 || (entry->hash == hash
200 && entry->key != dummy
201 && _PyString_Eq(entry->key, key)))
202 return entry;
203 if (entry->key == dummy && freeslot == NULL)
204 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000205 }
206}
207
208/*
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000209Internal routine to insert a new key into the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000210Used both by the internal resize routine and by the public insert routine.
211Eats a reference to key.
212*/
213static void
214set_insert_key(register PySetObject *so, PyObject *key, long hash)
215{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000216 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000217 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
218
219 assert(so->lookup != NULL);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000220 entry = so->lookup(so, key, hash);
221 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 }
237}
238
239/*
240Restructure the table by allocating a new table and reinserting all
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000241keys again. When entries have been deleted, the new table may
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000242actually be smaller than the old one.
243*/
244static int
245set_table_resize(PySetObject *so, int minused)
246{
247 int newsize;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000248 setentry *oldtable, *newtable, *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000249 int i;
250 int is_oldtable_malloced;
251 setentry small_copy[PySet_MINSIZE];
252
253 assert(minused >= 0);
254
255 /* Find the smallest table size > minused. */
256 for (newsize = PySet_MINSIZE;
257 newsize <= minused && newsize > 0;
258 newsize <<= 1)
259 ;
260 if (newsize <= 0) {
261 PyErr_NoMemory();
262 return -1;
263 }
264
265 /* Get space for a new table. */
266 oldtable = so->table;
267 assert(oldtable != NULL);
268 is_oldtable_malloced = oldtable != so->smalltable;
269
270 if (newsize == PySet_MINSIZE) {
271 /* A large table is shrinking, or we can't get any smaller. */
272 newtable = so->smalltable;
273 if (newtable == oldtable) {
274 if (so->fill == so->used) {
275 /* No dummies, so no point doing anything. */
276 return 0;
277 }
278 /* We're not going to resize it, but rebuild the
279 table anyway to purge old dummy entries.
280 Subtle: This is *necessary* if fill==size,
281 as set_lookkey needs at least one virgin slot to
282 terminate failing searches. If fill < size, it's
283 merely desirable, as dummies slow searches. */
284 assert(so->fill > so->used);
285 memcpy(small_copy, oldtable, sizeof(small_copy));
286 oldtable = small_copy;
287 }
288 }
289 else {
290 newtable = PyMem_NEW(setentry, newsize);
291 if (newtable == NULL) {
292 PyErr_NoMemory();
293 return -1;
294 }
295 }
296
297 /* Make the set empty, using the new table. */
298 assert(newtable != oldtable);
299 so->table = newtable;
300 so->mask = newsize - 1;
301 memset(newtable, 0, sizeof(setentry) * newsize);
302 so->used = 0;
303 i = so->fill;
304 so->fill = 0;
305
306 /* Copy the data over; this is refcount-neutral for active entries;
307 dummy entries aren't copied over, of course */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000308 for (entry = oldtable; i > 0; entry++) {
309 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000310 /* UNUSED */
311 ;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000312 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000313 /* DUMMY */
314 --i;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000315 assert(entry->key == dummy);
316 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000317 } else {
318 /* ACTIVE */
319 --i;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000320 set_insert_key(so, entry->key, entry->hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000321 }
322 }
323
324 if (is_oldtable_malloced)
325 PyMem_DEL(oldtable);
326 return 0;
327}
328
Raymond Hettingerc991db22005-08-11 07:58:45 +0000329/* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
330
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000331static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000332set_add_entry(register PySetObject *so, setentry *entry)
333{
334 register int n_used;
335
336 assert(so->fill <= so->mask); /* at least one empty slot */
337 n_used = so->used;
338 Py_INCREF(entry->key);
339 set_insert_key(so, entry->key, entry->hash);
340 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
341 return 0;
342 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
343}
344
345static int
346set_add_key(register PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000347{
348 register long hash;
349 register int n_used;
350
Raymond Hettingerc991db22005-08-11 07:58:45 +0000351 if (!PyString_CheckExact(key) ||
352 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000353 hash = PyObject_Hash(key);
354 if (hash == -1)
355 return -1;
356 }
357 assert(so->fill <= so->mask); /* at least one empty slot */
358 n_used = so->used;
359 Py_INCREF(key);
360 set_insert_key(so, key, hash);
361 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
362 return 0;
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000363 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000364}
365
366#define DISCARD_NOTFOUND 0
367#define DISCARD_FOUND 1
368
369static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000370set_discard_entry(PySetObject *so, setentry *oldentry)
371{ register setentry *entry;
372 PyObject *old_key;
373
374 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
375 if (entry->key == NULL || entry->key == dummy)
376 return DISCARD_NOTFOUND;
377 old_key = entry->key;
378 Py_INCREF(dummy);
379 entry->key = dummy;
380 so->used--;
381 Py_DECREF(old_key);
382 return DISCARD_FOUND;
383}
384
385static int
386set_discard_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000387{
388 register long hash;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000389 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000390 PyObject *old_key;
391
392 assert (PyAnySet_Check(so));
393 if (!PyString_CheckExact(key) ||
394 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
395 hash = PyObject_Hash(key);
396 if (hash == -1)
397 return -1;
398 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000399 entry = (so->lookup)(so, key, hash);
400 if (entry->key == NULL || entry->key == dummy)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000401 return DISCARD_NOTFOUND;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000402 old_key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000403 Py_INCREF(dummy);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000404 entry->key = dummy;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000405 so->used--;
406 Py_DECREF(old_key);
407 return DISCARD_FOUND;
408}
409
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000410static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000411set_clear_internal(PySetObject *so)
412{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000413 setentry *entry, *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000414 int table_is_malloced;
415 int fill;
416 setentry small_copy[PySet_MINSIZE];
417#ifdef Py_DEBUG
418 int i, n;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000419 assert (PyAnySet_Check(so));
Raymond Hettingera580c472005-08-05 17:19:54 +0000420
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000421 n = so->mask + 1;
422 i = 0;
423#endif
424
425 table = so->table;
426 assert(table != NULL);
427 table_is_malloced = table != so->smalltable;
428
429 /* This is delicate. During the process of clearing the set,
430 * decrefs can cause the set to mutate. To avoid fatal confusion
431 * (voice of experience), we have to make the set empty before
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000432 * clearing the slots, and never refer to anything via so->ref while
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000433 * clearing.
434 */
435 fill = so->fill;
436 if (table_is_malloced)
437 EMPTY_TO_MINSIZE(so);
438
439 else if (fill > 0) {
440 /* It's a small table with something that needs to be cleared.
441 * Afraid the only safe way is to copy the set entries into
442 * another small table first.
443 */
444 memcpy(small_copy, table, sizeof(small_copy));
445 table = small_copy;
446 EMPTY_TO_MINSIZE(so);
447 }
448 /* else it's a small table that's already empty */
449
450 /* Now we can finally clear things. If C had refcounts, we could
451 * assert that the refcount on table is 1 now, i.e. that this function
452 * has unique access to it, so decref side-effects can't alter it.
453 */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000454 for (entry = table; fill > 0; ++entry) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000455#ifdef Py_DEBUG
456 assert(i < n);
457 ++i;
458#endif
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000459 if (entry->key) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000460 --fill;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000461 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000462 }
463#ifdef Py_DEBUG
464 else
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000465 assert(entry->key == NULL || entry->key == dummy);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000466#endif
467 }
468
469 if (table_is_malloced)
470 PyMem_DEL(table);
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000471 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000472}
473
474/*
475 * Iterate over a set table. Use like so:
476 *
Raymond Hettingerd7946662005-08-01 21:39:29 +0000477 * int pos;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000478 * setentry *entry;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000479 * pos = 0; # important! pos should not otherwise be changed by you
Raymond Hettingerc991db22005-08-11 07:58:45 +0000480 * while (set_next(yourset, &pos, &entry)) {
481 * Refer to borrowed reference in entry->key.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000482 * }
483 *
Raymond Hettingerc991db22005-08-11 07:58:45 +0000484 * CAUTION: In general, it isn't safe to use set_next in a loop that
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000485 * mutates the table.
486 */
487static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000488set_next(PySetObject *so, int *pos_ptr, setentry **entry_ptr)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000489{
490 register int i, mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000491 register setentry *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000492
493 assert (PyAnySet_Check(so));
Raymond Hettingerc991db22005-08-11 07:58:45 +0000494 i = *pos_ptr;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000495 assert(i >= 0);
Raymond Hettingerc991db22005-08-11 07:58:45 +0000496 table = so->table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000497 mask = so->mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000498 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000499 i++;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000500 *pos_ptr = i+1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000501 if (i > mask)
502 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000503 assert(table[i].key != NULL);
504 *entry_ptr = &table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000505 return 1;
506}
507
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000508static void
509set_dealloc(PySetObject *so)
510{
511 register setentry *entry;
512 int fill = so->fill;
513 PyObject_GC_UnTrack(so);
514 Py_TRASHCAN_SAFE_BEGIN(so)
515 if (so->weakreflist != NULL)
516 PyObject_ClearWeakRefs((PyObject *) so);
517
518 for (entry = so->table; fill > 0; entry++) {
519 if (entry->key) {
520 --fill;
521 Py_DECREF(entry->key);
522 }
523 }
524 if (so->table != so->smalltable)
525 PyMem_DEL(so->table);
526 if (num_free_sets < MAXFREESETS && PyAnySet_CheckExact(so))
527 free_sets[num_free_sets++] = so;
528 else
529 so->ob_type->tp_free(so);
530 Py_TRASHCAN_SAFE_END(so)
531}
532
533static int
534set_tp_print(PySetObject *so, FILE *fp, int flags)
535{
536 setentry *entry;
537 int pos=0;
538 char *emit = ""; /* No separator emitted on first pass */
539 char *separator = ", ";
540
541 fprintf(fp, "%s([", so->ob_type->tp_name);
542 while (set_next(so, &pos, &entry)) {
543 fputs(emit, fp);
544 emit = separator;
545 if (PyObject_Print(entry->key, fp, 0) != 0)
546 return -1;
547 }
548 fputs("])", fp);
549 return 0;
550}
551
552static PyObject *
553set_repr(PySetObject *so)
554{
555 PyObject *keys, *result, *listrepr;
556
557 keys = PySequence_List((PyObject *)so);
558 if (keys == NULL)
559 return NULL;
560 listrepr = PyObject_Repr(keys);
561 Py_DECREF(keys);
562 if (listrepr == NULL)
563 return NULL;
564
565 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
566 PyString_AS_STRING(listrepr));
567 Py_DECREF(listrepr);
568 return result;
569}
570
571static int
572set_len(PyObject *so)
573{
574 return ((PySetObject *)so)->used;
575}
576
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000577static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000578set_merge(PySetObject *so, PyObject *otherset)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000579{
Raymond Hettingerd7946662005-08-01 21:39:29 +0000580 PySetObject *other;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000581 register int i;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000582 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000583
584 assert (PyAnySet_Check(so));
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000585 assert (PyAnySet_Check(otherset));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000586
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000587 other = (PySetObject*)otherset;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000588 if (other == so || other->used == 0)
589 /* a.update(a) or a.update({}); nothing to do */
590 return 0;
591 /* Do one big resize at the start, rather than
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000592 * incrementally resizing as we insert new keys. Expect
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000593 * that there will be no (or few) overlapping keys.
594 */
595 if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
596 if (set_table_resize(so, (so->used + other->used)*2) != 0)
597 return -1;
598 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000599 for (i = 0; i <= other->mask; i++) {
600 entry = &other->table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000601 if (entry->key != NULL &&
602 entry->key != dummy) {
603 Py_INCREF(entry->key);
604 set_insert_key(so, entry->key, entry->hash);
605 }
606 }
607 return 0;
608}
609
610static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000611set_contains_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000612{
613 long hash;
614
615 if (!PyString_CheckExact(key) ||
616 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
617 hash = PyObject_Hash(key);
618 if (hash == -1)
619 return -1;
620 }
621 key = (so->lookup)(so, key, hash)->key;
622 return key != NULL && key != dummy;
623}
624
Raymond Hettingerc991db22005-08-11 07:58:45 +0000625static int
626set_contains_entry(PySetObject *so, setentry *entry)
627{
628 PyObject *key;
629
630 key = (so->lookup)(so, entry->key, entry->hash)->key;
631 return key != NULL && key != dummy;
632}
633
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000634static PyObject *
635set_pop(PySetObject *so)
636{
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000637 register int i = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000638 register setentry *entry;
639 PyObject *key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000640
641 assert (PyAnySet_Check(so));
642 if (so->used == 0) {
643 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
644 return NULL;
645 }
646
647 /* Set entry to "the first" unused or dummy set entry. We abuse
648 * the hash field of slot 0 to hold a search finger:
649 * If slot 0 has a value, use slot 0.
650 * Else slot 0 is being used to hold a search finger,
651 * and we use its hash value as the first index to look.
652 */
653 entry = &so->table[0];
654 if (entry->key == NULL || entry->key == dummy) {
655 i = (int)entry->hash;
656 /* The hash field may be a real hash value, or it may be a
657 * legit search finger, or it may be a once-legit search
658 * finger that's out of bounds now because it wrapped around
659 * or the table shrunk -- simply make sure it's in bounds now.
660 */
661 if (i > so->mask || i < 1)
662 i = 1; /* skip slot 0 */
663 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
664 i++;
665 if (i > so->mask)
666 i = 1;
667 }
668 }
669 key = entry->key;
670 Py_INCREF(dummy);
671 entry->key = dummy;
672 so->used--;
673 so->table[0].hash = i + 1; /* next place to start */
674 return key;
675}
676
677PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
678
679static int
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000680set_traverse(PySetObject *so, visitproc visit, void *arg)
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000681{
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000682 int pos = 0;
683 setentry *entry;
684
685 while (set_next(so, &pos, &entry))
686 Py_VISIT(entry->key);
687 return 0;
688}
689
690static long
691frozenset_hash(PyObject *self)
692{
693 PySetObject *so = (PySetObject *)self;
694 long h, hash = 1927868237L;
695 setentry *entry;
696 int pos = 0;
697
698 if (so->hash != -1)
699 return so->hash;
700
701 hash *= PySet_GET_SIZE(self) + 1;
702 while (set_next(so, &pos, &entry)) {
703 /* Work to increase the bit dispersion for closely spaced hash
704 values. The is important because some use cases have many
705 combinations of a small number of elements with nearby
706 hashes so that many distinct combinations collapse to only
707 a handful of distinct hash values. */
708 h = entry->hash;
709 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
710 }
711 hash = hash * 69069L + 907133923L;
712 if (hash == -1)
713 hash = 590923713L;
714 so->hash = hash;
715 return hash;
716}
717
718static long
719set_nohash(PyObject *self)
720{
721 PyErr_SetString(PyExc_TypeError, "set objects are unhashable");
722 return -1;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000723}
724
Raymond Hettingera9d99362005-08-05 00:01:15 +0000725/***** Set iterator type ***********************************************/
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000726
Raymond Hettingerd7946662005-08-01 21:39:29 +0000727static PyTypeObject PySetIter_Type; /* Forward */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000728
729typedef struct {
730 PyObject_HEAD
731 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
732 int si_used;
733 int si_pos;
734 long len;
735} setiterobject;
736
737static PyObject *
738set_iter(PySetObject *so)
739{
740 setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
741 if (si == NULL)
742 return NULL;
743 Py_INCREF(so);
744 si->si_set = so;
745 si->si_used = so->used;
746 si->si_pos = 0;
747 si->len = so->used;
748 return (PyObject *)si;
749}
750
751static void
752setiter_dealloc(setiterobject *si)
753{
754 Py_XDECREF(si->si_set);
755 PyObject_Del(si);
756}
757
758static int
759setiter_len(setiterobject *si)
760{
761 if (si->si_set != NULL && si->si_used == si->si_set->used)
762 return si->len;
763 return 0;
764}
765
766static PySequenceMethods setiter_as_sequence = {
767 (inquiry)setiter_len, /* sq_length */
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000768 0, /* sq_concat */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000769};
770
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000771static PyObject *setiter_iternext(setiterobject *si)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000772{
773 PyObject *key;
774 register int i, mask;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000775 register setentry *entry;
776 PySetObject *so = si->si_set;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000777
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000778 if (so == NULL)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000779 return NULL;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000780 assert (PyAnySet_Check(so));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000781
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000782 if (si->si_used != so->used) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000783 PyErr_SetString(PyExc_RuntimeError,
784 "Set changed size during iteration");
785 si->si_used = -1; /* Make this state sticky */
786 return NULL;
787 }
788
789 i = si->si_pos;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000790 assert(i>=0);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000791 entry = so->table;
792 mask = so->mask;
793 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000794 i++;
795 si->si_pos = i+1;
796 if (i > mask)
797 goto fail;
798 si->len--;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000799 key = entry[i].key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000800 Py_INCREF(key);
801 return key;
802
803fail:
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000804 Py_DECREF(so);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000805 si->si_set = NULL;
806 return NULL;
807}
808
Hye-Shik Change2956762005-08-01 05:26:41 +0000809static PyTypeObject PySetIter_Type = {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000810 PyObject_HEAD_INIT(&PyType_Type)
811 0, /* ob_size */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000812 "setiterator", /* tp_name */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000813 sizeof(setiterobject), /* tp_basicsize */
814 0, /* tp_itemsize */
815 /* methods */
816 (destructor)setiter_dealloc, /* tp_dealloc */
817 0, /* tp_print */
818 0, /* tp_getattr */
819 0, /* tp_setattr */
820 0, /* tp_compare */
821 0, /* tp_repr */
822 0, /* tp_as_number */
823 &setiter_as_sequence, /* tp_as_sequence */
824 0, /* tp_as_mapping */
825 0, /* tp_hash */
826 0, /* tp_call */
827 0, /* tp_str */
828 PyObject_GenericGetAttr, /* tp_getattro */
829 0, /* tp_setattro */
830 0, /* tp_as_buffer */
831 Py_TPFLAGS_DEFAULT, /* tp_flags */
832 0, /* tp_doc */
833 0, /* tp_traverse */
834 0, /* tp_clear */
835 0, /* tp_richcompare */
836 0, /* tp_weaklistoffset */
837 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000838 (iternextfunc)setiter_iternext, /* tp_iternext */
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)) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000850 PyObject *key, *value;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000851 int 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)) {
Raymond Hettingera3b11e72003-12-31 14:08:58 +00001125 int 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
Raymond Hettingerc991db22005-08-11 07:58:45 +00001218int
1219set_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;
1226 int pos = 0;
1227
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;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001270 int pos = 0;
1271
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;
Raymond Hettingerdc5ae112003-12-13 14:46:46 +00001344 int 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;
1446 int 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 = {
1691 (inquiry)set_len, /* sq_length */
1692 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
2099#endif