mirror of https://github.com/python/cpython
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.
This commit is contained in:
parent
60bc809d9a
commit
56780257c6
|
@ -1489,6 +1489,13 @@ PyTypeObject PyList_Type = {
|
|||
0, /*tp_as_number*/
|
||||
&list_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*/
|
||||
};
|
||||
|
||||
|
||||
|
@ -1540,6 +1547,7 @@ static PySequenceMethods immutable_list_as_sequence = {
|
|||
(intintargfunc)list_slice, /*sq_slice*/
|
||||
(intobjargproc)immutable_list_ass, /*sq_ass_item*/
|
||||
(intintobjargproc)immutable_list_ass, /*sq_ass_slice*/
|
||||
(objobjproc)list_contains, /*sq_contains*/
|
||||
};
|
||||
|
||||
static PyTypeObject immutable_list_type = {
|
||||
|
@ -1557,5 +1565,12 @@ static PyTypeObject immutable_list_type = {
|
|||
0, /*tp_as_number*/
|
||||
&immutable_list_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*/
|
||||
};
|
||||
|
||||
|
|
|
@ -237,6 +237,23 @@ range_getattr(r, name)
|
|||
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 @@ static PySequenceMethods range_as_sequence = {
|
|||
(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 @@ PyTypeObject PyRange_Type = {
|
|||
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*/
|
||||
};
|
||||
|
|
|
@ -447,6 +447,12 @@ PyTypeObject PyTuple_Type = {
|
|||
&tuple_as_sequence, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
(hashfunc)tuplehash, /*tp_hash*/
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT, /*tp_flags*/
|
||||
};
|
||||
|
||||
/* The following function breaks the notion that tuples are immutable:
|
||||
|
|
Loading…
Reference in New Issue