[Python-checkins] python/dist/src/Objects setobject.c,1.49,1.50

rhettinger@users.sourceforge.net rhettinger at users.sourceforge.net
Tue Aug 16 05:48:02 CEST 2005


Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31184/Objects

Modified Files:
	setobject.c 
Log Message:
Add a C API for sets and frozensets.

Index: setobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/setobject.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -d -r1.49 -r1.50
--- setobject.c	13 Aug 2005 09:28:48 -0000	1.49
+++ setobject.c	16 Aug 2005 03:47:52 -0000	1.50
@@ -843,7 +843,7 @@
 			return iterable;
 		}
 		result = make_new_set(type, iterable);
-		if (result == NULL || set_len(result))
+		if (result == NULL || PySet_GET_SIZE(result))
 			return result;
 		Py_DECREF(result);
 	}
@@ -1052,7 +1052,7 @@
 		int pos = 0;
 		setentry *entry;
 
-		if (set_len(other) > set_len((PyObject *)so)) {
+		if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) {
 			tmp = (PyObject *)so;
 			so = (PySetObject *)other;
 			other = tmp;
@@ -1381,7 +1381,7 @@
 		Py_DECREF(tmp);
 		return result;
 	}
-	if (set_len((PyObject *)so) > set_len(other)) 
+	if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other)) 
 		Py_RETURN_FALSE;
 
 	while (set_next(so, &pos, &entry)) {
@@ -1426,11 +1426,11 @@
 	}
 	switch (op) {
 	case Py_EQ:
-		if (set_len((PyObject *)v) != set_len(w))
+		if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
 			Py_RETURN_FALSE;
 		return set_issubset(v, w);
 	case Py_NE:
-		if (set_len((PyObject *)v) != set_len(w))
+		if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
 			Py_RETURN_TRUE;
 		r1 = set_issubset(v, w);
 		assert (r1 != NULL);
@@ -1442,11 +1442,11 @@
 	case Py_GE:
 		return set_issuperset(v, w);
 	case Py_LT:
-		if (set_len((PyObject *)v) >= set_len(w))
+		if (PySet_GET_SIZE(v) >= PySet_GET_SIZE(w))
 			Py_RETURN_FALSE;		
 		return set_issubset(v, w);
 	case Py_GT:
-		if (set_len((PyObject *)v) <= set_len(w))
+		if (PySet_GET_SIZE(v) <= PySet_GET_SIZE(w))
 			Py_RETURN_FALSE;
 		return set_issuperset(v, w);
 	}
@@ -1472,7 +1472,7 @@
 	if (so->hash != -1)
 		return so->hash;
 
-	hash *= set_len(self) + 1;
+	hash *= PySet_GET_SIZE(self) + 1;
 	while (set_next(so, &pos, &entry)) {
 		/* Work to increase the bit dispersion for closely spaced hash
 		   values.  The is important because some use cases have many 
@@ -1918,3 +1918,67 @@
 	frozenset_new,			/* tp_new */
 	PyObject_GC_Del,		/* tp_free */
 };
+
+
+/***** C API functions *************************************************/
+
+PyObject *
+PySet_New(PyObject *iterable)
+{
+	return make_new_set(&PySet_Type, iterable);
+}
+
+PyObject *
+PyFrozenSet_New(PyObject *iterable)
+{
+	PyObject *args = NULL, *result;
+
+	if (iterable != NULL) {
+		args = PyTuple_Pack(1, iterable);
+		if (args == NULL)
+			return NULL;
+	}
+	result = frozenset_new(&PyFrozenSet_Type, args, NULL);
+	Py_DECREF(args);
+	return result;
+}
+
+int
+PySet_Contains(PyObject *anyset, PyObject *key)
+{
+	if (!PyAnySet_Check(anyset)) {
+		PyErr_BadInternalCall();
+		return -1;
+	}
+	return set_contains_key((PySetObject *)anyset, key);
+}
+
+int
+PySet_Discard(PyObject *anyset, PyObject *key)
+{
+	if (!PyAnySet_Check(anyset)) {
+		PyErr_BadInternalCall();
+		return -1;
+	}
+	return set_discard_key((PySetObject *)anyset, key);
+}
+
+int
+PySet_Add(PyObject *set, PyObject *key)
+{
+	if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
+		PyErr_BadInternalCall();
+		return -1;
+	}
+	return set_add_key((PySetObject *)set, key);
+}
+
+PyObject *
+PySet_Pop(PyObject *set)
+{
+	if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) {
+		PyErr_BadInternalCall();
+		return NULL;
+	}
+	return set_pop((PySetObject *)set);
+}



More information about the Python-checkins mailing list