From c8c4c0341db246bf523a4a2c275c73fbdb081f57 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 28 Oct 2019 10:49:55 +0000 Subject: [PATCH] key.c: Add hashing and comparison for `Key' objects. --- key.c | 19 +++++++++++++++++-- t/t-key.py | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/key.c b/key.c index 474b659..0707edc 100644 --- a/key.c +++ b/key.c @@ -1299,6 +1299,21 @@ static void key_pydealloc(PyObject *me) FREEOBJ(me); } +static Py_hash_t key_pyhash(PyObject *me) + { return ((Py_hash_t)KEY_K(me)); } + +static PyObject *key_pyrichcompare(PyObject *me, PyObject *you, int op) +{ + if (!KEY_PYCHECK(you)) RETURN_NOTIMPL; + switch (op) { + case Py_EQ: return (getbool(KEY_K(me) == KEY_K(you))); + case Py_NE: return (getbool(KEY_K(me) == KEY_K(you))); + default: TYERR("ordering makes no sense"); + } +end: + return (0); +} + static PyObject *kmeth_delete(PyObject *me) { int err; @@ -1521,7 +1536,7 @@ static const PyTypeObject key_pytype_skel = { 0, /* @tp_as_number@ */ 0, /* @tp_as_sequence@ */ 0, /* @tp_as_mapping@ */ - 0, /* @tp_hash@ */ + key_pyhash, /* @tp_hash@ */ 0, /* @tp_call@ */ 0, /* @tp_str@ */ 0, /* @tp_getattro@ */ @@ -1535,7 +1550,7 @@ static const PyTypeObject key_pytype_skel = { 0, /* @tp_traverse@ */ 0, /* @tp_clear@ */ - 0, /* @tp_richcompare@ */ + key_pyrichcompare, /* @tp_richcompare@ */ 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ diff --git a/t/t-key.py b/t/t-key.py index c33ea72..20cadb1 100644 --- a/t/t-key.py +++ b/t/t-key.py @@ -331,6 +331,8 @@ class TestKeyFileMapping (T.ImmutableMappingTextMixin): model[i] = 100 + i kf.newkey(i, "k#%d" % i).data = C.KeyDataMP(100 + i) + me.assertEqual(kf[1], kf[1]) + me.check_immutable_mapping(kf, model) class TestKeyAttrMapping (T.MutableMappingTestMixin): -- 2.11.0