annotate Objects/setobject.c @ 37850:ebe59cd18273

Use explicit relative import for an, ehm, relative import.
author Thomas Wouters <thomas@python.org>
date Tue, 18 Apr 2006 21:41:36 +0000
parents 4bfe8afe8f65
children f731859e9b3b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1
35311
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
2 /* set object implementation
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
3 Written and maintained by Raymond D. Hettinger <python@rcn.com>
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
4 Derived from Lib/sets.py and Objects/dictobject.c.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
5
35311
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
6 Copyright (c) 2003-5 Python Software Foundation.
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
7 All rights reserved.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
8 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
9
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
10 #include "Python.h"
35311
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
11 #include "structmember.h"
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
12
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
13 /* This must be >= 1. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
14 #define PERTURB_SHIFT 5
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
15
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
16 /* Object used as dummy key to fill deleted entries */
35311
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
17 static PyObject *dummy = NULL; /* Initialized by first call to make_new_set() */
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
18
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
19 #define INIT_NONZERO_SET_SLOTS(so) do { \
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
20 (so)->table = (so)->smalltable; \
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
21 (so)->mask = PySet_MINSIZE - 1; \
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
22 (so)->hash = -1; \
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
23 } while(0)
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
24
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
25 #define EMPTY_TO_MINSIZE(so) do { \
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
26 memset((so)->smalltable, 0, sizeof((so)->smalltable)); \
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
27 (so)->used = (so)->fill = 0; \
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
28 INIT_NONZERO_SET_SLOTS(so); \
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
29 } while(0)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
30
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
31 /* Reuse scheme to save calls to malloc, free, and memset */
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
32 #define MAXFREESETS 80
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
33 static PySetObject *free_sets[MAXFREESETS];
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
34 static int num_free_sets = 0;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
35
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
36 /*
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
37 The basic lookup function used by all operations.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
38 This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
39 Open addressing is preferred over chaining since the link overhead for
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
40 chaining would be substantial (100% with typical malloc overhead).
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
41
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
42 The initial probe index is computed as hash mod the table size. Subsequent
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
43 probe indices are computed as explained in Objects/dictobject.c.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
44
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
45 All arithmetic on hash should ignore overflow.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
46
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
47 Unlike the dictionary implementation, the lookkey functions can return
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
48 NULL if the rich comparison returns an error.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
49 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
50
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
51 static setentry *
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
52 set_lookkey(PySetObject *so, PyObject *key, register long hash)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
53 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
54 register Py_ssize_t i;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
55 register size_t perturb;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
56 register setentry *freeslot;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
57 register unsigned int mask = so->mask;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
58 setentry *table = so->table;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
59 register setentry *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
60 register int cmp;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
61 PyObject *startkey;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
62
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
63 i = hash & mask;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
64 entry = &table[i];
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
65 if (entry->key == NULL || entry->key == key)
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
66 return entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
67
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
68 if (entry->key == dummy)
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
69 freeslot = entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
70 else {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
71 if (entry->hash == hash) {
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
72 startkey = entry->key;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
73 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
74 if (cmp < 0)
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
75 return NULL;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
76 if (table == so->table && entry->key == startkey) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
77 if (cmp > 0)
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
78 return entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
79 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
80 else {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
81 /* The compare did major nasty stuff to the
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
82 * set: start over.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
83 */
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
84 return set_lookkey(so, key, hash);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
85 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
86 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
87 freeslot = NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
88 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
89
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
90 /* In the loop, key == dummy is by far (factor of 100s) the
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
91 least likely outcome, so test for that last. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
92 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
93 i = (i << 2) + i + perturb + 1;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
94 entry = &table[i & mask];
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
95 if (entry->key == NULL) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
96 if (freeslot != NULL)
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
97 entry = freeslot;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
98 break;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
99 }
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
100 if (entry->key == key)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
101 break;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
102 if (entry->hash == hash && entry->key != dummy) {
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
103 startkey = entry->key;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
104 cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
105 if (cmp < 0)
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
106 return NULL;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
107 if (table == so->table && entry->key == startkey) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
108 if (cmp > 0)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
109 break;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
110 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
111 else {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
112 /* The compare did major nasty stuff to the
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
113 * set: start over.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
114 */
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
115 return set_lookkey(so, key, hash);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
116 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
117 }
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
118 else if (entry->key == dummy && freeslot == NULL)
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
119 freeslot = entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
120 }
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
121 return entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
122 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
123
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
124 /*
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
125 * Hacked up version of set_lookkey which can assume keys are always strings;
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
126 * This means we can always use _PyString_Eq directly and not have to check to
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
127 * see if the comparison altered the table.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
128 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
129 static setentry *
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
130 set_lookkey_string(PySetObject *so, PyObject *key, register long hash)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
131 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
132 register Py_ssize_t i;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
133 register size_t perturb;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
134 register setentry *freeslot;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
135 register unsigned int mask = so->mask;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
136 setentry *table = so->table;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
137 register setentry *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
138
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
139 /* Make sure this function doesn't have to handle non-string keys,
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
140 including subclasses of str; e.g., one reason to subclass
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
141 strings is to override __eq__, and for speed we don't cater to
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
142 that here. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
143 if (!PyString_CheckExact(key)) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
144 so->lookup = set_lookkey;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
145 return set_lookkey(so, key, hash);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
146 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
147 i = hash & mask;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
148 entry = &table[i];
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
149 if (entry->key == NULL || entry->key == key)
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
150 return entry;
35339
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
151 if (entry->key == dummy)
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
152 freeslot = entry;
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
153 else {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
154 if (entry->hash == hash && _PyString_Eq(entry->key, key))
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
155 return entry;
35339
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
156 freeslot = NULL;
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
157 }
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
158
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
159 /* In the loop, key == dummy is by far (factor of 100s) the
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
160 least likely outcome, so test for that last. */
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
161 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
162 i = (i << 2) + i + perturb + 1;
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
163 entry = &table[i & mask];
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
164 if (entry->key == NULL)
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
165 return freeslot == NULL ? entry : freeslot;
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
166 if (entry->key == key
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
167 || (entry->hash == hash
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
168 && entry->key != dummy
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
169 && _PyString_Eq(entry->key, key)))
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
170 return entry;
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
171 if (entry->key == dummy && freeslot == NULL)
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
172 freeslot = entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
173 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
174 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
175
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
176 /*
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
177 Internal routine to insert a new key into the table.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
178 Used both by the internal resize routine and by the public insert routine.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
179 Eats a reference to key.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
180 */
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
181 static int
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
182 set_insert_key(register PySetObject *so, PyObject *key, long hash)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
183 {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
184 register setentry *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
185 typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
186
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
187 assert(so->lookup != NULL);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
188 entry = so->lookup(so, key, hash);
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
189 if (entry == NULL)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
190 return -1;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
191 if (entry->key == NULL) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
192 /* UNUSED */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
193 so->fill++;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
194 entry->key = key;
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
195 entry->hash = hash;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
196 so->used++;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
197 } else if (entry->key == dummy) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
198 /* DUMMY */
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
199 entry->key = key;
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
200 entry->hash = hash;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
201 so->used++;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
202 Py_DECREF(dummy);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
203 } else {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
204 /* ACTIVE */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
205 Py_DECREF(key);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
206 }
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
207 return 0;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
208 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
209
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
210 /*
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
211 Restructure the table by allocating a new table and reinserting all
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
212 keys again. When entries have been deleted, the new table may
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
213 actually be smaller than the old one.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
214 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
215 static int
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
216 set_table_resize(PySetObject *so, int minused)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
217 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
218 int newsize;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
219 setentry *oldtable, *newtable, *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
220 int i;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
221 int is_oldtable_malloced;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
222 setentry small_copy[PySet_MINSIZE];
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
223
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
224 assert(minused >= 0);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
225
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
226 /* Find the smallest table size > minused. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
227 for (newsize = PySet_MINSIZE;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
228 newsize <= minused && newsize > 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
229 newsize <<= 1)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
230 ;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
231 if (newsize <= 0) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
232 PyErr_NoMemory();
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
233 return -1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
234 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
235
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
236 /* Get space for a new table. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
237 oldtable = so->table;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
238 assert(oldtable != NULL);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
239 is_oldtable_malloced = oldtable != so->smalltable;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
240
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
241 if (newsize == PySet_MINSIZE) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
242 /* A large table is shrinking, or we can't get any smaller. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
243 newtable = so->smalltable;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
244 if (newtable == oldtable) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
245 if (so->fill == so->used) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
246 /* No dummies, so no point doing anything. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
247 return 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
248 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
249 /* We're not going to resize it, but rebuild the
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
250 table anyway to purge old dummy entries.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
251 Subtle: This is *necessary* if fill==size,
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
252 as set_lookkey needs at least one virgin slot to
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
253 terminate failing searches. If fill < size, it's
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
254 merely desirable, as dummies slow searches. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
255 assert(so->fill > so->used);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
256 memcpy(small_copy, oldtable, sizeof(small_copy));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
257 oldtable = small_copy;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
258 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
259 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
260 else {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
261 newtable = PyMem_NEW(setentry, newsize);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
262 if (newtable == NULL) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
263 PyErr_NoMemory();
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
264 return -1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
265 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
266 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
267
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
268 /* Make the set empty, using the new table. */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
269 assert(newtable != oldtable);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
270 so->table = newtable;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
271 so->mask = newsize - 1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
272 memset(newtable, 0, sizeof(setentry) * newsize);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
273 so->used = 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
274 i = so->fill;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
275 so->fill = 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
276
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
277 /* Copy the data over; this is refcount-neutral for active entries;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
278 dummy entries aren't copied over, of course */
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
279 for (entry = oldtable; i > 0; entry++) {
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
280 if (entry->key == NULL) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
281 /* UNUSED */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
282 ;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
283 } else if (entry->key == dummy) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
284 /* DUMMY */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
285 --i;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
286 assert(entry->key == dummy);
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
287 Py_DECREF(entry->key);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
288 } else {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
289 /* ACTIVE */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
290 --i;
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
291 if(set_insert_key(so, entry->key, entry->hash) == -1) {
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
292 if (is_oldtable_malloced)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
293 PyMem_DEL(oldtable);
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
294 return -1;
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
295 }
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
296 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
297 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
298
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
299 if (is_oldtable_malloced)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
300 PyMem_DEL(oldtable);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
301 return 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
302 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
303
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
304 /* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
305
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
306 static int
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
307 set_add_entry(register PySetObject *so, setentry *entry)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
308 {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
309 register int n_used;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
310
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
311 assert(so->fill <= so->mask); /* at least one empty slot */
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
312 n_used = so->used;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
313 Py_INCREF(entry->key);
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
314 if (set_insert_key(so, entry->key, entry->hash) == -1)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
315 return -1;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
316 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
317 return 0;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
318 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
319 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
320
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
321 static int
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
322 set_add_key(register PySetObject *so, PyObject *key)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
323 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
324 register long hash;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
325 register int n_used;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
326
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
327 if (!PyString_CheckExact(key) ||
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
328 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
329 hash = PyObject_Hash(key);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
330 if (hash == -1)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
331 return -1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
332 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
333 assert(so->fill <= so->mask); /* at least one empty slot */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
334 n_used = so->used;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
335 Py_INCREF(key);
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
336 if (set_insert_key(so, key, hash) == -1) {
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
337 Py_DECREF(key);
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
338 return -1;
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
339 }
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
340 if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2))
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
341 return 0;
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
342 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
343 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
344
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
345 #define DISCARD_NOTFOUND 0
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
346 #define DISCARD_FOUND 1
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
347
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
348 static int
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
349 set_discard_entry(PySetObject *so, setentry *oldentry)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
350 { register setentry *entry;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
351 PyObject *old_key;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
352
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
353 entry = (so->lookup)(so, oldentry->key, oldentry->hash);
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
354 if (entry == NULL)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
355 return -1;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
356 if (entry->key == NULL || entry->key == dummy)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
357 return DISCARD_NOTFOUND;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
358 old_key = entry->key;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
359 Py_INCREF(dummy);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
360 entry->key = dummy;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
361 so->used--;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
362 Py_DECREF(old_key);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
363 return DISCARD_FOUND;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
364 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
365
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
366 static int
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
367 set_discard_key(PySetObject *so, PyObject *key)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
368 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
369 register long hash;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
370 register setentry *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
371 PyObject *old_key;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
372
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
373 assert (PyAnySet_Check(so));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
374 if (!PyString_CheckExact(key) ||
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
375 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
376 hash = PyObject_Hash(key);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
377 if (hash == -1)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
378 return -1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
379 }
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
380 entry = (so->lookup)(so, key, hash);
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
381 if (entry == NULL)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
382 return -1;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
383 if (entry->key == NULL || entry->key == dummy)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
384 return DISCARD_NOTFOUND;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
385 old_key = entry->key;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
386 Py_INCREF(dummy);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
387 entry->key = dummy;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
388 so->used--;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
389 Py_DECREF(old_key);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
390 return DISCARD_FOUND;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
391 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
392
35315
a6cbfcd0e691 Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents: 35312
diff changeset
393 static int
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
394 set_clear_internal(PySetObject *so)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
395 {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
396 setentry *entry, *table;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
397 int table_is_malloced;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
398 int fill;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
399 setentry small_copy[PySet_MINSIZE];
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
400 #ifdef Py_DEBUG
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
401 int i, n;
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
402 assert (PyAnySet_Check(so));
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
403
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
404 n = so->mask + 1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
405 i = 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
406 #endif
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
407
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
408 table = so->table;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
409 assert(table != NULL);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
410 table_is_malloced = table != so->smalltable;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
411
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
412 /* This is delicate. During the process of clearing the set,
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
413 * decrefs can cause the set to mutate. To avoid fatal confusion
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
414 * (voice of experience), we have to make the set empty before
35315
a6cbfcd0e691 Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents: 35312
diff changeset
415 * clearing the slots, and never refer to anything via so->ref while
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
416 * clearing.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
417 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
418 fill = so->fill;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
419 if (table_is_malloced)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
420 EMPTY_TO_MINSIZE(so);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
421
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
422 else if (fill > 0) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
423 /* It's a small table with something that needs to be cleared.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
424 * Afraid the only safe way is to copy the set entries into
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
425 * another small table first.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
426 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
427 memcpy(small_copy, table, sizeof(small_copy));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
428 table = small_copy;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
429 EMPTY_TO_MINSIZE(so);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
430 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
431 /* else it's a small table that's already empty */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
432
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
433 /* Now we can finally clear things. If C had refcounts, we could
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
434 * assert that the refcount on table is 1 now, i.e. that this function
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
435 * has unique access to it, so decref side-effects can't alter it.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
436 */
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
437 for (entry = table; fill > 0; ++entry) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
438 #ifdef Py_DEBUG
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
439 assert(i < n);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
440 ++i;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
441 #endif
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
442 if (entry->key) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
443 --fill;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
444 Py_DECREF(entry->key);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
445 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
446 #ifdef Py_DEBUG
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
447 else
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
448 assert(entry->key == NULL || entry->key == dummy);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
449 #endif
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
450 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
451
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
452 if (table_is_malloced)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
453 PyMem_DEL(table);
35315
a6cbfcd0e691 Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents: 35312
diff changeset
454 return 0;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
455 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
456
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
457 /*
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
458 * Iterate over a set table. Use like so:
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
459 *
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
460 * int pos;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
461 * setentry *entry;
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
462 * pos = 0; # important! pos should not otherwise be changed by you
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
463 * while (set_next(yourset, &pos, &entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
464 * Refer to borrowed reference in entry->key.
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
465 * }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
466 *
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
467 * CAUTION: In general, it isn't safe to use set_next in a loop that
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
468 * mutates the table.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
469 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
470 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
471 set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
472 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
473 Py_ssize_t i;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
474 int mask;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
475 register setentry *table;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
476
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
477 assert (PyAnySet_Check(so));
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
478 i = *pos_ptr;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
479 assert(i >= 0);
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
480 table = so->table;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
481 mask = so->mask;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
482 while (i <= mask && (table[i].key == NULL || table[i].key == dummy))
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
483 i++;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
484 *pos_ptr = i+1;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
485 if (i > mask)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
486 return 0;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
487 assert(table[i].key != NULL);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
488 *entry_ptr = &table[i];
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
489 return 1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
490 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
491
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
492 static void
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
493 set_dealloc(PySetObject *so)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
494 {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
495 register setentry *entry;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
496 int fill = so->fill;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
497 PyObject_GC_UnTrack(so);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
498 Py_TRASHCAN_SAFE_BEGIN(so)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
499 if (so->weakreflist != NULL)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
500 PyObject_ClearWeakRefs((PyObject *) so);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
501
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
502 for (entry = so->table; fill > 0; entry++) {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
503 if (entry->key) {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
504 --fill;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
505 Py_DECREF(entry->key);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
506 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
507 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
508 if (so->table != so->smalltable)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
509 PyMem_DEL(so->table);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
510 if (num_free_sets < MAXFREESETS && PyAnySet_CheckExact(so))
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
511 free_sets[num_free_sets++] = so;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
512 else
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
513 so->ob_type->tp_free(so);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
514 Py_TRASHCAN_SAFE_END(so)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
515 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
516
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
517 static int
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
518 set_tp_print(PySetObject *so, FILE *fp, int flags)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
519 {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
520 setentry *entry;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
521 Py_ssize_t pos=0;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
522 char *emit = ""; /* No separator emitted on first pass */
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
523 char *separator = ", ";
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
524
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
525 fprintf(fp, "%s([", so->ob_type->tp_name);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
526 while (set_next(so, &pos, &entry)) {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
527 fputs(emit, fp);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
528 emit = separator;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
529 if (PyObject_Print(entry->key, fp, 0) != 0)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
530 return -1;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
531 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
532 fputs("])", fp);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
533 return 0;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
534 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
535
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
536 static PyObject *
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
537 set_repr(PySetObject *so)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
538 {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
539 PyObject *keys, *result, *listrepr;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
540
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
541 keys = PySequence_List((PyObject *)so);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
542 if (keys == NULL)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
543 return NULL;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
544 listrepr = PyObject_Repr(keys);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
545 Py_DECREF(keys);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
546 if (listrepr == NULL)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
547 return NULL;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
548
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
549 result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
550 PyString_AS_STRING(listrepr));
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
551 Py_DECREF(listrepr);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
552 return result;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
553 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
554
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
555 static Py_ssize_t
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
556 set_len(PyObject *so)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
557 {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
558 return ((PySetObject *)so)->used;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
559 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
560
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
561 static int
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
562 set_merge(PySetObject *so, PyObject *otherset)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
563 {
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
564 PySetObject *other;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
565 register int i;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
566 register setentry *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
567
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
568 assert (PyAnySet_Check(so));
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
569 assert (PyAnySet_Check(otherset));
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
570
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
571 other = (PySetObject*)otherset;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
572 if (other == so || other->used == 0)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
573 /* a.update(a) or a.update({}); nothing to do */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
574 return 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
575 /* Do one big resize at the start, rather than
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
576 * incrementally resizing as we insert new keys. Expect
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
577 * that there will be no (or few) overlapping keys.
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
578 */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
579 if ((so->fill + other->used)*3 >= (so->mask+1)*2) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
580 if (set_table_resize(so, (so->used + other->used)*2) != 0)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
581 return -1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
582 }
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
583 for (i = 0; i <= other->mask; i++) {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
584 entry = &other->table[i];
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
585 if (entry->key != NULL &&
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
586 entry->key != dummy) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
587 Py_INCREF(entry->key);
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
588 if (set_insert_key(so, entry->key, entry->hash) == -1) {
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
589 Py_DECREF(entry->key);
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
590 return -1;
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
591 }
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
592 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
593 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
594 return 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
595 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
596
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
597 static int
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
598 set_contains_key(PySetObject *so, PyObject *key)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
599 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
600 long hash;
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
601 setentry *entry;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
602
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
603 if (!PyString_CheckExact(key) ||
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
604 (hash = ((PyStringObject *) key)->ob_shash) == -1) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
605 hash = PyObject_Hash(key);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
606 if (hash == -1)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
607 return -1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
608 }
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
609 entry = (so->lookup)(so, key, hash);
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
610 if (entry == NULL)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
611 return -1;
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
612 key = entry->key;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
613 return key != NULL && key != dummy;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
614 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
615
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
616 static int
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
617 set_contains_entry(PySetObject *so, setentry *entry)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
618 {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
619 PyObject *key;
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
620 setentry *lu_entry;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
621
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
622 lu_entry = (so->lookup)(so, entry->key, entry->hash);
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
623 if (lu_entry == NULL)
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
624 return -1;
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
625 key = lu_entry->key;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
626 return key != NULL && key != dummy;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
627 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
628
35341
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
629 static PyObject *
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
630 set_pop(PySetObject *so)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
631 {
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
632 register int i = 0;
35341
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
633 register setentry *entry;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
634 PyObject *key;
35341
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
635
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
636 assert (PyAnySet_Check(so));
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
637 if (so->used == 0) {
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
638 PyErr_SetString(PyExc_KeyError, "pop from an empty set");
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
639 return NULL;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
640 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
641
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
642 /* Set entry to "the first" unused or dummy set entry. We abuse
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
643 * the hash field of slot 0 to hold a search finger:
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
644 * If slot 0 has a value, use slot 0.
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
645 * Else slot 0 is being used to hold a search finger,
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
646 * and we use its hash value as the first index to look.
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
647 */
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
648 entry = &so->table[0];
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
649 if (entry->key == NULL || entry->key == dummy) {
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
650 i = (int)entry->hash;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
651 /* The hash field may be a real hash value, or it may be a
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
652 * legit search finger, or it may be a once-legit search
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
653 * finger that's out of bounds now because it wrapped around
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
654 * or the table shrunk -- simply make sure it's in bounds now.
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
655 */
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
656 if (i > so->mask || i < 1)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
657 i = 1; /* skip slot 0 */
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
658 while ((entry = &so->table[i])->key == NULL || entry->key==dummy) {
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
659 i++;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
660 if (i > so->mask)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
661 i = 1;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
662 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
663 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
664 key = entry->key;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
665 Py_INCREF(dummy);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
666 entry->key = dummy;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
667 so->used--;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
668 so->table[0].hash = i + 1; /* next place to start */
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
669 return key;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
670 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
671
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
672 PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
673
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
674 static int
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
675 set_traverse(PySetObject *so, visitproc visit, void *arg)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
676 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
677 Py_ssize_t pos = 0;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
678 setentry *entry;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
679
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
680 while (set_next(so, &pos, &entry))
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
681 Py_VISIT(entry->key);
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
682 return 0;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
683 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
684
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
685 static long
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
686 frozenset_hash(PyObject *self)
35341
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
687 {
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
688 PySetObject *so = (PySetObject *)self;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
689 long h, hash = 1927868237L;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
690 setentry *entry;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
691 Py_ssize_t pos = 0;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
692
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
693 if (so->hash != -1)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
694 return so->hash;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
695
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
696 hash *= PySet_GET_SIZE(self) + 1;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
697 while (set_next(so, &pos, &entry)) {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
698 /* Work to increase the bit dispersion for closely spaced hash
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
699 values. The is important because some use cases have many
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
700 combinations of a small number of elements with nearby
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
701 hashes so that many distinct combinations collapse to only
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
702 a handful of distinct hash values. */
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
703 h = entry->hash;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
704 hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
705 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
706 hash = hash * 69069L + 907133923L;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
707 if (hash == -1)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
708 hash = 590923713L;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
709 so->hash = hash;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
710 return hash;
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
711 }
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
712
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
713 static long
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
714 set_nohash(PyObject *self)
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
715 {
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
716 PyErr_SetString(PyExc_TypeError, "set objects are unhashable");
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
717 return -1;
35341
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
718 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
719
35311
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
720 /***** Set iterator type ***********************************************/
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
721
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
722 static PyTypeObject PySetIter_Type; /* Forward */
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
723
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
724 typedef struct {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
725 PyObject_HEAD
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
726 PySetObject *si_set; /* Set to NULL when iterator is exhausted */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
727 int si_used;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
728 int si_pos;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
729 long len;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
730 } setiterobject;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
731
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
732 static PyObject *
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
733 set_iter(PySetObject *so)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
734 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
735 setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
736 if (si == NULL)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
737 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
738 Py_INCREF(so);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
739 si->si_set = so;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
740 si->si_used = so->used;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
741 si->si_pos = 0;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
742 si->len = so->used;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
743 return (PyObject *)si;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
744 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
745
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
746 static void
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
747 setiter_dealloc(setiterobject *si)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
748 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
749 Py_XDECREF(si->si_set);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
750 PyObject_Del(si);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
751 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
752
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
753 static PyObject *
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
754 setiter_len(setiterobject *si)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
755 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
756 long len = 0;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
757 if (si->si_set != NULL && si->si_used == si->si_set->used)
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
758 len = si->len;
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
759 return PyInt_FromLong(len);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
760 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
761
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 36244
diff changeset
762 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
763
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
764 static PyMethodDef setiter_methods[] = {
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 36244
diff changeset
765 {"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
766 {NULL, NULL} /* sentinel */
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
767 };
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
768
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
769 static PyObject *setiter_iternext(setiterobject *si)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
770 {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
771 PyObject *key;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
772 register int i, mask;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
773 register setentry *entry;
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
774 PySetObject *so = si->si_set;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
775
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
776 if (so == NULL)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
777 return NULL;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
778 assert (PyAnySet_Check(so));
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
779
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
780 if (si->si_used != so->used) {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
781 PyErr_SetString(PyExc_RuntimeError,
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
782 "Set changed size during iteration");
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
783 si->si_used = -1; /* Make this state sticky */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
784 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
785 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
786
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
787 i = si->si_pos;
35349
6f1cd28d6b87 Results of a line-by-line comparison back to dictobject.c.
Raymond Hettinger <python@rcn.com>
parents: 35348
diff changeset
788 assert(i>=0);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
789 entry = so->table;
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
790 mask = so->mask;
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
791 while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
792 i++;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
793 si->si_pos = i+1;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
794 if (i > mask)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
795 goto fail;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
796 si->len--;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
797 key = entry[i].key;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
798 Py_INCREF(key);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
799 return key;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
800
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
801 fail:
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
802 Py_DECREF(so);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
803 si->si_set = NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
804 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
805 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
806
35296
d91964f5fe0d Fix build on gcc: PySetIter_Type should be static in definition
Hye-Shik Chang <hyeshik@gmail.com>
parents: 35295
diff changeset
807 static PyTypeObject PySetIter_Type = {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
808 PyObject_HEAD_INIT(&PyType_Type)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
809 0, /* ob_size */
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
810 "setiterator", /* tp_name */
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
811 sizeof(setiterobject), /* tp_basicsize */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
812 0, /* tp_itemsize */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
813 /* methods */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
814 (destructor)setiter_dealloc, /* tp_dealloc */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
815 0, /* tp_print */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
816 0, /* tp_getattr */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
817 0, /* tp_setattr */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
818 0, /* tp_compare */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
819 0, /* tp_repr */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
820 0, /* tp_as_number */
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
821 0, /* tp_as_sequence */
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
822 0, /* tp_as_mapping */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
823 0, /* tp_hash */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
824 0, /* tp_call */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
825 0, /* tp_str */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
826 PyObject_GenericGetAttr, /* tp_getattro */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
827 0, /* tp_setattro */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
828 0, /* tp_as_buffer */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
829 Py_TPFLAGS_DEFAULT, /* tp_flags */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
830 0, /* tp_doc */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
831 0, /* tp_traverse */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
832 0, /* tp_clear */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
833 0, /* tp_richcompare */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
834 0, /* tp_weaklistoffset */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
835 PyObject_SelfIter, /* tp_iter */
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
836 (iternextfunc)setiter_iternext, /* tp_iternext */
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
837 setiter_methods, /* tp_methods */
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35581
diff changeset
838 0,
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
839 };
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
840
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
841 static int
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
842 set_update_internal(PySetObject *so, PyObject *other)
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
843 {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
844 PyObject *key, *it;
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
845
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
846 if (PyAnySet_Check(other))
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
847 return set_merge(so, other);
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
848
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
849 if (PyDict_Check(other)) {
36244
e7880f4f53a4 Remove some shadowed variables
Neal Norwitz <nnorwitz@gmail.com>
parents: 35862
diff changeset
850 PyObject *value;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
851 Py_ssize_t pos = 0;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
852 while (PyDict_Next(other, &pos, &key, &value)) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
853 if (set_add_key(so, key) == -1)
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
854 return -1;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
855 }
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
856 return 0;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
857 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
858
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
859 it = PyObject_GetIter(other);
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
860 if (it == NULL)
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
861 return -1;
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
862
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
863 while ((key = PyIter_Next(it)) != NULL) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
864 if (set_add_key(so, key) == -1) {
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
865 Py_DECREF(it);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
866 Py_DECREF(key);
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
867 return -1;
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
868 }
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
869 Py_DECREF(key);
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
870 }
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
871 Py_DECREF(it);
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
872 if (PyErr_Occurred())
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
873 return -1;
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
874 return 0;
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
875 }
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
876
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
877 static PyObject *
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
878 set_update(PySetObject *so, PyObject *other)
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
879 {
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
880 if (set_update_internal(so, other) == -1)
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
881 return NULL;
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
882 Py_RETURN_NONE;
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
883 }
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
884
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
885 PyDoc_STRVAR(update_doc,
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
886 "Update a set with the union of itself and another.");
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
887
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
888 static PyObject *
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
889 make_new_set(PyTypeObject *type, PyObject *iterable)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
890 {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
891 register PySetObject *so = NULL;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
892
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
893 if (dummy == NULL) { /* Auto-initialize dummy */
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
894 dummy = PyString_FromString("<dummy key>");
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
895 if (dummy == NULL)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
896 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
897 }
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
898
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
899 /* create PySetObject structure */
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
900 if (num_free_sets &&
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
901 (type == &PySet_Type || type == &PyFrozenSet_Type)) {
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
902 so = free_sets[--num_free_sets];
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
903 assert (so != NULL && PyAnySet_CheckExact(so));
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
904 so->ob_type = type;
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
905 _Py_NewReference((PyObject *)so);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
906 EMPTY_TO_MINSIZE(so);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
907 PyObject_GC_Track(so);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
908 } else {
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
909 so = (PySetObject *)type->tp_alloc(type, 0);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
910 if (so == NULL)
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
911 return NULL;
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
912 /* tp_alloc has already zeroed the structure */
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
913 assert(so->table == NULL && so->fill == 0 && so->used == 0);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
914 INIT_NONZERO_SET_SLOTS(so);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
915 }
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
916
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
917 so->lookup = set_lookkey_string;
32158
679e5c8effae Make sets and deques weak referencable.
Raymond Hettinger <python@rcn.com>
parents: 31628
diff changeset
918 so->weakreflist = NULL;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
919
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
920 if (iterable != NULL) {
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
921 if (set_update_internal(so, iterable) == -1) {
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
922 Py_DECREF(so);
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
923 return NULL;
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
924 }
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
925 }
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
926
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
927 return (PyObject *)so;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
928 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
929
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
930 /* The empty frozenset is a singleton */
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
931 static PyObject *emptyfrozenset = NULL;
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
932
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
933 static PyObject *
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
934 frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
935 {
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
936 PyObject *iterable = NULL, *result;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
937
35449
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 35398
diff changeset
938 if (!_PyArg_NoKeywords("frozenset()", kwds))
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 35398
diff changeset
939 return NULL;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 35398
diff changeset
940
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
941 if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
942 return NULL;
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
943
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
944 if (type != &PyFrozenSet_Type)
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
945 return make_new_set(type, iterable);
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
946
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
947 if (iterable != NULL) {
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
948 /* frozenset(f) is idempotent */
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
949 if (PyFrozenSet_CheckExact(iterable)) {
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
950 Py_INCREF(iterable);
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
951 return iterable;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
952 }
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
953 result = make_new_set(type, iterable);
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
954 if (result == NULL || PySet_GET_SIZE(result))
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
955 return result;
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
956 Py_DECREF(result);
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
957 }
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
958 /* The empty frozenset is a singleton */
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
959 if (emptyfrozenset == NULL)
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
960 emptyfrozenset = make_new_set(type, NULL);
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
961 Py_XINCREF(emptyfrozenset);
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
962 return emptyfrozenset;
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
963 }
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
964
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
965 void
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
966 PySet_Fini(void)
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
967 {
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
968 PySetObject *so;
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
969
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
970 while (num_free_sets) {
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
971 num_free_sets--;
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
972 so = free_sets[num_free_sets];
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
973 PyObject_GC_Del(so);
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
974 }
35311
541bfbb10030 * Move copyright notice to top and indicate derivation from sets.py and
Raymond Hettinger <python@rcn.com>
parents: 35301
diff changeset
975 Py_XDECREF(dummy);
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
976 Py_XDECREF(emptyfrozenset);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
977 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
978
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
979 static PyObject *
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
980 set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
981 {
35449
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 35398
diff changeset
982 if (!_PyArg_NoKeywords("set()", kwds))
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 35398
diff changeset
983 return NULL;
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 35398
diff changeset
984
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
985 return make_new_set(type, NULL);
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
986 }
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
987
35293
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
988 /* set_swap_bodies() switches the contents of any two sets by moving their
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
989 internal data pointers and, if needed, copying the internal smalltables.
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
990 Semantically equivalent to:
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
991
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
992 t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
993
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
994 The function always succeeds and it leaves both objects in a stable state.
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
995 Useful for creating temporary frozensets from sets for membership testing
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
996 in __contains__(), discard(), and remove(). Also useful for operations
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
997 that update in-place (by allowing an intermediate result to be swapped
35294
3f1b48f9ff0d Fix frozenset() ref count and a comment typo.
Raymond Hettinger <python@rcn.com>
parents: 35293
diff changeset
998 into one of the original inputs).
35293
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
999 */
8fffb4c95487 Comment on the set_swap_bodies() helper function.
Raymond Hettinger <python@rcn.com>
parents: 35292
diff changeset
1000
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1001 static void
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1002 set_swap_bodies(PySetObject *a, PySetObject *b)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1003 {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1004 int t;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1005 setentry *u;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1006 setentry *(*f)(PySetObject *so, PyObject *key, long hash);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1007 setentry tab[PySet_MINSIZE];
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1008 long h;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1009
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1010 t = a->fill; a->fill = b->fill; b->fill = t;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1011 t = a->used; a->used = b->used; b->used = t;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1012 t = a->mask; a->mask = b->mask; b->mask = t;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1013
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1014 u = a->table;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1015 if (a->table == a->smalltable)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1016 u = b->smalltable;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1017 a->table = b->table;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1018 if (b->table == b->smalltable)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1019 a->table = a->smalltable;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1020 b->table = u;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1021
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1022 f = a->lookup; a->lookup = b->lookup; b->lookup = f;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1023
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1024 if (a->table == a->smalltable || b->table == b->smalltable) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1025 memcpy(tab, a->smalltable, sizeof(tab));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1026 memcpy(a->smalltable, b->smalltable, sizeof(tab));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1027 memcpy(b->smalltable, tab, sizeof(tab));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1028 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1029
35312
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1030 if (PyType_IsSubtype(a->ob_type, &PyFrozenSet_Type) &&
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1031 PyType_IsSubtype(b->ob_type, &PyFrozenSet_Type)) {
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1032 h = a->hash; a->hash = b->hash; b->hash = h;
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1033 } else {
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1034 a->hash = -1;
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1035 b->hash = -1;
8aa9bd80286b * Improve a variable name: entry0 --> table.
Raymond Hettinger <python@rcn.com>
parents: 35311
diff changeset
1036 }
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1037 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1038
31172
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31019
diff changeset
1039 static PyObject *
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1040 set_copy(PySetObject *so)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1041 {
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
1042 return make_new_set(so->ob_type, (PyObject *)so);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1043 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1044
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1045 static PyObject *
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1046 frozenset_copy(PySetObject *so)
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1047 {
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1048 if (PyFrozenSet_CheckExact(so)) {
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1049 Py_INCREF(so);
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1050 return (PyObject *)so;
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1051 }
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1052 return set_copy(so);
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1053 }
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1054
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1055 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1056
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1057 static PyObject *
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1058 set_clear(PySetObject *so)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1059 {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1060 set_clear_internal(so);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1061 Py_RETURN_NONE;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1062 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1063
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1064 PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1065
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1066 static PyObject *
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1067 set_union(PySetObject *so, PyObject *other)
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1068 {
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1069 PySetObject *result;
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1070
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1071 result = (PySetObject *)set_copy(so);
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1072 if (result == NULL)
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1073 return NULL;
35353
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
1074 if ((PyObject *)so == other)
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
1075 return (PyObject *)result;
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
1076 if (set_update_internal(result, other) == -1) {
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1077 Py_DECREF(result);
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1078 return NULL;
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1079 }
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1080 return (PyObject *)result;
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1081 }
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1082
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1083 PyDoc_STRVAR(union_doc,
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1084 "Return the union of two sets as a new set.\n\
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1085 \n\
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1086 (i.e. all elements that are in either set.)");
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1087
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1088 static PyObject *
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1089 set_or(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1090 {
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1091 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1092 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1093 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1094 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1095 return set_union(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1096 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1097
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1098 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1099 set_ior(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1100 {
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1101 if (!PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1102 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1103 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1104 }
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
1105 if (set_update_internal(so, other) == -1)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1106 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1107 Py_INCREF(so);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1108 return (PyObject *)so;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1109 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1110
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1111 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1112 set_intersection(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1113 {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1114 PySetObject *result;
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1115 PyObject *key, *it, *tmp;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1116
35353
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
1117 if ((PyObject *)so == other)
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
1118 return set_copy(so);
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1119
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1120 result = (PySetObject *)make_new_set(so->ob_type, NULL);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1121 if (result == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1122 return NULL;
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1123
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1124 if (PyAnySet_Check(other)) {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1125 Py_ssize_t pos = 0;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1126 setentry *entry;
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1127
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1128 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1129 tmp = (PyObject *)so;
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1130 so = (PySetObject *)other;
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1131 other = tmp;
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1132 }
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1133
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1134 while (set_next((PySetObject *)other, &pos, &entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1135 if (set_contains_entry(so, entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1136 if (set_add_entry(result, entry) == -1) {
31300
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1137 Py_DECREF(result);
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1138 return NULL;
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1139 }
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1140 }
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1141 }
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1142 return (PyObject *)result;
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1143 }
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1144
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1145 it = PyObject_GetIter(other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1146 if (it == NULL) {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1147 Py_DECREF(result);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1148 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1149 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1150
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1151 while ((key = PyIter_Next(it)) != NULL) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1152 if (set_contains_key(so, key)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1153 if (set_add_key(result, key) == -1) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1154 Py_DECREF(it);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1155 Py_DECREF(result);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1156 Py_DECREF(key);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1157 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1158 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1159 }
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1160 Py_DECREF(key);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1161 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1162 Py_DECREF(it);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1163 if (PyErr_Occurred()) {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1164 Py_DECREF(result);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1165 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1166 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1167 return (PyObject *)result;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1168 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1169
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1170 PyDoc_STRVAR(intersection_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1171 "Return the intersection of two sets as a new set.\n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1172 \n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1173 (i.e. all elements that are in both sets.)");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1174
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1175 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1176 set_intersection_update(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1177 {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1178 PyObject *tmp;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1179
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1180 tmp = set_intersection(so, other);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1181 if (tmp == NULL)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1182 return NULL;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1183 set_swap_bodies(so, (PySetObject *)tmp);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1184 Py_DECREF(tmp);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1185 Py_RETURN_NONE;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1186 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1187
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1188 PyDoc_STRVAR(intersection_update_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1189 "Update a set with the intersection of itself and another.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1190
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1191 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1192 set_and(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1193 {
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1194 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1195 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1196 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1197 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1198 return set_intersection(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1199 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1200
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1201 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1202 set_iand(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1203 {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1204 PyObject *result;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1205
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1206 if (!PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1207 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1208 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1209 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1210 result = set_intersection_update(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1211 if (result == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1212 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1213 Py_DECREF(result);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1214 Py_INCREF(so);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1215 return (PyObject *)so;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1216 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1217
35862
6867995a18a7 Prevent name pollution by making lots of internal functions static.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35636
diff changeset
1218 static int
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1219 set_difference_update_internal(PySetObject *so, PyObject *other)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1220 {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1221 if ((PyObject *)so == other)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1222 return set_clear_internal(so);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1223
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1224 if (PyAnySet_Check(other)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1225 setentry *entry;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1226 Py_ssize_t pos = 0;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1227
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1228 while (set_next((PySetObject *)other, &pos, &entry))
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1229 set_discard_entry(so, entry);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1230 } else {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1231 PyObject *key, *it;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1232 it = PyObject_GetIter(other);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1233 if (it == NULL)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1234 return -1;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1235
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1236 while ((key = PyIter_Next(it)) != NULL) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1237 if (set_discard_key(so, key) == -1) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1238 Py_DECREF(it);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1239 Py_DECREF(key);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1240 return -1;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1241 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1242 Py_DECREF(key);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1243 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1244 Py_DECREF(it);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1245 if (PyErr_Occurred())
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1246 return -1;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1247 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1248 /* If more than 1/5 are dummies, then resize them away. */
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1249 if ((so->fill - so->used) * 5 < so->mask)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1250 return 0;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1251 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1252 }
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1253
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1254 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1255 set_difference_update(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1256 {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1257 if (set_difference_update_internal(so, other) != -1)
35321
bdcb01a9b60c * Bring in INIT_NONZERO_SET_SLOTS macro from dictionary code.
Raymond Hettinger <python@rcn.com>
parents: 35317
diff changeset
1258 Py_RETURN_NONE;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1259 return NULL;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1260 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1261
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1262 PyDoc_STRVAR(difference_update_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1263 "Remove all elements of another set from this set.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1264
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1265 static PyObject *
31191
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1266 set_difference(PySetObject *so, PyObject *other)
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1267 {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1268 PyObject *result;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1269 setentry *entry;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1270 Py_ssize_t pos = 0;
31191
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1271
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1272 if (!PyAnySet_Check(other) && !PyDict_Check(other)) {
31191
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1273 result = set_copy(so);
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1274 if (result == NULL)
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1275 return NULL;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1276 if (set_difference_update_internal((PySetObject *)result, other) != -1)
31191
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1277 return result;
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1278 Py_DECREF(result);
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1279 return NULL;
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1280 }
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1281
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1282 result = make_new_set(so->ob_type, NULL);
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1283 if (result == NULL)
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1284 return NULL;
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1285
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1286 if (PyDict_Check(other)) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1287 while (set_next(so, &pos, &entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1288 setentry entrycopy;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1289 entrycopy.hash = entry->hash;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1290 entrycopy.key = entry->key;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1291 if (!PyDict_Contains(other, entry->key)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1292 if (set_add_entry((PySetObject *)result, &entrycopy) == -1)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1293 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1294 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1295 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1296 return result;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1297 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1298
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1299 while (set_next(so, &pos, &entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1300 if (!set_contains_entry((PySetObject *)other, entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1301 if (set_add_entry((PySetObject *)result, entry) == -1)
31191
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1302 return NULL;
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1303 }
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1304 }
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1305 return result;
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1306 }
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1307
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1308 PyDoc_STRVAR(difference_doc,
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1309 "Return the difference of two sets as a new set.\n\
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1310 \n\
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1311 (i.e. all elements that are in this set but not the other.)");
e4682af7aea9 Improve algorithm for set.difference when the input is not a set.
Raymond Hettinger <python@rcn.com>
parents: 31178
diff changeset
1312 static PyObject *
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1313 set_sub(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1314 {
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1315 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1316 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1317 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1318 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1319 return set_difference(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1320 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1321
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1322 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1323 set_isub(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1324 {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1325 PyObject *result;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1326
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1327 if (!PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1328 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1329 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1330 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1331 result = set_difference_update(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1332 if (result == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1333 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1334 Py_DECREF(result);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1335 Py_INCREF(so);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1336 return (PyObject *)so;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1337 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1338
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1339 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1340 set_symmetric_difference_update(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1341 {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1342 PySetObject *otherset;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1343 PyObject *key;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1344 Py_ssize_t pos = 0;
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1345 setentry *entry;
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1346
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1347 if ((PyObject *)so == other)
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1348 return set_clear(so);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1349
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1350 if (PyDict_Check(other)) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1351 PyObject *value;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1352 int rv;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1353 while (PyDict_Next(other, &pos, &key, &value)) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1354 rv = set_discard_key(so, key);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1355 if (rv == -1)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1356 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1357 if (rv == DISCARD_NOTFOUND) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1358 if (set_add_key(so, key) == -1)
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1359 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1360 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1361 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1362 Py_RETURN_NONE;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1363 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1364
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1365 if (PyAnySet_Check(other)) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1366 Py_INCREF(other);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1367 otherset = (PySetObject *)other;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1368 } else {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1369 otherset = (PySetObject *)make_new_set(so->ob_type, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1370 if (otherset == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1371 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1372 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1373
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1374 while (set_next(otherset, &pos, &entry)) {
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1375 int rv = set_discard_entry(so, entry);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1376 if (rv == -1) {
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1377 Py_XDECREF(otherset);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1378 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1379 }
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1380 if (rv == DISCARD_NOTFOUND) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1381 if (set_add_entry(so, entry) == -1) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1382 Py_XDECREF(otherset);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1383 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1384 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1385 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1386 }
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1387 Py_DECREF(otherset);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1388 Py_RETURN_NONE;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1389 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1390
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1391 PyDoc_STRVAR(symmetric_difference_update_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1392 "Update a set with the symmetric difference of itself and another.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1393
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1394 static PyObject *
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1395 set_symmetric_difference(PySetObject *so, PyObject *other)
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1396 {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1397 PyObject *rv;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1398 PySetObject *otherset;
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1399
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1400 otherset = (PySetObject *)make_new_set(so->ob_type, other);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1401 if (otherset == NULL)
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1402 return NULL;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1403 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1404 if (rv == NULL)
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1405 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1406 Py_DECREF(rv);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1407 return (PyObject *)otherset;
31008
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1408 }
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1409
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1410 PyDoc_STRVAR(symmetric_difference_doc,
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1411 "Return the symmetric difference of two sets as a new set.\n\
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1412 \n\
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1413 (i.e. all elements that are in exactly one of the sets.)");
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1414
4224d807911c * Checkin remaining documentation
Raymond Hettinger <python@rcn.com>
parents: 31004
diff changeset
1415 static PyObject *
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1416 set_xor(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1417 {
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1418 if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1419 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1420 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1421 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1422 return set_symmetric_difference(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1423 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1424
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1425 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1426 set_ixor(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1427 {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1428 PyObject *result;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1429
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1430 if (!PyAnySet_Check(other)) {
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1431 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1432 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1433 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1434 result = set_symmetric_difference_update(so, other);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1435 if (result == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1436 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1437 Py_DECREF(result);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1438 Py_INCREF(so);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1439 return (PyObject *)so;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1440 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1441
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1442 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1443 set_issubset(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1444 {
35339
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1445 setentry *entry;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1446 Py_ssize_t pos = 0;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1447
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1448 if (!PyAnySet_Check(other)) {
35339
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1449 PyObject *tmp, *result;
30994
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1450 tmp = make_new_set(&PySet_Type, other);
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1451 if (tmp == NULL)
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1452 return NULL;
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1453 result = set_issubset(so, tmp);
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1454 Py_DECREF(tmp);
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1455 return result;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1456 }
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1457 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1458 Py_RETURN_FALSE;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1459
35339
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1460 while (set_next(so, &pos, &entry)) {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1461 if (!set_contains_entry((PySetObject *)other, entry))
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1462 Py_RETURN_FALSE;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1463 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1464 Py_RETURN_TRUE;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1465 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1466
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1467 PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1468
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1469 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1470 set_issuperset(PySetObject *so, PyObject *other)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1471 {
30994
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1472 PyObject *tmp, *result;
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1473
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1474 if (!PyAnySet_Check(other)) {
30994
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1475 tmp = make_new_set(&PySet_Type, other);
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1476 if (tmp == NULL)
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1477 return NULL;
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1478 result = set_issuperset(so, tmp);
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1479 Py_DECREF(tmp);
632b223cb8e8 issubset() and issuperset() to work with general iterables
Raymond Hettinger <python@rcn.com>
parents: 30993
diff changeset
1480 return result;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1481 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1482 return set_issubset((PySetObject *)other, (PyObject *)so);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1483 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1484
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1485 PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1486
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1487 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1488 set_richcompare(PySetObject *v, PyObject *w, int op)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1489 {
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1490 PyObject *r1, *r2;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1491
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1492 if(!PyAnySet_Check(w)) {
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1493 if (op == Py_EQ)
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1494 Py_RETURN_FALSE;
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1495 if (op == Py_NE)
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1496 Py_RETURN_TRUE;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1497 PyErr_SetString(PyExc_TypeError, "can only compare to a set");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1498 return NULL;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1499 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1500 switch (op) {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1501 case Py_EQ:
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1502 if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1503 Py_RETURN_FALSE;
35398
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1504 if (v->hash != -1 &&
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1505 ((PySetObject *)w)->hash != -1 &&
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1506 v->hash != ((PySetObject *)w)->hash)
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1507 Py_RETURN_FALSE;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1508 return set_issubset(v, w);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1509 case Py_NE:
35398
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1510 r1 = set_richcompare(v, w, Py_EQ);
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1511 if (r1 == NULL)
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1512 return NULL;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1513 r2 = PyBool_FromLong(PyObject_Not(r1));
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1514 Py_DECREF(r1);
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1515 return r2;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1516 case Py_LE:
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1517 return set_issubset(v, w);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1518 case Py_GE:
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1519 return set_issuperset(v, w);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1520 case Py_LT:
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1521 if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1522 Py_RETURN_FALSE;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1523 return set_issubset(v, w);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1524 case Py_GT:
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1525 if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1526 Py_RETURN_FALSE;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1527 return set_issuperset(v, w);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1528 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1529 Py_INCREF(Py_NotImplemented);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1530 return Py_NotImplemented;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1531 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1532
35339
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1533 static int
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1534 set_nocmp(PyObject *self)
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1535 {
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1536 PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1537 return -1;
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1538 }
028e94a6efc5 * Bring lookkey() and lookkey_string() closer to dict version.
Raymond Hettinger <python@rcn.com>
parents: 35332
diff changeset
1539
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1540 static PyObject *
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1541 set_add(PySetObject *so, PyObject *key)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1542 {
35328
0ef64a93f3f2 * Add short-circuit code for in-place operations with self (such as
Raymond Hettinger <python@rcn.com>
parents: 35321
diff changeset
1543 if (set_add_key(so, key) == -1)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1544 return NULL;
31178
1bbc2085f213 * Refactor set.__contains__()
Raymond Hettinger <python@rcn.com>
parents: 31177
diff changeset
1545 Py_RETURN_NONE;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1546 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1547
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1548 PyDoc_STRVAR(add_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1549 "Add an element to a set.\n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1550 \n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1551 This has no effect if the element is already present.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1552
35341
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1553 static int
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1554 set_contains(PySetObject *so, PyObject *key)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1555 {
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1556 PyObject *tmpkey;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1557 int rv;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1558
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1559 rv = set_contains_key(so, key);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1560 if (rv == -1) {
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1561 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1562 return -1;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1563 PyErr_Clear();
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1564 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1565 if (tmpkey == NULL)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1566 return -1;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1567 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1568 rv = set_contains(so, tmpkey);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1569 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1570 Py_DECREF(tmpkey);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1571 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1572 return rv;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1573 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1574
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1575 static PyObject *
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1576 set_direct_contains(PySetObject *so, PyObject *key)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1577 {
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1578 long result;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1579
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1580 result = set_contains(so, key);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1581 if (result == -1)
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1582 return NULL;
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1583 return PyBool_FromLong(result);
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1584 }
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1585
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1586 PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
f6b462d2a3a3 More function re-ordering (placing like functions together).
Raymond Hettinger <python@rcn.com>
parents: 35339
diff changeset
1587
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1588 static PyObject *
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1589 set_remove(PySetObject *so, PyObject *key)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1590 {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1591 PyObject *tmpkey, *result;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1592 int rv;
31002
622a76bc0237 Extend temporary hashability to remove() and discard().
Raymond Hettinger <python@rcn.com>
parents: 30995
diff changeset
1593
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1594 rv = set_discard_key(so, key);
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1595 if (rv == -1) {
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1596 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1597 return NULL;
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1598 PyErr_Clear();
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1599 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1600 if (tmpkey == NULL)
31002
622a76bc0237 Extend temporary hashability to remove() and discard().
Raymond Hettinger <python@rcn.com>
parents: 30995
diff changeset
1601 return NULL;
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1602 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1603 result = set_remove(so, tmpkey);
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1604 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1605 Py_DECREF(tmpkey);
31177
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1606 return result;
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1607 } else if (rv == DISCARD_NOTFOUND) {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1608 PyErr_SetObject(PyExc_KeyError, key);
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1609 return NULL;
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1610 }
31178
1bbc2085f213 * Refactor set.__contains__()
Raymond Hettinger <python@rcn.com>
parents: 31177
diff changeset
1611 Py_RETURN_NONE;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1612 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1613
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1614 PyDoc_STRVAR(remove_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1615 "Remove an element from a set; it must be a member.\n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1616 \n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1617 If the element is not a member, raise a KeyError.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1618
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1619 static PyObject *
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1620 set_discard(PySetObject *so, PyObject *key)
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1621 {
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1622 PyObject *tmpkey, *result;
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1623 int rv;
31177
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1624
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1625 rv = set_discard_key(so, key);
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1626 if (rv == -1) {
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1627 if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1628 return NULL;
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1629 PyErr_Clear();
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1630 tmpkey = make_new_set(&PyFrozenSet_Type, NULL);
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1631 if (tmpkey == NULL)
31177
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1632 return NULL;
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1633 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1634 result = set_discard(so, tmpkey);
35332
fd02b84fb2db * Fix SF #1257731. Make __contains__(), remove(), and discard() only do
Raymond Hettinger <python@rcn.com>
parents: 35328
diff changeset
1635 set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
35295
f30ebdc3bddf Improve variable names.
Raymond Hettinger <python@rcn.com>
parents: 35294
diff changeset
1636 Py_DECREF(tmpkey);
31177
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1637 return result;
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1638 }
31178
1bbc2085f213 * Refactor set.__contains__()
Raymond Hettinger <python@rcn.com>
parents: 31177
diff changeset
1639 Py_RETURN_NONE;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1640 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1641
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1642 PyDoc_STRVAR(discard_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1643 "Remove an element from a set if it is a member.\n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1644 \n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1645 If the element is not a member, do nothing.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1646
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1647 static PyObject *
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1648 set_reduce(PySetObject *so)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1649 {
33948
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1650 PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1651
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1652 keys = PySequence_List((PyObject *)so);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1653 if (keys == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1654 goto done;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1655 args = PyTuple_Pack(1, keys);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1656 if (args == NULL)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1657 goto done;
33948
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1658 dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1659 if (dict == NULL) {
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1660 PyErr_Clear();
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1661 dict = Py_None;
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1662 Py_INCREF(dict);
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1663 }
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1664 result = PyTuple_Pack(3, so->ob_type, args, dict);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1665 done:
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1666 Py_XDECREF(args);
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1667 Py_XDECREF(keys);
33948
f2ce15b02ba3 SF 1062353: set pickling problems
Raymond Hettinger <python@rcn.com>
parents: 33605
diff changeset
1668 Py_XDECREF(dict);
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1669 return result;
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1670 }
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1671
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1672 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1673
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1674 static int
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1675 set_init(PySetObject *self, PyObject *args, PyObject *kwds)
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1676 {
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1677 PyObject *iterable = NULL;
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1678
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1679 if (!PyAnySet_Check(self))
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1680 return -1;
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1681 if (!PyArg_UnpackTuple(args, self->ob_type->tp_name, 0, 1, &iterable))
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1682 return -1;
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1683 set_clear_internal(self);
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1684 self->hash = -1;
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1685 if (iterable == NULL)
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1686 return 0;
35297
26bf6c27e9ce * Improve code for the empty frozenset singleton:
Raymond Hettinger <python@rcn.com>
parents: 35296
diff changeset
1687 return set_update_internal(self, iterable);
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1688 }
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1689
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1690 static PySequenceMethods set_as_sequence = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1691 (lenfunc)set_len, /* sq_length */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1692 0, /* sq_concat */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1693 0, /* sq_repeat */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1694 0, /* sq_item */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1695 0, /* sq_slice */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1696 0, /* sq_ass_item */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1697 0, /* sq_ass_slice */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1698 (objobjproc)set_contains, /* sq_contains */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1699 };
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1700
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1701 /* set object ********************************************************/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1702
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1703 #ifdef Py_DEBUG
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1704 static PyObject *test_c_api(PySetObject *so);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1705
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1706 PyDoc_STRVAR(test_c_api_doc, "Exercises C API. Returns True.\n\
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1707 All is well if assertions don't fail.");
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1708 #endif
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1709
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1710 static PyMethodDef set_methods[] = {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1711 {"add", (PyCFunction)set_add, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1712 add_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1713 {"clear", (PyCFunction)set_clear, METH_NOARGS,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1714 clear_doc},
31177
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1715 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
31172
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31019
diff changeset
1716 contains_doc},
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1717 {"copy", (PyCFunction)set_copy, METH_NOARGS,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1718 copy_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1719 {"discard", (PyCFunction)set_discard, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1720 discard_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1721 {"difference", (PyCFunction)set_difference, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1722 difference_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1723 {"difference_update", (PyCFunction)set_difference_update, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1724 difference_update_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1725 {"intersection",(PyCFunction)set_intersection, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1726 intersection_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1727 {"intersection_update",(PyCFunction)set_intersection_update, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1728 intersection_update_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1729 {"issubset", (PyCFunction)set_issubset, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1730 issubset_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1731 {"issuperset", (PyCFunction)set_issuperset, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1732 issuperset_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1733 {"pop", (PyCFunction)set_pop, METH_NOARGS,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1734 pop_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1735 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1736 reduce_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1737 {"remove", (PyCFunction)set_remove, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1738 remove_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1739 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1740 symmetric_difference_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1741 {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1742 symmetric_difference_update_doc},
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1743 #ifdef Py_DEBUG
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1744 {"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1745 test_c_api_doc},
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1746 #endif
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1747 {"union", (PyCFunction)set_union, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1748 union_doc},
31015
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
1749 {"update", (PyCFunction)set_update, METH_O,
8d413578eb1a Factor out more duplicate code.
Raymond Hettinger <python@rcn.com>
parents: 31012
diff changeset
1750 update_doc},
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1751 {NULL, NULL} /* sentinel */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1752 };
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1753
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1754 static PyNumberMethods set_as_number = {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1755 0, /*nb_add*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1756 (binaryfunc)set_sub, /*nb_subtract*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1757 0, /*nb_multiply*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1758 0, /*nb_remainder*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1759 0, /*nb_divmod*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1760 0, /*nb_power*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1761 0, /*nb_negative*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1762 0, /*nb_positive*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1763 0, /*nb_absolute*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1764 0, /*nb_nonzero*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1765 0, /*nb_invert*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1766 0, /*nb_lshift*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1767 0, /*nb_rshift*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1768 (binaryfunc)set_and, /*nb_and*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1769 (binaryfunc)set_xor, /*nb_xor*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1770 (binaryfunc)set_or, /*nb_or*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1771 0, /*nb_coerce*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1772 0, /*nb_int*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1773 0, /*nb_long*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1774 0, /*nb_float*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1775 0, /*nb_oct*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1776 0, /*nb_hex*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1777 0, /*nb_inplace_add*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1778 (binaryfunc)set_isub, /*nb_inplace_subtract*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1779 0, /*nb_inplace_multiply*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1780 0, /*nb_inplace_remainder*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1781 0, /*nb_inplace_power*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1782 0, /*nb_inplace_lshift*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1783 0, /*nb_inplace_rshift*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1784 (binaryfunc)set_iand, /*nb_inplace_and*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1785 (binaryfunc)set_ixor, /*nb_inplace_xor*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1786 (binaryfunc)set_ior, /*nb_inplace_or*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1787 };
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1788
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1789 PyDoc_STRVAR(set_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1790 "set(iterable) --> set object\n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1791 \n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1792 Build an unordered collection.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1793
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1794 PyTypeObject PySet_Type = {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1795 PyObject_HEAD_INIT(&PyType_Type)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1796 0, /* ob_size */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1797 "set", /* tp_name */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1798 sizeof(PySetObject), /* tp_basicsize */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1799 0, /* tp_itemsize */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1800 /* methods */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1801 (destructor)set_dealloc, /* tp_dealloc */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1802 (printfunc)set_tp_print, /* tp_print */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1803 0, /* tp_getattr */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1804 0, /* tp_setattr */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1805 (cmpfunc)set_nocmp, /* tp_compare */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1806 (reprfunc)set_repr, /* tp_repr */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1807 &set_as_number, /* tp_as_number */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1808 &set_as_sequence, /* tp_as_sequence */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1809 0, /* tp_as_mapping */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1810 set_nohash, /* tp_hash */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1811 0, /* tp_call */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1812 0, /* tp_str */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1813 PyObject_GenericGetAttr, /* tp_getattro */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1814 0, /* tp_setattro */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1815 0, /* tp_as_buffer */
35110
f3d3151f8417 SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents: 33948
diff changeset
1816 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1817 Py_TPFLAGS_BASETYPE, /* tp_flags */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1818 set_doc, /* tp_doc */
35110
f3d3151f8417 SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents: 33948
diff changeset
1819 (traverseproc)set_traverse, /* tp_traverse */
35315
a6cbfcd0e691 Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents: 35312
diff changeset
1820 (inquiry)set_clear_internal, /* tp_clear */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1821 (richcmpfunc)set_richcompare, /* tp_richcompare */
32158
679e5c8effae Make sets and deques weak referencable.
Raymond Hettinger <python@rcn.com>
parents: 31628
diff changeset
1822 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1823 (getiterfunc)set_iter, /* tp_iter */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1824 0, /* tp_iternext */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1825 set_methods, /* tp_methods */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1826 0, /* tp_members */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1827 0, /* tp_getset */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1828 0, /* tp_base */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1829 0, /* tp_dict */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1830 0, /* tp_descr_get */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1831 0, /* tp_descr_set */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1832 0, /* tp_dictoffset */
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1833 (initproc)set_init, /* tp_init */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1834 PyType_GenericAlloc, /* tp_alloc */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1835 set_new, /* tp_new */
35110
f3d3151f8417 SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents: 33948
diff changeset
1836 PyObject_GC_Del, /* tp_free */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1837 };
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1838
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1839 /* frozenset object ********************************************************/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1840
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1841
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1842 static PyMethodDef frozenset_methods[] = {
31177
eeaa3660671c Refactor set.discard() and set.remove().
Raymond Hettinger <python@rcn.com>
parents: 31175
diff changeset
1843 {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
31172
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31019
diff changeset
1844 contains_doc},
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1845 {"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1846 copy_doc},
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1847 {"difference", (PyCFunction)set_difference, METH_O,
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1848 difference_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1849 {"intersection",(PyCFunction)set_intersection, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1850 intersection_doc},
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1851 {"issubset", (PyCFunction)set_issubset, METH_O,
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1852 issubset_doc},
31004
5b77bc4d25b1 * Simplify hash function and add test to show effectiveness of the hash
Raymond Hettinger <python@rcn.com>
parents: 31002
diff changeset
1853 {"issuperset", (PyCFunction)set_issuperset, METH_O,
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1854 issuperset_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1855 {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1856 reduce_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1857 {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1858 symmetric_difference_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1859 {"union", (PyCFunction)set_union, METH_O,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1860 union_doc},
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1861 {NULL, NULL} /* sentinel */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1862 };
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1863
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1864 static PyNumberMethods frozenset_as_number = {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1865 0, /*nb_add*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1866 (binaryfunc)set_sub, /*nb_subtract*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1867 0, /*nb_multiply*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1868 0, /*nb_remainder*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1869 0, /*nb_divmod*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1870 0, /*nb_power*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1871 0, /*nb_negative*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1872 0, /*nb_positive*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1873 0, /*nb_absolute*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1874 0, /*nb_nonzero*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1875 0, /*nb_invert*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1876 0, /*nb_lshift*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1877 0, /*nb_rshift*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1878 (binaryfunc)set_and, /*nb_and*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1879 (binaryfunc)set_xor, /*nb_xor*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1880 (binaryfunc)set_or, /*nb_or*/
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1881 };
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1882
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1883 PyDoc_STRVAR(frozenset_doc,
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1884 "frozenset(iterable) --> frozenset object\n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1885 \n\
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1886 Build an immutable unordered collection.");
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1887
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1888 PyTypeObject PyFrozenSet_Type = {
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1889 PyObject_HEAD_INIT(&PyType_Type)
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1890 0, /* ob_size */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1891 "frozenset", /* tp_name */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1892 sizeof(PySetObject), /* tp_basicsize */
31300
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1893 0, /* tp_itemsize */
bf8402a56fa4 * Simplify and speedup logic for tp_print.
Raymond Hettinger <python@rcn.com>
parents: 31203
diff changeset
1894 /* methods */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1895 (destructor)set_dealloc, /* tp_dealloc */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1896 (printfunc)set_tp_print, /* tp_print */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1897 0, /* tp_getattr */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1898 0, /* tp_setattr */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1899 (cmpfunc)set_nocmp, /* tp_compare */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1900 (reprfunc)set_repr, /* tp_repr */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1901 &frozenset_as_number, /* tp_as_number */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1902 &set_as_sequence, /* tp_as_sequence */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1903 0, /* tp_as_mapping */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1904 frozenset_hash, /* tp_hash */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1905 0, /* tp_call */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1906 0, /* tp_str */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1907 PyObject_GenericGetAttr, /* tp_getattro */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1908 0, /* tp_setattro */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1909 0, /* tp_as_buffer */
35110
f3d3151f8417 SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents: 33948
diff changeset
1910 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
35292
35a698302c63 Revised the set() and frozenset() implementaion to use its own internal
Raymond Hettinger <python@rcn.com>
parents: 35110
diff changeset
1911 Py_TPFLAGS_BASETYPE, /* tp_flags */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1912 frozenset_doc, /* tp_doc */
35110
f3d3151f8417 SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents: 33948
diff changeset
1913 (traverseproc)set_traverse, /* tp_traverse */
35315
a6cbfcd0e691 Factor away a redundant clear() function.
Raymond Hettinger <python@rcn.com>
parents: 35312
diff changeset
1914 (inquiry)set_clear_internal, /* tp_clear */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1915 (richcmpfunc)set_richcompare, /* tp_richcompare */
32158
679e5c8effae Make sets and deques weak referencable.
Raymond Hettinger <python@rcn.com>
parents: 31628
diff changeset
1916 offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1917 (getiterfunc)set_iter, /* tp_iter */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1918 0, /* tp_iternext */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1919 frozenset_methods, /* tp_methods */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1920 0, /* tp_members */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1921 0, /* tp_getset */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1922 0, /* tp_base */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1923 0, /* tp_dict */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1924 0, /* tp_descr_get */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1925 0, /* tp_descr_set */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1926 0, /* tp_dictoffset */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1927 0, /* tp_init */
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1928 PyType_GenericAlloc, /* tp_alloc */
30931
fa6e8d4f88c6 Various fixups (most suggested by Armin Rigo).
Raymond Hettinger <python@rcn.com>
parents: 30930
diff changeset
1929 frozenset_new, /* tp_new */
35110
f3d3151f8417 SF patch #1200018: Restore GC support to set objects
Raymond Hettinger <python@rcn.com>
parents: 33948
diff changeset
1930 PyObject_GC_Del, /* tp_free */
30929
54ff68e973ee * Migrate set() and frozenset() from the sandbox.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1931 };
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1932
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1933
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1934 /***** C API functions *************************************************/
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1935
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1936 PyObject *
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1937 PySet_New(PyObject *iterable)
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1938 {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1939 return make_new_set(&PySet_Type, iterable);
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1940 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1941
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1942 PyObject *
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1943 PyFrozenSet_New(PyObject *iterable)
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1944 {
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1945 PyObject *args, *result;
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1946
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1947 if (iterable == NULL)
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1948 args = PyTuple_New(0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1949 else
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1950 args = PyTuple_Pack(1, iterable);
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1951 if (args == NULL)
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1952 return NULL;
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1953 result = frozenset_new(&PyFrozenSet_Type, args, NULL);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1954 Py_DECREF(args);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1955 return result;
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1956 }
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1957
36833
9e81788b0d4b Use Py_ssize_t for PySet_Size() like all the other Py*_Size() functions.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36501
diff changeset
1958 Py_ssize_t
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1959 PySet_Size(PyObject *anyset)
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1960 {
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1961 if (!PyAnySet_Check(anyset)) {
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1962 PyErr_BadInternalCall();
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1963 return -1;
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1964 }
35398
1708479ade4d * Add a fast equality check path for frozensets where the hash value has
Raymond Hettinger <python@rcn.com>
parents: 35353
diff changeset
1965 return PySet_GET_SIZE(anyset);
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1966 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1967
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1968 int
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1969 PySet_Contains(PyObject *anyset, PyObject *key)
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1970 {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1971 if (!PyAnySet_Check(anyset)) {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1972 PyErr_BadInternalCall();
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1973 return -1;
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1974 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1975 return set_contains_key((PySetObject *)anyset, key);
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1976 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1977
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1978 int
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1979 PySet_Discard(PyObject *set, PyObject *key)
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1980 {
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1981 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1982 PyErr_BadInternalCall();
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1983 return -1;
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1984 }
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
1985 return set_discard_key((PySetObject *)set, key);
35346
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1986 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1987
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1988 int
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1989 PySet_Add(PyObject *set, PyObject *key)
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1990 {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1991 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1992 PyErr_BadInternalCall();
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1993 return -1;
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1994 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1995 return set_add_key((PySetObject *)set, key);
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1996 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1997
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1998 PyObject *
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
1999 PySet_Pop(PyObject *set)
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2000 {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2001 if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2002 PyErr_BadInternalCall();
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2003 return NULL;
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2004 }
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2005 return set_pop((PySetObject *)set);
dd2357953fe3 Add a C API for sets and frozensets.
Raymond Hettinger <python@rcn.com>
parents: 35341
diff changeset
2006 }
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2007
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2008
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2009 #ifdef Py_DEBUG
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2010
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2011 /* Test code to be called with any three element set.
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2012 Returns True and original set is restored. */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2013
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2014 #define assertRaises(call_return_value, exception) \
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2015 do { \
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2016 assert(call_return_value); \
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2017 assert(PyErr_ExceptionMatches(exception)); \
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2018 PyErr_Clear(); \
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2019 } while(0)
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2020
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2021 static PyObject *
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2022 test_c_api(PySetObject *so)
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2023 {
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2024 PyObject *elem, *dup, *t, *f, *ob = (PyObject *)so;
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2025
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2026 /* Verify preconditions and exercise type/size checks */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2027 assert(PyAnySet_Check(ob));
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2028 assert(PyAnySet_CheckExact(ob));
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2029 assert(!PyFrozenSet_CheckExact(ob));
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2030 assert(PySet_Size(ob) == 3);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2031 assert(PySet_GET_SIZE(ob) == 3);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2032
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2033 /* Raise TypeError for non-iterable constructor arguments */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2034 assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2035 assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2036
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2037 /* Raise TypeError for unhashable key */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2038 dup = PySet_New(ob);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2039 assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2040 assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2041 assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2042
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2043 /* Exercise successful pop, contains, add, and discard */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2044 elem = PySet_Pop(ob);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2045 assert(PySet_Contains(ob, elem) == 0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2046 assert(PySet_GET_SIZE(ob) == 2);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2047 assert(PySet_Add(ob, elem) == 0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2048 assert(PySet_Contains(ob, elem) == 1);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2049 assert(PySet_GET_SIZE(ob) == 3);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2050 assert(PySet_Discard(ob, elem) == 1);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2051 assert(PySet_GET_SIZE(ob) == 2);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2052 assert(PySet_Discard(ob, elem) == 0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2053 assert(PySet_GET_SIZE(ob) == 2);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2054
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2055 /* Raise SystemError when self argument is not a set or frozenset. */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2056 t = PyTuple_New(0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2057 assertRaises(PySet_Size(t) == -1, PyExc_SystemError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2058 assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2059 Py_DECREF(t);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2060
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2061 /* Raise SystemError when self argument is not a set. */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2062 f = PyFrozenSet_New(dup);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2063 assert(PySet_Size(f) == 3);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2064 assert(PyFrozenSet_CheckExact(f));
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2065 assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2066 assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2067 assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2068 Py_DECREF(f);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2069
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2070 /* Raise KeyError when popping from an empty set */
35353
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
2071 assert(PyNumber_InPlaceSubtract(ob, ob) == ob);
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
2072 Py_DECREF(ob);
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2073 assert(PySet_GET_SIZE(ob) == 0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2074 assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2075
35353
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
2076 /* Restore the set from the copy using the PyNumber API */
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
2077 assert(PyNumber_InPlaceOr(ob, dup) == ob);
e8806094d644 Add shortcuts for a|a and a&a.
Raymond Hettinger <python@rcn.com>
parents: 35349
diff changeset
2078 Py_DECREF(ob);
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2079
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2080 /* Verify constructors accept NULL arguments */
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2081 f = PySet_New(NULL);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2082 assert(f != NULL);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2083 assert(PySet_GET_SIZE(f) == 0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2084 Py_DECREF(f);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2085 f = PyFrozenSet_New(NULL);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2086 assert(f != NULL);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2087 assert(PyFrozenSet_CheckExact(f));
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2088 assert(PySet_GET_SIZE(f) == 0);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2089 Py_DECREF(f);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2090
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2091 Py_DECREF(elem);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2092 Py_DECREF(dup);
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2093 Py_RETURN_TRUE;
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2094 }
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2095
35581
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
2096 #undef assertRaises
37859c6ad5bb No longer ignore exceptions raised by comparisons during key lookup.
Raymond Hettinger <python@rcn.com>
parents: 35449
diff changeset
2097
35348
2f1bf64b837e Numerous fix-ups to C API and docs. Added tests for C API.
Raymond Hettinger <python@rcn.com>
parents: 35347
diff changeset
2098 #endif