blob: 307f19ef0f4ec6bd4d05b0a0716f36170eb18ca0 [file] [log] [blame]
Raymond Hettingerc991db22005-08-11 07:58:45 +00001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002/* set object implementation
Raymond Hettingerae7b00e2013-09-07 15:05:00 -07003
Raymond Hettingera9d99362005-08-05 00:01:15 +00004 Written and maintained by Raymond D. Hettinger <python@rcn.com>
5 Derived from Lib/sets.py and Objects/dictobject.c.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00006
Raymond Hettingerbd9b2002015-01-18 16:10:30 -08007 Copyright (c) 2003-2015 Python Software Foundation.
Raymond Hettingera9d99362005-08-05 00:01:15 +00008 All rights reserved.
Raymond Hettingerae7b00e2013-09-07 15:05:00 -07009
10 The basic lookup function used by all operations.
11 This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
12
13 The initial probe index is computed as hash mod the table size.
14 Subsequent probe indices are computed as explained in Objects/dictobject.c.
15
16 To improve cache locality, each probe inspects a series of consecutive
17 nearby entries before moving on to probes elsewhere in memory. This leaves
18 us with a hybrid of linear probing and open addressing. The linear probing
19 reduces the cost of hash collisions because consecutive memory accesses
20 tend to be much cheaper than scattered probes. After LINEAR_PROBES steps,
21 we then use open addressing with the upper bits from the hash value. This
22 helps break-up long chains of collisions.
23
24 All arithmetic on hash should ignore overflow.
25
Raymond Hettinger4d45c102015-01-25 16:27:40 -080026 Unlike the dictionary implementation, the lookkey function can return
Raymond Hettingerae7b00e2013-09-07 15:05:00 -070027 NULL if the rich comparison returns an error.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000028*/
29
Raymond Hettingera690a992003-11-16 16:17:49 +000030#include "Python.h"
Raymond Hettingera9d99362005-08-05 00:01:15 +000031#include "structmember.h"
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000032
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000033/* Object used as dummy key to fill deleted entries */
Raymond Hettingerbfc1e1a2013-08-23 03:22:15 -050034static PyObject _dummy_struct;
35
36#define dummy (&_dummy_struct)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000037
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000038
Raymond Hettinger04fd9dd2013-09-07 17:41:01 -070039/* ======================================================================== */
40/* ======= Begin logic for probing the hash table ========================= */
41
Raymond Hettinger710a67e2013-09-21 20:17:31 -070042/* Set this to zero to turn-off linear probing */
Raymond Hettinger8408dc52013-09-15 14:57:15 -070043#ifndef LINEAR_PROBES
Raymond Hettinger742d8712013-09-08 00:25:57 -070044#define LINEAR_PROBES 9
Raymond Hettinger8408dc52013-09-15 14:57:15 -070045#endif
Raymond Hettinger742d8712013-09-08 00:25:57 -070046
47/* This must be >= 1 */
48#define PERTURB_SHIFT 5
49
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000050static setentry *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020051set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 setentry *table = so->table;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020054 setentry *entry;
Raymond Hettinger38bb95e2015-06-24 01:22:19 -070055 size_t perturb;
Raymond Hettingerafe89092013-08-28 20:59:31 -070056 size_t mask = so->mask;
Raymond Hettinger59ecabd2015-01-31 02:45:12 -080057 size_t i = (size_t)hash & mask; /* Unsigned for defined overflow behavior */
Raymond Hettinger8408dc52013-09-15 14:57:15 -070058 size_t j;
Raymond Hettinger4ef05282013-09-21 15:39:49 -070059 int cmp;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +000060
Raymond Hettinger59ecabd2015-01-31 02:45:12 -080061 entry = &table[i];
Raymond Hettingerafe89092013-08-28 20:59:31 -070062 if (entry->key == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 return entry;
Raymond Hettinger237b34b2013-08-17 02:31:53 -070064
Raymond Hettinger38bb95e2015-06-24 01:22:19 -070065 perturb = hash;
66
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -070067 while (1) {
Raymond Hettingera5ebbf62015-01-26 21:54:35 -080068 if (entry->hash == hash) {
Raymond Hettingerafe89092013-08-28 20:59:31 -070069 PyObject *startkey = entry->key;
Raymond Hettingera5ebbf62015-01-26 21:54:35 -080070 /* startkey cannot be a dummy because the dummy hash field is -1 */
71 assert(startkey != dummy);
Raymond Hettinger08e3dc02014-12-26 20:14:00 -080072 if (startkey == key)
73 return entry;
Raymond Hettinger93035c42015-01-25 16:12:49 -080074 if (PyUnicode_CheckExact(startkey)
75 && PyUnicode_CheckExact(key)
Raymond Hettingerac2ef652015-07-04 16:04:44 -070076 && _PyUnicode_EQ(startkey, key))
Raymond Hettinger93035c42015-01-25 16:12:49 -080077 return entry;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 Py_INCREF(startkey);
79 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
80 Py_DECREF(startkey);
Raymond Hettinger426d9952014-05-18 21:40:20 +010081 if (cmp < 0) /* unlikely */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 return NULL;
Raymond Hettinger426d9952014-05-18 21:40:20 +010083 if (table != so->table || entry->key != startkey) /* unlikely */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 return set_lookkey(so, key, hash);
Raymond Hettinger426d9952014-05-18 21:40:20 +010085 if (cmp > 0) /* likely */
Raymond Hettingerafe89092013-08-28 20:59:31 -070086 return entry;
Raymond Hettinger438f9132015-02-09 06:48:29 -060087 mask = so->mask; /* help avoid a register spill */
Raymond Hettingerafe89092013-08-28 20:59:31 -070088 }
Raymond Hettingerafe89092013-08-28 20:59:31 -070089
Raymond Hettingerc658d852015-02-02 08:35:00 -080090 if (i + LINEAR_PROBES <= mask) {
Raymond Hettinger82492822015-02-04 08:37:02 -080091 for (j = 0 ; j < LINEAR_PROBES ; j++) {
Raymond Hettingerc658d852015-02-02 08:35:00 -080092 entry++;
Raymond Hettinger8651a502015-05-27 10:37:20 -070093 if (entry->hash == 0 && entry->key == NULL)
94 return entry;
Raymond Hettingerc658d852015-02-02 08:35:00 -080095 if (entry->hash == hash) {
96 PyObject *startkey = entry->key;
97 assert(startkey != dummy);
98 if (startkey == key)
99 return entry;
100 if (PyUnicode_CheckExact(startkey)
101 && PyUnicode_CheckExact(key)
Raymond Hettingerac2ef652015-07-04 16:04:44 -0700102 && _PyUnicode_EQ(startkey, key))
Raymond Hettingerc658d852015-02-02 08:35:00 -0800103 return entry;
104 Py_INCREF(startkey);
105 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
106 Py_DECREF(startkey);
107 if (cmp < 0)
108 return NULL;
109 if (table != so->table || entry->key != startkey)
110 return set_lookkey(so, key, hash);
111 if (cmp > 0)
112 return entry;
Raymond Hettinger438f9132015-02-09 06:48:29 -0600113 mask = so->mask;
Raymond Hettingerc658d852015-02-02 08:35:00 -0800114 }
Raymond Hettinger8651a502015-05-27 10:37:20 -0700115 }
116 }
117
118 perturb >>= PERTURB_SHIFT;
119 i = (i * 5 + 1 + perturb) & mask;
120
121 entry = &table[i];
Raymond Hettinger7e3592d2015-06-21 10:47:20 -0700122 if (entry->key == NULL)
Raymond Hettinger8651a502015-05-27 10:37:20 -0700123 return entry;
124 }
125}
126
Raymond Hettinger15f08692015-07-03 17:21:17 -0700127static int set_table_resize(PySetObject *, Py_ssize_t);
128
Raymond Hettinger8651a502015-05-27 10:37:20 -0700129static int
Raymond Hettinger73799b12015-07-05 16:06:10 -0700130set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
Raymond Hettinger8651a502015-05-27 10:37:20 -0700131{
132 setentry *table = so->table;
Raymond Hettinger38bb95e2015-06-24 01:22:19 -0700133 setentry *freeslot;
Raymond Hettinger8651a502015-05-27 10:37:20 -0700134 setentry *entry;
Raymond Hettinger38bb95e2015-06-24 01:22:19 -0700135 size_t perturb;
Raymond Hettinger8651a502015-05-27 10:37:20 -0700136 size_t mask = so->mask;
137 size_t i = (size_t)hash & mask; /* Unsigned for defined overflow behavior */
138 size_t j;
139 int cmp;
140
141 entry = &table[i];
142 if (entry->key == NULL)
Raymond Hettinger15f08692015-07-03 17:21:17 -0700143 goto found_unused;
Raymond Hettinger6ee588f2015-06-20 21:39:51 -0700144
145 freeslot = NULL;
146 perturb = hash;
Raymond Hettinger8651a502015-05-27 10:37:20 -0700147
148 while (1) {
149 if (entry->hash == hash) {
150 PyObject *startkey = entry->key;
151 /* startkey cannot be a dummy because the dummy hash field is -1 */
152 assert(startkey != dummy);
153 if (startkey == key)
154 goto found_active;
155 if (PyUnicode_CheckExact(startkey)
156 && PyUnicode_CheckExact(key)
Raymond Hettingerac2ef652015-07-04 16:04:44 -0700157 && _PyUnicode_EQ(startkey, key))
Raymond Hettinger8651a502015-05-27 10:37:20 -0700158 goto found_active;
159 Py_INCREF(startkey);
160 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
161 Py_DECREF(startkey);
162 if (cmp < 0) /* unlikely */
163 return -1;
164 if (table != so->table || entry->key != startkey) /* unlikely */
Raymond Hettinger73799b12015-07-05 16:06:10 -0700165 return set_add_entry(so, key, hash);
Raymond Hettinger8651a502015-05-27 10:37:20 -0700166 if (cmp > 0) /* likely */
167 goto found_active;
168 mask = so->mask; /* help avoid a register spill */
169 }
170 if (entry->hash == -1 && freeslot == NULL)
171 freeslot = entry;
172
173 if (i + LINEAR_PROBES <= mask) {
174 for (j = 0 ; j < LINEAR_PROBES ; j++) {
175 entry++;
176 if (entry->hash == 0 && entry->key == NULL)
Raymond Hettinger15f08692015-07-03 17:21:17 -0700177 goto found_unused_or_dummy;
Raymond Hettinger8651a502015-05-27 10:37:20 -0700178 if (entry->hash == hash) {
179 PyObject *startkey = entry->key;
180 assert(startkey != dummy);
181 if (startkey == key)
182 goto found_active;
183 if (PyUnicode_CheckExact(startkey)
184 && PyUnicode_CheckExact(key)
Raymond Hettingerac2ef652015-07-04 16:04:44 -0700185 && _PyUnicode_EQ(startkey, key))
Raymond Hettinger8651a502015-05-27 10:37:20 -0700186 goto found_active;
187 Py_INCREF(startkey);
188 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
189 Py_DECREF(startkey);
190 if (cmp < 0)
191 return -1;
192 if (table != so->table || entry->key != startkey)
Raymond Hettinger73799b12015-07-05 16:06:10 -0700193 return set_add_entry(so, key, hash);
Raymond Hettinger8651a502015-05-27 10:37:20 -0700194 if (cmp > 0)
195 goto found_active;
196 mask = so->mask;
197 }
Raymond Hettinger91672612015-06-26 02:50:21 -0700198 else if (entry->hash == -1 && freeslot == NULL)
Raymond Hettingerc658d852015-02-02 08:35:00 -0800199 freeslot = entry;
Raymond Hettingera35adf52013-09-02 03:23:21 -0700200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 }
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -0700202
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -0700203 perturb >>= PERTURB_SHIFT;
Raymond Hettinger59ecabd2015-01-31 02:45:12 -0800204 i = (i * 5 + 1 + perturb) & mask;
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -0700205
Raymond Hettinger59ecabd2015-01-31 02:45:12 -0800206 entry = &table[i];
Raymond Hettinger7e3592d2015-06-21 10:47:20 -0700207 if (entry->key == NULL)
Raymond Hettinger15f08692015-07-03 17:21:17 -0700208 goto found_unused_or_dummy;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 }
Raymond Hettinger8651a502015-05-27 10:37:20 -0700210
Raymond Hettinger15f08692015-07-03 17:21:17 -0700211 found_unused_or_dummy:
212 if (freeslot == NULL)
213 goto found_unused;
214 Py_INCREF(key);
215 so->used++;
216 freeslot->key = key;
217 freeslot->hash = hash;
218 return 0;
219
220 found_unused:
Raymond Hettinger2eff9e92015-06-27 22:03:35 -0700221 Py_INCREF(key);
Raymond Hettinger6ee588f2015-06-20 21:39:51 -0700222 so->fill++;
223 so->used++;
224 entry->key = key;
225 entry->hash = hash;
Raymond Hettinger15f08692015-07-03 17:21:17 -0700226 if ((size_t)so->fill*3 < mask*2)
227 return 0;
Raymond Hettinger48973002015-07-03 20:00:03 -0700228 return set_table_resize(so, so->used);
Raymond Hettinger8651a502015-05-27 10:37:20 -0700229
230 found_active:
Raymond Hettinger8651a502015-05-27 10:37:20 -0700231 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
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200243set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 setentry *table = so->table;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200246 setentry *entry;
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -0700247 size_t perturb = hash;
248 size_t mask = (size_t)so->mask;
Raymond Hettinger3037e842015-01-26 21:33:48 -0800249 size_t i = (size_t)hash & mask;
Raymond Hettingera35adf52013-09-02 03:23:21 -0700250 size_t j;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000251
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -0700252 while (1) {
Raymond Hettinger3037e842015-01-26 21:33:48 -0800253 entry = &table[i];
254 if (entry->key == NULL)
255 goto found_null;
256 if (i + LINEAR_PROBES <= mask) {
Raymond Hettinger82492822015-02-04 08:37:02 -0800257 for (j = 0; j < LINEAR_PROBES; j++) {
Raymond Hettinger9edd7532015-01-30 20:09:23 -0800258 entry++;
Raymond Hettinger3037e842015-01-26 21:33:48 -0800259 if (entry->key == NULL)
260 goto found_null;
261 }
Raymond Hettingera35adf52013-09-02 03:23:21 -0700262 }
Raymond Hettinger3c0a4f52013-08-19 07:36:04 -0700263 perturb >>= PERTURB_SHIFT;
Raymond Hettinger3037e842015-01-26 21:33:48 -0800264 i = (i * 5 + 1 + perturb) & mask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 }
Raymond Hettingera35adf52013-09-02 03:23:21 -0700266 found_null:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 entry->key = key;
268 entry->hash = hash;
Raymond Hettinger4ef05282013-09-21 15:39:49 -0700269 so->fill++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 so->used++;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000271}
272
Raymond Hettinger04fd9dd2013-09-07 17:41:01 -0700273/* ======== End logic for probing the hash table ========================== */
274/* ======================================================================== */
275
Thomas Wouters89f507f2006-12-13 04:49:30 +0000276/*
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000277Restructure the table by allocating a new table and reinserting all
Raymond Hettinger06d8cf82005-07-31 15:36:06 +0000278keys again. When entries have been deleted, the new table may
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000279actually be smaller than the old one.
280*/
281static int
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000282set_table_resize(PySetObject *so, Py_ssize_t minused)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 Py_ssize_t newsize;
285 setentry *oldtable, *newtable, *entry;
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800286 Py_ssize_t oldfill = so->fill;
287 Py_ssize_t oldused = so->used;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 int is_oldtable_malloced;
289 setentry small_copy[PySet_MINSIZE];
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 assert(minused >= 0);
Raymond Hettinger48973002015-07-03 20:00:03 -0700292 minused = (minused > 50000) ? minused * 2 : minused * 4;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 /* Find the smallest table size > minused. */
Raymond Hettinger426d9952014-05-18 21:40:20 +0100295 /* XXX speed-up with intrinsics */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 for (newsize = PySet_MINSIZE;
297 newsize <= minused && newsize > 0;
298 newsize <<= 1)
299 ;
300 if (newsize <= 0) {
301 PyErr_NoMemory();
302 return -1;
303 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 /* Get space for a new table. */
306 oldtable = so->table;
307 assert(oldtable != NULL);
308 is_oldtable_malloced = oldtable != so->smalltable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 if (newsize == PySet_MINSIZE) {
311 /* A large table is shrinking, or we can't get any smaller. */
312 newtable = so->smalltable;
313 if (newtable == oldtable) {
314 if (so->fill == so->used) {
315 /* No dummies, so no point doing anything. */
316 return 0;
317 }
318 /* We're not going to resize it, but rebuild the
319 table anyway to purge old dummy entries.
320 Subtle: This is *necessary* if fill==size,
321 as set_lookkey needs at least one virgin slot to
322 terminate failing searches. If fill < size, it's
323 merely desirable, as dummies slow searches. */
324 assert(so->fill > so->used);
325 memcpy(small_copy, oldtable, sizeof(small_copy));
326 oldtable = small_copy;
327 }
328 }
329 else {
330 newtable = PyMem_NEW(setentry, newsize);
331 if (newtable == NULL) {
332 PyErr_NoMemory();
333 return -1;
334 }
335 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 /* Make the set empty, using the new table. */
338 assert(newtable != oldtable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 memset(newtable, 0, sizeof(setentry) * newsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 so->fill = 0;
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800341 so->used = 0;
342 so->mask = newsize - 1;
343 so->table = newtable;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 /* Copy the data over; this is refcount-neutral for active entries;
346 dummy entries aren't copied over, of course */
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800347 if (oldfill == oldused) {
348 for (entry = oldtable; oldused > 0; entry++) {
349 if (entry->key != NULL) {
350 oldused--;
351 set_insert_clean(so, entry->key, entry->hash);
352 }
353 }
354 } else {
355 for (entry = oldtable; oldused > 0; entry++) {
356 if (entry->key != NULL && entry->key != dummy) {
357 oldused--;
358 set_insert_clean(so, entry->key, entry->hash);
359 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 }
361 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 if (is_oldtable_malloced)
364 PyMem_DEL(oldtable);
365 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000366}
367
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000368static int
Raymond Hettingerb48d6a62015-07-05 16:27:44 -0700369set_contains_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000370{
Raymond Hettingerb48d6a62015-07-05 16:27:44 -0700371 setentry *entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000372
Raymond Hettingerb48d6a62015-07-05 16:27:44 -0700373 entry = set_lookkey(so, key, hash);
374 if (entry != NULL)
375 return entry->key != NULL;
376 return -1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000377}
378
379#define DISCARD_NOTFOUND 0
380#define DISCARD_FOUND 1
381
382static int
Raymond Hettinger73799b12015-07-05 16:06:10 -0700383set_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
Raymond Hettinger8edf27c2014-12-26 23:08:58 -0800384{
385 setentry *entry;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 PyObject *old_key;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000387
Raymond Hettingerdc28d5a2015-07-05 10:03:20 -0700388 entry = set_lookkey(so, key, hash);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 if (entry == NULL)
390 return -1;
Raymond Hettinger8651a502015-05-27 10:37:20 -0700391 if (entry->key == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 return DISCARD_NOTFOUND;
393 old_key = entry->key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 entry->key = dummy;
Raymond Hettingerb335dfe2015-01-25 16:38:52 -0800395 entry->hash = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 so->used--;
397 Py_DECREF(old_key);
398 return DISCARD_FOUND;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000399}
400
401static int
Raymond Hettingerb48d6a62015-07-05 16:27:44 -0700402set_add_key(PySetObject *so, PyObject *key)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000403{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200404 Py_hash_t hash;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000405
Raymond Hettingerb48d6a62015-07-05 16:27:44 -0700406 if (!PyUnicode_CheckExact(key) ||
407 (hash = ((PyASCIIObject *) key)->hash) == -1) {
408 hash = PyObject_Hash(key);
409 if (hash == -1)
410 return -1;
411 }
412 return set_add_entry(so, key, hash);
413}
414
415static int
416set_contains_key(PySetObject *so, PyObject *key)
417{
418 Py_hash_t hash;
419
420 if (!PyUnicode_CheckExact(key) ||
421 (hash = ((PyASCIIObject *) key)->hash) == -1) {
422 hash = PyObject_Hash(key);
423 if (hash == -1)
424 return -1;
425 }
426 return set_contains_entry(so, key, hash);
427}
428
429static int
430set_discard_key(PySetObject *so, PyObject *key)
431{
432 Py_hash_t hash;
Christian Heimes0ded5b52007-12-10 15:50:56 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 if (!PyUnicode_CheckExact(key) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200435 (hash = ((PyASCIIObject *) key)->hash) == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 hash = PyObject_Hash(key);
437 if (hash == -1)
438 return -1;
439 }
Raymond Hettinger73799b12015-07-05 16:06:10 -0700440 return set_discard_entry(so, key, hash);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000441}
442
Raymond Hettinger4ea90802013-09-07 21:01:29 -0700443static void
444set_empty_to_minsize(PySetObject *so)
445{
446 memset(so->smalltable, 0, sizeof(so->smalltable));
447 so->fill = 0;
448 so->used = 0;
449 so->mask = PySet_MINSIZE - 1;
450 so->table = so->smalltable;
451 so->hash = -1;
452}
453
Raymond Hettingerfe889f32005-08-06 05:43:39 +0000454static int
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000455set_clear_internal(PySetObject *so)
456{
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800457 setentry *entry;
458 setentry *table = so->table;
459 Py_ssize_t fill = so->fill;
460 Py_ssize_t used = so->used;
461 int table_is_malloced = table != so->smalltable;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 setentry small_copy[PySet_MINSIZE];
Raymond Hettingera580c472005-08-05 17:19:54 +0000463
Raymond Hettinger583cd032013-09-07 22:06:35 -0700464 assert (PyAnySet_Check(so));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 assert(table != NULL);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 /* This is delicate. During the process of clearing the set,
468 * decrefs can cause the set to mutate. To avoid fatal confusion
469 * (voice of experience), we have to make the set empty before
470 * clearing the slots, and never refer to anything via so->ref while
471 * clearing.
472 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 if (table_is_malloced)
Raymond Hettinger4ea90802013-09-07 21:01:29 -0700474 set_empty_to_minsize(so);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 else if (fill > 0) {
477 /* It's a small table with something that needs to be cleared.
478 * Afraid the only safe way is to copy the set entries into
479 * another small table first.
480 */
481 memcpy(small_copy, table, sizeof(small_copy));
482 table = small_copy;
Raymond Hettinger4ea90802013-09-07 21:01:29 -0700483 set_empty_to_minsize(so);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 }
485 /* else it's a small table that's already empty */
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 /* Now we can finally clear things. If C had refcounts, we could
488 * assert that the refcount on table is 1 now, i.e. that this function
489 * has unique access to it, so decref side-effects can't alter it.
490 */
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800491 for (entry = table; used > 0; entry++) {
492 if (entry->key && entry->key != dummy) {
493 used--;
494 Py_DECREF(entry->key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 if (table_is_malloced)
499 PyMem_DEL(table);
500 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000501}
502
503/*
504 * Iterate over a set table. Use like so:
505 *
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000506 * Py_ssize_t pos;
Raymond Hettingerc991db22005-08-11 07:58:45 +0000507 * setentry *entry;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000508 * pos = 0; # important! pos should not otherwise be changed by you
Raymond Hettingerc991db22005-08-11 07:58:45 +0000509 * while (set_next(yourset, &pos, &entry)) {
510 * Refer to borrowed reference in entry->key.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000511 * }
512 *
Raymond Hettingerc991db22005-08-11 07:58:45 +0000513 * CAUTION: In general, it isn't safe to use set_next in a loop that
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 * mutates the table.
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000515 */
516static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000517set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 Py_ssize_t i;
520 Py_ssize_t mask;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200521 setentry *table;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 assert (PyAnySet_Check(so));
524 i = *pos_ptr;
525 assert(i >= 0);
526 table = so->table;
527 mask = so->mask;
528 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
529 i++;
530 *pos_ptr = i+1;
531 if (i > mask)
532 return 0;
533 assert(table[i].key != NULL);
534 *entry_ptr = &table[i];
535 return 1;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000536}
537
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000538static void
539set_dealloc(PySetObject *so)
540{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200541 setentry *entry;
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800542 Py_ssize_t used = so->used;
543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 PyObject_GC_UnTrack(so);
545 Py_TRASHCAN_SAFE_BEGIN(so)
546 if (so->weakreflist != NULL)
547 PyObject_ClearWeakRefs((PyObject *) so);
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000548
Raymond Hettinger08e3dc02014-12-26 20:14:00 -0800549 for (entry = so->table; used > 0; entry++) {
550 if (entry->key && entry->key != dummy) {
551 used--;
Raymond Hettingerfcf3b502013-08-22 08:20:31 -0700552 Py_DECREF(entry->key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 }
554 }
555 if (so->table != so->smalltable)
556 PyMem_DEL(so->table);
Raymond Hettinger8f8839e2013-09-07 20:26:50 -0700557 Py_TYPE(so)->tp_free(so);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 Py_TRASHCAN_SAFE_END(so)
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000559}
560
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000561static PyObject *
562set_repr(PySetObject *so)
563{
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200564 PyObject *result=NULL, *keys, *listrepr, *tmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 int status = Py_ReprEnter((PyObject*)so);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 if (status != 0) {
568 if (status < 0)
569 return NULL;
570 return PyUnicode_FromFormat("%s(...)", Py_TYPE(so)->tp_name);
571 }
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 /* shortcut for the empty set */
574 if (!so->used) {
575 Py_ReprLeave((PyObject*)so);
576 return PyUnicode_FromFormat("%s()", Py_TYPE(so)->tp_name);
577 }
Georg Brandlc4996ba2006-08-28 19:37:11 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 keys = PySequence_List((PyObject *)so);
580 if (keys == NULL)
581 goto done;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000582
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200583 /* repr(keys)[1:-1] */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 listrepr = PyObject_Repr(keys);
585 Py_DECREF(keys);
586 if (listrepr == NULL)
587 goto done;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200588 tmp = PyUnicode_Substring(listrepr, 1, PyUnicode_GET_LENGTH(listrepr)-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 Py_DECREF(listrepr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200590 if (tmp == NULL)
591 goto done;
592 listrepr = tmp;
Victor Stinnera1a807b2011-05-26 14:24:30 +0200593
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200594 if (Py_TYPE(so) != &PySet_Type)
595 result = PyUnicode_FromFormat("%s({%U})",
596 Py_TYPE(so)->tp_name,
597 listrepr);
598 else
599 result = PyUnicode_FromFormat("{%U}", listrepr);
600 Py_DECREF(listrepr);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000601done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 Py_ReprLeave((PyObject*)so);
603 return result;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000604}
605
Martin v. Löwis18e16552006-02-15 17:27:45 +0000606static Py_ssize_t
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000607set_len(PyObject *so)
608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 return ((PySetObject *)so)->used;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000610}
611
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000612static int
Raymond Hettingerc991db22005-08-11 07:58:45 +0000613set_merge(PySetObject *so, PyObject *otherset)
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 PySetObject *other;
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +0000616 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200617 Py_ssize_t i;
Raymond Hettinger1bd8d752015-05-13 01:26:14 -0700618 setentry *so_entry;
619 setentry *other_entry;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 assert (PyAnySet_Check(so));
622 assert (PyAnySet_Check(otherset));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 other = (PySetObject*)otherset;
625 if (other == so || other->used == 0)
Raymond Hettinger1bd8d752015-05-13 01:26:14 -0700626 /* a.update(a) or a.update(set()); nothing to do */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 return 0;
628 /* Do one big resize at the start, rather than
629 * incrementally resizing as we insert new keys. Expect
630 * that there will be no (or few) overlapping keys.
631 */
Raymond Hettinger15f08692015-07-03 17:21:17 -0700632 if ((so->fill + other->used)*3 >= so->mask*2) {
Raymond Hettinger48973002015-07-03 20:00:03 -0700633 if (set_table_resize(so, so->used + other->used) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return -1;
635 }
Raymond Hettinger1bd8d752015-05-13 01:26:14 -0700636 so_entry = so->table;
637 other_entry = other->table;
638
639 /* If our table is empty, and both tables have the same size, and
640 there are no dummies to eliminate, then just copy the pointers. */
641 if (so->fill == 0 && so->mask == other->mask && other->fill == other->used) {
642 for (i = 0; i <= other->mask; i++, so_entry++, other_entry++) {
643 key = other_entry->key;
644 if (key != NULL) {
645 assert(so_entry->key == NULL);
646 Py_INCREF(key);
647 so_entry->key = key;
648 so_entry->hash = other_entry->hash;
649 }
650 }
651 so->fill = other->fill;
652 so->used = other->used;
653 return 0;
654 }
655
656 /* If our table is empty, we can use set_insert_clean() */
657 if (so->fill == 0) {
658 for (i = 0; i <= other->mask; i++, other_entry++) {
659 key = other_entry->key;
660 if (key != NULL && key != dummy) {
661 Py_INCREF(key);
662 set_insert_clean(so, key, other_entry->hash);
663 }
664 }
665 return 0;
666 }
667
668 /* We can't assure there are no duplicates, so do normal insertions */
669 for (i = 0; i <= other->mask; i++, other_entry++) {
670 key = other_entry->key;
671 if (key != NULL && key != dummy) {
Raymond Hettinger73799b12015-07-05 16:06:10 -0700672 if (set_add_entry(so, key, other_entry->hash))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 }
675 }
676 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000677}
678
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000679static PyObject *
680set_pop(PySetObject *so)
681{
Raymond Hettinger9cd6a782015-01-18 16:06:18 -0800682 /* Make sure the search finger is in bounds */
683 Py_ssize_t i = so->finger & so->mask;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200684 setentry *entry;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 PyObject *key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 assert (PyAnySet_Check(so));
688 if (so->used == 0) {
689 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
690 return NULL;
691 }
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000692
Raymond Hettinger1202a472015-01-18 13:12:42 -0800693 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
694 i++;
Raymond Hettingered741d42015-01-18 21:25:15 -0800695 if (i > so->mask)
696 i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 }
698 key = entry->key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 entry->key = dummy;
Raymond Hettingerb335dfe2015-01-25 16:38:52 -0800700 entry->hash = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 so->used--;
Raymond Hettinger1202a472015-01-18 13:12:42 -0800702 so->finger = i + 1; /* next place to start */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 return key;
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000704}
705
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000706PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
707Raises KeyError if the set is empty.");
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000708
709static int
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000710set_traverse(PySetObject *so, visitproc visit, void *arg)
Raymond Hettingerce8185e2005-08-13 09:28:48 +0000711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 Py_ssize_t pos = 0;
713 setentry *entry;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 while (set_next(so, &pos, &entry))
716 Py_VISIT(entry->key);
717 return 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000718}
719
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000720static Py_hash_t
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000721frozenset_hash(PyObject *self)
722{
Raymond Hettinger74fc8c42014-01-05 12:00:31 -0800723 /* Most of the constants in this hash algorithm are randomly choosen
724 large primes with "interesting bit patterns" and that passed
725 tests for good collision statistics on a variety of problematic
726 datasets such as:
727
728 ps = []
729 for r in range(21):
730 ps += itertools.combinations(range(20), r)
731 num_distinct_hashes = len({hash(frozenset(s)) for s in ps})
732
733 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 PySetObject *so = (PySetObject *)self;
Gregory P. Smith27cbcd62012-12-10 18:15:46 -0800735 Py_uhash_t h, hash = 1927868237UL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 setentry *entry;
737 Py_ssize_t pos = 0;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 if (so->hash != -1)
740 return so->hash;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000741
Mark Dickinson57e683e2011-09-24 18:18:40 +0100742 hash *= (Py_uhash_t)PySet_GET_SIZE(self) + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 while (set_next(so, &pos, &entry)) {
744 /* Work to increase the bit dispersion for closely spaced hash
Raymond Hettinger06a1c8d2015-01-30 18:02:15 -0800745 values. This is important because some use cases have many
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 combinations of a small number of elements with nearby
747 hashes so that many distinct combinations collapse to only
748 a handful of distinct hash values. */
Antoine Pitroufbb1c612010-10-23 17:37:54 +0000749 h = entry->hash;
Raymond Hettinger74fc8c42014-01-05 12:00:31 -0800750 hash ^= ((h ^ 89869747UL) ^ (h << 16)) * 3644798167UL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 }
Raymond Hettinger74fc8c42014-01-05 12:00:31 -0800752 /* Make the final result spread-out in a different pattern
Eric V. Smith6ba56652014-01-14 08:15:03 -0500753 than the algorithm for tuples or other python objects. */
Gregory P. Smithc2176e42012-12-10 18:32:53 -0800754 hash = hash * 69069U + 907133923UL;
Victor Stinner12174a52014-08-15 23:17:38 +0200755 if (hash == (Py_uhash_t)-1)
Gregory P. Smith27cbcd62012-12-10 18:15:46 -0800756 hash = 590923713UL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 so->hash = hash;
758 return hash;
Raymond Hettingerf408ddf2005-08-17 00:27:42 +0000759}
760
Raymond Hettingera9d99362005-08-05 00:01:15 +0000761/***** Set iterator type ***********************************************/
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000762
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000763typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 PyObject_HEAD
765 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
766 Py_ssize_t si_used;
767 Py_ssize_t si_pos;
768 Py_ssize_t len;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000769} setiterobject;
770
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000771static void
772setiter_dealloc(setiterobject *si)
773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 Py_XDECREF(si->si_set);
775 PyObject_GC_Del(si);
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000776}
777
778static int
779setiter_traverse(setiterobject *si, visitproc visit, void *arg)
780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 Py_VISIT(si->si_set);
782 return 0;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000783}
784
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000785static PyObject *
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000786setiter_len(setiterobject *si)
787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 Py_ssize_t len = 0;
789 if (si->si_set != NULL && si->si_used == si->si_set->used)
790 len = si->len;
Antoine Pitrou671b4d92010-08-17 17:55:07 +0000791 return PyLong_FromSsize_t(len);
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000792}
793
Armin Rigof5b3e362006-02-11 21:32:43 +0000794PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000795
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000796static PyObject *setiter_iternext(setiterobject *si);
797
798static PyObject *
799setiter_reduce(setiterobject *si)
800{
801 PyObject *list;
802 setiterobject tmp;
803
804 list = PyList_New(0);
805 if (!list)
806 return NULL;
807
Ezio Melotti0e1af282012-09-28 16:43:40 +0300808 /* copy the iterator state */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000809 tmp = *si;
810 Py_XINCREF(tmp.si_set);
Ezio Melotti0e1af282012-09-28 16:43:40 +0300811
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000812 /* iterate the temporary into a list */
813 for(;;) {
814 PyObject *element = setiter_iternext(&tmp);
815 if (element) {
816 if (PyList_Append(list, element)) {
817 Py_DECREF(element);
818 Py_DECREF(list);
819 Py_XDECREF(tmp.si_set);
820 return NULL;
821 }
822 Py_DECREF(element);
823 } else
824 break;
825 }
826 Py_XDECREF(tmp.si_set);
827 /* check for error */
828 if (tmp.si_set != NULL) {
829 /* we have an error */
830 Py_DECREF(list);
831 return NULL;
832 }
Antoine Pitroua7013882012-04-05 00:04:20 +0200833 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000834}
835
836PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
837
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000838static PyMethodDef setiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000840 {"__reduce__", (PyCFunction)setiter_reduce, METH_NOARGS, reduce_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 PyObject *key;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200847 Py_ssize_t i, mask;
848 setentry *entry;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 PySetObject *so = si->si_set;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 if (so == NULL)
852 return NULL;
853 assert (PyAnySet_Check(so));
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 if (si->si_used != so->used) {
856 PyErr_SetString(PyExc_RuntimeError,
857 "Set changed size during iteration");
858 si->si_used = -1; /* Make this state sticky */
859 return NULL;
860 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 i = si->si_pos;
863 assert(i>=0);
864 entry = so->table;
865 mask = so->mask;
866 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
867 i++;
868 si->si_pos = i+1;
869 if (i > mask)
870 goto fail;
871 si->len--;
872 key = entry[i].key;
873 Py_INCREF(key);
874 return key;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000875
876fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 Py_DECREF(so);
878 si->si_set = NULL;
879 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000880}
881
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000882PyTypeObject PySetIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 PyVarObject_HEAD_INIT(&PyType_Type, 0)
884 "set_iterator", /* tp_name */
885 sizeof(setiterobject), /* tp_basicsize */
886 0, /* tp_itemsize */
887 /* methods */
888 (destructor)setiter_dealloc, /* tp_dealloc */
889 0, /* tp_print */
890 0, /* tp_getattr */
891 0, /* tp_setattr */
892 0, /* tp_reserved */
893 0, /* tp_repr */
894 0, /* tp_as_number */
895 0, /* tp_as_sequence */
896 0, /* tp_as_mapping */
897 0, /* tp_hash */
898 0, /* tp_call */
899 0, /* tp_str */
900 PyObject_GenericGetAttr, /* tp_getattro */
901 0, /* tp_setattro */
902 0, /* tp_as_buffer */
903 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
904 0, /* tp_doc */
905 (traverseproc)setiter_traverse, /* tp_traverse */
906 0, /* tp_clear */
907 0, /* tp_richcompare */
908 0, /* tp_weaklistoffset */
909 PyObject_SelfIter, /* tp_iter */
910 (iternextfunc)setiter_iternext, /* tp_iternext */
911 setiter_methods, /* tp_methods */
912 0,
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000913};
914
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000915static PyObject *
916set_iter(PySetObject *so)
917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
919 if (si == NULL)
920 return NULL;
921 Py_INCREF(so);
922 si->si_set = so;
923 si->si_used = so->used;
924 si->si_pos = 0;
925 si->len = so->used;
926 _PyObject_GC_TRACK(si);
927 return (PyObject *)si;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000928}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 PyObject *key, *it;
Raymond Hettingera690a992003-11-16 16:17:49 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 if (PyAnySet_Check(other))
936 return set_merge(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +0000937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (PyDict_CheckExact(other)) {
939 PyObject *value;
940 Py_ssize_t pos = 0;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000941 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 Py_ssize_t dictsize = PyDict_Size(other);
Thomas Wouterscf297e42007-02-23 15:07:44 +0000943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 /* 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 */
Raymond Hettingerc2480dc2015-07-04 08:46:31 -0700948 if (dictsize < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 return -1;
Raymond Hettinger15f08692015-07-03 17:21:17 -0700950 if ((so->fill + dictsize)*3 >= so->mask*2) {
Raymond Hettinger48973002015-07-03 20:00:03 -0700951 if (set_table_resize(so, so->used + dictsize) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 return -1;
953 }
954 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -0700955 if (set_add_entry(so, key, hash))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 return -1;
957 }
958 return 0;
959 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 it = PyObject_GetIter(other);
962 if (it == NULL)
963 return -1;
Raymond Hettingera690a992003-11-16 16:17:49 +0000964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettinger5af9e132015-05-13 01:44:36 -0700966 if (set_add_key(so, key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 Py_DECREF(it);
968 Py_DECREF(key);
969 return -1;
970 }
971 Py_DECREF(key);
972 }
973 Py_DECREF(it);
974 if (PyErr_Occurred())
975 return -1;
976 return 0;
Raymond Hettingerd7946662005-08-01 21:39:29 +0000977}
978
979static PyObject *
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000980set_update(PySetObject *so, PyObject *args)
Raymond Hettingerd7946662005-08-01 21:39:29 +0000981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 Py_ssize_t i;
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
985 PyObject *other = PyTuple_GET_ITEM(args, i);
Raymond Hettinger5af9e132015-05-13 01:44:36 -0700986 if (set_update_internal(so, other))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 return NULL;
988 }
989 Py_RETURN_NONE;
Raymond Hettingera38123e2003-11-24 22:18:49 +0000990}
991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992PyDoc_STRVAR(update_doc,
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000993"Update a set with the union of itself and others.");
Raymond Hettingera38123e2003-11-24 22:18:49 +0000994
Raymond Hettinger426d9952014-05-18 21:40:20 +0100995/* XXX Todo:
996 If aligned memory allocations become available, make the
997 set object 64 byte aligned so that most of the fields
998 can be retrieved or updated in a single cache line.
999*/
1000
Raymond Hettingera38123e2003-11-24 22:18:49 +00001001static PyObject *
1002make_new_set(PyTypeObject *type, PyObject *iterable)
1003{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001004 PySetObject *so = NULL;
Raymond Hettingera38123e2003-11-24 22:18:49 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 /* create PySetObject structure */
Raymond Hettinger8f8839e2013-09-07 20:26:50 -07001007 so = (PySetObject *)type->tp_alloc(type, 0);
1008 if (so == NULL)
1009 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001010
Raymond Hettinger4ea90802013-09-07 21:01:29 -07001011 so->fill = 0;
1012 so->used = 0;
1013 so->mask = PySet_MINSIZE - 1;
1014 so->table = so->smalltable;
Raymond Hettinger4ea90802013-09-07 21:01:29 -07001015 so->hash = -1;
Raymond Hettinger1202a472015-01-18 13:12:42 -08001016 so->finger = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 so->weakreflist = NULL;
Raymond Hettingera690a992003-11-16 16:17:49 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (iterable != NULL) {
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001020 if (set_update_internal(so, iterable)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 Py_DECREF(so);
1022 return NULL;
1023 }
1024 }
Raymond Hettingera38123e2003-11-24 22:18:49 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001027}
1028
Raymond Hettinger7d99f092008-11-16 11:44:54 +00001029static PyObject *
1030make_new_set_basetype(PyTypeObject *type, PyObject *iterable)
1031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 if (type != &PySet_Type && type != &PyFrozenSet_Type) {
1033 if (PyType_IsSubtype(type, &PySet_Type))
1034 type = &PySet_Type;
1035 else
1036 type = &PyFrozenSet_Type;
1037 }
1038 return make_new_set(type, iterable);
Raymond Hettinger7d99f092008-11-16 11:44:54 +00001039}
1040
Raymond Hettingerd7946662005-08-01 21:39:29 +00001041/* The empty frozenset is a singleton */
1042static PyObject *emptyfrozenset = NULL;
1043
Raymond Hettingera690a992003-11-16 16:17:49 +00001044static PyObject *
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001045frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Raymond Hettingera690a992003-11-16 16:17:49 +00001046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 PyObject *iterable = NULL, *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds))
1050 return NULL;
Georg Brandl02c42872005-08-26 06:42:30 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
1053 return NULL;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 if (type != &PyFrozenSet_Type)
1056 return make_new_set(type, iterable);
Raymond Hettingerd7946662005-08-01 21:39:29 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 if (iterable != NULL) {
1059 /* frozenset(f) is idempotent */
1060 if (PyFrozenSet_CheckExact(iterable)) {
1061 Py_INCREF(iterable);
1062 return iterable;
1063 }
1064 result = make_new_set(type, iterable);
1065 if (result == NULL || PySet_GET_SIZE(result))
1066 return result;
1067 Py_DECREF(result);
1068 }
1069 /* The empty frozenset is a singleton */
1070 if (emptyfrozenset == NULL)
1071 emptyfrozenset = make_new_set(type, NULL);
1072 Py_XINCREF(emptyfrozenset);
1073 return emptyfrozenset;
Raymond Hettingerd7946662005-08-01 21:39:29 +00001074}
1075
Antoine Pitrou093ce9c2011-12-16 11:24:27 +01001076int
1077PySet_ClearFreeList(void)
Raymond Hettingerd7946662005-08-01 21:39:29 +00001078{
Raymond Hettinger8f8839e2013-09-07 20:26:50 -07001079 return 0;
Antoine Pitrou093ce9c2011-12-16 11:24:27 +01001080}
1081
1082void
1083PySet_Fini(void)
1084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 Py_CLEAR(emptyfrozenset);
Raymond Hettingera690a992003-11-16 16:17:49 +00001086}
1087
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001088static PyObject *
1089set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 if (type == &PySet_Type && !_PyArg_NoKeywords("set()", kwds))
1092 return NULL;
1093
1094 return make_new_set(type, NULL);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001095}
1096
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001097/* set_swap_bodies() switches the contents of any two sets by moving their
1098 internal data pointers and, if needed, copying the internal smalltables.
1099 Semantically equivalent to:
1100
1101 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
1102
1103 The function always succeeds and it leaves both objects in a stable state.
Raymond Hettinger4d45c102015-01-25 16:27:40 -08001104 Useful for operations that update in-place (by allowing an intermediate
1105 result to be swapped into one of the original inputs).
Raymond Hettinger934d63e2005-07-31 01:33:10 +00001106*/
1107
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001108static void
1109set_swap_bodies(PySetObject *a, PySetObject *b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 Py_ssize_t t;
1112 setentry *u;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 setentry tab[PySet_MINSIZE];
Antoine Pitroufbb1c612010-10-23 17:37:54 +00001114 Py_hash_t h;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 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;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 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;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 if (a->table == a->smalltable || b->table == b->smalltable) {
1129 memcpy(tab, a->smalltable, sizeof(tab));
1130 memcpy(a->smalltable, b->smalltable, sizeof(tab));
1131 memcpy(b->smalltable, tab, sizeof(tab));
1132 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) &&
1135 PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) {
1136 h = a->hash; a->hash = b->hash; b->hash = h;
1137 } else {
1138 a->hash = -1;
1139 b->hash = -1;
1140 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001141}
1142
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00001143static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001144set_copy(PySetObject *so)
1145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 return make_new_set_basetype(Py_TYPE(so), (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001147}
1148
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001149static PyObject *
1150frozenset_copy(PySetObject *so)
1151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 if (PyFrozenSet_CheckExact(so)) {
1153 Py_INCREF(so);
1154 return (PyObject *)so;
1155 }
1156 return set_copy(so);
Raymond Hettinger49ba4c32003-11-23 02:49:05 +00001157}
1158
Raymond Hettingera690a992003-11-16 16:17:49 +00001159PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
1160
1161static PyObject *
Raymond Hettingerc991db22005-08-11 07:58:45 +00001162set_clear(PySetObject *so)
1163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 set_clear_internal(so);
1165 Py_RETURN_NONE;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001166}
1167
1168PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
1169
1170static PyObject *
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001171set_union(PySetObject *so, PyObject *args)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 PySetObject *result;
1174 PyObject *other;
1175 Py_ssize_t i;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 result = (PySetObject *)set_copy(so);
1178 if (result == NULL)
1179 return NULL;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1182 other = PyTuple_GET_ITEM(args, i);
1183 if ((PyObject *)so == other)
1184 continue;
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001185 if (set_update_internal(result, other)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 Py_DECREF(result);
1187 return NULL;
1188 }
1189 }
1190 return (PyObject *)result;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001191}
1192
1193PyDoc_STRVAR(union_doc,
1194 "Return the union of sets as a new set.\n\
1195\n\
1196(i.e. all elements that are in either set.)");
1197
1198static PyObject *
1199set_or(PySetObject *so, PyObject *other)
1200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 PySetObject *result;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001202
Brian Curtindfc80e32011-08-10 20:28:54 -05001203 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1204 Py_RETURN_NOTIMPLEMENTED;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 result = (PySetObject *)set_copy(so);
1207 if (result == NULL)
1208 return NULL;
1209 if ((PyObject *)so == other)
1210 return (PyObject *)result;
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001211 if (set_update_internal(result, other)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 Py_DECREF(result);
1213 return NULL;
1214 }
1215 return (PyObject *)result;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001216}
1217
Raymond Hettingera690a992003-11-16 16:17:49 +00001218static PyObject *
1219set_ior(PySetObject *so, PyObject *other)
1220{
Brian Curtindfc80e32011-08-10 20:28:54 -05001221 if (!PyAnySet_Check(other))
1222 Py_RETURN_NOTIMPLEMENTED;
1223
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001224 if (set_update_internal(so, other))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 return NULL;
1226 Py_INCREF(so);
1227 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001228}
1229
1230static PyObject *
1231set_intersection(PySetObject *so, PyObject *other)
1232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 PySetObject *result;
1234 PyObject *key, *it, *tmp;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001235 Py_hash_t hash;
1236 int rv;
Raymond Hettingera690a992003-11-16 16:17:49 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 if ((PyObject *)so == other)
1239 return set_copy(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 result = (PySetObject *)make_new_set_basetype(Py_TYPE(so), NULL);
1242 if (result == NULL)
1243 return NULL;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 if (PyAnySet_Check(other)) {
1246 Py_ssize_t pos = 0;
1247 setentry *entry;
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1250 tmp = (PyObject *)so;
1251 so = (PySetObject *)other;
1252 other = tmp;
1253 }
Raymond Hettingerb02c35e2005-08-12 20:48:39 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 while (set_next((PySetObject *)other, &pos, &entry)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001256 key = entry->key;
1257 hash = entry->hash;
1258 rv = set_contains_entry(so, key, hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001259 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 Py_DECREF(result);
1261 return NULL;
1262 }
1263 if (rv) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001264 if (set_add_entry(result, key, hash)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 Py_DECREF(result);
1266 return NULL;
1267 }
1268 }
1269 }
1270 return (PyObject *)result;
1271 }
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 it = PyObject_GetIter(other);
1274 if (it == NULL) {
1275 Py_DECREF(result);
1276 return NULL;
1277 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001280 hash = PyObject_Hash(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 if (hash == -1) {
1282 Py_DECREF(it);
1283 Py_DECREF(result);
1284 Py_DECREF(key);
1285 return NULL;
1286 }
Raymond Hettinger73799b12015-07-05 16:06:10 -07001287 rv = set_contains_entry(so, key, hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001288 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 Py_DECREF(it);
1290 Py_DECREF(result);
1291 Py_DECREF(key);
1292 return NULL;
1293 }
1294 if (rv) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001295 if (set_add_entry(result, key, hash)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 Py_DECREF(it);
1297 Py_DECREF(result);
1298 Py_DECREF(key);
1299 return NULL;
1300 }
1301 }
1302 Py_DECREF(key);
1303 }
1304 Py_DECREF(it);
1305 if (PyErr_Occurred()) {
1306 Py_DECREF(result);
1307 return NULL;
1308 }
1309 return (PyObject *)result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001310}
1311
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001312static PyObject *
1313set_intersection_multi(PySetObject *so, PyObject *args)
1314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 Py_ssize_t i;
1316 PyObject *result = (PyObject *)so;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 if (PyTuple_GET_SIZE(args) == 0)
1319 return set_copy(so);
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 Py_INCREF(so);
1322 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1323 PyObject *other = PyTuple_GET_ITEM(args, i);
1324 PyObject *newresult = set_intersection((PySetObject *)result, other);
1325 if (newresult == NULL) {
1326 Py_DECREF(result);
1327 return NULL;
1328 }
1329 Py_DECREF(result);
1330 result = newresult;
1331 }
1332 return result;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001333}
1334
Raymond Hettingera690a992003-11-16 16:17:49 +00001335PyDoc_STRVAR(intersection_doc,
1336"Return the intersection of two sets as a new set.\n\
1337\n\
1338(i.e. all elements that are in both sets.)");
1339
1340static PyObject *
1341set_intersection_update(PySetObject *so, PyObject *other)
1342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 PyObject *tmp;
Raymond Hettingera690a992003-11-16 16:17:49 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 tmp = set_intersection(so, other);
1346 if (tmp == NULL)
1347 return NULL;
1348 set_swap_bodies(so, (PySetObject *)tmp);
1349 Py_DECREF(tmp);
1350 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001351}
1352
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001353static PyObject *
1354set_intersection_update_multi(PySetObject *so, PyObject *args)
1355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 PyObject *tmp;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 tmp = set_intersection_multi(so, args);
1359 if (tmp == NULL)
1360 return NULL;
1361 set_swap_bodies(so, (PySetObject *)tmp);
1362 Py_DECREF(tmp);
1363 Py_RETURN_NONE;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001364}
1365
Raymond Hettingera690a992003-11-16 16:17:49 +00001366PyDoc_STRVAR(intersection_update_doc,
1367"Update a set with the intersection of itself and another.");
1368
1369static PyObject *
1370set_and(PySetObject *so, PyObject *other)
1371{
Brian Curtindfc80e32011-08-10 20:28:54 -05001372 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1373 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 return set_intersection(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001375}
1376
1377static PyObject *
1378set_iand(PySetObject *so, PyObject *other)
1379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 PyObject *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001381
Brian Curtindfc80e32011-08-10 20:28:54 -05001382 if (!PyAnySet_Check(other))
1383 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 result = set_intersection_update(so, other);
1385 if (result == NULL)
1386 return NULL;
1387 Py_DECREF(result);
1388 Py_INCREF(so);
1389 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001390}
1391
Guido van Rossum58da9312007-11-10 23:39:45 +00001392static PyObject *
1393set_isdisjoint(PySetObject *so, PyObject *other)
1394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 PyObject *key, *it, *tmp;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001396 int rv;
Guido van Rossum58da9312007-11-10 23:39:45 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if ((PyObject *)so == other) {
1399 if (PySet_GET_SIZE(so) == 0)
1400 Py_RETURN_TRUE;
1401 else
1402 Py_RETURN_FALSE;
1403 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 if (PyAnySet_CheckExact(other)) {
1406 Py_ssize_t pos = 0;
1407 setentry *entry;
Guido van Rossum58da9312007-11-10 23:39:45 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1410 tmp = (PyObject *)so;
1411 so = (PySetObject *)other;
1412 other = tmp;
1413 }
1414 while (set_next((PySetObject *)other, &pos, &entry)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001415 rv = set_contains_entry(so, entry->key, entry->hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001416 if (rv < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 return NULL;
1418 if (rv)
1419 Py_RETURN_FALSE;
1420 }
1421 Py_RETURN_TRUE;
1422 }
Guido van Rossum58da9312007-11-10 23:39:45 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 it = PyObject_GetIter(other);
1425 if (it == NULL)
1426 return NULL;
Guido van Rossum58da9312007-11-10 23:39:45 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 while ((key = PyIter_Next(it)) != NULL) {
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001429 Py_hash_t hash = PyObject_Hash(key);
Guido van Rossum58da9312007-11-10 23:39:45 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 if (hash == -1) {
1432 Py_DECREF(key);
1433 Py_DECREF(it);
1434 return NULL;
1435 }
Raymond Hettinger73799b12015-07-05 16:06:10 -07001436 rv = set_contains_entry(so, key, hash);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 Py_DECREF(key);
Raymond Hettingerc2480dc2015-07-04 08:46:31 -07001438 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 Py_DECREF(it);
1440 return NULL;
1441 }
1442 if (rv) {
1443 Py_DECREF(it);
1444 Py_RETURN_FALSE;
1445 }
1446 }
1447 Py_DECREF(it);
1448 if (PyErr_Occurred())
1449 return NULL;
1450 Py_RETURN_TRUE;
Guido van Rossum58da9312007-11-10 23:39:45 +00001451}
1452
1453PyDoc_STRVAR(isdisjoint_doc,
1454"Return True if two sets have a null intersection.");
1455
Neal Norwitz6576bd82005-11-13 18:41:28 +00001456static int
Raymond Hettingerc991db22005-08-11 07:58:45 +00001457set_difference_update_internal(PySetObject *so, PyObject *other)
1458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 if ((PyObject *)so == other)
1460 return set_clear_internal(so);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 if (PyAnySet_Check(other)) {
1463 setentry *entry;
1464 Py_ssize_t pos = 0;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 while (set_next((PySetObject *)other, &pos, &entry))
Raymond Hettinger73799b12015-07-05 16:06:10 -07001467 if (set_discard_entry(so, entry->key, entry->hash) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 return -1;
1469 } else {
1470 PyObject *key, *it;
1471 it = PyObject_GetIter(other);
1472 if (it == NULL)
1473 return -1;
1474
1475 while ((key = PyIter_Next(it)) != NULL) {
Raymond Hettingerb3223262015-07-03 23:37:16 -07001476 if (set_discard_key(so, key) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 Py_DECREF(it);
1478 Py_DECREF(key);
1479 return -1;
1480 }
1481 Py_DECREF(key);
1482 }
1483 Py_DECREF(it);
1484 if (PyErr_Occurred())
1485 return -1;
1486 }
Raymond Hettingere186c762015-07-04 11:28:35 -07001487 /* If more than 1/4th are dummies, then resize them away. */
1488 if ((size_t)(so->fill - so->used) <= (size_t)so->mask / 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 return 0;
Raymond Hettinger48973002015-07-03 20:00:03 -07001490 return set_table_resize(so, so->used);
Raymond Hettingerc991db22005-08-11 07:58:45 +00001491}
1492
Raymond Hettingera690a992003-11-16 16:17:49 +00001493static PyObject *
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001494set_difference_update(PySetObject *so, PyObject *args)
Raymond Hettingera690a992003-11-16 16:17:49 +00001495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 Py_ssize_t i;
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
1499 PyObject *other = PyTuple_GET_ITEM(args, i);
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001500 if (set_difference_update_internal(so, other))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 return NULL;
1502 }
1503 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001504}
1505
1506PyDoc_STRVAR(difference_update_doc,
1507"Remove all elements of another set from this set.");
1508
1509static PyObject *
Antoine Pitrou715f3cd2010-11-30 22:23:20 +00001510set_copy_and_difference(PySetObject *so, PyObject *other)
1511{
1512 PyObject *result;
1513
1514 result = set_copy(so);
1515 if (result == NULL)
1516 return NULL;
Raymond Hettingerb3223262015-07-03 23:37:16 -07001517 if (set_difference_update_internal((PySetObject *) result, other) == 0)
Antoine Pitrou715f3cd2010-11-30 22:23:20 +00001518 return result;
1519 Py_DECREF(result);
1520 return NULL;
1521}
1522
1523static PyObject *
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001524set_difference(PySetObject *so, PyObject *other)
1525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 PyObject *result;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001527 PyObject *key;
1528 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 setentry *entry;
1530 Py_ssize_t pos = 0;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001531 int rv;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) {
Antoine Pitrou715f3cd2010-11-30 22:23:20 +00001534 return set_copy_and_difference(so, other);
1535 }
1536
1537 /* If len(so) much more than len(other), it's more efficient to simply copy
1538 * so and then iterate other looking for common elements. */
1539 if ((PySet_GET_SIZE(so) >> 2) > PyObject_Size(other)) {
1540 return set_copy_and_difference(so, other);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 }
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 result = make_new_set_basetype(Py_TYPE(so), NULL);
1544 if (result == NULL)
1545 return NULL;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 if (PyDict_CheckExact(other)) {
1548 while (set_next(so, &pos, &entry)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001549 key = entry->key;
1550 hash = entry->hash;
Raymond Hettinger15f08692015-07-03 17:21:17 -07001551 rv = _PyDict_Contains(other, key, hash);
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001552 if (rv < 0) {
1553 Py_DECREF(result);
1554 return NULL;
1555 }
1556 if (!rv) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001557 if (set_add_entry((PySetObject *)result, key, hash)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 Py_DECREF(result);
1559 return NULL;
1560 }
1561 }
1562 }
1563 return result;
1564 }
1565
Antoine Pitrou715f3cd2010-11-30 22:23:20 +00001566 /* Iterate over so, checking for common elements in other. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 while (set_next(so, &pos, &entry)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001568 key = entry->key;
1569 hash = entry->hash;
1570 rv = set_contains_entry((PySetObject *)other, key, hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001571 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 Py_DECREF(result);
1573 return NULL;
1574 }
1575 if (!rv) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001576 if (set_add_entry((PySetObject *)result, key, hash)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 Py_DECREF(result);
1578 return NULL;
1579 }
1580 }
1581 }
1582 return result;
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001583}
1584
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001585static PyObject *
1586set_difference_multi(PySetObject *so, PyObject *args)
1587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 Py_ssize_t i;
1589 PyObject *result, *other;
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (PyTuple_GET_SIZE(args) == 0)
1592 return set_copy(so);
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 other = PyTuple_GET_ITEM(args, 0);
1595 result = set_difference(so, other);
1596 if (result == NULL)
1597 return NULL;
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 for (i=1 ; i<PyTuple_GET_SIZE(args) ; i++) {
1600 other = PyTuple_GET_ITEM(args, i);
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001601 if (set_difference_update_internal((PySetObject *)result, other)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 Py_DECREF(result);
1603 return NULL;
1604 }
1605 }
1606 return result;
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001607}
1608
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001609PyDoc_STRVAR(difference_doc,
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001610"Return the difference of two or more sets as a new set.\n\
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001611\n\
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +00001612(i.e. all elements that are in this set but not the others.)");
Raymond Hettingerfb4e33a2003-12-15 13:23:55 +00001613static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001614set_sub(PySetObject *so, PyObject *other)
1615{
Brian Curtindfc80e32011-08-10 20:28:54 -05001616 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1617 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 return set_difference(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001619}
1620
1621static PyObject *
1622set_isub(PySetObject *so, PyObject *other)
1623{
Brian Curtindfc80e32011-08-10 20:28:54 -05001624 if (!PyAnySet_Check(other))
1625 Py_RETURN_NOTIMPLEMENTED;
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001626 if (set_difference_update_internal(so, other))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 return NULL;
1628 Py_INCREF(so);
1629 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001630}
1631
1632static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001633set_symmetric_difference_update(PySetObject *so, PyObject *other)
1634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 PySetObject *otherset;
1636 PyObject *key;
1637 Py_ssize_t pos = 0;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001638 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 setentry *entry;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001640 int rv;
Raymond Hettingerc991db22005-08-11 07:58:45 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if ((PyObject *)so == other)
1643 return set_clear(so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 if (PyDict_CheckExact(other)) {
1646 PyObject *value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001648 Py_INCREF(key);
Raymond Hettinger73799b12015-07-05 16:06:10 -07001649 rv = set_discard_entry(so, key, hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001650 if (rv < 0) {
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001651 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 }
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001654 if (rv == DISCARD_NOTFOUND) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001655 if (set_add_entry(so, key, hash)) {
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001656 Py_DECREF(key);
1657 return NULL;
1658 }
1659 }
Georg Brandl2d444492010-09-03 10:52:55 +00001660 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 }
1662 Py_RETURN_NONE;
1663 }
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 if (PyAnySet_Check(other)) {
1666 Py_INCREF(other);
1667 otherset = (PySetObject *)other;
1668 } else {
1669 otherset = (PySetObject *)make_new_set_basetype(Py_TYPE(so), other);
1670 if (otherset == NULL)
1671 return NULL;
1672 }
Raymond Hettingera690a992003-11-16 16:17:49 +00001673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 while (set_next(otherset, &pos, &entry)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001675 key = entry->key;
1676 hash = entry->hash;
1677 rv = set_discard_entry(so, key, hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001678 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 Py_DECREF(otherset);
1680 return NULL;
1681 }
1682 if (rv == DISCARD_NOTFOUND) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001683 if (set_add_entry(so, key, hash)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 Py_DECREF(otherset);
1685 return NULL;
1686 }
1687 }
1688 }
1689 Py_DECREF(otherset);
1690 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001691}
1692
1693PyDoc_STRVAR(symmetric_difference_update_doc,
1694"Update a set with the symmetric difference of itself and another.");
1695
1696static PyObject *
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001697set_symmetric_difference(PySetObject *so, PyObject *other)
1698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 PyObject *rv;
1700 PySetObject *otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 otherset = (PySetObject *)make_new_set_basetype(Py_TYPE(so), other);
1703 if (otherset == NULL)
1704 return NULL;
1705 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1706 if (rv == NULL)
1707 return NULL;
1708 Py_DECREF(rv);
1709 return (PyObject *)otherset;
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001710}
1711
1712PyDoc_STRVAR(symmetric_difference_doc,
1713"Return the symmetric difference of two sets as a new set.\n\
1714\n\
1715(i.e. all elements that are in exactly one of the sets.)");
1716
1717static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001718set_xor(PySetObject *so, PyObject *other)
1719{
Brian Curtindfc80e32011-08-10 20:28:54 -05001720 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1721 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 return set_symmetric_difference(so, other);
Raymond Hettingera690a992003-11-16 16:17:49 +00001723}
1724
1725static PyObject *
1726set_ixor(PySetObject *so, PyObject *other)
1727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 PyObject *result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001729
Brian Curtindfc80e32011-08-10 20:28:54 -05001730 if (!PyAnySet_Check(other))
1731 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 result = set_symmetric_difference_update(so, other);
1733 if (result == NULL)
1734 return NULL;
1735 Py_DECREF(result);
1736 Py_INCREF(so);
1737 return (PyObject *)so;
Raymond Hettingera690a992003-11-16 16:17:49 +00001738}
1739
1740static PyObject *
1741set_issubset(PySetObject *so, PyObject *other)
1742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 setentry *entry;
1744 Py_ssize_t pos = 0;
Raymond Hettinger73799b12015-07-05 16:06:10 -07001745 int rv;
Raymond Hettingera690a992003-11-16 16:17:49 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 if (!PyAnySet_Check(other)) {
1748 PyObject *tmp, *result;
1749 tmp = make_new_set(&PySet_Type, other);
1750 if (tmp == NULL)
1751 return NULL;
1752 result = set_issubset(so, tmp);
1753 Py_DECREF(tmp);
1754 return result;
1755 }
1756 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
1757 Py_RETURN_FALSE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 while (set_next(so, &pos, &entry)) {
Raymond Hettinger73799b12015-07-05 16:06:10 -07001760 rv = set_contains_entry((PySetObject *)other, entry->key, entry->hash);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001761 if (rv < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 return NULL;
1763 if (!rv)
1764 Py_RETURN_FALSE;
1765 }
1766 Py_RETURN_TRUE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001767}
1768
1769PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
1770
1771static PyObject *
1772set_issuperset(PySetObject *so, PyObject *other)
1773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 PyObject *tmp, *result;
Raymond Hettinger3fbec702003-11-21 07:56:36 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 if (!PyAnySet_Check(other)) {
1777 tmp = make_new_set(&PySet_Type, other);
1778 if (tmp == NULL)
1779 return NULL;
1780 result = set_issuperset(so, tmp);
1781 Py_DECREF(tmp);
1782 return result;
1783 }
1784 return set_issubset((PySetObject *)other, (PyObject *)so);
Raymond Hettingera690a992003-11-16 16:17:49 +00001785}
1786
1787PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
1788
Raymond Hettingera690a992003-11-16 16:17:49 +00001789static PyObject *
1790set_richcompare(PySetObject *v, PyObject *w, int op)
1791{
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001792 PyObject *r1;
1793 int r2;
Raymond Hettinger9f1a6792005-07-31 01:16:36 +00001794
Brian Curtindfc80e32011-08-10 20:28:54 -05001795 if(!PyAnySet_Check(w))
1796 Py_RETURN_NOTIMPLEMENTED;
1797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 switch (op) {
1799 case Py_EQ:
1800 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
1801 Py_RETURN_FALSE;
1802 if (v->hash != -1 &&
1803 ((PySetObject *)w)->hash != -1 &&
1804 v->hash != ((PySetObject *)w)->hash)
1805 Py_RETURN_FALSE;
1806 return set_issubset(v, w);
1807 case Py_NE:
1808 r1 = set_richcompare(v, w, Py_EQ);
1809 if (r1 == NULL)
1810 return NULL;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001811 r2 = PyObject_IsTrue(r1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 Py_DECREF(r1);
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001813 if (r2 < 0)
1814 return NULL;
1815 return PyBool_FromLong(!r2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 case Py_LE:
1817 return set_issubset(v, w);
1818 case Py_GE:
1819 return set_issuperset(v, w);
1820 case Py_LT:
1821 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
1822 Py_RETURN_FALSE;
1823 return set_issubset(v, w);
1824 case Py_GT:
1825 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
1826 Py_RETURN_FALSE;
1827 return set_issuperset(v, w);
1828 }
Brian Curtindfc80e32011-08-10 20:28:54 -05001829 Py_RETURN_NOTIMPLEMENTED;
Raymond Hettingera690a992003-11-16 16:17:49 +00001830}
1831
Raymond Hettingera690a992003-11-16 16:17:49 +00001832static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001833set_add(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001834{
Raymond Hettinger5af9e132015-05-13 01:44:36 -07001835 if (set_add_key(so, key))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 return NULL;
1837 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001838}
1839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840PyDoc_STRVAR(add_doc,
Raymond Hettingera690a992003-11-16 16:17:49 +00001841"Add an element to a set.\n\
1842\n\
1843This has no effect if the element is already present.");
1844
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001845static int
1846set_contains(PySetObject *so, PyObject *key)
1847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 PyObject *tmpkey;
1849 int rv;
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 rv = set_contains_key(so, key);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001852 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1854 return -1;
1855 PyErr_Clear();
Raymond Hettinger38bf2cc2010-08-06 09:52:17 +00001856 tmpkey = make_new_set(&PyFrozenSet_Type, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 if (tmpkey == NULL)
1858 return -1;
Petri Lehtinen5acc27e2011-10-30 13:56:41 +02001859 rv = set_contains_key(so, tmpkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 Py_DECREF(tmpkey);
1861 }
1862 return rv;
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001863}
1864
1865static PyObject *
1866set_direct_contains(PySetObject *so, PyObject *key)
1867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 long result;
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 result = set_contains(so, key);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001871 if (result < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 return NULL;
1873 return PyBool_FromLong(result);
Raymond Hettingerce8185e2005-08-13 09:28:48 +00001874}
1875
1876PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
1877
Raymond Hettingera690a992003-11-16 16:17:49 +00001878static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001879set_remove(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 PyObject *tmpkey;
1882 int rv;
Raymond Hettingerbfd334a2003-11-22 03:55:23 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 rv = set_discard_key(so, key);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001885 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1887 return NULL;
1888 PyErr_Clear();
Raymond Hettinger38bf2cc2010-08-06 09:52:17 +00001889 tmpkey = make_new_set(&PyFrozenSet_Type, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 if (tmpkey == NULL)
1891 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 rv = set_discard_key(so, tmpkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 Py_DECREF(tmpkey);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001894 if (rv < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return NULL;
1896 }
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 if (rv == DISCARD_NOTFOUND) {
Raymond Hettinger69492da2013-09-02 15:59:26 -07001899 _PyErr_SetKeyError(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 return NULL;
1901 }
1902 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001903}
1904
1905PyDoc_STRVAR(remove_doc,
1906"Remove an element from a set; it must be a member.\n\
1907\n\
1908If the element is not a member, raise a KeyError.");
1909
1910static PyObject *
Raymond Hettinger06d8cf82005-07-31 15:36:06 +00001911set_discard(PySetObject *so, PyObject *key)
Raymond Hettingera690a992003-11-16 16:17:49 +00001912{
Benjamin Peterson2b50a012011-10-30 14:24:44 -04001913 PyObject *tmpkey;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 int rv;
Raymond Hettinger0deab622003-12-13 18:53:18 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 rv = set_discard_key(so, key);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001917 if (rv < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
1919 return NULL;
1920 PyErr_Clear();
Raymond Hettinger38bf2cc2010-08-06 09:52:17 +00001921 tmpkey = make_new_set(&PyFrozenSet_Type, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 if (tmpkey == NULL)
1923 return NULL;
Petri Lehtinene0aa8032011-10-30 14:31:27 +02001924 rv = set_discard_key(so, tmpkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 Py_DECREF(tmpkey);
Raymond Hettingerb3223262015-07-03 23:37:16 -07001926 if (rv < 0)
Petri Lehtinene0aa8032011-10-30 14:31:27 +02001927 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 }
1929 Py_RETURN_NONE;
Raymond Hettingera690a992003-11-16 16:17:49 +00001930}
1931
1932PyDoc_STRVAR(discard_doc,
1933"Remove an element from a set if it is a member.\n\
1934\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935If the element is not a member, do nothing.");
Raymond Hettingera690a992003-11-16 16:17:49 +00001936
1937static PyObject *
Raymond Hettingera690a992003-11-16 16:17:49 +00001938set_reduce(PySetObject *so)
1939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001941 _Py_IDENTIFIER(__dict__);
Raymond Hettingera690a992003-11-16 16:17:49 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 keys = PySequence_List((PyObject *)so);
1944 if (keys == NULL)
1945 goto done;
1946 args = PyTuple_Pack(1, keys);
1947 if (args == NULL)
1948 goto done;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001949 dict = _PyObject_GetAttrId((PyObject *)so, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 if (dict == NULL) {
1951 PyErr_Clear();
1952 dict = Py_None;
1953 Py_INCREF(dict);
1954 }
1955 result = PyTuple_Pack(3, Py_TYPE(so), args, dict);
Raymond Hettingera690a992003-11-16 16:17:49 +00001956done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 Py_XDECREF(args);
1958 Py_XDECREF(keys);
1959 Py_XDECREF(dict);
1960 return result;
Raymond Hettingera690a992003-11-16 16:17:49 +00001961}
1962
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001963static PyObject *
1964set_sizeof(PySetObject *so)
1965{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 res = sizeof(PySetObject);
1969 if (so->table != so->smalltable)
1970 res = res + (so->mask + 1) * sizeof(setentry);
1971 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001972}
1973
1974PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes");
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001975static int
1976set_init(PySetObject *self, PyObject *args, PyObject *kwds)
1977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 PyObject *iterable = NULL;
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 if (!PyAnySet_Check(self))
1981 return -1;
1982 if (PySet_Check(self) && !_PyArg_NoKeywords("set()", kwds))
1983 return -1;
1984 if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable))
1985 return -1;
1986 set_clear_internal(self);
1987 self->hash = -1;
1988 if (iterable == NULL)
1989 return 0;
1990 return set_update_internal(self, iterable);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001991}
1992
Raymond Hettingera690a992003-11-16 16:17:49 +00001993static PySequenceMethods set_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 set_len, /* sq_length */
1995 0, /* sq_concat */
1996 0, /* sq_repeat */
1997 0, /* sq_item */
1998 0, /* sq_slice */
1999 0, /* sq_ass_item */
2000 0, /* sq_ass_slice */
2001 (objobjproc)set_contains, /* sq_contains */
Raymond Hettingera690a992003-11-16 16:17:49 +00002002};
2003
2004/* set object ********************************************************/
2005
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002006#ifdef Py_DEBUG
2007static PyObject *test_c_api(PySetObject *so);
2008
2009PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
2010All is well if assertions don't fail.");
2011#endif
2012
Raymond Hettingera690a992003-11-16 16:17:49 +00002013static PyMethodDef set_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 {"add", (PyCFunction)set_add, METH_O,
2015 add_doc},
2016 {"clear", (PyCFunction)set_clear, METH_NOARGS,
2017 clear_doc},
2018 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
2019 contains_doc},
2020 {"copy", (PyCFunction)set_copy, METH_NOARGS,
2021 copy_doc},
2022 {"discard", (PyCFunction)set_discard, METH_O,
2023 discard_doc},
2024 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
2025 difference_doc},
2026 {"difference_update", (PyCFunction)set_difference_update, METH_VARARGS,
2027 difference_update_doc},
2028 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
2029 intersection_doc},
2030 {"intersection_update",(PyCFunction)set_intersection_update_multi, METH_VARARGS,
2031 intersection_update_doc},
2032 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2033 isdisjoint_doc},
2034 {"issubset", (PyCFunction)set_issubset, METH_O,
2035 issubset_doc},
2036 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2037 issuperset_doc},
2038 {"pop", (PyCFunction)set_pop, METH_NOARGS,
2039 pop_doc},
2040 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2041 reduce_doc},
2042 {"remove", (PyCFunction)set_remove, METH_O,
2043 remove_doc},
2044 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2045 sizeof_doc},
2046 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2047 symmetric_difference_doc},
2048 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
2049 symmetric_difference_update_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002050#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
2052 test_c_api_doc},
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 {"union", (PyCFunction)set_union, METH_VARARGS,
2055 union_doc},
2056 {"update", (PyCFunction)set_update, METH_VARARGS,
2057 update_doc},
2058 {NULL, NULL} /* sentinel */
Raymond Hettingera690a992003-11-16 16:17:49 +00002059};
2060
2061static PyNumberMethods set_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 0, /*nb_add*/
2063 (binaryfunc)set_sub, /*nb_subtract*/
2064 0, /*nb_multiply*/
2065 0, /*nb_remainder*/
2066 0, /*nb_divmod*/
2067 0, /*nb_power*/
2068 0, /*nb_negative*/
2069 0, /*nb_positive*/
2070 0, /*nb_absolute*/
2071 0, /*nb_bool*/
2072 0, /*nb_invert*/
2073 0, /*nb_lshift*/
2074 0, /*nb_rshift*/
2075 (binaryfunc)set_and, /*nb_and*/
2076 (binaryfunc)set_xor, /*nb_xor*/
2077 (binaryfunc)set_or, /*nb_or*/
2078 0, /*nb_int*/
2079 0, /*nb_reserved*/
2080 0, /*nb_float*/
2081 0, /*nb_inplace_add*/
2082 (binaryfunc)set_isub, /*nb_inplace_subtract*/
2083 0, /*nb_inplace_multiply*/
2084 0, /*nb_inplace_remainder*/
2085 0, /*nb_inplace_power*/
2086 0, /*nb_inplace_lshift*/
2087 0, /*nb_inplace_rshift*/
2088 (binaryfunc)set_iand, /*nb_inplace_and*/
2089 (binaryfunc)set_ixor, /*nb_inplace_xor*/
2090 (binaryfunc)set_ior, /*nb_inplace_or*/
Raymond Hettingera690a992003-11-16 16:17:49 +00002091};
2092
2093PyDoc_STRVAR(set_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002094"set() -> new empty set object\n\
2095set(iterable) -> new set object\n\
Raymond Hettingera690a992003-11-16 16:17:49 +00002096\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002097Build an unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002098
2099PyTypeObject PySet_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2101 "set", /* tp_name */
2102 sizeof(PySetObject), /* tp_basicsize */
2103 0, /* tp_itemsize */
2104 /* methods */
2105 (destructor)set_dealloc, /* tp_dealloc */
2106 0, /* tp_print */
2107 0, /* tp_getattr */
2108 0, /* tp_setattr */
2109 0, /* tp_reserved */
2110 (reprfunc)set_repr, /* tp_repr */
2111 &set_as_number, /* tp_as_number */
2112 &set_as_sequence, /* tp_as_sequence */
2113 0, /* tp_as_mapping */
Georg Brandl00da4e02010-10-18 07:32:48 +00002114 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 0, /* tp_call */
2116 0, /* tp_str */
2117 PyObject_GenericGetAttr, /* tp_getattro */
2118 0, /* tp_setattro */
2119 0, /* tp_as_buffer */
2120 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2121 Py_TPFLAGS_BASETYPE, /* tp_flags */
2122 set_doc, /* tp_doc */
2123 (traverseproc)set_traverse, /* tp_traverse */
2124 (inquiry)set_clear_internal, /* tp_clear */
2125 (richcmpfunc)set_richcompare, /* tp_richcompare */
Georg Brandl00da4e02010-10-18 07:32:48 +00002126 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
2127 (getiterfunc)set_iter, /* tp_iter */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 0, /* tp_iternext */
2129 set_methods, /* tp_methods */
2130 0, /* tp_members */
2131 0, /* tp_getset */
2132 0, /* tp_base */
2133 0, /* tp_dict */
2134 0, /* tp_descr_get */
2135 0, /* tp_descr_set */
2136 0, /* tp_dictoffset */
2137 (initproc)set_init, /* tp_init */
2138 PyType_GenericAlloc, /* tp_alloc */
2139 set_new, /* tp_new */
2140 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002141};
2142
2143/* frozenset object ********************************************************/
2144
2145
2146static PyMethodDef frozenset_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
2148 contains_doc},
2149 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
2150 copy_doc},
2151 {"difference", (PyCFunction)set_difference_multi, METH_VARARGS,
2152 difference_doc},
2153 {"intersection",(PyCFunction)set_intersection_multi, METH_VARARGS,
2154 intersection_doc},
2155 {"isdisjoint", (PyCFunction)set_isdisjoint, METH_O,
2156 isdisjoint_doc},
2157 {"issubset", (PyCFunction)set_issubset, METH_O,
2158 issubset_doc},
2159 {"issuperset", (PyCFunction)set_issuperset, METH_O,
2160 issuperset_doc},
2161 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2162 reduce_doc},
2163 {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
2164 sizeof_doc},
2165 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
2166 symmetric_difference_doc},
2167 {"union", (PyCFunction)set_union, METH_VARARGS,
2168 union_doc},
2169 {NULL, NULL} /* sentinel */
Raymond Hettingera690a992003-11-16 16:17:49 +00002170};
2171
2172static PyNumberMethods frozenset_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 0, /*nb_add*/
2174 (binaryfunc)set_sub, /*nb_subtract*/
2175 0, /*nb_multiply*/
2176 0, /*nb_remainder*/
2177 0, /*nb_divmod*/
2178 0, /*nb_power*/
2179 0, /*nb_negative*/
2180 0, /*nb_positive*/
2181 0, /*nb_absolute*/
2182 0, /*nb_bool*/
2183 0, /*nb_invert*/
2184 0, /*nb_lshift*/
2185 0, /*nb_rshift*/
2186 (binaryfunc)set_and, /*nb_and*/
2187 (binaryfunc)set_xor, /*nb_xor*/
2188 (binaryfunc)set_or, /*nb_or*/
Raymond Hettingera690a992003-11-16 16:17:49 +00002189};
2190
2191PyDoc_STRVAR(frozenset_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +00002192"frozenset() -> empty frozenset object\n\
2193frozenset(iterable) -> frozenset object\n\
Raymond Hettingera690a992003-11-16 16:17:49 +00002194\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002195Build an immutable unordered collection of unique elements.");
Raymond Hettingera690a992003-11-16 16:17:49 +00002196
2197PyTypeObject PyFrozenSet_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2199 "frozenset", /* tp_name */
2200 sizeof(PySetObject), /* tp_basicsize */
2201 0, /* tp_itemsize */
2202 /* methods */
2203 (destructor)set_dealloc, /* tp_dealloc */
2204 0, /* tp_print */
2205 0, /* tp_getattr */
2206 0, /* tp_setattr */
2207 0, /* tp_reserved */
2208 (reprfunc)set_repr, /* tp_repr */
2209 &frozenset_as_number, /* tp_as_number */
2210 &set_as_sequence, /* tp_as_sequence */
2211 0, /* tp_as_mapping */
2212 frozenset_hash, /* tp_hash */
2213 0, /* tp_call */
2214 0, /* tp_str */
2215 PyObject_GenericGetAttr, /* tp_getattro */
2216 0, /* tp_setattro */
2217 0, /* tp_as_buffer */
2218 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2219 Py_TPFLAGS_BASETYPE, /* tp_flags */
2220 frozenset_doc, /* tp_doc */
2221 (traverseproc)set_traverse, /* tp_traverse */
2222 (inquiry)set_clear_internal, /* tp_clear */
2223 (richcmpfunc)set_richcompare, /* tp_richcompare */
2224 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
2225 (getiterfunc)set_iter, /* tp_iter */
2226 0, /* tp_iternext */
2227 frozenset_methods, /* tp_methods */
2228 0, /* tp_members */
2229 0, /* tp_getset */
2230 0, /* tp_base */
2231 0, /* tp_dict */
2232 0, /* tp_descr_get */
2233 0, /* tp_descr_set */
2234 0, /* tp_dictoffset */
2235 0, /* tp_init */
2236 PyType_GenericAlloc, /* tp_alloc */
2237 frozenset_new, /* tp_new */
2238 PyObject_GC_Del, /* tp_free */
Raymond Hettingera690a992003-11-16 16:17:49 +00002239};
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002240
2241
2242/***** C API functions *************************************************/
2243
2244PyObject *
2245PySet_New(PyObject *iterable)
2246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 return make_new_set(&PySet_Type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002248}
2249
2250PyObject *
2251PyFrozenSet_New(PyObject *iterable)
2252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 return make_new_set(&PyFrozenSet_Type, iterable);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002254}
2255
Neal Norwitz8c49c822006-03-04 18:41:19 +00002256Py_ssize_t
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002257PySet_Size(PyObject *anyset)
2258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if (!PyAnySet_Check(anyset)) {
2260 PyErr_BadInternalCall();
2261 return -1;
2262 }
2263 return PySet_GET_SIZE(anyset);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002264}
2265
2266int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002267PySet_Clear(PyObject *set)
2268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 if (!PySet_Check(set)) {
2270 PyErr_BadInternalCall();
2271 return -1;
2272 }
2273 return set_clear_internal((PySetObject *)set);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002274}
2275
2276int
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002277PySet_Contains(PyObject *anyset, PyObject *key)
2278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 if (!PyAnySet_Check(anyset)) {
2280 PyErr_BadInternalCall();
2281 return -1;
2282 }
2283 return set_contains_key((PySetObject *)anyset, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002284}
2285
2286int
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002287PySet_Discard(PyObject *set, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 if (!PySet_Check(set)) {
2290 PyErr_BadInternalCall();
2291 return -1;
2292 }
2293 return set_discard_key((PySetObject *)set, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002294}
2295
2296int
Christian Heimesfd66e512008-01-29 12:18:50 +00002297PySet_Add(PyObject *anyset, PyObject *key)
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 if (!PySet_Check(anyset) &&
2300 (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
2301 PyErr_BadInternalCall();
2302 return -1;
2303 }
2304 return set_add_key((PySetObject *)anyset, key);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002305}
2306
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002307int
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002308_PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 setentry *entry;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 if (!PyAnySet_Check(set)) {
2313 PyErr_BadInternalCall();
2314 return -1;
2315 }
2316 if (set_next((PySetObject *)set, pos, &entry) == 0)
2317 return 0;
2318 *key = entry->key;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002319 *hash = entry->hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 return 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321}
2322
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002323PyObject *
2324PySet_Pop(PyObject *set)
2325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 if (!PySet_Check(set)) {
2327 PyErr_BadInternalCall();
2328 return NULL;
2329 }
2330 return set_pop((PySetObject *)set);
Raymond Hettingerbeb31012005-08-16 03:47:52 +00002331}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002332
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002333int
2334_PySet_Update(PyObject *set, PyObject *iterable)
2335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 if (!PySet_Check(set)) {
2337 PyErr_BadInternalCall();
2338 return -1;
2339 }
2340 return set_update_internal((PySetObject *)set, iterable);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002341}
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002342
Raymond Hettingere259f132013-12-15 11:56:14 -08002343/* Exported for the gdb plugin's benefit. */
2344PyObject *_PySet_Dummy = dummy;
2345
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002346#ifdef Py_DEBUG
2347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348/* Test code to be called with any three element set.
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002349 Returns True and original set is restored. */
2350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351#define assertRaises(call_return_value, exception) \
2352 do { \
2353 assert(call_return_value); \
2354 assert(PyErr_ExceptionMatches(exception)); \
2355 PyErr_Clear(); \
2356 } while(0)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002357
2358static PyObject *
2359test_c_api(PySetObject *so)
2360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 Py_ssize_t count;
2362 char *s;
2363 Py_ssize_t i;
Raymond Hettinger583cd032013-09-07 22:06:35 -07002364 PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 PyObject *ob = (PyObject *)so;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002366 Py_hash_t hash;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 PyObject *str;
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 /* Verify preconditions */
2370 assert(PyAnySet_Check(ob));
2371 assert(PyAnySet_CheckExact(ob));
2372 assert(!PyFrozenSet_CheckExact(ob));
Victor Stinner08b36bd2010-03-13 00:19:17 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 /* so.clear(); so |= set("abc"); */
2375 str = PyUnicode_FromString("abc");
2376 if (str == NULL)
2377 return NULL;
2378 set_clear_internal(so);
Raymond Hettinger5af9e132015-05-13 01:44:36 -07002379 if (set_update_internal(so, str)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 Py_DECREF(str);
2381 return NULL;
2382 }
2383 Py_DECREF(str);
Victor Stinner08b36bd2010-03-13 00:19:17 +00002384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 /* Exercise type/size checks */
2386 assert(PySet_Size(ob) == 3);
2387 assert(PySet_GET_SIZE(ob) == 3);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 /* Raise TypeError for non-iterable constructor arguments */
2390 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2391 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 /* Raise TypeError for unhashable key */
2394 dup = PySet_New(ob);
2395 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2396 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2397 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 /* Exercise successful pop, contains, add, and discard */
2400 elem = PySet_Pop(ob);
2401 assert(PySet_Contains(ob, elem) == 0);
2402 assert(PySet_GET_SIZE(ob) == 2);
2403 assert(PySet_Add(ob, elem) == 0);
2404 assert(PySet_Contains(ob, elem) == 1);
2405 assert(PySet_GET_SIZE(ob) == 3);
2406 assert(PySet_Discard(ob, elem) == 1);
2407 assert(PySet_GET_SIZE(ob) == 2);
2408 assert(PySet_Discard(ob, elem) == 0);
2409 assert(PySet_GET_SIZE(ob) == 2);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 /* Exercise clear */
2412 dup2 = PySet_New(dup);
2413 assert(PySet_Clear(dup2) == 0);
2414 assert(PySet_Size(dup2) == 0);
2415 Py_DECREF(dup2);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 /* Raise SystemError on clear or update of frozen set */
2418 f = PyFrozenSet_New(dup);
2419 assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
2420 assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
2421 assert(PySet_Add(f, elem) == 0);
2422 Py_INCREF(f);
2423 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2424 Py_DECREF(f);
2425 Py_DECREF(f);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 /* Exercise direct iteration */
2428 i = 0, count = 0;
2429 while (_PySet_NextEntry((PyObject *)dup, &i, &x, &hash)) {
2430 s = _PyUnicode_AsString(x);
2431 assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c'));
2432 count++;
2433 }
2434 assert(count == 3);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 /* Exercise updates */
2437 dup2 = PySet_New(NULL);
2438 assert(_PySet_Update(dup2, dup) == 0);
2439 assert(PySet_Size(dup2) == 3);
2440 assert(_PySet_Update(dup2, dup) == 0);
2441 assert(PySet_Size(dup2) == 3);
2442 Py_DECREF(dup2);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 /* Raise SystemError when self argument is not a set or frozenset. */
2445 t = PyTuple_New(0);
2446 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2447 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2448 Py_DECREF(t);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 /* Raise SystemError when self argument is not a set. */
2451 f = PyFrozenSet_New(dup);
2452 assert(PySet_Size(f) == 3);
2453 assert(PyFrozenSet_CheckExact(f));
2454 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2455 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2456 Py_DECREF(f);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 /* Raise KeyError when popping from an empty set */
2459 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
2460 Py_DECREF(ob);
2461 assert(PySet_GET_SIZE(ob) == 0);
2462 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 /* Restore the set from the copy using the PyNumber API */
2465 assert(PyNumber_InPlaceOr(ob, dup) == ob);
2466 Py_DECREF(ob);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 /* Verify constructors accept NULL arguments */
2469 f = PySet_New(NULL);
2470 assert(f != NULL);
2471 assert(PySet_GET_SIZE(f) == 0);
2472 Py_DECREF(f);
2473 f = PyFrozenSet_New(NULL);
2474 assert(f != NULL);
2475 assert(PyFrozenSet_CheckExact(f));
2476 assert(PySet_GET_SIZE(f) == 0);
2477 Py_DECREF(f);
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 Py_DECREF(elem);
2480 Py_DECREF(dup);
2481 Py_RETURN_TRUE;
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002482}
2483
Raymond Hettinger9bda1d62005-09-16 07:14:21 +00002484#undef assertRaises
2485
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00002486#endif
Raymond Hettingerbfc1e1a2013-08-23 03:22:15 -05002487
2488/***** Dummy Struct *************************************************/
2489
2490static PyObject *
2491dummy_repr(PyObject *op)
2492{
2493 return PyUnicode_FromString("<dummy key>");
2494}
2495
2496static void
2497dummy_dealloc(PyObject* ignore)
2498{
2499 Py_FatalError("deallocating <dummy key>");
2500}
2501
2502static PyTypeObject _PySetDummy_Type = {
2503 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2504 "<dummy key> type",
2505 0,
2506 0,
2507 dummy_dealloc, /*tp_dealloc*/ /*never called*/
2508 0, /*tp_print*/
2509 0, /*tp_getattr*/
2510 0, /*tp_setattr*/
2511 0, /*tp_reserved*/
2512 dummy_repr, /*tp_repr*/
2513 0, /*tp_as_number*/
2514 0, /*tp_as_sequence*/
2515 0, /*tp_as_mapping*/
2516 0, /*tp_hash */
2517 0, /*tp_call */
2518 0, /*tp_str */
2519 0, /*tp_getattro */
2520 0, /*tp_setattro */
2521 0, /*tp_as_buffer */
2522 Py_TPFLAGS_DEFAULT, /*tp_flags */
2523};
2524
2525static PyObject _dummy_struct = {
2526 _PyObject_EXTRA_INIT
2527 2, &_PySetDummy_Type
2528};
2529