Lines Matching refs:so

56 set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
61 size_t mask = so->mask;
67 entry = &so->table[i];
81 table = so->table;
87 if (table != so->table || entry->key != startkey)
88 return set_lookkey(so, key, hash);
91 mask = so->mask;
103 set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
120 mask = so->mask;
126 entry = &so->table[i];
140 table = so->table;
148 if (table != so->table || entry->key != startkey)
150 mask = so->mask;
165 so->used++;
171 so->fill++;
172 so->used++;
175 if ((size_t)so->fill*5 < mask*3)
177 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
232 set_table_resize(PySetObject *so, Py_ssize_t minused)
235 Py_ssize_t oldmask = so->mask;
250 oldtable = so->table;
252 is_oldtable_malloced = oldtable != so->smalltable;
256 newtable = so->smalltable;
258 if (so->fill == so->used) {
259 /* No dummies, so no point doing anything. */
268 assert(so->fill > so->used);
284 so->mask = newsize - 1;
285 so->table = newtable;
289 newmask = (size_t)so->mask;
290 if (so->fill == so->used) {
297 so->fill = so->used;
311 set_contains_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
315 entry = set_lookkey(so, key, hash);
325 set_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
330 entry = set_lookkey(so, key, hash);
338 so->used--;
344 set_add_key(PySetObject *so, PyObject *key)
354 return set_add_entry(so, key, hash);
358 set_contains_key(PySetObject *so, PyObject *key)
368 return set_contains_entry(so, key, hash);
372 set_discard_key(PySetObject *so, PyObject *key)
382 return set_discard_entry(so, key, hash);
386 set_empty_to_minsize(PySetObject *so)
388 memset(so->smalltable, 0, sizeof(so->smalltable));
389 so->fill = 0;
390 so->used = 0;
391 so->mask = PySet_MINSIZE - 1;
392 so->table = so->smalltable;
393 so->hash = -1;
397 set_clear_internal(PySetObject *so)
400 setentry *table = so->table;
401 Py_ssize_t fill = so->fill;
402 Py_ssize_t used = so->used;
403 int table_is_malloced = table != so->smalltable;
406 assert (PyAnySet_Check(so));
412 * clearing the slots, and never refer to anything via so->ref while
416 set_empty_to_minsize(so);
425 set_empty_to_minsize(so);
431 * has unique access to it, so decref side-effects can't alter it.
446 * Iterate over a set table. Use like so:
459 set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
465 assert (PyAnySet_Check(so));
468 mask = so->mask;
469 entry = &so->table[i];
483 set_dealloc(PySetObject *so)
486 Py_ssize_t used = so->used;
489 PyObject_GC_UnTrack(so);
490 Py_TRASHCAN_BEGIN(so, set_dealloc)
491 if (so->weakreflist != NULL)
492 PyObject_ClearWeakRefs((PyObject *) so);
494 for (entry = so->table; used > 0; entry++) {
500 if (so->table != so->smalltable)
501 PyMem_Free(so->table);
502 Py_TYPE(so)->tp_free(so);
507 set_repr(PySetObject *so)
510 int status = Py_ReprEnter((PyObject*)so);
515 return PyUnicode_FromFormat("%s(...)", Py_TYPE(so)->tp_name);
519 if (!so->used) {
520 Py_ReprLeave((PyObject*)so);
521 return PyUnicode_FromFormat("%s()", Py_TYPE(so)->tp_name);
524 keys = PySequence_List((PyObject *)so);
539 if (!PySet_CheckExact(so))
541 Py_TYPE(so)->tp_name,
547 Py_ReprLeave((PyObject*)so);
552 set_len(PyObject *so)
554 return ((PySetObject *)so)->used;
558 set_merge(PySetObject *so, PyObject *otherset)
566 assert (PyAnySet_Check(so));
570 if (other == so || other->used == 0)
577 if ((so->fill + other->used)*5 >= so->mask*3) {
578 if (set_table_resize(so, (so->used + other->used)*2) != 0)
581 so_entry = so->table;
586 if (so->fill == 0 && so->mask == other->mask && other->fill == other->used) {
596 so->fill = other->fill;
597 so->used = other->used;
602 if (so->fill == 0) {
603 setentry *newtable = so->table;
604 size_t newmask = (size_t)so->mask;
605 so->fill = other->used;
606 so->used = other->used;
617 /* We can't assure there are no duplicates, so do normal insertions */
622 if (set_add_entry(so, key, other_entry->hash))
630 set_pop(PySetObject *so, PyObject *Py_UNUSED(ignored))
633 setentry *entry = so->table + (so->finger & so->mask);
634 setentry *limit = so->table + so->mask;
637 if (so->used == 0) {
644 entry = so->table;
649 so->used--;
650 so->finger = entry - so->table + 1; /* next place to start */
658 set_traverse(PySetObject *so, visitproc visit, void *arg)
663 while (set_next(so, &pos, &entry))
670 small number of elements with nearby hashes so that many distinct
688 PySetObject *so = (PySetObject *)self;
692 if (so->hash != -1)
693 return so->hash;
699 subtract out their effect afterwards so that the final hash
705 for (entry = so->table; entry <= &so->table[so->mask]; entry++)
709 if ((so->mask + 1 - so->fill) & 1)
713 if ((so->fill - so->used) & 1)
727 so->hash = hash;
799 PySetObject *so = si->si_set;
801 if (so == NULL)
803 assert (PyAnySet_Check(so));
805 if (si->si_used != so->used) {
814 entry = so->table;
815 mask = so->mask;
828 Py_DECREF(so);
866 set_iter(PySetObject *so)
871 Py_INCREF(so);
872 si->si_set = so;
873 si->si_used = so->used;
875 si->len = so->used;
881 set_update_internal(PySetObject *so, PyObject *other)
886 return set_merge(so, other);
900 if ((so->fill + dictsize)*5 >= so->mask*3) {
901 if (set_table_resize(so, (so->used + dictsize)*2) != 0)
905 if (set_add_entry(so, key, hash))
916 if (set_add_key(so, key)) {
930 set_update(PySetObject *so, PyObject *args)
936 if (set_update_internal(so, other))
947 set object 64 byte aligned so that most of the fields
955 PySetObject *so;
957 so = (PySetObject *)type->tp_alloc(type, 0);
958 if (so == NULL)
961 so->fill = 0;
962 so->used = 0;
963 so->mask = PySet_MINSIZE - 1;
964 so->table = so->smalltable;
965 so->hash = -1;
966 so->finger = 0;
967 so->weakreflist = NULL;
970 if (set_update_internal(so, iterable)) {
971 Py_DECREF(so);
976 return (PyObject *)so;
1094 set_copy(PySetObject *so, PyObject *Py_UNUSED(ignored))
1096 return make_new_set_basetype(Py_TYPE(so), (PyObject *)so);
1100 frozenset_copy(PySetObject *so, PyObject *Py_UNUSED(ignored))
1102 if (PyFrozenSet_CheckExact(so)) {
1103 Py_INCREF(so);
1104 return (PyObject *)so;
1106 return set_copy(so, NULL);
1112 set_clear(PySetObject *so, PyObject *Py_UNUSED(ignored))
1114 set_clear_internal(so);
1121 set_union(PySetObject *so, PyObject *args)
1127 result = (PySetObject *)set_copy(so, NULL);
1133 if ((PyObject *)so == other)
1149 set_or(PySetObject *so, PyObject *other)
1153 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1156 result = (PySetObject *)set_copy(so, NULL);
1159 if ((PyObject *)so == other)
1169 set_ior(PySetObject *so, PyObject *other)
1174 if (set_update_internal(so, other))
1176 Py_INCREF(so);
1177 return (PyObject *)so;
1181 set_intersection(PySetObject *so, PyObject *other)
1188 if ((PyObject *)so == other)
1189 return set_copy(so, NULL);
1191 result = (PySetObject *)make_new_set_basetype(Py_TYPE(so), NULL);
1199 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1200 tmp = (PyObject *)so;
1201 so = (PySetObject *)other;
1209 rv = set_contains_entry(so, key, hash);
1237 rv = set_contains_entry(so, key, hash);
1243 if (PySet_GET_SIZE(result) >= PySet_GET_SIZE(so)) {
1264 set_intersection_multi(PySetObject *so, PyObject *args)
1267 PyObject *result = (PyObject *)so;
1270 return set_copy(so, NULL);
1272 Py_INCREF(so);
1292 set_intersection_update(PySetObject *so, PyObject *other)
1296 tmp = set_intersection(so, other);
1299 set_swap_bodies(so, (PySetObject *)tmp);
1305 set_intersection_update_multi(PySetObject *so, PyObject *args)
1309 tmp = set_intersection_multi(so, args);
1312 set_swap_bodies(so, (PySetObject *)tmp);
1321 set_and(PySetObject *so, PyObject *other)
1323 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1325 return set_intersection(so, other);
1329 set_iand(PySetObject *so, PyObject *other)
1335 result = set_intersection_update(so, other);
1339 Py_INCREF(so);
1340 return (PyObject *)so;
1344 set_isdisjoint(PySetObject *so, PyObject *other)
1349 if ((PyObject *)so == other) {
1350 if (PySet_GET_SIZE(so) == 0)
1360 if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
1361 tmp = (PyObject *)so;
1362 so = (PySetObject *)other;
1368 rv = set_contains_entry(so, key, entry->hash);
1385 rv = set_contains_key(so, key);
1406 set_difference_update_internal(PySetObject *so, PyObject *other)
1408 if ((PyObject *)so == other)
1409 return set_clear_internal(so);
1419 if ((PySet_GET_SIZE(other) >> 3) > PySet_GET_SIZE(so)) {
1420 other = set_intersection(so, other);
1430 if (set_discard_entry(so, key, entry->hash) < 0) {
1446 if (set_discard_key(so, key) < 0) {
1458 if ((size_t)(so->fill - so->used) <= (size_t)so->mask / 4)
1460 return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
1464 set_difference_update(PySetObject *so, PyObject *args)
1470 if (set_difference_update_internal(so, other))
1480 set_copy_and_difference(PySetObject *so, PyObject *other)
1484 result = set_copy(so, NULL);
1494 set_difference(PySetObject *so, PyObject *other)
1510 return set_copy_and_difference(so, other);
1513 /* If len(so) much more than len(other), it's more efficient to simply copy
1514 * so and then iterate other looking for common elements. */
1515 if ((PySet_GET_SIZE(so) >> 2) > other_size) {
1516 return set_copy_and_difference(so, other);
1519 result = make_new_set_basetype(Py_TYPE(so), NULL);
1524 while (set_next(so, &pos, &entry)) {
1546 /* Iterate over so, checking for common elements in other. */
1547 while (set_next(so, &pos, &entry)) {
1570 set_difference_multi(PySetObject *so, PyObject *args)
1576 return set_copy(so, NULL);
1579 result = set_difference(so, other);
1598 set_sub(PySetObject *so, PyObject *other)
1600 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1602 return set_difference(so, other);
1606 set_isub(PySetObject *so, PyObject *other)
1610 if (set_difference_update_internal(so, other))
1612 Py_INCREF(so);
1613 return (PyObject *)so;
1617 set_symmetric_difference_update(PySetObject *so, PyObject *other)
1626 if ((PyObject *)so == other)
1627 return set_clear(so, NULL);
1633 rv = set_discard_entry(so, key, hash);
1639 if (set_add_entry(so, key, hash)) {
1653 otherset = (PySetObject *)make_new_set_basetype(Py_TYPE(so), other);
1662 rv = set_discard_entry(so, key, hash);
1669 if (set_add_entry(so, key, hash)) {
1685 set_symmetric_difference(PySetObject *so, PyObject *other)
1690 otherset = (PySetObject *)make_new_set_basetype(Py_TYPE(so), other);
1693 rv = set_symmetric_difference_update(otherset, (PyObject *)so);
1708 set_xor(PySetObject *so, PyObject *other)
1710 if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
1712 return set_symmetric_difference(so, other);
1716 set_ixor(PySetObject *so, PyObject *other)
1722 result = set_symmetric_difference_update(so, other);
1726 Py_INCREF(so);
1727 return (PyObject *)so;
1731 set_issubset(PySetObject *so, PyObject *other)
1742 result = set_issubset(so, tmp);
1746 if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other))
1749 while (set_next(so, &pos, &entry)) {
1767 set_issuperset(PySetObject *so, PyObject *other)
1770 return set_issubset((PySetObject *)other, (PyObject *)so);
1778 int rv = set_contains_key(so, key);
1842 set_add(PySetObject *so, PyObject *key)
1844 if (set_add_key(so, key))
1855 set_contains(PySetObject *so, PyObject *key)
1860 rv = set_contains_key(so, key);
1868 rv = set_contains_key(so, tmpkey);
1875 set_direct_contains(PySetObject *so, PyObject *key)
1879 result = set_contains(so, key);
1888 set_remove(PySetObject *so, PyObject *key)
1893 rv = set_discard_key(so, key);
1901 rv = set_discard_key(so, tmpkey);
1920 set_discard(PySetObject *so, PyObject *key)
1925 rv = set_discard_key(so, key);
1933 rv = set_discard_key(so, tmpkey);
1948 set_reduce(PySetObject *so, PyObject *Py_UNUSED(ignored))
1952 keys = PySequence_List((PyObject *)so);
1958 state = _PyObject_GetState((PyObject *)so);
1961 result = PyTuple_Pack(3, Py_TYPE(so), args, state);
1970 set_sizeof(PySetObject *so, PyObject *Py_UNUSED(ignored))
1974 res = _PyObject_SIZE(Py_TYPE(so));
1975 if (so->table != so->smalltable)
1976 res = res + (so->mask + 1) * sizeof(setentry);
2034 static PyObject *test_c_api(PySetObject *so, PyObject *Py_UNUSED(ignored));
2392 test_c_api(PySetObject *so, PyObject *Py_UNUSED(ignored))
2398 PyObject *ob = (PyObject *)so;
2407 /* so.clear(); so |= set("abc"); */
2411 set_clear_internal(so);
2412 if (set_update_internal(so, str)) {