remove wrong markup
[python.git] / Objects / setobject.c
blob81fd31580e4ade5b3527785a6e93be75b436d51b
2 /* set object implementation
3 Written and maintained by Raymond D. Hettinger <python@rcn.com>
4 Derived from Lib/sets.py and Objects/dictobject.c.
6 Copyright (c) 2003-2007 Python Software Foundation.
7 All rights reserved.
8 */
10 #include "Python.h"
11 #include "structmember.h"
13 /* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16 static void
17 set_key_error(PyObject *arg)
19 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
24 Py_DECREF(tup);
27 /* This must be >= 1. */
28 #define PERTURB_SHIFT 5
30 /* Object used as dummy key to fill deleted entries */
31 static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
33 #ifdef Py_REF_DEBUG
34 PyObject *
35 _PySet_Dummy(void)
37 return dummy;
39 #endif
41 #define INIT_NONZERO_SET_SLOTS(so) do { \
42 (so)->table = (so)->smalltable; \
43 (so)->mask = PySet_MINSIZE - 1; \
44 (so)->hash = -1; \
45 } while(0)
47 #define EMPTY_TO_MINSIZE(so) do { \
48 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \
49 (so)->used = (so)->fill = 0; \
50 INIT_NONZERO_SET_SLOTS(so); \
51 } while(0)
53 /* Reuse scheme to save calls to malloc, free, and memset */
54 #ifndef PySet_MAXFREELIST
55 #define PySet_MAXFREELIST 80
56 #endif
57 static PySetObject *free_list[PySet_MAXFREELIST];
58 static int numfree = 0;
61 The basic lookup function used by all operations.
62 This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
63 Open addressing is preferred over chaining since the link overhead for
64 chaining would be substantial (100% with typical malloc overhead).
66 The initial probe index is computed as hash mod the table size. Subsequent
67 probe indices are computed as explained in Objects/dictobject.c.
69 All arithmetic on hash should ignore overflow.
71 Unlike the dictionary implementation, the lookkey functions can return
72 NULL if the rich comparison returns an error.
75 static setentry *
76 set_lookkey(PySetObject *so, PyObject *key, register long hash)
78 register Py_ssize_t i;
79 register size_t perturb;
80 register setentry *freeslot;
81 register size_t mask = so->mask;
82 setentry *table = so->table;
83 register setentry *entry;
84 register int cmp;
85 PyObject *startkey;
87 i = hash & mask;
88 entry = &table[i];
89 if (entry->key == NULL || entry->key == key)
90 return entry;
92 if (entry->key == dummy)
93 freeslot = entry;
94 else {
95 if (entry->hash == hash) {
96 startkey = entry->key;
97 Py_INCREF(startkey);
98 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
99 Py_DECREF(startkey);
100 if (cmp < 0)
101 return NULL;
102 if (table == so->table && entry->key == startkey) {
103 if (cmp > 0)
104 return entry;
106 else {
107 /* The compare did major nasty stuff to the
108 * set: start over.
110 return set_lookkey(so, key, hash);
113 freeslot = NULL;
116 /* In the loop, key == dummy is by far (factor of 100s) the
117 least likely outcome, so test for that last. */
118 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
119 i = (i << 2) + i + perturb + 1;
120 entry = &table[i & mask];
121 if (entry->key == NULL) {
122 if (freeslot != NULL)
123 entry = freeslot;
124 break;
126 if (entry->key == key)
127 break;
128 if (entry->hash == hash && entry->key != dummy) {
129 startkey = entry->key;
130 Py_INCREF(startkey);
131 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
132 Py_DECREF(startkey);
133 if (cmp < 0)
134 return NULL;
135 if (table == so->table && entry->key == startkey) {
136 if (cmp > 0)
137 break;
139 else {
140 /* The compare did major nasty stuff to the
141 * set: start over.
143 return set_lookkey(so, key, hash);
146 else if (entry->key == dummy && freeslot == NULL)
147 freeslot = entry;
149 return entry;
153 * Hacked up version of set_lookkey which can assume keys are always strings;
154 * This means we can always use _PyString_Eq directly and not have to check to
155 * see if the comparison altered the table.
157 static setentry *
158 set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
160 register Py_ssize_t i;
161 register size_t perturb;
162 register setentry *freeslot;
163 register size_t mask = so->mask;
164 setentry *table = so->table;
165 register setentry *entry;
167 /* Make sure this function doesn't have to handle non-string keys,
168 including subclasses of str; e.g., one reason to subclass
169 strings is to override __eq__, and for speed we don't cater to
170 that here. */
171 if (!PyString_CheckExact(key)) {
172 so->lookup = set_lookkey;
173 return set_lookkey(so, key, hash);
175 i = hash & mask;
176 entry = &table[i];
177 if (entry->key == NULL || entry->key == key)
178 return entry;
179 if (entry->key == dummy)
180 freeslot = entry;
181 else {
182 if (entry->hash == hash && _PyString_Eq(entry->key, key))
183 return entry;
184 freeslot = NULL;
187 /* In the loop, key == dummy is by far (factor of 100s) the
188 least likely outcome, so test for that last. */
189 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
190 i = (i << 2) + i + perturb + 1;
191 entry = &table[i & mask];
192 if (entry->key == NULL)
193 return freeslot == NULL ? entry : freeslot;
194 if (entry->key == key
195 || (entry->hash == hash
196 && entry->key != dummy
197 && _PyString_Eq(entry->key, key)))
198 return entry;
199 if (entry->key == dummy && freeslot == NULL)
200 freeslot = entry;
202 assert(0); /* NOT REACHED */
203 return 0;
207 Internal routine to insert a new key into the table.
208 Used by the public insert routine.
209 Eats a reference to key.
211 static int
212 set_insert_key(register PySetObject *so, PyObject *key, long hash)
214 register setentry *entry;
215 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
217 assert(so->lookup != NULL);
218 entry = so->lookup(so, key, hash);
219 if (entry == NULL)
220 return -1;
221 if (entry->key == NULL) {
222 /* UNUSED */
223 so->fill++;
224 entry->key = key;
225 entry->hash = hash;
226 so->used++;
227 } else if (entry->key == dummy) {
228 /* DUMMY */
229 entry->key = key;
230 entry->hash = hash;
231 so->used++;
232 Py_DECREF(dummy);
233 } else {
234 /* ACTIVE */
235 Py_DECREF(key);
237 return 0;
241 Internal routine used by set_table_resize() to insert an item which is
242 known to be absent from the set. This routine also assumes that
243 the set contains no deleted entries. Besides the performance benefit,
244 using set_insert_clean() in set_table_resize() is dangerous (SF bug #1456209).
245 Note that no refcounts are changed by this routine; if needed, the caller
246 is responsible for incref'ing `key`.
248 static void
249 set_insert_clean(register PySetObject *so, PyObject *key, long hash)
251 register size_t i;
252 register size_t perturb;
253 register size_t mask = (size_t)so->mask;
254 setentry *table = so->table;
255 register setentry *entry;
257 i = hash & mask;
258 entry = &table[i];
259 for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) {
260 i = (i << 2) + i + perturb + 1;
261 entry = &table[i & mask];
263 so->fill++;
264 entry->key = key;
265 entry->hash = hash;
266 so->used++;
270 Restructure the table by allocating a new table and reinserting all
271 keys again. When entries have been deleted, the new table may
272 actually be smaller than the old one.
274 static int
275 set_table_resize(PySetObject *so, Py_ssize_t minused)
277 Py_ssize_t newsize;
278 setentry *oldtable, *newtable, *entry;
279 Py_ssize_t i;
280 int is_oldtable_malloced;
281 setentry small_copy[PySet_MINSIZE];
283 assert(minused >= 0);
285 /* Find the smallest table size > minused. */
286 for (newsize = PySet_MINSIZE;
287 newsize <= minused && newsize > 0;
288 newsize <<= 1)
290 if (newsize <= 0) {
291 PyErr_NoMemory();
292 return -1;
295 /* Get space for a new table. */
296 oldtable = so->table;
297 assert(oldtable != NULL);
298 is_oldtable_malloced = oldtable != so->smalltable;
300 if (newsize == PySet_MINSIZE) {
301 /* A large table is shrinking, or we can't get any smaller. */
302 newtable = so->smalltable;
303 if (newtable == oldtable) {
304 if (so->fill == so->used) {
305 /* No dummies, so no point doing anything. */
306 return 0;
308 /* We're not going to resize it, but rebuild the
309 table anyway to purge old dummy entries.
310 Subtle: This is *necessary* if fill==size,
311 as set_lookkey needs at least one virgin slot to
312 terminate failing searches. If fill < size, it's
313 merely desirable, as dummies slow searches. */
314 assert(so->fill > so->used);
315 memcpy(small_copy, oldtable, sizeof(small_copy));
316 oldtable = small_copy;
319 else {
320 newtable = PyMem_NEW(setentry, newsize);
321 if (newtable == NULL) {
322 PyErr_NoMemory();
323 return -1;
327 /* Make the set empty, using the new table. */
328 assert(newtable != oldtable);
329 so->table = newtable;
330 so->mask = newsize - 1;
331 memset(newtable, 0, sizeof(setentry) * newsize);
332 so->used = 0;
333 i = so->fill;
334 so->fill = 0;
336 /* Copy the data over; this is refcount-neutral for active entries;
337 dummy entries aren't copied over, of course */
338 for (entry = oldtable; i > 0; entry++) {
339 if (entry->key == NULL) {
340 /* UNUSED */
342 } else if (entry->key == dummy) {
343 /* DUMMY */
344 --i;
345 assert(entry->key == dummy);
346 Py_DECREF(entry->key);
347 } else {
348 /* ACTIVE */
349 --i;
350 set_insert_clean(so, entry->key, entry->hash);
354 if (is_oldtable_malloced)
355 PyMem_DEL(oldtable);
356 return 0;
359 /* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
361 static int
362 set_add_entry(register PySetObject *so, setentry *entry)
364 register Py_ssize_t n_used;
366 assert(so->fill <= so->mask); /* at least one empty slot */
367 n_used = so->used;
368 Py_INCREF(entry->key);
369 if (set_insert_key(so, entry->key, entry->hash) == -1) {
370 Py_DECREF(entry->key);
371 return -1;
373 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
374 return 0;
375 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
378 static int
379 set_add_key(register PySetObject *so, PyObject *key)
381 register long hash;
382 register Py_ssize_t n_used;
384 if (!PyString_CheckExact(key) ||
385 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
386 hash = PyObject_Hash(key);
387 if (hash == -1)
388 return -1;
390 assert(so->fill <= so->mask); /* at least one empty slot */
391 n_used = so->used;
392 Py_INCREF(key);
393 if (set_insert_key(so, key, hash) == -1) {
394 Py_DECREF(key);
395 return -1;
397 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
398 return 0;
399 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
402 #define DISCARD_NOTFOUND 0
403 #define DISCARD_FOUND 1
405 static int
406 set_discard_entry(PySetObject *so, setentry *oldentry)
407 { register setentry *entry;
408 PyObject *old_key;
410 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
411 if (entry == NULL)
412 return -1;
413 if (entry->key == NULL || entry->key == dummy)
414 return DISCARD_NOTFOUND;
415 old_key = entry->key;
416 Py_INCREF(dummy);
417 entry->key = dummy;
418 so->used--;
419 Py_DECREF(old_key);
420 return DISCARD_FOUND;
423 static int
424 set_discard_key(PySetObject *so, PyObject *key)
426 register long hash;
427 register setentry *entry;
428 PyObject *old_key;
430 assert (PyAnySet_Check(so));
431 if (!PyString_CheckExact(key) ||
432 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
433 hash = PyObject_Hash(key);
434 if (hash == -1)
435 return -1;
437 entry = (so->lookup)(so, key, hash);
438 if (entry == NULL)
439 return -1;
440 if (entry->key == NULL || entry->key == dummy)
441 return DISCARD_NOTFOUND;
442 old_key = entry->key;
443 Py_INCREF(dummy);
444 entry->key = dummy;
445 so->used--;
446 Py_DECREF(old_key);
447 return DISCARD_FOUND;
450 static int
451 set_clear_internal(PySetObject *so)
453 setentry *entry, *table;
454 int table_is_malloced;
455 Py_ssize_t fill;
456 setentry small_copy[PySet_MINSIZE];
457 #ifdef Py_DEBUG
458 Py_ssize_t i, n;
459 assert (PyAnySet_Check(so));
461 n = so->mask + 1;
462 i = 0;
463 #endif
465 table = so->table;
466 assert(table != NULL);
467 table_is_malloced = table != so->smalltable;
469 /* This is delicate. During the process of clearing the set,
470 * decrefs can cause the set to mutate. To avoid fatal confusion
471 * (voice of experience), we have to make the set empty before
472 * clearing the slots, and never refer to anything via so->ref while
473 * clearing.
475 fill = so->fill;
476 if (table_is_malloced)
477 EMPTY_TO_MINSIZE(so);
479 else if (fill > 0) {
480 /* It's a small table with something that needs to be cleared.
481 * Afraid the only safe way is to copy the set entries into
482 * another small table first.
484 memcpy(small_copy, table, sizeof(small_copy));
485 table = small_copy;
486 EMPTY_TO_MINSIZE(so);
488 /* else it's a small table that's already empty */
490 /* Now we can finally clear things. If C had refcounts, we could
491 * assert that the refcount on table is 1 now, i.e. that this function
492 * has unique access to it, so decref side-effects can't alter it.
494 for (entry = table; fill > 0; ++entry) {
495 #ifdef Py_DEBUG
496 assert(i < n);
497 ++i;
498 #endif
499 if (entry->key) {
500 --fill;
501 Py_DECREF(entry->key);
503 #ifdef Py_DEBUG
504 else
505 assert(entry->key == NULL);
506 #endif
509 if (table_is_malloced)
510 PyMem_DEL(table);
511 return 0;
515 * Iterate over a set table. Use like so:
517 * Py_ssize_t pos;
518 * setentry *entry;
519 * pos = 0; # important! pos should not otherwise be changed by you
520 * while (set_next(yourset, &pos, &entry)) {
521 * Refer to borrowed reference in entry->key.
524 * CAUTION: In general, it isn't safe to use set_next in a loop that
525 * mutates the table.
527 static int
528 set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
530 Py_ssize_t i;
531 Py_ssize_t mask;
532 register setentry *table;
534 assert (PyAnySet_Check(so));
535 i = *pos_ptr;
536 assert(i >= 0);
537 table = so->table;
538 mask = so->mask;
539 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
540 i++;
541 *pos_ptr = i+1;
542 if (i > mask)
543 return 0;
544 assert(table[i].key != NULL);
545 *entry_ptr = &table[i];
546 return 1;
549 static void
550 set_dealloc(PySetObject *so)
552 register setentry *entry;
553 Py_ssize_t fill = so->fill;
554 PyObject_GC_UnTrack(so);
555 Py_TRASHCAN_SAFE_BEGIN(so)
556 if (so->weakreflist != NULL)
557 PyObject_ClearWeakRefs((PyObject *) so);
559 for (entry = so->table; fill > 0; entry++) {
560 if (entry->key) {
561 --fill;
562 Py_DECREF(entry->key);
565 if (so->table != so->smalltable)
566 PyMem_DEL(so->table);
567 if (numfree < PySet_MAXFREELIST && PyAnySet_CheckExact(so))
568 free_list[numfree++] = so;
569 else
570 Py_TYPE(so)->tp_free(so);
571 Py_TRASHCAN_SAFE_END(so)
574 static int
575 set_tp_print(PySetObject *so, FILE *fp, int flags)
577 setentry *entry;
578 Py_ssize_t pos=0;
579 char *emit = ""; /* No separator emitted on first pass */
580 char *separator = ", ";
581 int status = Py_ReprEnter((PyObject*)so);
583 if (status != 0) {
584 if (status < 0)
585 return status;
586 Py_BEGIN_ALLOW_THREADS
587 fprintf(fp, "%s(...)", so->ob_type->tp_name);
588 Py_END_ALLOW_THREADS
589 return 0;
592 Py_BEGIN_ALLOW_THREADS
593 fprintf(fp, "%s([", so->ob_type->tp_name);
594 Py_END_ALLOW_THREADS
595 while (set_next(so, &pos, &entry)) {
596 Py_BEGIN_ALLOW_THREADS
597 fputs(emit, fp);
598 Py_END_ALLOW_THREADS
599 emit = separator;
600 if (PyObject_Print(entry->key, fp, 0) != 0) {
601 Py_ReprLeave((PyObject*)so);
602 return -1;
605 Py_BEGIN_ALLOW_THREADS
606 fputs("])", fp);
607 Py_END_ALLOW_THREADS
608 Py_ReprLeave((PyObject*)so);
609 return 0;
612 static PyObject *
613 set_repr(PySetObject *so)
615 PyObject *keys, *result=NULL, *listrepr;
616 int status = Py_ReprEnter((PyObject*)so);
618 if (status != 0) {
619 if (status < 0)
620 return NULL;
621 return PyString_FromFormat("%s(...)", so->ob_type->tp_name);
624 keys = PySequence_List((PyObject *)so);
625 if (keys == NULL)
626 goto done;
627 listrepr = PyObject_Repr(keys);
628 Py_DECREF(keys);
629 if (listrepr == NULL)
630 goto done;
632 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
633 PyString_AS_STRING(listrepr));
634 Py_DECREF(listrepr);
635 done:
636 Py_ReprLeave((PyObject*)so);
637 return result;
640 static Py_ssize_t
641 set_len(PyObject *so)
643 return ((PySetObject *)so)->used;
646 static int
647 set_merge(PySetObject *so, PyObject *otherset)
649 PySetObject *other;
650 register Py_ssize_t i;
651 register setentry *entry;
653 assert (PyAnySet_Check(so));
654 assert (PyAnySet_Check(otherset));
656 other = (PySetObject*)otherset;
657 if (other == so || other->used == 0)
658 /* a.update(a) or a.update({}); nothing to do */
659 return 0;
660 /* Do one big resize at the start, rather than
661 * incrementally resizing as we insert new keys. Expect
662 * that there will be no (or few) overlapping keys.
664 if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
665 if (set_table_resize(so, (so->used + other->used)*2) != 0)
666 return -1;
668 for (i = 0; i <= other->mask; i++) {
669 entry = &other->table[i];
670 if (entry->key != NULL &&
671 entry->key != dummy) {
672 Py_INCREF(entry->key);
673 if (set_insert_key(so, entry->key, entry->hash) == -1) {
674 Py_DECREF(entry->key);
675 return -1;
679 return 0;
682 static int
683 set_contains_key(PySetObject *so, PyObject *key)
685 long hash;
686 setentry *entry;
688 if (!PyString_CheckExact(key) ||
689 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
690 hash = PyObject_Hash(key);
691 if (hash == -1)
692 return -1;
694 entry = (so->lookup)(so, key, hash);
695 if (entry == NULL)
696 return -1;
697 key = entry->key;
698 return key != NULL && key != dummy;
701 static int
702 set_contains_entry(PySetObject *so, setentry *entry)
704 PyObject *key;
705 setentry *lu_entry;
707 lu_entry = (so->lookup)(so, entry->key, entry->hash);
708 if (lu_entry == NULL)
709 return -1;
710 key = lu_entry->key;
711 return key != NULL && key != dummy;
714 static PyObject *
715 set_pop(PySetObject *so)
717 register Py_ssize_t i = 0;
718 register setentry *entry;
719 PyObject *key;
721 assert (PyAnySet_Check(so));
722 if (so->used == 0) {
723 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
724 return NULL;
727 /* Set entry to "the first" unused or dummy set entry. We abuse
728 * the hash field of slot 0 to hold a search finger:
729 * If slot 0 has a value, use slot 0.
730 * Else slot 0 is being used to hold a search finger,
731 * and we use its hash value as the first index to look.
733 entry = &so->table[0];
734 if (entry->key == NULL || entry->key == dummy) {
735 i = entry->hash;
736 /* The hash field may be a real hash value, or it may be a
737 * legit search finger, or it may be a once-legit search
738 * finger that's out of bounds now because it wrapped around
739 * or the table shrunk -- simply make sure it's in bounds now.
741 if (i > so->mask || i < 1)
742 i = 1; /* skip slot 0 */
743 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
744 i++;
745 if (i > so->mask)
746 i = 1;
749 key = entry->key;
750 Py_INCREF(dummy);
751 entry->key = dummy;
752 so->used--;
753 so->table[0].hash = i + 1; /* next place to start */
754 return key;
757 PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
758 Raises KeyError if the set is empty.");
760 static int
761 set_traverse(PySetObject *so, visitproc visit, void *arg)
763 Py_ssize_t pos = 0;
764 setentry *entry;
766 while (set_next(so, &pos, &entry))
767 Py_VISIT(entry->key);
768 return 0;
771 static long
772 frozenset_hash(PyObject *self)
774 PySetObject *so = (PySetObject *)self;
775 long h, hash = 1927868237L;
776 setentry *entry;
777 Py_ssize_t pos = 0;
779 if (so->hash != -1)
780 return so->hash;
782 hash *= PySet_GET_SIZE(self) + 1;
783 while (set_next(so, &pos, &entry)) {
784 /* Work to increase the bit dispersion for closely spaced hash
785 values. The is important because some use cases have many
786 combinations of a small number of elements with nearby
787 hashes so that many distinct combinations collapse to only
788 a handful of distinct hash values. */
789 h = entry->hash;
790 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
792 hash = hash * 69069L + 907133923L;
793 if (hash == -1)
794 hash = 590923713L;
795 so->hash = hash;
796 return hash;
799 /***** Set iterator type ***********************************************/
801 typedef struct {
802 PyObject_HEAD
803 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
804 Py_ssize_t si_used;
805 Py_ssize_t si_pos;
806 Py_ssize_t len;
807 } setiterobject;
809 static void
810 setiter_dealloc(setiterobject *si)
812 Py_XDECREF(si->si_set);
813 PyObject_GC_Del(si);
816 static int
817 setiter_traverse(setiterobject *si, visitproc visit, void *arg)
819 Py_VISIT(si->si_set);
820 return 0;
823 static PyObject *
824 setiter_len(setiterobject *si)
826 Py_ssize_t len = 0;
827 if (si->si_set != NULL && si->si_used == si->si_set->used)
828 len = si->len;
829 return PyInt_FromLong(len);
832 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
834 static PyMethodDef setiter_methods[] = {
835 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
836 {NULL, NULL} /* sentinel */
839 static PyObject *setiter_iternext(setiterobject *si)
841 PyObject *key;
842 register Py_ssize_t i, mask;
843 register setentry *entry;
844 PySetObject *so = si->si_set;
846 if (so == NULL)
847 return NULL;
848 assert (PyAnySet_Check(so));
850 if (si->si_used != so->used) {
851 PyErr_SetString(PyExc_RuntimeError,
852 "Set changed size during iteration");
853 si->si_used = -1; /* Make this state sticky */
854 return NULL;
857 i = si->si_pos;
858 assert(i>=0);
859 entry = so->table;
860 mask = so->mask;
861 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
862 i++;
863 si->si_pos = i+1;
864 if (i > mask)
865 goto fail;
866 si->len--;
867 key = entry[i].key;
868 Py_INCREF(key);
869 return key;
871 fail:
872 Py_DECREF(so);
873 si->si_set = NULL;
874 return NULL;
877 static PyTypeObject PySetIter_Type = {
878 PyVarObject_HEAD_INIT(&PyType_Type, 0)
879 "setiterator", /* tp_name */
880 sizeof(setiterobject), /* tp_basicsize */
881 0, /* tp_itemsize */
882 /* methods */
883 (destructor)setiter_dealloc, /* tp_dealloc */
884 0, /* tp_print */
885 0, /* tp_getattr */
886 0, /* tp_setattr */
887 0, /* tp_compare */
888 0, /* tp_repr */
889 0, /* tp_as_number */
890 0, /* tp_as_sequence */
891 0, /* tp_as_mapping */
892 0, /* tp_hash */
893 0, /* tp_call */
894 0, /* tp_str */
895 PyObject_GenericGetAttr, /* tp_getattro */
896 0, /* tp_setattro */
897 0, /* tp_as_buffer */
898 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
899 0, /* tp_doc */
900 (traverseproc)setiter_traverse, /* tp_traverse */
901 0, /* tp_clear */
902 0, /* tp_richcompare */
903 0, /* tp_weaklistoffset */
904 PyObject_SelfIter, /* tp_iter */
905 (iternextfunc)setiter_iternext, /* tp_iternext */
906 setiter_methods, /* tp_methods */
910 static PyObject *
911 set_iter(PySetObject *so)
913 setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
914 if (si == NULL)
915 return NULL;
916 Py_INCREF(so);
917 si->si_set = so;
918 si->si_used = so->used;
919 si->si_pos = 0;
920 si->len = so->used;
921 _PyObject_GC_TRACK(si);
922 return (PyObject *)si;
925 static int
926 set_update_internal(PySetObject *so, PyObject *other)
928 PyObject *key, *it;
930 if (PyAnySet_Check(other))
931 return set_merge(so, other);
933 if (PyDict_CheckExact(other)) {
934 PyObject *value;
935 Py_ssize_t pos = 0;
936 long hash;
937 Py_ssize_t dictsize = PyDict_Size(other);
939 /* Do one big resize at the start, rather than
940 * incrementally resizing as we insert new keys. Expect
941 * that there will be no (or few) overlapping keys.
943 if (dictsize == -1)
944 return -1;
945 if ((so->fill + dictsize)*3 >= (so->mask+1)*2) {
946 if (set_table_resize(so, (so->used + dictsize)*2) != 0)
947 return -1;
949 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
950 setentry an_entry;
952 an_entry.hash = hash;
953 an_entry.key = key;
954 if (set_add_entry(so, &an_entry) == -1)
955 return -1;
957 return 0;
960 it = PyObject_GetIter(other);
961 if (it == NULL)
962 return -1;
964 while ((key = PyIter_Next(it)) != NULL) {
965 if (set_add_key(so, key) == -1) {
966 Py_DECREF(it);
967 Py_DECREF(key);
968 return -1;
970 Py_DECREF(key);
972 Py_DECREF(it);
973 if (PyErr_Occurred())
974 return -1;
975 return 0;
978 static PyObject *
979 set_update(PySetObject *so, PyObject *args)
981 Py_ssize_t i;
983 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
984 PyObject *other = PyTuple_GET_ITEM(args, i);
985 if (set_update_internal(so, other) == -1)
986 return NULL;
988 Py_RETURN_NONE;
991 PyDoc_STRVAR(update_doc,
992 "Update a set with the union of itself and others.");
994 static PyObject *
995 make_new_set(PyTypeObject *type, PyObject *iterable)
997 register PySetObject *so = NULL;
999 if (dummy == NULL) { /* Auto-initialize dummy */
1000 dummy = PyString_FromString("<dummy key>");
1001 if (dummy == NULL)
1002 return NULL;
1005 /* create PySetObject structure */
1006 if (numfree &&
1007 (type == &PySet_Type || type == &PyFrozenSet_Type)) {
1008 so = free_list[--numfree];
1009 assert (so != NULL && PyAnySet_CheckExact(so));
1010 Py_TYPE(so) = type;
1011 _Py_NewReference((PyObject *)so);
1012 EMPTY_TO_MINSIZE(so);
1013 PyObject_GC_Track(so);
1014 } else {
1015 so = (PySetObject *)type->tp_alloc(type, 0);
1016 if (so == NULL)
1017 return NULL;
1018 /* tp_alloc has already zeroed the structure */
1019 assert(so->table == NULL && so->fill == 0 && so->used == 0);
1020 INIT_NONZERO_SET_SLOTS(so);
1023 so->lookup = set_lookkey_string;
1024 so->weakreflist = NULL;
1026 if (iterable != NULL) {
1027 if (set_update_internal(so, iterable) == -1) {
1028 Py_DECREF(so);
1029 return NULL;
1033 return (PyObject *)so;
1036 /* The empty frozenset is a singleton */
1037 static PyObject *emptyfrozenset = NULL;
1039 static PyObject *
1040 frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1042 PyObject *iterable = NULL, *result;
1044 if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds))
1045 return NULL;
1047 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
1048 return NULL;
1050 if (type != &PyFrozenSet_Type)
1051 return make_new_set(type, iterable);
1053 if (iterable != NULL) {
1054 /* frozenset(f) is idempotent */
1055 if (PyFrozenSet_CheckExact(iterable)) {
1056 Py_INCREF(iterable);
1057 return iterable;
1059 result = make_new_set(type, iterable);
1060 if (result == NULL || PySet_GET_SIZE(result))
1061 return result;
1062 Py_DECREF(result);
1064 /* The empty frozenset is a singleton */
1065 if (emptyfrozenset == NULL)
1066 emptyfrozenset = make_new_set(type, NULL);
1067 Py_XINCREF(emptyfrozenset);
1068 return emptyfrozenset;
1071 void
1072 PySet_Fini(void)
1074 PySetObject *so;
1076 while (numfree) {
1077 numfree--;
1078 so = free_list[numfree];
1079 PyObject_GC_Del(so);
1081 Py_CLEAR(dummy);
1082 Py_CLEAR(emptyfrozenset);
1085 static PyObject *
1086 set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1088 if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds))
1089 return NULL;
1091 return make_new_set(type, NULL);
1094 /* set_swap_bodies() switches the contents of any two sets by moving their
1095 internal data pointers and, if needed, copying the internal smalltables.
1096 Semantically equivalent to:
1098 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
1100 The function always succeeds and it leaves both objects in a stable state.
1101 Useful for creating temporary frozensets from sets for membership testing
1102 in __contains__(), discard(), and remove(). Also useful for operations
1103 that update in-place (by allowing an intermediate result to be swapped
1104 into one of the original inputs).
1107 static void
1108 set_swap_bodies(PySetObject *a, PySetObject *b)
1110 Py_ssize_t t;
1111 setentry *u;
1112 setentry *(*f)(PySetObject *so, PyObject *key, long hash);
1113 setentry tab[PySet_MINSIZE];
1114 long h;
1116 t = a->fill; a->fill = b->fill; b->fill = t;
1117 t = a->used; a->used = b->used; b->used = t;
1118 t = a->mask; a->mask = b->mask; b->mask = t;
1120 u = a->table;
1121 if (a->table == a->smalltable)
1122 u = b->smalltable;
1123 a->table = b->table;
1124 if (b->table == b->smalltable)
1125 a->table = a->smalltable;
1126 b->table = u;
1128 f = a->lookup; a->lookup = b->lookup; b->lookup = f;
1130 if (a->table == a->smalltable || b->table == b->smalltable) {
1131 memcpy(tab, a->smalltable, sizeof(tab));
1132 memcpy(a->smalltable, b->smalltable, sizeof(tab));
1133 memcpy(b->smalltable, tab, sizeof(tab));
1136 if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) &&
1137 PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) {
1138 h = a->hash; a->hash = b->hash; b->hash = h;
1139 } else {
1140 a->hash = -1;
1141 b->hash = -1;
1145 static PyObject *
1146 set_copy(PySetObject *so)
1148 return make_new_set(Py_TYPE(so), (PyObject *)so);
1151 static PyObject *
1152 frozenset_copy(PySetObject *so)
1154 if (PyFrozenSet_CheckExact(so)) {
1155 Py_INCREF(so);
1156 return (PyObject *)so;
1158 return set_copy(so);
1161 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
1163 static PyObject *
1164 set_clear(PySetObject *so)
1166 set_clear_internal(so);
1167 Py_RETURN_NONE;
1170 PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
1172 static PyObject *
1173 set_union(PySetObject *so, PyObject *args)
1175 PySetObject *result;
1176 PyObject *other;
1177 Py_ssize_t i;
1179 result = (PySetObject *)set_copy(so);
1180 if (result == NULL)
1181 return NULL;
1183 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1184 other = PyTuple_GET_ITEM(args, i);
1185 if ((PyObject *)so == other)
1186 continue;
1187 if (set_update_internal(result, other) == -1) {
1188 Py_DECREF(result);
1189 return NULL;
1192 return (PyObject *)result;
1195 PyDoc_STRVAR(union_doc,
1196 "Return the union of sets as a new set.\n\
1198 (i.e. all elements that are in either set.)");
1200 static PyObject *
1201 set_or(PySetObject *so, PyObject *other)
1203 PySetObject *result;
1205 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1206 Py_INCREF(Py_NotImplemented);
1207 return Py_NotImplemented;
1210 result = (PySetObject *)set_copy(so);
1211 if (result == NULL)
1212 return NULL;
1213 if ((PyObject *)so == other)
1214 return (PyObject *)result;
1215 if (set_update_internal(result, other) == -1) {
1216 Py_DECREF(result);
1217 return NULL;
1219 return (PyObject *)result;
1222 static PyObject *
1223 set_ior(PySetObject *so, PyObject *other)
1225 if (!PyAnySet_Check(other)) {
1226 Py_INCREF(Py_NotImplemented);
1227 return Py_NotImplemented;
1229 if (set_update_internal(so, other) == -1)
1230 return NULL;
1231 Py_INCREF(so);
1232 return (PyObject *)so;
1235 static PyObject *
1236 set_intersection(PySetObject *so, PyObject *other)
1238 PySetObject *result;
1239 PyObject *key, *it, *tmp;
1241 if ((PyObject *)so == other)
1242 return set_copy(so);
1244 result = (PySetObject *)make_new_set(Py_TYPE(so), NULL);
1245 if (result == NULL)
1246 return NULL;
1248 if (PyAnySet_Check(other)) {
1249 Py_ssize_t pos = 0;
1250 setentry *entry;
1252 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1253 tmp = (PyObject *)so;
1254 so = (PySetObject *)other;
1255 other = tmp;
1258 while (set_next((PySetObject *)other, &pos, &entry)) {
1259 int rv = set_contains_entry(so, entry);
1260 if (rv == -1) {
1261 Py_DECREF(result);
1262 return NULL;
1264 if (rv) {
1265 if (set_add_entry(result, entry) == -1) {
1266 Py_DECREF(result);
1267 return NULL;
1271 return (PyObject *)result;
1274 it = PyObject_GetIter(other);
1275 if (it == NULL) {
1276 Py_DECREF(result);
1277 return NULL;
1280 while ((key = PyIter_Next(it)) != NULL) {
1281 int rv;
1282 setentry entry;
1283 long hash = PyObject_Hash(key);
1285 if (hash == -1) {
1286 Py_DECREF(it);
1287 Py_DECREF(result);
1288 Py_DECREF(key);
1289 return NULL;
1291 entry.hash = hash;
1292 entry.key = key;
1293 rv = set_contains_entry(so, &entry);
1294 if (rv == -1) {
1295 Py_DECREF(it);
1296 Py_DECREF(result);
1297 Py_DECREF(key);
1298 return NULL;
1300 if (rv) {
1301 if (set_add_entry(result, &entry) == -1) {
1302 Py_DECREF(it);
1303 Py_DECREF(result);
1304 Py_DECREF(key);
1305 return NULL;
1308 Py_DECREF(key);
1310 Py_DECREF(it);
1311 if (PyErr_Occurred()) {
1312 Py_DECREF(result);
1313 return NULL;
1315 return (PyObject *)result;
1318 static PyObject *
1319 set_intersection_multi(PySetObject *so, PyObject *args)
1321 Py_ssize_t i;
1322 PyObject *result = (PyObject *)so;
1324 if (PyTuple_GET_SIZE(args) == 0)
1325 return set_copy(so);
1327 Py_INCREF(so);
1328 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1329 PyObject *other = PyTuple_GET_ITEM(args, i);
1330 PyObject *newresult = set_intersection((PySetObject *)result, other);
1331 if (newresult == NULL) {
1332 Py_DECREF(result);
1333 return NULL;
1335 Py_DECREF(result);
1336 result = newresult;
1338 return result;
1341 PyDoc_STRVAR(intersection_doc,
1342 "Return the intersection of two or more sets as a new set.\n\
1344 (i.e. elements that are common to all of the sets.)");
1346 static PyObject *
1347 set_intersection_update(PySetObject *so, PyObject *other)
1349 PyObject *tmp;
1351 tmp = set_intersection(so, other);
1352 if (tmp == NULL)
1353 return NULL;
1354 set_swap_bodies(so, (PySetObject *)tmp);
1355 Py_DECREF(tmp);
1356 Py_RETURN_NONE;
1359 static PyObject *
1360 set_intersection_update_multi(PySetObject *so, PyObject *args)
1362 PyObject *tmp;
1364 tmp = set_intersection_multi(so, args);
1365 if (tmp == NULL)
1366 return NULL;
1367 set_swap_bodies(so, (PySetObject *)tmp);
1368 Py_DECREF(tmp);
1369 Py_RETURN_NONE;
1372 PyDoc_STRVAR(intersection_update_doc,
1373 "Update a set with the intersection of itself and another.");
1375 static PyObject *
1376 set_and(PySetObject *so, PyObject *other)
1378 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1379 Py_INCREF(Py_NotImplemented);
1380 return Py_NotImplemented;
1382 return set_intersection(so, other);
1385 static PyObject *
1386 set_iand(PySetObject *so, PyObject *other)
1388 PyObject *result;
1390 if (!PyAnySet_Check(other)) {
1391 Py_INCREF(Py_NotImplemented);
1392 return Py_NotImplemented;
1394 result = set_intersection_update(so, other);
1395 if (result == NULL)
1396 return NULL;
1397 Py_DECREF(result);
1398 Py_INCREF(so);
1399 return (PyObject *)so;
1402 static PyObject *
1403 set_isdisjoint(PySetObject *so, PyObject *other)
1405 PyObject *key, *it, *tmp;
1407 if ((PyObject *)so == other) {
1408 if (PySet_GET_SIZE(so) == 0)
1409 Py_RETURN_TRUE;
1410 else
1411 Py_RETURN_FALSE;
1414 if (PyAnySet_CheckExact(other)) {
1415 Py_ssize_t pos = 0;
1416 setentry *entry;
1418 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1419 tmp = (PyObject *)so;
1420 so = (PySetObject *)other;
1421 other = tmp;
1423 while (set_next((PySetObject *)other, &pos, &entry)) {
1424 int rv = set_contains_entry(so, entry);
1425 if (rv == -1)
1426 return NULL;
1427 if (rv)
1428 Py_RETURN_FALSE;
1430 Py_RETURN_TRUE;
1433 it = PyObject_GetIter(other);
1434 if (it == NULL)
1435 return NULL;
1437 while ((key = PyIter_Next(it)) != NULL) {
1438 int rv;
1439 setentry entry;
1440 long hash = PyObject_Hash(key);
1442 if (hash == -1) {
1443 Py_DECREF(key);
1444 Py_DECREF(it);
1445 return NULL;
1447 entry.hash = hash;
1448 entry.key = key;
1449 rv = set_contains_entry(so, &entry);
1450 Py_DECREF(key);
1451 if (rv == -1) {
1452 Py_DECREF(it);
1453 return NULL;
1455 if (rv) {
1456 Py_DECREF(it);
1457 Py_RETURN_FALSE;
1460 Py_DECREF(it);
1461 if (PyErr_Occurred())
1462 return NULL;
1463 Py_RETURN_TRUE;
1466 PyDoc_STRVAR(isdisjoint_doc,
1467 "Return True if two sets have a null intersection.");
1469 static int
1470 set_difference_update_internal(PySetObject *so, PyObject *other)
1472 if ((PyObject *)so == other)
1473 return set_clear_internal(so);
1475 if (PyAnySet_Check(other)) {
1476 setentry *entry;
1477 Py_ssize_t pos = 0;
1479 while (set_next((PySetObject *)other, &pos, &entry))
1480 if (set_discard_entry(so, entry) == -1)
1481 return -1;
1482 } else {
1483 PyObject *key, *it;
1484 it = PyObject_GetIter(other);
1485 if (it == NULL)
1486 return -1;
1488 while ((key = PyIter_Next(it)) != NULL) {
1489 if (set_discard_key(so, key) == -1) {
1490 Py_DECREF(it);
1491 Py_DECREF(key);
1492 return -1;
1494 Py_DECREF(key);
1496 Py_DECREF(it);
1497 if (PyErr_Occurred())
1498 return -1;
1500 /* If more than 1/5 are dummies, then resize them away. */
1501 if ((so->fill - so->used) * 5 < so->mask)
1502 return 0;
1503 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
1506 static PyObject *
1507 set_difference_update(PySetObject *so, PyObject *args)
1509 Py_ssize_t i;
1511 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1512 PyObject *other = PyTuple_GET_ITEM(args, i);
1513 if (set_difference_update_internal(so, other) == -1)
1514 return NULL;
1516 Py_RETURN_NONE;
1519 PyDoc_STRVAR(difference_update_doc,
1520 "Remove all elements of another set from this set.");
1522 static PyObject *
1523 set_difference(PySetObject *so, PyObject *other)
1525 PyObject *result;
1526 setentry *entry;
1527 Py_ssize_t pos = 0;
1529 if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) {
1530 result = set_copy(so);
1531 if (result == NULL)
1532 return NULL;
1533 if (set_difference_update_internal((PySetObject *)result, other) != -1)
1534 return result;
1535 Py_DECREF(result);
1536 return NULL;
1539 result = make_new_set(Py_TYPE(so), NULL);
1540 if (result == NULL)
1541 return NULL;
1543 if (PyDict_CheckExact(other)) {
1544 while (set_next(so, &pos, &entry)) {
1545 setentry entrycopy;
1546 entrycopy.hash = entry->hash;
1547 entrycopy.key = entry->key;
1548 if (!_PyDict_Contains(other, entry->key, entry->hash)) {
1549 if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
1550 Py_DECREF(result);
1551 return NULL;
1555 return result;
1558 while (set_next(so, &pos, &entry)) {
1559 int rv = set_contains_entry((PySetObject *)other, entry);
1560 if (rv == -1) {
1561 Py_DECREF(result);
1562 return NULL;
1564 if (!rv) {
1565 if (set_add_entry((PySetObject *)result, entry) == -1) {
1566 Py_DECREF(result);
1567 return NULL;
1571 return result;
1574 static PyObject *
1575 set_difference_multi(PySetObject *so, PyObject *args)
1577 Py_ssize_t i;
1578 PyObject *result, *other;
1580 if (PyTuple_GET_SIZE(args) == 0)
1581 return set_copy(so);
1583 other = PyTuple_GET_ITEM(args, 0);
1584 result = set_difference(so, other);
1585 if (result == NULL)
1586 return NULL;
1588 for (i=1 ; i<PyTuple_GET_SIZE(args) ; i++) {
1589 other = PyTuple_GET_ITEM(args, i);
1590 if (set_difference_update_internal((PySetObject *)result, other) == -1) {
1591 Py_DECREF(result);
1592 return NULL;
1595 return result;
1598 PyDoc_STRVAR(difference_doc,
1599 "Return the difference of two or more sets as a new set.\n\
1601 (i.e. all elements that are in this set but not the others.)");
1602 static PyObject *
1603 set_sub(PySetObject *so, PyObject *other)
1605 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1606 Py_INCREF(Py_NotImplemented);
1607 return Py_NotImplemented;
1609 return set_difference(so, other);
1612 static PyObject *
1613 set_isub(PySetObject *so, PyObject *other)
1615 if (!PyAnySet_Check(other)) {
1616 Py_INCREF(Py_NotImplemented);
1617 return Py_NotImplemented;
1619 if (set_difference_update_internal(so, other) == -1)
1620 return NULL;
1621 Py_INCREF(so);
1622 return (PyObject *)so;
1625 static PyObject *
1626 set_symmetric_difference_update(PySetObject *so, PyObject *other)
1628 PySetObject *otherset;
1629 PyObject *key;
1630 Py_ssize_t pos = 0;
1631 setentry *entry;
1633 if ((PyObject *)so == other)
1634 return set_clear(so);
1636 if (PyDict_CheckExact(other)) {
1637 PyObject *value;
1638 int rv;
1639 long hash;
1640 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
1641 setentry an_entry;
1643 an_entry.hash = hash;
1644 an_entry.key = key;
1645 rv = set_discard_entry(so, &an_entry);
1646 if (rv == -1)
1647 return NULL;
1648 if (rv == DISCARD_NOTFOUND) {
1649 if (set_add_entry(so, &an_entry) == -1)
1650 return NULL;
1653 Py_RETURN_NONE;
1656 if (PyAnySet_Check(other)) {
1657 Py_INCREF(other);
1658 otherset = (PySetObject *)other;
1659 } else {
1660 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
1661 if (otherset == NULL)
1662 return NULL;
1665 while (set_next(otherset, &pos, &entry)) {
1666 int rv = set_discard_entry(so, entry);
1667 if (rv == -1) {
1668 Py_DECREF(otherset);
1669 return NULL;
1671 if (rv == DISCARD_NOTFOUND) {
1672 if (set_add_entry(so, entry) == -1) {
1673 Py_DECREF(otherset);
1674 return NULL;
1678 Py_DECREF(otherset);
1679 Py_RETURN_NONE;
1682 PyDoc_STRVAR(symmetric_difference_update_doc,
1683 "Update a set with the symmetric difference of itself and another.");
1685 static PyObject *
1686 set_symmetric_difference(PySetObject *so, PyObject *other)
1688 PyObject *rv;
1689 PySetObject *otherset;
1691 otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
1692 if (otherset == NULL)
1693 return NULL;
1694 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1695 if (rv == NULL)
1696 return NULL;
1697 Py_DECREF(rv);
1698 return (PyObject *)otherset;
1701 PyDoc_STRVAR(symmetric_difference_doc,
1702 "Return the symmetric difference of two sets as a new set.\n\
1704 (i.e. all elements that are in exactly one of the sets.)");
1706 static PyObject *
1707 set_xor(PySetObject *so, PyObject *other)
1709 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
1710 Py_INCREF(Py_NotImplemented);
1711 return Py_NotImplemented;
1713 return set_symmetric_difference(so, other);
1716 static PyObject *
1717 set_ixor(PySetObject *so, PyObject *other)
1719 PyObject *result;
1721 if (!PyAnySet_Check(other)) {
1722 Py_INCREF(Py_NotImplemented);
1723 return Py_NotImplemented;
1725 result = set_symmetric_difference_update(so, other);
1726 if (result == NULL)
1727 return NULL;
1728 Py_DECREF(result);
1729 Py_INCREF(so);
1730 return (PyObject *)so;
1733 static PyObject *
1734 set_issubset(PySetObject *so, PyObject *other)
1736 setentry *entry;
1737 Py_ssize_t pos = 0;
1739 if (!PyAnySet_Check(other)) {
1740 PyObject *tmp, *result;
1741 tmp = make_new_set(&PySet_Type, other);
1742 if (tmp == NULL)
1743 return NULL;
1744 result = set_issubset(so, tmp);
1745 Py_DECREF(tmp);
1746 return result;
1748 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
1749 Py_RETURN_FALSE;
1751 while (set_next(so, &pos, &entry)) {
1752 int rv = set_contains_entry((PySetObject *)other, entry);
1753 if (rv == -1)
1754 return NULL;
1755 if (!rv)
1756 Py_RETURN_FALSE;
1758 Py_RETURN_TRUE;
1761 PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
1763 static PyObject *
1764 set_issuperset(PySetObject *so, PyObject *other)
1766 PyObject *tmp, *result;
1768 if (!PyAnySet_Check(other)) {
1769 tmp = make_new_set(&PySet_Type, other);
1770 if (tmp == NULL)
1771 return NULL;
1772 result = set_issuperset(so, tmp);
1773 Py_DECREF(tmp);
1774 return result;
1776 return set_issubset((PySetObject *)other, (PyObject *)so);
1779 PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
1781 static PyObject *
1782 set_richcompare(PySetObject *v, PyObject *w, int op)
1784 PyObject *r1, *r2;
1786 if(!PyAnySet_Check(w)) {
1787 if (op == Py_EQ)
1788 Py_RETURN_FALSE;
1789 if (op == Py_NE)
1790 Py_RETURN_TRUE;
1791 PyErr_SetString(PyExc_TypeError, "can only compare to a set");
1792 return NULL;
1794 switch (op) {
1795 case Py_EQ:
1796 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
1797 Py_RETURN_FALSE;
1798 if (v->hash != -1 &&
1799 ((PySetObject *)w)->hash != -1 &&
1800 v->hash != ((PySetObject *)w)->hash)
1801 Py_RETURN_FALSE;
1802 return set_issubset(v, w);
1803 case Py_NE:
1804 r1 = set_richcompare(v, w, Py_EQ);
1805 if (r1 == NULL)
1806 return NULL;
1807 r2 = PyBool_FromLong(PyObject_Not(r1));
1808 Py_DECREF(r1);
1809 return r2;
1810 case Py_LE:
1811 return set_issubset(v, w);
1812 case Py_GE:
1813 return set_issuperset(v, w);
1814 case Py_LT:
1815 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
1816 Py_RETURN_FALSE;
1817 return set_issubset(v, w);
1818 case Py_GT:
1819 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
1820 Py_RETURN_FALSE;
1821 return set_issuperset(v, w);
1823 Py_INCREF(Py_NotImplemented);
1824 return Py_NotImplemented;
1827 static int
1828 set_nocmp(PyObject *self, PyObject *other)
1830 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
1831 return -1;
1834 static PyObject *
1835 set_add(PySetObject *so, PyObject *key)
1837 if (set_add_key(so, key) == -1)
1838 return NULL;
1839 Py_RETURN_NONE;
1842 PyDoc_STRVAR(add_doc,
1843 "Add an element to a set.\n\
1845 This has no effect if the element is already present.");
1847 static int
1848 set_contains(PySetObject *so, PyObject *key)
1850 PyObject *tmpkey;
1851 int rv;
1853 rv = set_contains_key(so, key);
1854 if (rv == -1) {
1855 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1856 return -1;
1857 PyErr_Clear();
1858 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1859 if (tmpkey == NULL)
1860 return -1;
1861 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1862 rv = set_contains(so, tmpkey);
1863 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1864 Py_DECREF(tmpkey);
1866 return rv;
1869 static PyObject *
1870 set_direct_contains(PySetObject *so, PyObject *key)
1872 long result;
1874 result = set_contains(so, key);
1875 if (result == -1)
1876 return NULL;
1877 return PyBool_FromLong(result);
1880 PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
1882 static PyObject *
1883 set_remove(PySetObject *so, PyObject *key)
1885 PyObject *tmpkey;
1886 int rv;
1888 rv = set_discard_key(so, key);
1889 if (rv == -1) {
1890 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1891 return NULL;
1892 PyErr_Clear();
1893 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1894 if (tmpkey == NULL)
1895 return NULL;
1896 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1897 rv = set_discard_key(so, tmpkey);
1898 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1899 Py_DECREF(tmpkey);
1900 if (rv == -1)
1901 return NULL;
1904 if (rv == DISCARD_NOTFOUND) {
1905 set_key_error(key);
1906 return NULL;
1908 Py_RETURN_NONE;
1911 PyDoc_STRVAR(remove_doc,
1912 "Remove an element from a set; it must be a member.\n\
1914 If the element is not a member, raise a KeyError.");
1916 static PyObject *
1917 set_discard(PySetObject *so, PyObject *key)
1919 PyObject *tmpkey, *result;
1920 int rv;
1922 rv = set_discard_key(so, key);
1923 if (rv == -1) {
1924 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1925 return NULL;
1926 PyErr_Clear();
1927 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1928 if (tmpkey == NULL)
1929 return NULL;
1930 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1931 result = set_discard(so, tmpkey);
1932 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1933 Py_DECREF(tmpkey);
1934 return result;
1936 Py_RETURN_NONE;
1939 PyDoc_STRVAR(discard_doc,
1940 "Remove an element from a set if it is a member.\n\
1942 If the element is not a member, do nothing.");
1944 static PyObject *
1945 set_reduce(PySetObject *so)
1947 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
1949 keys = PySequence_List((PyObject *)so);
1950 if (keys == NULL)
1951 goto done;
1952 args = PyTuple_Pack(1, keys);
1953 if (args == NULL)
1954 goto done;
1955 dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
1956 if (dict == NULL) {
1957 PyErr_Clear();
1958 dict = Py_None;
1959 Py_INCREF(dict);
1961 result = PyTuple_Pack(3, Py_TYPE(so), args, dict);
1962 done:
1963 Py_XDECREF(args);
1964 Py_XDECREF(keys);
1965 Py_XDECREF(dict);
1966 return result;
1969 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1971 static PyObject *
1972 set_sizeof(PySetObject *so)
1974 Py_ssize_t res;
1976 res = sizeof(PySetObject);
1977 if (so->table != so->smalltable)
1978 res = res + (so->mask + 1) * sizeof(setentry);
1979 return PyInt_FromSsize_t(res);
1982 PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes");
1983 static int
1984 set_init(PySetObject *self, PyObject *args, PyObject *kwds)
1986 PyObject *iterable = NULL;
1988 if (!PyAnySet_Check(self))
1989 return -1;
1990 if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable))
1991 return -1;
1992 set_clear_internal(self);
1993 self->hash = -1;
1994 if (iterable == NULL)
1995 return 0;
1996 return set_update_internal(self, iterable);
1999 static PySequenceMethods set_as_sequence = {
2000 set_len, /* sq_length */
2001 0, /* sq_concat */
2002 0, /* sq_repeat */
2003 0, /* sq_item */
2004 0, /* sq_slice */
2005 0, /* sq_ass_item */
2006 0, /* sq_ass_slice */
2007 (objobjproc)set_contains, /* sq_contains */
2010 /* set object ********************************************************/
2012 #ifdef Py_DEBUG
2013 static PyObject *test_c_api(PySetObject *so);
2015 PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
2016 All is well if assertions don't fail.");
2017 #endif
2019 static PyMethodDef set_methods[] = {
2020 {"add", (PyCFunction)set_add, METH_O,
2021 add_doc},
2022 {"clear", (PyCFunction)set_clear, METH_NOARGS,
2023 clear_doc},
2024 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
2025 contains_doc},
2026 {"copy", (PyCFunction)set_copy, METH_NOARGS,
2027 copy_doc},
2028 {"discard", (PyCFunction)set_discard, METH_O,
2029 discard_doc},
2030 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
2031 difference_doc},
2032 {"difference_update", (PyCFunction)set_difference_update, METH_VARARGS,
2033 difference_update_doc},
2034 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
2035 intersection_doc},
2036 {"intersection_update",(PyCFunction)set_intersection_update_multi, METH_VARARGS,
2037 intersection_update_doc},
2038 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2039 isdisjoint_doc},
2040 {"issubset", (PyCFunction)set_issubset, METH_O,
2041 issubset_doc},
2042 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2043 issuperset_doc},
2044 {"pop", (PyCFunction)set_pop, METH_NOARGS,
2045 pop_doc},
2046 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2047 reduce_doc},
2048 {"remove", (PyCFunction)set_remove, METH_O,
2049 remove_doc},
2050 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2051 sizeof_doc},
2052 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2053 symmetric_difference_doc},
2054 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
2055 symmetric_difference_update_doc},
2056 #ifdef Py_DEBUG
2057 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
2058 test_c_api_doc},
2059 #endif
2060 {"union", (PyCFunction)set_union, METH_VARARGS,
2061 union_doc},
2062 {"update", (PyCFunction)set_update, METH_VARARGS,
2063 update_doc},
2064 {NULL, NULL} /* sentinel */
2067 static PyNumberMethods set_as_number = {
2068 0, /*nb_add*/
2069 (binaryfunc)set_sub, /*nb_subtract*/
2070 0, /*nb_multiply*/
2071 0, /*nb_divide*/
2072 0, /*nb_remainder*/
2073 0, /*nb_divmod*/
2074 0, /*nb_power*/
2075 0, /*nb_negative*/
2076 0, /*nb_positive*/
2077 0, /*nb_absolute*/
2078 0, /*nb_nonzero*/
2079 0, /*nb_invert*/
2080 0, /*nb_lshift*/
2081 0, /*nb_rshift*/
2082 (binaryfunc)set_and, /*nb_and*/
2083 (binaryfunc)set_xor, /*nb_xor*/
2084 (binaryfunc)set_or, /*nb_or*/
2085 0, /*nb_coerce*/
2086 0, /*nb_int*/
2087 0, /*nb_long*/
2088 0, /*nb_float*/
2089 0, /*nb_oct*/
2090 0, /*nb_hex*/
2091 0, /*nb_inplace_add*/
2092 (binaryfunc)set_isub, /*nb_inplace_subtract*/
2093 0, /*nb_inplace_multiply*/
2094 0, /*nb_inplace_divide*/
2095 0, /*nb_inplace_remainder*/
2096 0, /*nb_inplace_power*/
2097 0, /*nb_inplace_lshift*/
2098 0, /*nb_inplace_rshift*/
2099 (binaryfunc)set_iand, /*nb_inplace_and*/
2100 (binaryfunc)set_ixor, /*nb_inplace_xor*/
2101 (binaryfunc)set_ior, /*nb_inplace_or*/
2104 PyDoc_STRVAR(set_doc,
2105 "set(iterable) --> set object\n\
2107 Build an unordered collection of unique elements.");
2109 PyTypeObject PySet_Type = {
2110 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2111 "set", /* tp_name */
2112 sizeof(PySetObject), /* tp_basicsize */
2113 0, /* tp_itemsize */
2114 /* methods */
2115 (destructor)set_dealloc, /* tp_dealloc */
2116 (printfunc)set_tp_print, /* tp_print */
2117 0, /* tp_getattr */
2118 0, /* tp_setattr */
2119 set_nocmp, /* tp_compare */
2120 (reprfunc)set_repr, /* tp_repr */
2121 &set_as_number, /* tp_as_number */
2122 &set_as_sequence, /* tp_as_sequence */
2123 0, /* tp_as_mapping */
2124 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
2125 0, /* tp_call */
2126 0, /* tp_str */
2127 PyObject_GenericGetAttr, /* tp_getattro */
2128 0, /* tp_setattro */
2129 0, /* tp_as_buffer */
2130 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
2131 Py_TPFLAGS_BASETYPE, /* tp_flags */
2132 set_doc, /* tp_doc */
2133 (traverseproc)set_traverse, /* tp_traverse */
2134 (inquiry)set_clear_internal, /* tp_clear */
2135 (richcmpfunc)set_richcompare, /* tp_richcompare */
2136 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
2137 (getiterfunc)set_iter, /* tp_iter */
2138 0, /* tp_iternext */
2139 set_methods, /* tp_methods */
2140 0, /* tp_members */
2141 0, /* tp_getset */
2142 0, /* tp_base */
2143 0, /* tp_dict */
2144 0, /* tp_descr_get */
2145 0, /* tp_descr_set */
2146 0, /* tp_dictoffset */
2147 (initproc)set_init, /* tp_init */
2148 PyType_GenericAlloc, /* tp_alloc */
2149 set_new, /* tp_new */
2150 PyObject_GC_Del, /* tp_free */
2153 /* frozenset object ********************************************************/
2156 static PyMethodDef frozenset_methods[] = {
2157 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
2158 contains_doc},
2159 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
2160 copy_doc},
2161 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
2162 difference_doc},
2163 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
2164 intersection_doc},
2165 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2166 isdisjoint_doc},
2167 {"issubset", (PyCFunction)set_issubset, METH_O,
2168 issubset_doc},
2169 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2170 issuperset_doc},
2171 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2172 reduce_doc},
2173 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2174 sizeof_doc},
2175 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2176 symmetric_difference_doc},
2177 {"union", (PyCFunction)set_union, METH_VARARGS,
2178 union_doc},
2179 {NULL, NULL} /* sentinel */
2182 static PyNumberMethods frozenset_as_number = {
2183 0, /*nb_add*/
2184 (binaryfunc)set_sub, /*nb_subtract*/
2185 0, /*nb_multiply*/
2186 0, /*nb_divide*/
2187 0, /*nb_remainder*/
2188 0, /*nb_divmod*/
2189 0, /*nb_power*/
2190 0, /*nb_negative*/
2191 0, /*nb_positive*/
2192 0, /*nb_absolute*/
2193 0, /*nb_nonzero*/
2194 0, /*nb_invert*/
2195 0, /*nb_lshift*/
2196 0, /*nb_rshift*/
2197 (binaryfunc)set_and, /*nb_and*/
2198 (binaryfunc)set_xor, /*nb_xor*/
2199 (binaryfunc)set_or, /*nb_or*/
2202 PyDoc_STRVAR(frozenset_doc,
2203 "frozenset(iterable) --> frozenset object\n\
2205 Build an immutable unordered collection of unique elements.");
2207 PyTypeObject PyFrozenSet_Type = {
2208 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2209 "frozenset", /* tp_name */
2210 sizeof(PySetObject), /* tp_basicsize */
2211 0, /* tp_itemsize */
2212 /* methods */
2213 (destructor)set_dealloc, /* tp_dealloc */
2214 (printfunc)set_tp_print, /* tp_print */
2215 0, /* tp_getattr */
2216 0, /* tp_setattr */
2217 set_nocmp, /* tp_compare */
2218 (reprfunc)set_repr, /* tp_repr */
2219 &frozenset_as_number, /* tp_as_number */
2220 &set_as_sequence, /* tp_as_sequence */
2221 0, /* tp_as_mapping */
2222 frozenset_hash, /* tp_hash */
2223 0, /* tp_call */
2224 0, /* tp_str */
2225 PyObject_GenericGetAttr, /* tp_getattro */
2226 0, /* tp_setattro */
2227 0, /* tp_as_buffer */
2228 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
2229 Py_TPFLAGS_BASETYPE, /* tp_flags */
2230 frozenset_doc, /* tp_doc */
2231 (traverseproc)set_traverse, /* tp_traverse */
2232 (inquiry)set_clear_internal, /* tp_clear */
2233 (richcmpfunc)set_richcompare, /* tp_richcompare */
2234 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
2235 (getiterfunc)set_iter, /* tp_iter */
2236 0, /* tp_iternext */
2237 frozenset_methods, /* tp_methods */
2238 0, /* tp_members */
2239 0, /* tp_getset */
2240 0, /* tp_base */
2241 0, /* tp_dict */
2242 0, /* tp_descr_get */
2243 0, /* tp_descr_set */
2244 0, /* tp_dictoffset */
2245 0, /* tp_init */
2246 PyType_GenericAlloc, /* tp_alloc */
2247 frozenset_new, /* tp_new */
2248 PyObject_GC_Del, /* tp_free */
2252 /***** C API functions *************************************************/
2254 PyObject *
2255 PySet_New(PyObject *iterable)
2257 return make_new_set(&PySet_Type, iterable);
2260 PyObject *
2261 PyFrozenSet_New(PyObject *iterable)
2263 return make_new_set(&PyFrozenSet_Type, iterable);
2266 Py_ssize_t
2267 PySet_Size(PyObject *anyset)
2269 if (!PyAnySet_Check(anyset)) {
2270 PyErr_BadInternalCall();
2271 return -1;
2273 return PySet_GET_SIZE(anyset);
2277 PySet_Clear(PyObject *set)
2279 if (!PySet_Check(set)) {
2280 PyErr_BadInternalCall();
2281 return -1;
2283 return set_clear_internal((PySetObject *)set);
2287 PySet_Contains(PyObject *anyset, PyObject *key)
2289 if (!PyAnySet_Check(anyset)) {
2290 PyErr_BadInternalCall();
2291 return -1;
2293 return set_contains_key((PySetObject *)anyset, key);
2297 PySet_Discard(PyObject *set, PyObject *key)
2299 if (!PySet_Check(set)) {
2300 PyErr_BadInternalCall();
2301 return -1;
2303 return set_discard_key((PySetObject *)set, key);
2307 PySet_Add(PyObject *anyset, PyObject *key)
2309 if (!PySet_Check(anyset) &&
2310 (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
2311 PyErr_BadInternalCall();
2312 return -1;
2314 return set_add_key((PySetObject *)anyset, key);
2318 _PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key)
2320 setentry *entry_ptr;
2322 if (!PyAnySet_Check(set)) {
2323 PyErr_BadInternalCall();
2324 return -1;
2326 if (set_next((PySetObject *)set, pos, &entry_ptr) == 0)
2327 return 0;
2328 *key = entry_ptr->key;
2329 return 1;
2333 _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash)
2335 setentry *entry;
2337 if (!PyAnySet_Check(set)) {
2338 PyErr_BadInternalCall();
2339 return -1;
2341 if (set_next((PySetObject *)set, pos, &entry) == 0)
2342 return 0;
2343 *key = entry->key;
2344 *hash = entry->hash;
2345 return 1;
2348 PyObject *
2349 PySet_Pop(PyObject *set)
2351 if (!PySet_Check(set)) {
2352 PyErr_BadInternalCall();
2353 return NULL;
2355 return set_pop((PySetObject *)set);
2359 _PySet_Update(PyObject *set, PyObject *iterable)
2361 if (!PySet_Check(set)) {
2362 PyErr_BadInternalCall();
2363 return -1;
2365 return set_update_internal((PySetObject *)set, iterable);
2368 #ifdef Py_DEBUG
2370 /* Test code to be called with any three element set.
2371 Returns True and original set is restored. */
2373 #define assertRaises(call_return_value, exception) \
2374 do { \
2375 assert(call_return_value); \
2376 assert(PyErr_ExceptionMatches(exception)); \
2377 PyErr_Clear(); \
2378 } while(0)
2380 static PyObject *
2381 test_c_api(PySetObject *so)
2383 Py_ssize_t count;
2384 char *s;
2385 Py_ssize_t i;
2386 PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x;
2387 PyObject *ob = (PyObject *)so;
2389 /* Verify preconditions and exercise type/size checks */
2390 assert(PyAnySet_Check(ob));
2391 assert(PyAnySet_CheckExact(ob));
2392 assert(!PyFrozenSet_CheckExact(ob));
2393 assert(PySet_Size(ob) == 3);
2394 assert(PySet_GET_SIZE(ob) == 3);
2396 /* Raise TypeError for non-iterable constructor arguments */
2397 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2398 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
2400 /* Raise TypeError for unhashable key */
2401 dup = PySet_New(ob);
2402 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2403 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2404 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
2406 /* Exercise successful pop, contains, add, and discard */
2407 elem = PySet_Pop(ob);
2408 assert(PySet_Contains(ob, elem) == 0);
2409 assert(PySet_GET_SIZE(ob) == 2);
2410 assert(PySet_Add(ob, elem) == 0);
2411 assert(PySet_Contains(ob, elem) == 1);
2412 assert(PySet_GET_SIZE(ob) == 3);
2413 assert(PySet_Discard(ob, elem) == 1);
2414 assert(PySet_GET_SIZE(ob) == 2);
2415 assert(PySet_Discard(ob, elem) == 0);
2416 assert(PySet_GET_SIZE(ob) == 2);
2418 /* Exercise clear */
2419 dup2 = PySet_New(dup);
2420 assert(PySet_Clear(dup2) == 0);
2421 assert(PySet_Size(dup2) == 0);
2422 Py_DECREF(dup2);
2424 /* Raise SystemError on clear or update of frozen set */
2425 f = PyFrozenSet_New(dup);
2426 assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
2427 assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
2428 assert(PySet_Add(f, elem) == 0);
2429 Py_INCREF(f);
2430 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2431 Py_DECREF(f);
2432 Py_DECREF(f);
2434 /* Exercise direct iteration */
2435 i = 0, count = 0;
2436 while (_PySet_Next((PyObject *)dup, &i, &x)) {
2437 s = PyString_AsString(x);
2438 assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c'));
2439 count++;
2441 assert(count == 3);
2443 /* Exercise updates */
2444 dup2 = PySet_New(NULL);
2445 assert(_PySet_Update(dup2, dup) == 0);
2446 assert(PySet_Size(dup2) == 3);
2447 assert(_PySet_Update(dup2, dup) == 0);
2448 assert(PySet_Size(dup2) == 3);
2449 Py_DECREF(dup2);
2451 /* Raise SystemError when self argument is not a set or frozenset. */
2452 t = PyTuple_New(0);
2453 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2454 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2455 Py_DECREF(t);
2457 /* Raise SystemError when self argument is not a set. */
2458 f = PyFrozenSet_New(dup);
2459 assert(PySet_Size(f) == 3);
2460 assert(PyFrozenSet_CheckExact(f));
2461 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2462 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2463 Py_DECREF(f);
2465 /* Raise KeyError when popping from an empty set */
2466 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
2467 Py_DECREF(ob);
2468 assert(PySet_GET_SIZE(ob) == 0);
2469 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
2471 /* Restore the set from the copy using the PyNumber API */
2472 assert(PyNumber_InPlaceOr(ob, dup) == ob);
2473 Py_DECREF(ob);
2475 /* Verify constructors accept NULL arguments */
2476 f = PySet_New(NULL);
2477 assert(f != NULL);
2478 assert(PySet_GET_SIZE(f) == 0);
2479 Py_DECREF(f);
2480 f = PyFrozenSet_New(NULL);
2481 assert(f != NULL);
2482 assert(PyFrozenSet_CheckExact(f));
2483 assert(PySet_GET_SIZE(f) == 0);
2484 Py_DECREF(f);
2486 Py_DECREF(elem);
2487 Py_DECREF(dup);
2488 Py_RETURN_TRUE;
2491 #undef assertRaises
2493 #endif