diff options
author | Fred Drake <fdrake@acm.org> | 2000-06-15 14:50:20 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2000-06-15 14:50:20 (GMT) |
commit | 56780257c624996758237f96ce59fe3068f86deb (patch) | |
tree | 3dfc09ddbac0f610d3fba43245eac1155e6c04af /Objects | |
parent | 60bc809d9a80ec12530d224cc680bae42c4de285 (diff) | |
download | cpython-56780257c624996758237f96ce59fe3068f86deb.zip cpython-56780257c624996758237f96ce59fe3068f86deb.tar.gz cpython-56780257c624996758237f96ce59fe3068f86deb.tar.bz2 |
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.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/listobject.c | 15 | ||||
-rw-r--r-- | Objects/rangeobject.c | 25 | ||||
-rw-r--r-- | Objects/tupleobject.c | 6 |
3 files changed, 46 insertions, 0 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c index 922444e..3bb5aec 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -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*/ }; diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 807cf51..86144ca 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -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*/ }; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index c26b7df..451e794 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -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: |