[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