[Python-checkins] python/nondist/sandbox/setobj setobject.c, 1.7,
1.8 test_set.py, 1.7, 1.8
rhettinger at users.sourceforge.net
rhettinger at users.sourceforge.net
Thu Nov 13 15:59:14 EST 2003
Update of /cvsroot/python/python/nondist/sandbox/setobj
In directory sc8-pr-cvs1:/tmp/cvs-serv15675
Modified Files:
setobject.c test_set.py
Log Message:
Add __cmp__() and non-mutating operators: & | ^ -.
Index: setobject.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/setobj/setobject.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** setobject.c 13 Nov 2003 19:21:22 -0000 1.7
--- setobject.c 13 Nov 2003 20:59:12 -0000 1.8
***************
*** 33,37 ****
{
PyObject *data;
! PyObject *it;
PyObject *item;
setobject *so;
--- 33,37 ----
{
PyObject *data;
! PyObject *it = NULL;
PyObject *item;
setobject *so;
***************
*** 46,54 ****
data = PyDict_New();
if (data == NULL) {
! Py_DECREF(data);
return NULL;
}
! while (iterable != NULL) {
item = PyIter_Next(it);
if (item == NULL)
--- 46,54 ----
data = PyDict_New();
if (data == NULL) {
! Py_DECREF(it);
return NULL;
}
! while (it != NULL) {
item = PyIter_Next(it);
if (item == NULL)
***************
*** 63,67 ****
Py_DECREF(item);
}
! Py_DECREF(it);
/* create setobject structure */
--- 63,67 ----
Py_DECREF(item);
}
! Py_XDECREF(it);
/* create setobject structure */
***************
*** 172,175 ****
--- 172,185 ----
static PyObject *
+ set_or(setobject *so, PyObject *other)
+ {
+ if (!IS_SET(other)) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return set_union(so, other);
+ }
+
+ static PyObject *
set_intersection(setobject *so, PyObject *other)
{
***************
*** 197,201 ****
"all set entries must be immutable");
return NULL;
! }
}
Py_DECREF(item);
--- 207,211 ----
"all set entries must be immutable");
return NULL;
! }
}
Py_DECREF(item);
***************
*** 205,208 ****
--- 215,228 ----
}
+ static PyObject *
+ set_and(setobject *so, PyObject *other)
+ {
+ if (!IS_SET(other)) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return set_intersection(so, other);
+ }
+
PyDoc_STRVAR(intersection_doc,
"""Return the intersection of two sets as a new set.\n\
***************
*** 243,246 ****
--- 263,276 ----
static PyObject *
+ set_sub(setobject *so, PyObject *other)
+ {
+ if (!IS_SET(other)) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return set_difference(so, other);
+ }
+
+ static PyObject *
set_symmetric_difference(setobject *so, PyObject *other)
{
***************
*** 293,296 ****
--- 323,336 ----
(i.e. all elements that are in exactly one of the sets.)\n");
+ static PyObject *
+ set_xor(setobject *so, PyObject *other)
+ {
+ if (!IS_SET(other)) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return set_symmetric_difference(so, other);
+ }
+
static long
set_nohash(PyObject *self)
***************
*** 300,303 ****
--- 340,350 ----
}
+ static int
+ set_nocmp(PyObject *self)
+ {
+ PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
+ return -1;
+ }
+
static long
frozenset_hash(PyObject *so)
***************
*** 315,319 ****
}
Py_DECREF(it);
! return hash;
}
--- 362,366 ----
}
Py_DECREF(it);
! return hash; /* XXX Consider caching the hash value to save recomputations */
}
***************
*** 380,383 ****
--- 427,450 ----
};
+ static PyNumberMethods set_as_number = {
+ 0, /*nb_add*/
+ (binaryfunc)set_sub, /*nb_subtract*/
+ 0, /*nb_multiply*/
+ 0, /*nb_divide*/
+ 0, /*nb_remainder*/
+ 0, /*nb_divmod*/
+ 0, /*nb_power*/
+ 0, /*nb_negative*/
+ 0, /*nb_positive*/
+ 0, /*nb_absolute*/
+ 0, /*nb_nonzero*/
+ 0, /*nb_invert*/
+ 0, /*nb_lshift*/
+ 0, /*nb_rshift*/
+ (binaryfunc)set_and, /*nb_and*/
+ (binaryfunc)set_xor, /*nb_xor*/
+ (binaryfunc)set_or, /*nb_or*/
+ };
+
PyDoc_STRVAR(set_doc,
"set(iterable) --> set object\n\
***************
*** 396,402 ****
0, /* tp_getattr */
0, /* tp_setattr */
! 0, /* tp_compare */
(reprfunc)set_repr, /* tp_repr */
! 0, /* tp_as_number */
&set_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
--- 463,469 ----
0, /* tp_getattr */
0, /* tp_setattr */
! (cmpfunc)set_nocmp, /* tp_compare */
(reprfunc)set_repr, /* tp_repr */
! &set_as_number, /* tp_as_number */
&set_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
***************
*** 449,452 ****
--- 516,539 ----
};
+ static PyNumberMethods frozenset_as_number = {
+ 0, /*nb_add*/
+ (binaryfunc)set_sub, /*nb_subtract*/
+ 0, /*nb_multiply*/
+ 0, /*nb_divide*/
+ 0, /*nb_remainder*/
+ 0, /*nb_divmod*/
+ 0, /*nb_power*/
+ 0, /*nb_negative*/
+ 0, /*nb_positive*/
+ 0, /*nb_absolute*/
+ 0, /*nb_nonzero*/
+ 0, /*nb_invert*/
+ 0, /*nb_lshift*/
+ 0, /*nb_rshift*/
+ (binaryfunc)set_and, /*nb_and*/
+ (binaryfunc)set_xor, /*nb_xor*/
+ (binaryfunc)set_or, /*nb_or*/
+ };
+
PyDoc_STRVAR(frozenset_doc,
"frozenset(iterable) --> frozenset object\n\
***************
*** 465,471 ****
0, /* tp_getattr */
0, /* tp_setattr */
! 0, /* tp_compare */
(reprfunc)set_repr, /* tp_repr */
! 0, /* tp_as_number */
&set_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
--- 552,558 ----
0, /* tp_getattr */
0, /* tp_setattr */
! (cmpfunc)set_nocmp, /* tp_compare */
(reprfunc)set_repr, /* tp_repr */
! &frozenset_as_number, /* tp_as_number */
&set_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
Index: test_set.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/setobj/test_set.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** test_set.py 13 Nov 2003 19:21:22 -0000 1.7
--- test_set.py 13 Nov 2003 20:59:12 -0000 1.8
***************
*** 31,34 ****
--- 31,44 ----
self.assertEqual(type(u), self.thetype)
+ def test_or(self):
+ i = self.s.union(self.otherword)
+ self.assertEqual(self.s | self.thetype(self.otherword), i)
+ try:
+ self.s | self.otherword
+ except TypeError:
+ pass
+ else:
+ self.fail("s|t did not screen-out general iterables")
+
def test_intersection(self):
i = self.s.intersection(self.otherword)
***************
*** 37,40 ****
--- 47,60 ----
self.assertEqual(type(i), self.thetype)
+ def test_and(self):
+ i = self.s.intersection(self.otherword)
+ self.assertEqual(self.s & self.thetype(self.otherword), i)
+ try:
+ self.s & self.otherword
+ except TypeError:
+ pass
+ else:
+ self.fail("s&t did not screen-out general iterables")
+
def test_difference(self):
i = self.s.difference(self.otherword)
***************
*** 43,46 ****
--- 63,76 ----
self.assertEqual(type(i), self.thetype)
+ def test_sub(self):
+ i = self.s.difference(self.otherword)
+ self.assertEqual(self.s - self.thetype(self.otherword), i)
+ try:
+ self.s - self.otherword
+ except TypeError:
+ pass
+ else:
+ self.fail("s-t did not screen-out general iterables")
+
def test_symmetric_difference(self):
i = self.s.symmetric_difference(self.otherword)
***************
*** 49,52 ****
--- 79,92 ----
self.assertEqual(type(i), self.thetype)
+ def test_xor(self):
+ i = self.s.symmetric_difference(self.otherword)
+ self.assertEqual(self.s ^ self.thetype(self.otherword), i)
+ try:
+ self.s ^ self.otherword
+ except TypeError:
+ pass
+ else:
+ self.fail("s^t did not screen-out general iterables")
+
def test_equality(self):
self.assertEqual(self.thetype('abcb'), set('bcac'))
***************
*** 59,62 ****
--- 99,105 ----
s = self.thetype(t)
self.assertEqual(len(s), 3)
+
+ def test_compare(self):
+ self.assertRaises(TypeError, self.s.__cmp__, self.s)
class TestSet(TestJointOps):
More information about the Python-checkins
mailing list