From 37b1a26c89d5f2583f04ac4efb3d799ff07634f6 Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Thu, 27 Apr 2000 21:41:03 +0000 Subject: [PATCH] add list_contains and tuplecontains: efficient implementations of tp_contains --- Objects/listobject.c | 21 +++++++++++++++++++++ Objects/tupleobject.c | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/Objects/listobject.c b/Objects/listobject.c index 673028f31bb..005d7097cbc 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -306,6 +306,26 @@ list_length(a) return a->ob_size; } + + +static int +list_contains(a, el) + PyListObject *a; + PyObject *el; +{ + int i, cmp; + + for (i = 0; i < a->ob_size; ++i) { + cmp = PyObject_Compare(el, PyList_GET_ITEM(a, i)); + if (cmp == 0) + return 1; + if (PyErr_Occurred()) + return -1; + } + return 0; +} + + static PyObject * list_item(a, i) PyListObject *a; @@ -1447,6 +1467,7 @@ static PySequenceMethods list_as_sequence = { (intintargfunc)list_slice, /*sq_slice*/ (intobjargproc)list_ass_item, /*sq_ass_item*/ (intintobjargproc)list_ass_slice, /*sq_ass_slice*/ + (objobjproc)list_contains, /*sq_contains*/ }; PyTypeObject PyList_Type = { diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 98448bd5e0a..d1627a9a2c0 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -281,6 +281,23 @@ tuplelength(a) return a->ob_size; } +static int +tuplecontains(a, el) + PyTupleObject *a; + PyObject *el; +{ + int i, cmp; + + for (i = 0; i < a->ob_size; ++i) { + cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i)); + if (cmp == 0) + return 1; + if (PyErr_Occurred()) + return -1; + } + return 0; +} + static PyObject * tupleitem(a, i) register PyTupleObject *a; @@ -409,6 +426,7 @@ static PySequenceMethods tuple_as_sequence = { (intintargfunc)tupleslice, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ + (objobjproc)tuplecontains, /*sq_contains*/ }; PyTypeObject PyTuple_Type = {