blob: 2210edf787e4c34e7e88eea7c662868e2d1334f0 [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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006 Copyright (c) 2003-6 Python Software Foundation.
Raymond Hettingera9d99362005-08-05 00:01:15 +00007 All rights reserved.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00008*/
9
Raymond Hettingera690a992003-11-16 16:17:49 +000010#include "Python.h"
Raymond Hettingera9d99362005-08-05 00:01:15 +000011#include "structmember.h"
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000012
Thomas Wouters89f507f2006-12-13 04:49:30 +000013/* Set a key error with the specified argument, wrapping it in a
14 * tuple automatically so that tuple keys are not unpacked as the
15 * exception arguments. */
16static void
17set_key_error(PyObject *arg)
18{
19 PyObject *tup;
20 tup = PyTuple_Pack(1, arg);
21 if (!tup)
22 return; /* caller will expect error to be set anyway */
23 PyErr_SetObject(PyExc_KeyError, tup);
24 Py_DECREF(tup);
25}
26
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000027/* This must be >= 1. */
28#define PERTURB_SHIFT 5
29
30/* Object used as dummy key to fill deleted entries */
Raymond Hettingera9d99362005-08-05 00:01:15 +000031static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000032
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000033#ifdef Py_REF_DEBUG
34PyObject *
35_PySet_Dummy(void)
36{
37 return dummy;
38}
39#endif
40
Raymond Hettingerbc841a12005-08-07 13:02:53 +000041#define INIT_NONZERO_SET_SLOTS(so) do { \
42 (so)->table = (so)->smalltable; \
43 (so)->mask = PySet_MINSIZE - 1; \
44 (so)->hash = -1; \
45 } while(0)
46
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000047#define EMPTY_TO_MINSIZE(so) do { \
48 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \
49 (so)->used = (so)->fill = 0; \
Raymond Hettingerbc841a12005-08-07 13:02:53 +000050 INIT_NONZERO_SET_SLOTS(so); \
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000051 } while(0)
52
Raymond Hettingerbc841a12005-08-07 13:02:53 +000053/* Reuse scheme to save calls to malloc, free, and memset */
54#define MAXFREESETS 80
55static PySetObject *free_sets[MAXFREESETS];
56static int num_free_sets = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000057
58/*
59The basic lookup function used by all operations.
60This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
61Open addressing is preferred over chaining since the link overhead for
62chaining would be substantial (100% with typical malloc overhead).
63
64The initial probe index is computed as hash mod the table size. Subsequent
Raymond Hettingerbc841a12005-08-07 13:02:53 +000065probe indices are computed as explained in Objects/dictobject.c.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000066
67All arithmetic on hash should ignore overflow.
68
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000069Unlike the dictionary implementation, the lookkey functions can return
70NULL if the rich comparison returns an error.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000071*/
72
73static setentry *
74set_lookkey(PySetObject *so, PyObject *key, register long hash)
75{
Martin v. Löwis18e16552006-02-15 17:27:45 +000076 register Py_ssize_t i;
77 register size_t perturb;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000078 register setentry *freeslot;
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079 register size_t mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000080 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000081 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000082 register int cmp;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000083 PyObject *startkey;
84
85 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +000086 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000087 if (entry->key == NULL || entry->key == key)
88 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000089
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000090 if (entry->key == dummy)
91 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000092 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000093 if (entry->hash == hash) {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +000094 startkey = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000095 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
96 if (cmp < 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000097 return NULL;
Raymond Hettingera580c472005-08-05 17:19:54 +000098 if (table == so->table && entry->key == startkey) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000099 if (cmp > 0)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000100 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000101 }
102 else {
103 /* The compare did major nasty stuff to the
104 * set: start over.
105 */
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000106 return set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000107 }
108 }
109 freeslot = NULL;
110 }
111
112 /* In the loop, key == dummy is by far (factor of 100s) the
113 least likely outcome, so test for that last. */
114 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
115 i = (i << 2) + i + perturb + 1;
Raymond Hettingera580c472005-08-05 17:19:54 +0000116 entry = &table[i & mask];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000117 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000118 if (freeslot != NULL)
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000119 entry = freeslot;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000120 break;
121 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000122 if (entry->key == key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000123 break;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000124 if (entry->hash == hash && entry->key != dummy) {
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)
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000128 return NULL;
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 Hettinger9bda1d62005-09-16 07:14:21 +0000137 return set_lookkey(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000138 }
139 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000140 else if (entry->key == dummy && freeslot == NULL)
141 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000142 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000143 return entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000144}
145
146/*
147 * Hacked up version of set_lookkey which can assume keys are always strings;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000148 * This means we can always use _PyString_Eq directly and not have to check to
149 * see if the comparison altered the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000150 */
151static setentry *
152set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
153{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000154 register Py_ssize_t i;
155 register size_t perturb;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000156 register setentry *freeslot;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000157 register size_t mask = so->mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000158 setentry *table = so->table;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000159 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000160
161 /* Make sure this function doesn't have to handle non-string keys,
162 including subclasses of str; e.g., one reason to subclass
163 strings is to override __eq__, and for speed we don't cater to
164 that here. */
165 if (!PyString_CheckExact(key)) {
166 so->lookup = set_lookkey;
167 return set_lookkey(so, key, hash);
168 }
169 i = hash & mask;
Raymond Hettingera580c472005-08-05 17:19:54 +0000170 entry = &table[i];
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000171 if (entry->key == NULL || entry->key == key)
172 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000173 if (entry->key == dummy)
174 freeslot = entry;
175 else {
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000176 if (entry->hash == hash && _PyString_Eq(entry->key, key))
177 return entry;
Raymond Hettingered6c1ef2005-08-13 08:28:03 +0000178 freeslot = NULL;
179 }
180
181 /* In the loop, key == dummy is by far (factor of 100s) the
182 least likely outcome, so test for that last. */
183 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
184 i = (i << 2) + i + perturb + 1;
185 entry = &table[i & mask];
186 if (entry->key == NULL)
187 return freeslot == NULL ? entry : freeslot;
188 if (entry->key == key
189 || (entry->hash == hash
190 && entry->key != dummy
191 && _PyString_Eq(entry->key, key)))
192 return entry;
193 if (entry->key == dummy && freeslot == NULL)
194 freeslot = entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000195 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000196 assert(0); /* NOT REACHED */
197 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000198}
199
200/*
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000201Internal routine to insert a new key into the table.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000202Used by the public insert routine.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000203Eats a reference to key.
204*/
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000205static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000206set_insert_key(register PySetObject *so, PyObject *key, long hash)
207{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000208 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000209 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
210
211 assert(so->lookup != NULL);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000212 entry = so->lookup(so, key, hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000213 if (entry == NULL)
214 return -1;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000215 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000216 /* UNUSED */
217 so->fill++;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000218 entry->key = key;
219 entry->hash = hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000220 so->used++;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000221 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000222 /* DUMMY */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000223 entry->key = key;
224 entry->hash = hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000225 so->used++;
226 Py_DECREF(dummy);
227 } else {
228 /* ACTIVE */
229 Py_DECREF(key);
230 }
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000231 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000232}
233
234/*
Thomas Wouters89f507f2006-12-13 04:49:30 +0000235Internal routine used by set_table_resize() to insert an item which is
236known to be absent from the set. This routine also assumes that
237the set contains no deleted entries. Besides the performance benefit,
238using set_insert_clean() in set_table_resize() is dangerous (SF bug #1456209).
239Note that no refcounts are changed by this routine; if needed, the caller
240is responsible for incref'ing `key`.
241*/
242static void
243set_insert_clean(register PySetObject *so, PyObject *key, long hash)
244{
245 register size_t i;
246 register size_t perturb;
247 register size_t mask = (size_t)so->mask;
248 setentry *table = so->table;
249 register setentry *entry;
250
251 i = hash & mask;
252 entry = &table[i];
253 for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) {
254 i = (i << 2) + i + perturb + 1;
255 entry = &table[i & mask];
256 }
257 so->fill++;
258 entry->key = key;
259 entry->hash = hash;
260 so->used++;
261}
262
263/*
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000264Restructure the table by allocating a new table and reinserting all
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000265keys again. When entries have been deleted, the new table may
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000266actually be smaller than the old one.
267*/
268static int
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269set_table_resize(PySetObject *so, Py_ssize_t minused)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000270{
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271 Py_ssize_t newsize;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000272 setentry *oldtable, *newtable, *entry;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273 Py_ssize_t i;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000274 int is_oldtable_malloced;
275 setentry small_copy[PySet_MINSIZE];
276
277 assert(minused >= 0);
278
279 /* Find the smallest table size > minused. */
280 for (newsize = PySet_MINSIZE;
281 newsize <= minused && newsize > 0;
282 newsize <<= 1)
283 ;
284 if (newsize <= 0) {
285 PyErr_NoMemory();
286 return -1;
287 }
288
289 /* Get space for a new table. */
290 oldtable = so->table;
291 assert(oldtable != NULL);
292 is_oldtable_malloced = oldtable != so->smalltable;
293
294 if (newsize == PySet_MINSIZE) {
295 /* A large table is shrinking, or we can't get any smaller. */
296 newtable = so->smalltable;
297 if (newtable == oldtable) {
298 if (so->fill == so->used) {
299 /* No dummies, so no point doing anything. */
300 return 0;
301 }
302 /* We're not going to resize it, but rebuild the
303 table anyway to purge old dummy entries.
304 Subtle: This is *necessary* if fill==size,
305 as set_lookkey needs at least one virgin slot to
306 terminate failing searches. If fill < size, it's
307 merely desirable, as dummies slow searches. */
308 assert(so->fill > so->used);
309 memcpy(small_copy, oldtable, sizeof(small_copy));
310 oldtable = small_copy;
311 }
312 }
313 else {
314 newtable = PyMem_NEW(setentry, newsize);
315 if (newtable == NULL) {
316 PyErr_NoMemory();
317 return -1;
318 }
319 }
320
321 /* Make the set empty, using the new table. */
322 assert(newtable != oldtable);
323 so->table = newtable;
324 so->mask = newsize - 1;
325 memset(newtable, 0, sizeof(setentry) * newsize);
326 so->used = 0;
327 i = so->fill;
328 so->fill = 0;
329
330 /* Copy the data over; this is refcount-neutral for active entries;
331 dummy entries aren't copied over, of course */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000332 for (entry = oldtable; i > 0; entry++) {
333 if (entry->key == NULL) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000334 /* UNUSED */
335 ;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000336 } else if (entry->key == dummy) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000337 /* DUMMY */
338 --i;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000339 assert(entry->key == dummy);
340 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000341 } else {
342 /* ACTIVE */
343 --i;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000344 set_insert_clean(so, entry->key, entry->hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000345 }
346 }
347
348 if (is_oldtable_malloced)
349 PyMem_DEL(oldtable);
350 return 0;
351}
352
Raymond Hettingerc991db22005-08-11 07:58:45 +0000353/* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
354
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000355static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000356set_add_entry(register PySetObject *so, setentry *entry)
357{
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000358 register Py_ssize_t n_used;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000359
360 assert(so->fill <= so->mask); /* at least one empty slot */
361 n_used = so->used;
362 Py_INCREF(entry->key);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000363 if (set_insert_key(so, entry->key, entry->hash) == -1) {
364 Py_DECREF(entry->key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000365 return -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000366 }
Raymond Hettingerc991db22005-08-11 07:58:45 +0000367 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
368 return 0;
369 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
370}
371
372static int
373set_add_key(register PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000374{
375 register long hash;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000376 register Py_ssize_t n_used;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000377
Raymond Hettingerc991db22005-08-11 07:58:45 +0000378 if (!PyString_CheckExact(key) ||
379 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000380 hash = PyObject_Hash(key);
381 if (hash == -1)
382 return -1;
383 }
384 assert(so->fill <= so->mask); /* at least one empty slot */
385 n_used = so->used;
386 Py_INCREF(key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000387 if (set_insert_key(so, key, hash) == -1) {
388 Py_DECREF(key);
389 return -1;
390 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000391 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
392 return 0;
Raymond Hettingerbc841a12005-08-07 13:02:53 +0000393 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000394}
395
396#define DISCARD_NOTFOUND 0
397#define DISCARD_FOUND 1
398
399static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000400set_discard_entry(PySetObject *so, setentry *oldentry)
401{ register setentry *entry;
402 PyObject *old_key;
403
404 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000405 if (entry == NULL)
406 return -1;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000407 if (entry->key == NULL || entry->key == dummy)
408 return DISCARD_NOTFOUND;
409 old_key = entry->key;
410 Py_INCREF(dummy);
411 entry->key = dummy;
412 so->used--;
413 Py_DECREF(old_key);
414 return DISCARD_FOUND;
415}
416
417static int
418set_discard_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000419{
420 register long hash;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000421 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000422 PyObject *old_key;
423
424 assert (PyAnySet_Check(so));
425 if (!PyString_CheckExact(key) ||
426 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
427 hash = PyObject_Hash(key);
428 if (hash == -1)
429 return -1;
430 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000431 entry = (so->lookup)(so, key, hash);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000432 if (entry == NULL)
433 return -1;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000434 if (entry->key == NULL || entry->key == dummy)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000435 return DISCARD_NOTFOUND;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000436 old_key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000437 Py_INCREF(dummy);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000438 entry->key = dummy;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000439 so->used--;
440 Py_DECREF(old_key);
441 return DISCARD_FOUND;
442}
443
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000444static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000445set_clear_internal(PySetObject *so)
446{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000447 setentry *entry, *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000448 int table_is_malloced;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000449 Py_ssize_t fill;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000450 setentry small_copy[PySet_MINSIZE];
451#ifdef Py_DEBUG
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000452 Py_ssize_t i, n;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000453 assert (PyAnySet_Check(so));
Raymond Hettingera580c472005-08-05 17:19:54 +0000454
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000455 n = so->mask + 1;
456 i = 0;
457#endif
458
459 table = so->table;
460 assert(table != NULL);
461 table_is_malloced = table != so->smalltable;
462
463 /* This is delicate. During the process of clearing the set,
464 * decrefs can cause the set to mutate. To avoid fatal confusion
465 * (voice of experience), we have to make the set empty before
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000466 * clearing the slots, and never refer to anything via so->ref while
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000467 * clearing.
468 */
469 fill = so->fill;
470 if (table_is_malloced)
471 EMPTY_TO_MINSIZE(so);
472
473 else if (fill > 0) {
474 /* It's a small table with something that needs to be cleared.
475 * Afraid the only safe way is to copy the set entries into
476 * another small table first.
477 */
478 memcpy(small_copy, table, sizeof(small_copy));
479 table = small_copy;
480 EMPTY_TO_MINSIZE(so);
481 }
482 /* else it's a small table that's already empty */
483
484 /* Now we can finally clear things. If C had refcounts, we could
485 * assert that the refcount on table is 1 now, i.e. that this function
486 * has unique access to it, so decref side-effects can't alter it.
487 */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000488 for (entry = table; fill > 0; ++entry) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000489#ifdef Py_DEBUG
490 assert(i < n);
491 ++i;
492#endif
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000493 if (entry->key) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000494 --fill;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000495 Py_DECREF(entry->key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000496 }
497#ifdef Py_DEBUG
498 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000499 assert(entry->key == NULL);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000500#endif
501 }
502
503 if (table_is_malloced)
504 PyMem_DEL(table);
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000505 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000506}
507
508/*
509 * Iterate over a set table. Use like so:
510 *
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000511 * Py_ssize_t pos;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000512 * setentry *entry;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000513 * pos = 0; # important! pos should not otherwise be changed by you
Raymond Hettingerc991db22005-08-11 07:58:45 +0000514 * while (set_next(yourset, &pos, &entry)) {
515 * Refer to borrowed reference in entry->key.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000516 * }
517 *
Raymond Hettingerc991db22005-08-11 07:58:45 +0000518 * CAUTION: In general, it isn't safe to use set_next in a loop that
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000519 * mutates the table.
520 */
521static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000522set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000523{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000524 Py_ssize_t i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000525 Py_ssize_t mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000526 register setentry *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000527
528 assert (PyAnySet_Check(so));
Raymond Hettingerc991db22005-08-11 07:58:45 +0000529 i = *pos_ptr;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000530 assert(i >= 0);
Raymond Hettingerc991db22005-08-11 07:58:45 +0000531 table = so->table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000532 mask = so->mask;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000533 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000534 i++;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000535 *pos_ptr = i+1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000536 if (i > mask)
537 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000538 assert(table[i].key != NULL);
539 *entry_ptr = &table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000540 return 1;
541}
542
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000543static void
544set_dealloc(PySetObject *so)
545{
546 register setentry *entry;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000547 Py_ssize_t fill = so->fill;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000548 PyObject_GC_UnTrack(so);
549 Py_TRASHCAN_SAFE_BEGIN(so)
550 if (so->weakreflist != NULL)
551 PyObject_ClearWeakRefs((PyObject *) so);
552
553 for (entry = so->table; fill > 0; entry++) {
554 if (entry->key) {
555 --fill;
556 Py_DECREF(entry->key);
557 }
558 }
559 if (so->table != so->smalltable)
560 PyMem_DEL(so->table);
561 if (num_free_sets < MAXFREESETS && PyAnySet_CheckExact(so))
562 free_sets[num_free_sets++] = so;
563 else
564 so->ob_type->tp_free(so);
565 Py_TRASHCAN_SAFE_END(so)
566}
567
568static int
569set_tp_print(PySetObject *so, FILE *fp, int flags)
570{
571 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000572 Py_ssize_t pos=0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000573 char *emit = ""; /* No separator emitted on first pass */
574 char *separator = ", ";
Georg Brandlc4996ba2006-08-28 19:37:11 +0000575 int literalform = 0;
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000576 int status = Py_ReprEnter((PyObject*)so);
577
578 if (status != 0) {
579 if (status < 0)
580 return status;
581 fprintf(fp, "%s(...)", so->ob_type->tp_name);
582 return 0;
583 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000584
Georg Brandlc4996ba2006-08-28 19:37:11 +0000585 if (!so->used) {
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000586 Py_ReprLeave((PyObject*)so);
Georg Brandlc4996ba2006-08-28 19:37:11 +0000587 fprintf(fp, "%s()", so->ob_type->tp_name);
588 return 0;
589 }
590
591 if (so->ob_type == &PySet_Type) {
592 literalform = 1;
Guido van Rossum86e58e22006-08-28 15:27:34 +0000593 fprintf(fp, "{");
Georg Brandlc4996ba2006-08-28 19:37:11 +0000594 } else
Guido van Rossum86e58e22006-08-28 15:27:34 +0000595 fprintf(fp, "%s([", so->ob_type->tp_name);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000596 while (set_next(so, &pos, &entry)) {
597 fputs(emit, fp);
598 emit = separator;
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000599 if (PyObject_Print(entry->key, fp, 0) != 0) {
600 Py_ReprLeave((PyObject*)so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000601 return -1;
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000602 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000603 }
Georg Brandlc4996ba2006-08-28 19:37:11 +0000604 if (literalform)
Guido van Rossum86e58e22006-08-28 15:27:34 +0000605 fputs("}", fp);
606 else
607 fputs("])", fp);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000608 Py_ReprLeave((PyObject*)so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000609 return 0;
610}
611
612static PyObject *
613set_repr(PySetObject *so)
614{
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000615 PyObject *keys, *result=NULL, *listrepr;
616 int status = Py_ReprEnter((PyObject*)so);
617
618 if (status != 0) {
619 if (status < 0)
620 return NULL;
621 return PyString_FromFormat("%s(...)", so->ob_type->tp_name);
622 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000623
Georg Brandlc4996ba2006-08-28 19:37:11 +0000624 /* shortcut for the empty set */
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000625 if (!so->used) {
626 Py_ReprLeave((PyObject*)so);
Georg Brandlc4996ba2006-08-28 19:37:11 +0000627 return PyString_FromFormat("%s()", so->ob_type->tp_name);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000628 }
Georg Brandlc4996ba2006-08-28 19:37:11 +0000629
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000630 keys = PySequence_List((PyObject *)so);
631 if (keys == NULL)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000632 goto done;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000633 listrepr = PyObject_Repr(keys);
634 Py_DECREF(keys);
635 if (listrepr == NULL)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000636 goto done;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000637
Guido van Rossum86e58e22006-08-28 15:27:34 +0000638 if (so->ob_type == &PySet_Type) {
639 char *s = PyString_AS_STRING(listrepr);
640 s += 1;
641 s[strlen(s)-1] = 0;
642 result = PyString_FromFormat("{%s}", s);
643 } else {
644 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
Georg Brandlc4996ba2006-08-28 19:37:11 +0000645 PyString_AS_STRING(listrepr));
Guido van Rossum86e58e22006-08-28 15:27:34 +0000646 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000647 Py_DECREF(listrepr);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000648done:
649 Py_ReprLeave((PyObject*)so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000650 return result;
651}
652
Martin v. Löwis18e16552006-02-15 17:27:45 +0000653static Py_ssize_t
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000654set_len(PyObject *so)
655{
656 return ((PySetObject *)so)->used;
657}
658
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000659static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000660set_merge(PySetObject *so, PyObject *otherset)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000661{
Raymond Hettingerd7946662005-08-01 21:39:29 +0000662 PySetObject *other;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000663 register Py_ssize_t i;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000664 register setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000665
666 assert (PyAnySet_Check(so));
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000667 assert (PyAnySet_Check(otherset));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000668
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000669 other = (PySetObject*)otherset;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000670 if (other == so || other->used == 0)
671 /* a.update(a) or a.update({}); nothing to do */
672 return 0;
673 /* Do one big resize at the start, rather than
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000674 * incrementally resizing as we insert new keys. Expect
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000675 * that there will be no (or few) overlapping keys.
676 */
677 if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
678 if (set_table_resize(so, (so->used + other->used)*2) != 0)
679 return -1;
680 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000681 for (i = 0; i <= other->mask; i++) {
682 entry = &other->table[i];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000683 if (entry->key != NULL &&
684 entry->key != dummy) {
685 Py_INCREF(entry->key);
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000686 if (set_insert_key(so, entry->key, entry->hash) == -1) {
687 Py_DECREF(entry->key);
688 return -1;
689 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000690 }
691 }
692 return 0;
693}
694
695static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000696set_contains_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000697{
698 long hash;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000699 setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000700
701 if (!PyString_CheckExact(key) ||
702 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
703 hash = PyObject_Hash(key);
704 if (hash == -1)
705 return -1;
706 }
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000707 entry = (so->lookup)(so, key, hash);
708 if (entry == NULL)
709 return -1;
710 key = entry->key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000711 return key != NULL && key != dummy;
712}
713
Raymond Hettingerc991db22005-08-11 07:58:45 +0000714static int
715set_contains_entry(PySetObject *so, setentry *entry)
716{
717 PyObject *key;
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000718 setentry *lu_entry;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000719
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000720 lu_entry = (so->lookup)(so, entry->key, entry->hash);
721 if (lu_entry == NULL)
722 return -1;
723 key = lu_entry->key;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000724 return key != NULL && key != dummy;
725}
726
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000727static PyObject *
728set_pop(PySetObject *so)
729{
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000730 register Py_ssize_t i = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000731 register setentry *entry;
732 PyObject *key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000733
734 assert (PyAnySet_Check(so));
735 if (so->used == 0) {
736 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
737 return NULL;
738 }
739
740 /* Set entry to "the first" unused or dummy set entry. We abuse
741 * the hash field of slot 0 to hold a search finger:
742 * If slot 0 has a value, use slot 0.
743 * Else slot 0 is being used to hold a search finger,
744 * and we use its hash value as the first index to look.
745 */
746 entry = &so->table[0];
747 if (entry->key == NULL || entry->key == dummy) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000748 i = entry->hash;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000749 /* The hash field may be a real hash value, or it may be a
750 * legit search finger, or it may be a once-legit search
751 * finger that's out of bounds now because it wrapped around
752 * or the table shrunk -- simply make sure it's in bounds now.
753 */
754 if (i > so->mask || i < 1)
755 i = 1; /* skip slot 0 */
756 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
757 i++;
758 if (i > so->mask)
759 i = 1;
760 }
761 }
762 key = entry->key;
763 Py_INCREF(dummy);
764 entry->key = dummy;
765 so->used--;
766 so->table[0].hash = i + 1; /* next place to start */
767 return key;
768}
769
770PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
771
772static int
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000773set_traverse(PySetObject *so, visitproc visit, void *arg)
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000774{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000775 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000776 setentry *entry;
777
778 while (set_next(so, &pos, &entry))
779 Py_VISIT(entry->key);
780 return 0;
781}
782
783static long
784frozenset_hash(PyObject *self)
785{
786 PySetObject *so = (PySetObject *)self;
787 long h, hash = 1927868237L;
788 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000789 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000790
791 if (so->hash != -1)
792 return so->hash;
793
794 hash *= PySet_GET_SIZE(self) + 1;
795 while (set_next(so, &pos, &entry)) {
796 /* Work to increase the bit dispersion for closely spaced hash
797 values. The is important because some use cases have many
798 combinations of a small number of elements with nearby
799 hashes so that many distinct combinations collapse to only
800 a handful of distinct hash values. */
801 h = entry->hash;
802 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
803 }
804 hash = hash * 69069L + 907133923L;
805 if (hash == -1)
806 hash = 590923713L;
807 so->hash = hash;
808 return hash;
809}
810
Raymond Hettingera9d99362005-08-05 00:01:15 +0000811/***** Set iterator type ***********************************************/
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000812
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000813typedef struct {
814 PyObject_HEAD
815 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000816 Py_ssize_t si_used;
817 Py_ssize_t si_pos;
818 Py_ssize_t len;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000819} setiterobject;
820
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000821static void
822setiter_dealloc(setiterobject *si)
823{
824 Py_XDECREF(si->si_set);
825 PyObject_Del(si);
826}
827
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000828static PyObject *
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000829setiter_len(setiterobject *si)
830{
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000831 Py_ssize_t len = 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000832 if (si->si_set != NULL && si->si_used == si->si_set->used)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000833 len = si->len;
834 return PyInt_FromLong(len);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000835}
836
Armin Rigof5b3e362006-02-11 21:32:43 +0000837PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000838
839static PyMethodDef setiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000840 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000841 {NULL, NULL} /* sentinel */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000842};
843
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000844static PyObject *setiter_iternext(setiterobject *si)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000845{
846 PyObject *key;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000847 register Py_ssize_t i, mask;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000848 register setentry *entry;
849 PySetObject *so = si->si_set;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000850
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000851 if (so == NULL)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000852 return NULL;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000853 assert (PyAnySet_Check(so));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000854
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000855 if (si->si_used != so->used) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000856 PyErr_SetString(PyExc_RuntimeError,
857 "Set changed size during iteration");
858 si->si_used = -1; /* Make this state sticky */
859 return NULL;
860 }
861
862 i = si->si_pos;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000863 assert(i>=0);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000864 entry = so->table;
865 mask = so->mask;
866 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000867 i++;
868 si->si_pos = i+1;
869 if (i > mask)
870 goto fail;
871 si->len--;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000872 key = entry[i].key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000873 Py_INCREF(key);
874 return key;
875
876fail:
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000877 Py_DECREF(so);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000878 si->si_set = NULL;
879 return NULL;
880}
881
Hye-Shik Change2956762005-08-01 05:26:41 +0000882static PyTypeObject PySetIter_Type = {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000883 PyObject_HEAD_INIT(&PyType_Type)
884 0, /* ob_size */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000885 "setiterator", /* tp_name */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000886 sizeof(setiterobject), /* tp_basicsize */
887 0, /* tp_itemsize */
888 /* methods */
889 (destructor)setiter_dealloc, /* tp_dealloc */
890 0, /* tp_print */
891 0, /* tp_getattr */
892 0, /* tp_setattr */
893 0, /* tp_compare */
894 0, /* tp_repr */
895 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000896 0, /* tp_as_sequence */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000897 0, /* tp_as_mapping */
898 0, /* tp_hash */
899 0, /* tp_call */
900 0, /* tp_str */
901 PyObject_GenericGetAttr, /* tp_getattro */
902 0, /* tp_setattro */
903 0, /* tp_as_buffer */
904 Py_TPFLAGS_DEFAULT, /* tp_flags */
905 0, /* tp_doc */
906 0, /* tp_traverse */
907 0, /* tp_clear */
908 0, /* tp_richcompare */
909 0, /* tp_weaklistoffset */
910 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000911 (iternextfunc)setiter_iternext, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000912 setiter_methods, /* tp_methods */
913 0,
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000914};
915
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000916static PyObject *
917set_iter(PySetObject *so)
918{
919 setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
920 if (si == NULL)
921 return NULL;
922 Py_INCREF(so);
923 si->si_set = so;
924 si->si_used = so->used;
925 si->si_pos = 0;
926 si->len = so->used;
927 return (PyObject *)si;
928}
929
Raymond Hettingerd7946662005-08-01 21:39:29 +0000930static int
Raymond Hettingerd7946662005-08-01 21:39:29 +0000931set_update_internal(PySetObject *so, PyObject *other)
Raymond Hettingera690a992003-11-16 16:17:49 +0000932{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000933 PyObject *key, *it;
Raymond Hettingera690a992003-11-16 16:17:49 +0000934
Thomas Wouterscf297e42007-02-23 15:07:44 +0000935 if (PyAnySet_CheckExact(other))
Raymond Hettingerc991db22005-08-11 07:58:45 +0000936 return set_merge(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +0000937
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000938 if (PyDict_CheckExact(other)) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000939 PyObject *value;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000940 Py_ssize_t pos = 0;
Thomas Wouterscf297e42007-02-23 15:07:44 +0000941 long hash;
942 Py_ssize_t dictsize = PyDict_Size(other);
943
944 /* Do one big resize at the start, rather than
945 * incrementally resizing as we insert new keys. Expect
946 * that there will be no (or few) overlapping keys.
947 */
948 if (dictsize == -1)
949 return -1;
950 if ((so->fill + dictsize)*3 >= (so->mask+1)*2) {
951 if (set_table_resize(so, (so->used + dictsize)*2) != 0)
952 return -1;
953 }
954 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
955 setentry an_entry;
956
957 an_entry.hash = hash;
958 an_entry.key = key;
959 if (set_add_entry(so, &an_entry) == -1)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000960 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000961 }
Raymond Hettingerd7946662005-08-01 21:39:29 +0000962 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000963 }
964
Raymond Hettingera38123e2003-11-24 22:18:49 +0000965 it = PyObject_GetIter(other);
966 if (it == NULL)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000967 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000968
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000969 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettingerc991db22005-08-11 07:58:45 +0000970 if (set_add_key(so, key) == -1) {
Raymond Hettingera38123e2003-11-24 22:18:49 +0000971 Py_DECREF(it);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000972 Py_DECREF(key);
Raymond Hettingerd7946662005-08-01 21:39:29 +0000973 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000974 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000975 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +0000976 }
Raymond Hettingera38123e2003-11-24 22:18:49 +0000977 Py_DECREF(it);
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000978 if (PyErr_Occurred())
Raymond Hettingerd7946662005-08-01 21:39:29 +0000979 return -1;
980 return 0;
981}
982
983static PyObject *
984set_update(PySetObject *so, PyObject *other)
985{
986 if (set_update_internal(so, other) == -1)
Raymond Hettingera38123e2003-11-24 22:18:49 +0000987 return NULL;
988 Py_RETURN_NONE;
989}
990
991PyDoc_STRVAR(update_doc,
992"Update a set with the union of itself and another.");
993
994static PyObject *
995make_new_set(PyTypeObject *type, PyObject *iterable)
996{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000997 register PySetObject *so = NULL;
Raymond Hettingera38123e2003-11-24 22:18:49 +0000998
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000999 if (dummy == NULL) { /* Auto-initialize dummy */
1000 dummy = PyString_FromString("<dummy key>");
1001 if (dummy == NULL)
1002 return NULL;
1003 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001004
1005 /* create PySetObject structure */
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001006 if (num_free_sets &&
1007 (type == &PySet_Type || type == &PyFrozenSet_Type)) {
1008 so = free_sets[--num_free_sets];
1009 assert (so != NULL && PyAnySet_CheckExact(so));
1010 so->ob_type = type;
1011 _Py_NewReference((PyObject *)so);
1012 EMPTY_TO_MINSIZE(so);
1013 PyObject_GC_Track(so);
1014 } else {
1015 so = (PySetObject *)type->tp_alloc(type, 0);
1016 if (so == NULL)
1017 return NULL;
1018 /* tp_alloc has already zeroed the structure */
1019 assert(so->table == NULL && so->fill == 0 && so->used == 0);
1020 INIT_NONZERO_SET_SLOTS(so);
1021 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001022
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001023 so->lookup = set_lookkey_string;
Raymond Hettinger691d8052004-05-30 07:26:47 +00001024 so->weakreflist = NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001025
Raymond Hettingera38123e2003-11-24 22:18:49 +00001026 if (iterable != NULL) {
Raymond Hettingerd7946662005-08-01 21:39:29 +00001027 if (set_update_internal(so, iterable) == -1) {
Raymond Hettingera38123e2003-11-24 22:18:49 +00001028 Py_DECREF(so);
1029 return NULL;
1030 }
Raymond Hettingera38123e2003-11-24 22:18:49 +00001031 }
1032
Raymond Hettingera690a992003-11-16 16:17:49 +00001033 return (PyObject *)so;
1034}
1035
Raymond Hettingerd7946662005-08-01 21:39:29 +00001036/* The empty frozenset is a singleton */
1037static PyObject *emptyfrozenset = NULL;
1038
Raymond Hettingera690a992003-11-16 16:17:49 +00001039static PyObject *
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001040frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Raymond Hettingera690a992003-11-16 16:17:49 +00001041{
Raymond Hettingerd7946662005-08-01 21:39:29 +00001042 PyObject *iterable = NULL, *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001043
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001044 if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001045 return NULL;
1046
Raymond Hettingera690a992003-11-16 16:17:49 +00001047 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
1048 return NULL;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001049
1050 if (type != &PyFrozenSet_Type)
1051 return make_new_set(type, iterable);
1052
1053 if (iterable != NULL) {
1054 /* frozenset(f) is idempotent */
1055 if (PyFrozenSet_CheckExact(iterable)) {
1056 Py_INCREF(iterable);
1057 return iterable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001058 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001059 result = make_new_set(type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001060 if (result == NULL || PySet_GET_SIZE(result))
Raymond Hettingerd7946662005-08-01 21:39:29 +00001061 return result;
1062 Py_DECREF(result);
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001063 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001064 /* The empty frozenset is a singleton */
1065 if (emptyfrozenset == NULL)
1066 emptyfrozenset = make_new_set(type, NULL);
1067 Py_XINCREF(emptyfrozenset);
1068 return emptyfrozenset;
1069}
1070
1071void
1072PySet_Fini(void)
1073{
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001074 PySetObject *so;
1075
1076 while (num_free_sets) {
1077 num_free_sets--;
1078 so = free_sets[num_free_sets];
1079 PyObject_GC_Del(so);
1080 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001081 Py_CLEAR(dummy);
1082 Py_CLEAR(emptyfrozenset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001083}
1084
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001085static PyObject *
1086set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1087{
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +00001088 if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001089 return NULL;
1090
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001091 return make_new_set(type, NULL);
1092}
1093
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001094/* set_swap_bodies() switches the contents of any two sets by moving their
1095 internal data pointers and, if needed, copying the internal smalltables.
1096 Semantically equivalent to:
1097
1098 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
1099
1100 The function always succeeds and it leaves both objects in a stable state.
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
Raymond Hettinger9dcb17c2005-07-31 13:09:28 +00001104 into one of the original inputs).
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001105*/
1106
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001107static void
1108set_swap_bodies(PySetObject *a, PySetObject *b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001109{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001110 Py_ssize_t t;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001111 setentry *u;
1112 setentry *(*f)(PySetObject *so, PyObject *key, long hash);
1113 setentry tab[PySet_MINSIZE];
1114 long h;
1115
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;
1119
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;
1127
1128 f = a->lookup; a->lookup = b->lookup; b->lookup = f;
1129
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));
1134 }
1135
Raymond Hettingera580c472005-08-05 17:19:54 +00001136 if (PyType_IsSubtype(a->ob_type, &PyFrozenSet_Type) &&
1137 PyType_IsSubtype(b->ob_type, &PyFrozenSet_Type)) {
1138 h = a->hash; a->hash = b->hash; b->hash = h;
1139 } else {
1140 a->hash = -1;
1141 b->hash = -1;
1142 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001143}
1144
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001145static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001146set_copy(PySetObject *so)
1147{
Raymond Hettingera38123e2003-11-24 22:18:49 +00001148 return make_new_set(so->ob_type, (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001149}
1150
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001151static PyObject *
1152frozenset_copy(PySetObject *so)
1153{
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001154 if (PyFrozenSet_CheckExact(so)) {
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001155 Py_INCREF(so);
1156 return (PyObject *)so;
1157 }
1158 return set_copy(so);
1159}
1160
Raymond Hettingera690a992003-11-16 16:17:49 +00001161PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
1162
1163static PyObject *
Raymond Hettingerc991db22005-08-11 07:58:45 +00001164set_clear(PySetObject *so)
1165{
1166 set_clear_internal(so);
1167 Py_RETURN_NONE;
1168}
1169
1170PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
1171
1172static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001173set_union(PySetObject *so, PyObject *other)
1174{
1175 PySetObject *result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001176
1177 result = (PySetObject *)set_copy(so);
1178 if (result == NULL)
1179 return NULL;
Raymond Hettingerd8e13382005-08-17 12:27:17 +00001180 if ((PyObject *)so == other)
1181 return (PyObject *)result;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001182 if (set_update_internal(result, other) == -1) {
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001183 Py_DECREF(result);
1184 return NULL;
1185 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001186 return (PyObject *)result;
1187}
1188
1189PyDoc_STRVAR(union_doc,
1190 "Return the union of two sets as a new set.\n\
1191\n\
1192(i.e. all elements that are in either set.)");
1193
1194static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001195set_or(PySetObject *so, PyObject *other)
1196{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001197 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001198 Py_INCREF(Py_NotImplemented);
1199 return Py_NotImplemented;
1200 }
1201 return set_union(so, other);
1202}
1203
1204static PyObject *
1205set_ior(PySetObject *so, PyObject *other)
1206{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001207 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001208 Py_INCREF(Py_NotImplemented);
1209 return Py_NotImplemented;
1210 }
Raymond Hettingerd7946662005-08-01 21:39:29 +00001211 if (set_update_internal(so, other) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001212 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001213 Py_INCREF(so);
1214 return (PyObject *)so;
1215}
1216
1217static PyObject *
1218set_intersection(PySetObject *so, PyObject *other)
1219{
1220 PySetObject *result;
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001221 PyObject *key, *it, *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001222
Raymond Hettingerd8e13382005-08-17 12:27:17 +00001223 if ((PyObject *)so == other)
1224 return set_copy(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001225
Raymond Hettingera690a992003-11-16 16:17:49 +00001226 result = (PySetObject *)make_new_set(so->ob_type, NULL);
1227 if (result == NULL)
1228 return NULL;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001229
Thomas Wouterscf297e42007-02-23 15:07:44 +00001230 if (PyAnySet_CheckExact(other)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001231 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001232 setentry *entry;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001233
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001234 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001235 tmp = (PyObject *)so;
1236 so = (PySetObject *)other;
1237 other = tmp;
1238 }
1239
Raymond Hettingerc991db22005-08-11 07:58:45 +00001240 while (set_next((PySetObject *)other, &pos, &entry)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001241 int rv = set_contains_entry(so, entry);
1242 if (rv == -1) {
1243 Py_DECREF(result);
1244 return NULL;
1245 }
1246 if (rv) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001247 if (set_add_entry(result, entry) == -1) {
Raymond Hettingera3b11e72003-12-31 14:08:58 +00001248 Py_DECREF(result);
1249 return NULL;
1250 }
1251 }
1252 }
1253 return (PyObject *)result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001254 }
1255
Raymond Hettingera690a992003-11-16 16:17:49 +00001256 it = PyObject_GetIter(other);
1257 if (it == NULL) {
1258 Py_DECREF(result);
1259 return NULL;
1260 }
1261
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001262 while ((key = PyIter_Next(it)) != NULL) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001263 int rv;
1264 setentry entry;
1265 long hash = PyObject_Hash(key);
1266
1267 if (hash == -1) {
1268 Py_DECREF(it);
1269 Py_DECREF(result);
1270 Py_DECREF(key);
1271 return NULL;
1272 }
1273 entry.hash = hash;
1274 entry.key = key;
1275 rv = set_contains_entry(so, &entry);
1276 if (rv == -1) {
1277 Py_DECREF(it);
1278 Py_DECREF(result);
1279 Py_DECREF(key);
1280 return NULL;
1281 }
1282 if (rv) {
1283 if (set_add_entry(result, &entry) == -1) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001284 Py_DECREF(it);
1285 Py_DECREF(result);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001286 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +00001287 return NULL;
1288 }
1289 }
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001290 Py_DECREF(key);
Raymond Hettingera690a992003-11-16 16:17:49 +00001291 }
1292 Py_DECREF(it);
1293 if (PyErr_Occurred()) {
1294 Py_DECREF(result);
1295 return NULL;
1296 }
1297 return (PyObject *)result;
1298}
1299
1300PyDoc_STRVAR(intersection_doc,
1301"Return the intersection of two sets as a new set.\n\
1302\n\
1303(i.e. all elements that are in both sets.)");
1304
1305static PyObject *
1306set_intersection_update(PySetObject *so, PyObject *other)
1307{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001308 PyObject *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001309
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001310 tmp = set_intersection(so, other);
1311 if (tmp == NULL)
Raymond Hettingera690a992003-11-16 16:17:49 +00001312 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001313 set_swap_bodies(so, (PySetObject *)tmp);
Raymond Hettingera690a992003-11-16 16:17:49 +00001314 Py_DECREF(tmp);
1315 Py_RETURN_NONE;
1316}
1317
1318PyDoc_STRVAR(intersection_update_doc,
1319"Update a set with the intersection of itself and another.");
1320
1321static PyObject *
1322set_and(PySetObject *so, PyObject *other)
1323{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001324 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001325 Py_INCREF(Py_NotImplemented);
1326 return Py_NotImplemented;
1327 }
1328 return set_intersection(so, other);
1329}
1330
1331static PyObject *
1332set_iand(PySetObject *so, PyObject *other)
1333{
1334 PyObject *result;
1335
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001336 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001337 Py_INCREF(Py_NotImplemented);
1338 return Py_NotImplemented;
1339 }
1340 result = set_intersection_update(so, other);
1341 if (result == NULL)
1342 return NULL;
1343 Py_DECREF(result);
1344 Py_INCREF(so);
1345 return (PyObject *)so;
1346}
1347
Neal Norwitz6576bd82005-11-13 18:41:28 +00001348static int
Raymond Hettingerc991db22005-08-11 07:58:45 +00001349set_difference_update_internal(PySetObject *so, PyObject *other)
1350{
1351 if ((PyObject *)so == other)
1352 return set_clear_internal(so);
1353
Thomas Wouterscf297e42007-02-23 15:07:44 +00001354 if (PyAnySet_CheckExact(other)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001355 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001356 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001357
1358 while (set_next((PySetObject *)other, &pos, &entry))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001359 if (set_discard_entry(so, entry) == -1)
1360 return -1;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001361 } else {
1362 PyObject *key, *it;
1363 it = PyObject_GetIter(other);
1364 if (it == NULL)
1365 return -1;
1366
1367 while ((key = PyIter_Next(it)) != NULL) {
1368 if (set_discard_key(so, key) == -1) {
1369 Py_DECREF(it);
1370 Py_DECREF(key);
1371 return -1;
1372 }
1373 Py_DECREF(key);
1374 }
1375 Py_DECREF(it);
1376 if (PyErr_Occurred())
1377 return -1;
1378 }
1379 /* If more than 1/5 are dummies, then resize them away. */
1380 if ((so->fill - so->used) * 5 < so->mask)
1381 return 0;
1382 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
1383}
1384
Raymond Hettingera690a992003-11-16 16:17:49 +00001385static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001386set_difference_update(PySetObject *so, PyObject *other)
1387{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001388 if (set_difference_update_internal(so, other) != -1)
Raymond Hettingerbc841a12005-08-07 13:02:53 +00001389 Py_RETURN_NONE;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001390 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001391}
1392
1393PyDoc_STRVAR(difference_update_doc,
1394"Remove all elements of another set from this set.");
1395
1396static PyObject *
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001397set_difference(PySetObject *so, PyObject *other)
1398{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001399 PyObject *result;
1400 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401 Py_ssize_t pos = 0;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001402
Thomas Wouterscf297e42007-02-23 15:07:44 +00001403 if (!PyAnySet_CheckExact(other) && !PyDict_CheckExact(other)) {
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001404 result = set_copy(so);
1405 if (result == NULL)
Raymond Hettingerc991db22005-08-11 07:58:45 +00001406 return NULL;
1407 if (set_difference_update_internal((PySetObject *)result, other) != -1)
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001408 return result;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001409 Py_DECREF(result);
1410 return NULL;
1411 }
1412
1413 result = make_new_set(so->ob_type, NULL);
1414 if (result == NULL)
1415 return NULL;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001416
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001417 if (PyDict_CheckExact(other)) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001418 while (set_next(so, &pos, &entry)) {
1419 setentry entrycopy;
1420 entrycopy.hash = entry->hash;
1421 entrycopy.key = entry->key;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001422 if (!_PyDict_Contains(other, entry->key, entry->hash)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001423 if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
1424 Py_DECREF(result);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001425 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001426 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001427 }
1428 }
1429 return result;
1430 }
1431
Raymond Hettingerc991db22005-08-11 07:58:45 +00001432 while (set_next(so, &pos, &entry)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 int rv = set_contains_entry((PySetObject *)other, entry);
1434 if (rv == -1) {
1435 Py_DECREF(result);
1436 return NULL;
1437 }
1438 if (!rv) {
1439 if (set_add_entry((PySetObject *)result, entry) == -1) {
1440 Py_DECREF(result);
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001441 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001442 }
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001443 }
1444 }
1445 return result;
1446}
1447
1448PyDoc_STRVAR(difference_doc,
1449"Return the difference of two sets as a new set.\n\
1450\n\
1451(i.e. all elements that are in this set but not the other.)");
1452static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001453set_sub(PySetObject *so, PyObject *other)
1454{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001455 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001456 Py_INCREF(Py_NotImplemented);
1457 return Py_NotImplemented;
1458 }
1459 return set_difference(so, other);
1460}
1461
1462static PyObject *
1463set_isub(PySetObject *so, PyObject *other)
1464{
1465 PyObject *result;
1466
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001467 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001468 Py_INCREF(Py_NotImplemented);
1469 return Py_NotImplemented;
1470 }
1471 result = set_difference_update(so, other);
1472 if (result == NULL)
1473 return NULL;
1474 Py_DECREF(result);
1475 Py_INCREF(so);
1476 return (PyObject *)so;
1477}
1478
1479static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001480set_symmetric_difference_update(PySetObject *so, PyObject *other)
1481{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001482 PySetObject *otherset;
1483 PyObject *key;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001484 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001485 setentry *entry;
1486
1487 if ((PyObject *)so == other)
1488 return set_clear(so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001489
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001490 if (PyDict_CheckExact(other)) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001491 PyObject *value;
1492 int rv;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001493 long hash;
1494 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 setentry an_entry;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 an_entry.hash = hash;
1498 an_entry.key = key;
1499 rv = set_discard_entry(so, &an_entry);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001500 if (rv == -1)
1501 return NULL;
1502 if (rv == DISCARD_NOTFOUND) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 if (set_add_entry(so, &an_entry) == -1)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001504 return NULL;
1505 }
1506 }
1507 Py_RETURN_NONE;
1508 }
1509
Thomas Wouterscf297e42007-02-23 15:07:44 +00001510 if (PyAnySet_CheckExact(other)) {
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001511 Py_INCREF(other);
1512 otherset = (PySetObject *)other;
1513 } else {
Raymond Hettingera690a992003-11-16 16:17:49 +00001514 otherset = (PySetObject *)make_new_set(so->ob_type, other);
1515 if (otherset == NULL)
1516 return NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001517 }
1518
Raymond Hettingerc991db22005-08-11 07:58:45 +00001519 while (set_next(otherset, &pos, &entry)) {
1520 int rv = set_discard_entry(so, entry);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001521 if (rv == -1) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001522 Py_DECREF(otherset);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001523 return NULL;
1524 }
1525 if (rv == DISCARD_NOTFOUND) {
Raymond Hettingerc991db22005-08-11 07:58:45 +00001526 if (set_add_entry(so, entry) == -1) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001527 Py_DECREF(otherset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001528 return NULL;
1529 }
1530 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001531 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001532 Py_DECREF(otherset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001533 Py_RETURN_NONE;
1534}
1535
1536PyDoc_STRVAR(symmetric_difference_update_doc,
1537"Update a set with the symmetric difference of itself and another.");
1538
1539static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001540set_symmetric_difference(PySetObject *so, PyObject *other)
1541{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001542 PyObject *rv;
1543 PySetObject *otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001544
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001545 otherset = (PySetObject *)make_new_set(so->ob_type, other);
1546 if (otherset == NULL)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001547 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001548 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1549 if (rv == NULL)
1550 return NULL;
1551 Py_DECREF(rv);
1552 return (PyObject *)otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001553}
1554
1555PyDoc_STRVAR(symmetric_difference_doc,
1556"Return the symmetric difference of two sets as a new set.\n\
1557\n\
1558(i.e. all elements that are in exactly one of the sets.)");
1559
1560static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001561set_xor(PySetObject *so, PyObject *other)
1562{
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001563 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001564 Py_INCREF(Py_NotImplemented);
1565 return Py_NotImplemented;
1566 }
1567 return set_symmetric_difference(so, other);
1568}
1569
1570static PyObject *
1571set_ixor(PySetObject *so, PyObject *other)
1572{
1573 PyObject *result;
1574
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001575 if (!PyAnySet_Check(other)) {
Raymond Hettingera690a992003-11-16 16:17:49 +00001576 Py_INCREF(Py_NotImplemented);
1577 return Py_NotImplemented;
1578 }
1579 result = set_symmetric_difference_update(so, other);
1580 if (result == NULL)
1581 return NULL;
1582 Py_DECREF(result);
1583 Py_INCREF(so);
1584 return (PyObject *)so;
1585}
1586
1587static PyObject *
1588set_issubset(PySetObject *so, PyObject *other)
1589{
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001590 setentry *entry;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001591 Py_ssize_t pos = 0;
Raymond Hettingera690a992003-11-16 16:17:49 +00001592
Thomas Wouterscf297e42007-02-23 15:07:44 +00001593 if (!PyAnySet_CheckExact(other)) {
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001594 PyObject *tmp, *result;
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001595 tmp = make_new_set(&PySet_Type, other);
1596 if (tmp == NULL)
1597 return NULL;
1598 result = set_issubset(so, tmp);
1599 Py_DECREF(tmp);
1600 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001601 }
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001602 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
Raymond Hettingera690a992003-11-16 16:17:49 +00001603 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001604
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001605 while (set_next(so, &pos, &entry)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001606 int rv = set_contains_entry((PySetObject *)other, entry);
1607 if (rv == -1)
1608 return NULL;
1609 if (!rv)
Raymond Hettingera690a992003-11-16 16:17:49 +00001610 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001611 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001612 Py_RETURN_TRUE;
1613}
1614
1615PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
1616
1617static PyObject *
1618set_issuperset(PySetObject *so, PyObject *other)
1619{
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001620 PyObject *tmp, *result;
1621
Thomas Wouterscf297e42007-02-23 15:07:44 +00001622 if (!PyAnySet_CheckExact(other)) {
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001623 tmp = make_new_set(&PySet_Type, other);
1624 if (tmp == NULL)
1625 return NULL;
1626 result = set_issuperset(so, tmp);
1627 Py_DECREF(tmp);
1628 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001629 }
1630 return set_issubset((PySetObject *)other, (PyObject *)so);
1631}
1632
1633PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
1634
Raymond Hettingera690a992003-11-16 16:17:49 +00001635static PyObject *
1636set_richcompare(PySetObject *v, PyObject *w, int op)
1637{
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001638 PyObject *r1, *r2;
1639
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001640 if(!PyAnySet_Check(w)) {
1641 if (op == Py_EQ)
1642 Py_RETURN_FALSE;
1643 if (op == Py_NE)
1644 Py_RETURN_TRUE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001645 PyErr_SetString(PyExc_TypeError, "can only compare to a set");
1646 return NULL;
1647 }
1648 switch (op) {
1649 case Py_EQ:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001650 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
Raymond Hettingera690a992003-11-16 16:17:49 +00001651 Py_RETURN_FALSE;
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001652 if (v->hash != -1 &&
1653 ((PySetObject *)w)->hash != -1 &&
1654 v->hash != ((PySetObject *)w)->hash)
1655 Py_RETURN_FALSE;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001656 return set_issubset(v, w);
1657 case Py_NE:
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00001658 r1 = set_richcompare(v, w, Py_EQ);
1659 if (r1 == NULL)
1660 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001661 r2 = PyBool_FromLong(PyObject_Not(r1));
1662 Py_DECREF(r1);
1663 return r2;
1664 case Py_LE:
1665 return set_issubset(v, w);
1666 case Py_GE:
1667 return set_issuperset(v, w);
1668 case Py_LT:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001669 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001670 Py_RETURN_FALSE;
1671 return set_issubset(v, w);
1672 case Py_GT:
Raymond Hettingerbeb31012005-08-16 03:47:52 +00001673 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001674 Py_RETURN_FALSE;
1675 return set_issuperset(v, w);
Raymond Hettingera690a992003-11-16 16:17:49 +00001676 }
1677 Py_INCREF(Py_NotImplemented);
1678 return Py_NotImplemented;
1679}
1680
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001681static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001682set_nocmp(PyObject *self, PyObject *other)
Raymond Hettingered6c1ef2005-08-13 08:28:03 +00001683{
1684 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
1685 return -1;
1686}
1687
Raymond Hettingera690a992003-11-16 16:17:49 +00001688static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001689set_add(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001690{
Raymond Hettingerc991db22005-08-11 07:58:45 +00001691 if (set_add_key(so, key) == -1)
Raymond Hettingera690a992003-11-16 16:17:49 +00001692 return NULL;
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001693 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001694}
1695
1696PyDoc_STRVAR(add_doc,
1697"Add an element to a set.\n\
1698\n\
1699This has no effect if the element is already present.");
1700
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001701static int
1702set_contains(PySetObject *so, PyObject *key)
1703{
1704 PyObject *tmpkey;
1705 int rv;
1706
1707 rv = set_contains_key(so, key);
1708 if (rv == -1) {
1709 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1710 return -1;
1711 PyErr_Clear();
1712 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1713 if (tmpkey == NULL)
1714 return -1;
1715 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1716 rv = set_contains(so, tmpkey);
1717 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
1718 Py_DECREF(tmpkey);
1719 }
1720 return rv;
1721}
1722
1723static PyObject *
1724set_direct_contains(PySetObject *so, PyObject *key)
1725{
1726 long result;
1727
1728 result = set_contains(so, key);
1729 if (result == -1)
1730 return NULL;
1731 return PyBool_FromLong(result);
1732}
1733
1734PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
1735
Raymond Hettingera690a992003-11-16 16:17:49 +00001736static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001737set_remove(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001738{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001739 PyObject *tmpkey, *result;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001740 int rv;
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001741
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001742 rv = set_discard_key(so, key);
1743 if (rv == -1) {
1744 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1745 return NULL;
1746 PyErr_Clear();
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001747 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1748 if (tmpkey == NULL)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001749 return NULL;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001750 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001751 result = set_remove(so, tmpkey);
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001752 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001753 Py_DECREF(tmpkey);
Raymond Hettinger0deab622003-12-13 18:53:18 +00001754 return result;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001755 } else if (rv == DISCARD_NOTFOUND) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001756 set_key_error(key);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001757 return NULL;
1758 }
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001759 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001760}
1761
1762PyDoc_STRVAR(remove_doc,
1763"Remove an element from a set; it must be a member.\n\
1764\n\
1765If the element is not a member, raise a KeyError.");
1766
1767static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001768set_discard(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001769{
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001770 PyObject *tmpkey, *result;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001771 int rv;
Raymond Hettinger0deab622003-12-13 18:53:18 +00001772
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001773 rv = set_discard_key(so, key);
1774 if (rv == -1) {
1775 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1776 return NULL;
1777 PyErr_Clear();
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001778 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
1779 if (tmpkey == NULL)
Raymond Hettinger0deab622003-12-13 18:53:18 +00001780 return NULL;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001781 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001782 result = set_discard(so, tmpkey);
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001783 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001784 Py_DECREF(tmpkey);
Raymond Hettinger0deab622003-12-13 18:53:18 +00001785 return result;
1786 }
Raymond Hettinger438e02d2003-12-13 19:38:47 +00001787 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001788}
1789
1790PyDoc_STRVAR(discard_doc,
1791"Remove an element from a set if it is a member.\n\
1792\n\
1793If the element is not a member, do nothing.");
1794
1795static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001796set_reduce(PySetObject *so)
1797{
Raymond Hettinger15056a52004-11-09 07:25:31 +00001798 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001799
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001800 keys = PySequence_List((PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001801 if (keys == NULL)
1802 goto done;
1803 args = PyTuple_Pack(1, keys);
1804 if (args == NULL)
1805 goto done;
Raymond Hettinger15056a52004-11-09 07:25:31 +00001806 dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
1807 if (dict == NULL) {
1808 PyErr_Clear();
1809 dict = Py_None;
1810 Py_INCREF(dict);
1811 }
1812 result = PyTuple_Pack(3, so->ob_type, args, dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001813done:
1814 Py_XDECREF(args);
1815 Py_XDECREF(keys);
Raymond Hettinger15056a52004-11-09 07:25:31 +00001816 Py_XDECREF(dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001817 return result;
1818}
1819
1820PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1821
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001822static int
1823set_init(PySetObject *self, PyObject *args, PyObject *kwds)
1824{
1825 PyObject *iterable = NULL;
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001826
1827 if (!PyAnySet_Check(self))
1828 return -1;
1829 if (!PyArg_UnpackTuple(args, self->ob_type->tp_name, 0, 1, &iterable))
1830 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001831 set_clear_internal(self);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001832 self->hash = -1;
1833 if (iterable == NULL)
1834 return 0;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001835 return set_update_internal(self, iterable);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001836}
1837
Raymond Hettingera690a992003-11-16 16:17:49 +00001838static PySequenceMethods set_as_sequence = {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001839 set_len, /* sq_length */
Raymond Hettingera690a992003-11-16 16:17:49 +00001840 0, /* sq_concat */
1841 0, /* sq_repeat */
1842 0, /* sq_item */
1843 0, /* sq_slice */
1844 0, /* sq_ass_item */
1845 0, /* sq_ass_slice */
1846 (objobjproc)set_contains, /* sq_contains */
1847};
1848
1849/* set object ********************************************************/
1850
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001851#ifdef Py_DEBUG
1852static PyObject *test_c_api(PySetObject *so);
1853
1854PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
1855All is well if assertions don't fail.");
1856#endif
1857
Raymond Hettingera690a992003-11-16 16:17:49 +00001858static PyMethodDef set_methods[] = {
1859 {"add", (PyCFunction)set_add, METH_O,
1860 add_doc},
1861 {"clear", (PyCFunction)set_clear, METH_NOARGS,
1862 clear_doc},
Raymond Hettinger0deab622003-12-13 18:53:18 +00001863 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001864 contains_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00001865 {"copy", (PyCFunction)set_copy, METH_NOARGS,
1866 copy_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00001867 {"discard", (PyCFunction)set_discard, METH_O,
1868 discard_doc},
1869 {"difference", (PyCFunction)set_difference, METH_O,
1870 difference_doc},
1871 {"difference_update", (PyCFunction)set_difference_update, METH_O,
1872 difference_update_doc},
1873 {"intersection",(PyCFunction)set_intersection, METH_O,
1874 intersection_doc},
1875 {"intersection_update",(PyCFunction)set_intersection_update, METH_O,
1876 intersection_update_doc},
1877 {"issubset", (PyCFunction)set_issubset, METH_O,
1878 issubset_doc},
1879 {"issuperset", (PyCFunction)set_issuperset, METH_O,
1880 issuperset_doc},
1881 {"pop", (PyCFunction)set_pop, METH_NOARGS,
1882 pop_doc},
1883 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
1884 reduce_doc},
1885 {"remove", (PyCFunction)set_remove, METH_O,
1886 remove_doc},
1887 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
1888 symmetric_difference_doc},
1889 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
1890 symmetric_difference_update_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00001891#ifdef Py_DEBUG
1892 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
1893 test_c_api_doc},
1894#endif
Raymond Hettingera690a992003-11-16 16:17:49 +00001895 {"union", (PyCFunction)set_union, METH_O,
1896 union_doc},
Raymond Hettingera38123e2003-11-24 22:18:49 +00001897 {"update", (PyCFunction)set_update, METH_O,
1898 update_doc},
Raymond Hettingera690a992003-11-16 16:17:49 +00001899 {NULL, NULL} /* sentinel */
1900};
1901
1902static PyNumberMethods set_as_number = {
1903 0, /*nb_add*/
1904 (binaryfunc)set_sub, /*nb_subtract*/
1905 0, /*nb_multiply*/
Raymond Hettingera690a992003-11-16 16:17:49 +00001906 0, /*nb_remainder*/
1907 0, /*nb_divmod*/
1908 0, /*nb_power*/
1909 0, /*nb_negative*/
1910 0, /*nb_positive*/
1911 0, /*nb_absolute*/
Jack Diederich4dafcc42006-11-28 19:15:13 +00001912 0, /*nb_bool*/
Raymond Hettingera690a992003-11-16 16:17:49 +00001913 0, /*nb_invert*/
1914 0, /*nb_lshift*/
1915 0, /*nb_rshift*/
1916 (binaryfunc)set_and, /*nb_and*/
1917 (binaryfunc)set_xor, /*nb_xor*/
1918 (binaryfunc)set_or, /*nb_or*/
1919 0, /*nb_coerce*/
1920 0, /*nb_int*/
1921 0, /*nb_long*/
1922 0, /*nb_float*/
1923 0, /*nb_oct*/
1924 0, /*nb_hex*/
1925 0, /*nb_inplace_add*/
1926 (binaryfunc)set_isub, /*nb_inplace_subtract*/
1927 0, /*nb_inplace_multiply*/
Raymond Hettingera690a992003-11-16 16:17:49 +00001928 0, /*nb_inplace_remainder*/
1929 0, /*nb_inplace_power*/
1930 0, /*nb_inplace_lshift*/
1931 0, /*nb_inplace_rshift*/
1932 (binaryfunc)set_iand, /*nb_inplace_and*/
1933 (binaryfunc)set_ixor, /*nb_inplace_xor*/
1934 (binaryfunc)set_ior, /*nb_inplace_or*/
1935};
1936
1937PyDoc_STRVAR(set_doc,
1938"set(iterable) --> set object\n\
1939\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001940Build an unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00001941
1942PyTypeObject PySet_Type = {
1943 PyObject_HEAD_INIT(&PyType_Type)
1944 0, /* ob_size */
1945 "set", /* tp_name */
1946 sizeof(PySetObject), /* tp_basicsize */
1947 0, /* tp_itemsize */
1948 /* methods */
1949 (destructor)set_dealloc, /* tp_dealloc */
1950 (printfunc)set_tp_print, /* tp_print */
1951 0, /* tp_getattr */
1952 0, /* tp_setattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001953 set_nocmp, /* tp_compare */
Raymond Hettingera690a992003-11-16 16:17:49 +00001954 (reprfunc)set_repr, /* tp_repr */
1955 &set_as_number, /* tp_as_number */
1956 &set_as_sequence, /* tp_as_sequence */
1957 0, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +00001958 0, /* tp_hash */
Raymond Hettingera690a992003-11-16 16:17:49 +00001959 0, /* tp_call */
1960 0, /* tp_str */
1961 PyObject_GenericGetAttr, /* tp_getattro */
1962 0, /* tp_setattro */
1963 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001964 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001965 Py_TPFLAGS_BASETYPE, /* tp_flags */
Raymond Hettingera690a992003-11-16 16:17:49 +00001966 set_doc, /* tp_doc */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001967 (traverseproc)set_traverse, /* tp_traverse */
Raymond Hettingerfe889f32005-08-06 05:43:39 +00001968 (inquiry)set_clear_internal, /* tp_clear */
Raymond Hettingera690a992003-11-16 16:17:49 +00001969 (richcmpfunc)set_richcompare, /* tp_richcompare */
Raymond Hettinger691d8052004-05-30 07:26:47 +00001970 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001971 (getiterfunc)set_iter, /* tp_iter */
Raymond Hettingera690a992003-11-16 16:17:49 +00001972 0, /* tp_iternext */
1973 set_methods, /* tp_methods */
1974 0, /* tp_members */
1975 0, /* tp_getset */
1976 0, /* tp_base */
1977 0, /* tp_dict */
1978 0, /* tp_descr_get */
1979 0, /* tp_descr_set */
1980 0, /* tp_dictoffset */
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001981 (initproc)set_init, /* tp_init */
Raymond Hettingera690a992003-11-16 16:17:49 +00001982 PyType_GenericAlloc, /* tp_alloc */
1983 set_new, /* tp_new */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00001984 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00001985};
1986
1987/* frozenset object ********************************************************/
1988
1989
1990static PyMethodDef frozenset_methods[] = {
Raymond Hettinger0deab622003-12-13 18:53:18 +00001991 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001992 contains_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001993 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
Raymond Hettingera690a992003-11-16 16:17:49 +00001994 copy_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001995 {"difference", (PyCFunction)set_difference, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00001996 difference_doc},
1997 {"intersection",(PyCFunction)set_intersection, METH_O,
1998 intersection_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001999 {"issubset", (PyCFunction)set_issubset, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00002000 issubset_doc},
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00002001 {"issuperset", (PyCFunction)set_issuperset, METH_O,
Raymond Hettingera690a992003-11-16 16:17:49 +00002002 issuperset_doc},
2003 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2004 reduce_doc},
2005 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2006 symmetric_difference_doc},
2007 {"union", (PyCFunction)set_union, METH_O,
2008 union_doc},
2009 {NULL, NULL} /* sentinel */
2010};
2011
2012static PyNumberMethods frozenset_as_number = {
2013 0, /*nb_add*/
2014 (binaryfunc)set_sub, /*nb_subtract*/
2015 0, /*nb_multiply*/
Raymond Hettingera690a992003-11-16 16:17:49 +00002016 0, /*nb_remainder*/
2017 0, /*nb_divmod*/
2018 0, /*nb_power*/
2019 0, /*nb_negative*/
2020 0, /*nb_positive*/
2021 0, /*nb_absolute*/
Jack Diederich4dafcc42006-11-28 19:15:13 +00002022 0, /*nb_bool*/
Raymond Hettingera690a992003-11-16 16:17:49 +00002023 0, /*nb_invert*/
2024 0, /*nb_lshift*/
2025 0, /*nb_rshift*/
2026 (binaryfunc)set_and, /*nb_and*/
2027 (binaryfunc)set_xor, /*nb_xor*/
2028 (binaryfunc)set_or, /*nb_or*/
2029};
2030
2031PyDoc_STRVAR(frozenset_doc,
2032"frozenset(iterable) --> frozenset object\n\
2033\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002034Build an immutable unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002035
2036PyTypeObject PyFrozenSet_Type = {
2037 PyObject_HEAD_INIT(&PyType_Type)
2038 0, /* ob_size */
2039 "frozenset", /* tp_name */
2040 sizeof(PySetObject), /* tp_basicsize */
Raymond Hettingera3b11e72003-12-31 14:08:58 +00002041 0, /* tp_itemsize */
2042 /* methods */
Raymond Hettingera690a992003-11-16 16:17:49 +00002043 (destructor)set_dealloc, /* tp_dealloc */
2044 (printfunc)set_tp_print, /* tp_print */
2045 0, /* tp_getattr */
2046 0, /* tp_setattr */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002047 set_nocmp, /* tp_compare */
Raymond Hettingera690a992003-11-16 16:17:49 +00002048 (reprfunc)set_repr, /* tp_repr */
2049 &frozenset_as_number, /* tp_as_number */
2050 &set_as_sequence, /* tp_as_sequence */
2051 0, /* tp_as_mapping */
2052 frozenset_hash, /* tp_hash */
2053 0, /* tp_call */
2054 0, /* tp_str */
2055 PyObject_GenericGetAttr, /* tp_getattro */
2056 0, /* tp_setattro */
2057 0, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002058 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00002059 Py_TPFLAGS_BASETYPE, /* tp_flags */
Raymond Hettingera690a992003-11-16 16:17:49 +00002060 frozenset_doc, /* tp_doc */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002061 (traverseproc)set_traverse, /* tp_traverse */
Raymond Hettingerfe889f32005-08-06 05:43:39 +00002062 (inquiry)set_clear_internal, /* tp_clear */
Raymond Hettingera690a992003-11-16 16:17:49 +00002063 (richcmpfunc)set_richcompare, /* tp_richcompare */
Raymond Hettinger691d8052004-05-30 07:26:47 +00002064 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
Raymond Hettingera690a992003-11-16 16:17:49 +00002065 (getiterfunc)set_iter, /* tp_iter */
2066 0, /* tp_iternext */
2067 frozenset_methods, /* tp_methods */
2068 0, /* tp_members */
2069 0, /* tp_getset */
2070 0, /* tp_base */
2071 0, /* tp_dict */
2072 0, /* tp_descr_get */
2073 0, /* tp_descr_set */
2074 0, /* tp_dictoffset */
2075 0, /* tp_init */
2076 PyType_GenericAlloc, /* tp_alloc */
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00002077 frozenset_new, /* tp_new */
Raymond Hettingerbb999b52005-06-18 21:00:26 +00002078 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002079};
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002080
2081
2082/***** C API functions *************************************************/
2083
2084PyObject *
2085PySet_New(PyObject *iterable)
2086{
2087 return make_new_set(&PySet_Type, iterable);
2088}
2089
2090PyObject *
2091PyFrozenSet_New(PyObject *iterable)
2092{
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002093 PyObject *args, *result;
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002094
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002095 if (iterable == NULL)
2096 args = PyTuple_New(0);
2097 else
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002098 args = PyTuple_Pack(1, iterable);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002099 if (args == NULL)
2100 return NULL;
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002101 result = frozenset_new(&PyFrozenSet_Type, args, NULL);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002102 Py_DECREF(args);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002103 return result;
2104}
2105
Neal Norwitz8c49c822006-03-04 18:41:19 +00002106Py_ssize_t
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002107PySet_Size(PyObject *anyset)
2108{
2109 if (!PyAnySet_Check(anyset)) {
2110 PyErr_BadInternalCall();
2111 return -1;
2112 }
Raymond Hettinger9c1491f2005-08-24 00:24:40 +00002113 return PySet_GET_SIZE(anyset);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002114}
2115
2116int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002117PySet_Clear(PyObject *set)
2118{
2119 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
2120 PyErr_BadInternalCall();
2121 return -1;
2122 }
2123 return set_clear_internal((PySetObject *)set);
2124}
2125
2126int
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002127PySet_Contains(PyObject *anyset, PyObject *key)
2128{
2129 if (!PyAnySet_Check(anyset)) {
2130 PyErr_BadInternalCall();
2131 return -1;
2132 }
2133 return set_contains_key((PySetObject *)anyset, key);
2134}
2135
2136int
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002137PySet_Discard(PyObject *set, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002138{
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002139 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002140 PyErr_BadInternalCall();
2141 return -1;
2142 }
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002143 return set_discard_key((PySetObject *)set, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002144}
2145
2146int
2147PySet_Add(PyObject *set, PyObject *key)
2148{
2149 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
2150 PyErr_BadInternalCall();
2151 return -1;
2152 }
2153 return set_add_key((PySetObject *)set, key);
2154}
2155
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002156int
2157_PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **entry)
2158{
2159 setentry *entry_ptr;
2160
2161 if (!PyAnySet_Check(set)) {
2162 PyErr_BadInternalCall();
2163 return -1;
2164 }
2165 if (set_next((PySetObject *)set, pos, &entry_ptr) == 0)
2166 return 0;
2167 *entry = entry_ptr->key;
2168 return 1;
2169}
2170
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002171PyObject *
2172PySet_Pop(PyObject *set)
2173{
2174 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
2175 PyErr_BadInternalCall();
2176 return NULL;
2177 }
2178 return set_pop((PySetObject *)set);
2179}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002180
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002181int
2182_PySet_Update(PyObject *set, PyObject *iterable)
2183{
2184 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
2185 PyErr_BadInternalCall();
2186 return -1;
2187 }
2188 return set_update_internal((PySetObject *)set, iterable);
2189}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002190
2191#ifdef Py_DEBUG
2192
2193/* Test code to be called with any three element set.
2194 Returns True and original set is restored. */
2195
2196#define assertRaises(call_return_value, exception) \
2197 do { \
2198 assert(call_return_value); \
2199 assert(PyErr_ExceptionMatches(exception)); \
2200 PyErr_Clear(); \
2201 } while(0)
2202
2203static PyObject *
2204test_c_api(PySetObject *so)
2205{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002206 Py_ssize_t count;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002207 char *s;
2208 Py_ssize_t i;
2209 PyObject *elem, *dup, *t, *f, *dup2;
2210 PyObject *ob = (PyObject *)so;
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002211
2212 /* Verify preconditions and exercise type/size checks */
2213 assert(PyAnySet_Check(ob));
2214 assert(PyAnySet_CheckExact(ob));
2215 assert(!PyFrozenSet_CheckExact(ob));
2216 assert(PySet_Size(ob) == 3);
2217 assert(PySet_GET_SIZE(ob) == 3);
2218
2219 /* Raise TypeError for non-iterable constructor arguments */
2220 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2221 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
2222
2223 /* Raise TypeError for unhashable key */
2224 dup = PySet_New(ob);
2225 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2226 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2227 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
2228
2229 /* Exercise successful pop, contains, add, and discard */
2230 elem = PySet_Pop(ob);
2231 assert(PySet_Contains(ob, elem) == 0);
2232 assert(PySet_GET_SIZE(ob) == 2);
2233 assert(PySet_Add(ob, elem) == 0);
2234 assert(PySet_Contains(ob, elem) == 1);
2235 assert(PySet_GET_SIZE(ob) == 3);
2236 assert(PySet_Discard(ob, elem) == 1);
2237 assert(PySet_GET_SIZE(ob) == 2);
2238 assert(PySet_Discard(ob, elem) == 0);
2239 assert(PySet_GET_SIZE(ob) == 2);
2240
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002241 /* Exercise clear */
2242 dup2 = PySet_New(dup);
2243 assert(PySet_Clear(dup2) == 0);
2244 assert(PySet_Size(dup2) == 0);
2245 Py_DECREF(dup2);
2246
2247 /* Raise SystemError on clear or update of frozen set */
2248 f = PyFrozenSet_New(dup);
2249 assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
2250 assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
2251 Py_DECREF(f);
2252
2253 /* Exercise direct iteration */
2254 i = 0, count = 0;
2255 while (_PySet_Next((PyObject *)dup, &i, &elem)) {
2256 s = PyString_AsString(elem);
2257 assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c'));
2258 count++;
2259 }
2260 assert(count == 3);
2261
2262 /* Exercise updates */
2263 dup2 = PySet_New(NULL);
2264 assert(_PySet_Update(dup2, dup) == 0);
2265 assert(PySet_Size(dup2) == 3);
2266 assert(_PySet_Update(dup2, dup) == 0);
2267 assert(PySet_Size(dup2) == 3);
2268 Py_DECREF(dup2);
2269
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002270 /* Raise SystemError when self argument is not a set or frozenset. */
2271 t = PyTuple_New(0);
2272 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2273 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2274 Py_DECREF(t);
2275
2276 /* Raise SystemError when self argument is not a set. */
2277 f = PyFrozenSet_New(dup);
2278 assert(PySet_Size(f) == 3);
2279 assert(PyFrozenSet_CheckExact(f));
2280 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2281 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2282 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2283 Py_DECREF(f);
2284
2285 /* Raise KeyError when popping from an empty set */
Raymond Hettingerd8e13382005-08-17 12:27:17 +00002286 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
2287 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002288 assert(PySet_GET_SIZE(ob) == 0);
2289 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
2290
Raymond Hettingerd8e13382005-08-17 12:27:17 +00002291 /* Restore the set from the copy using the PyNumber API */
2292 assert(PyNumber_InPlaceOr(ob, dup) == ob);
2293 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002294
2295 /* Verify constructors accept NULL arguments */
2296 f = PySet_New(NULL);
2297 assert(f != NULL);
2298 assert(PySet_GET_SIZE(f) == 0);
2299 Py_DECREF(f);
2300 f = PyFrozenSet_New(NULL);
2301 assert(f != NULL);
2302 assert(PyFrozenSet_CheckExact(f));
2303 assert(PySet_GET_SIZE(f) == 0);
2304 Py_DECREF(f);
2305
2306 Py_DECREF(elem);
2307 Py_DECREF(dup);
2308 Py_RETURN_TRUE;
2309}
2310
Raymond Hettinger9bda1d62005-09-16 07:14:21 +00002311#undef assertRaises
2312
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002313#endif