diff Objects/rangeobject.c @ 12925:128e7b994505 legacy-trunk

Thomas Wouters <thomas@xs4all.net>: The following patch adds "sq_contains" support to rangeobject, and enables the already-written support for sq_contains in listobject and tupleobject. The rangeobject "contains" code should be a bit more efficient than the current default "in" implementation ;-) It might not get used much, but it's not that much to add. listobject.c and tupleobject.c already had code for sq_contains, and the proper struct member was set, but the PyType structure was not extended to include tp_flags, so the object-specific code was not getting called (Go ahead, test it ;-). I also did this for the immutable_list_type in listobject.c, eventhough it is probably never used. Symmetry and all that.
author Fred Drake <fdrake@acm.org>
date Thu, 15 Jun 2000 14:50:20 +0000
parents 1c7c2dd1beb1
children 916fb024ce94
line wrap: on
line diff
--- a/Objects/rangeobject.c	Wed Jun 14 09:18:32 2000 +0000
+++ b/Objects/rangeobject.c	Thu Jun 15 14:50:20 2000 +0000
@@ -237,6 +237,23 @@
 	return Py_FindMethod(range_methods, (PyObject *) r, name);
 }
 
+static int
+range_contains(r, obj)
+	rangeobject * r;
+	PyObject * obj;
+{
+	long num = PyInt_AsLong(obj);
+	
+	if (num < 0 && PyErr_Occurred())
+		return -1;
+	
+	if (num < r->start || (num - r->start) % r->step)
+		return 0;
+	if (num > (r->start + (r->len * r->step)))
+		return 0;
+	return 1;
+}
+
 static PySequenceMethods range_as_sequence = {
 	(inquiry)range_length, /*sq_length*/
 	(binaryfunc)range_concat, /*sq_concat*/
@@ -245,6 +262,7 @@
 	(intintargfunc)range_slice, /*sq_slice*/
 	0,		/*sq_ass_item*/
 	0,		/*sq_ass_slice*/
+	(objobjproc)range_contains, /*sq_contains*/
 };
 
 PyTypeObject PyRange_Type = {
@@ -262,4 +280,11 @@
 	0,			/*tp_as_number*/
 	&range_as_sequence,	/*tp_as_sequence*/
 	0,			/*tp_as_mapping*/
+	0,			/*tp_hash*/
+	0,			/*tp_call*/
+	0,			/*tp_str*/
+	0,			/*tp_getattro*/
+	0,			/*tp_setattro*/
+	0,			/*tp_as_buffer*/
+	Py_TPFLAGS_DEFAULT,	/*tp_flags*/
 };