key.c: Add hashing and comparison for `Key' objects.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 28 Oct 2019 10:49:55 +0000 (10:49 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 11 Apr 2020 11:44:21 +0000 (12:44 +0100)
key.c
t/t-key.py

diff --git a/key.c b/key.c
index 474b659..0707edc 100644 (file)
--- 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@ */
index c33ea72..20cadb1 100644 (file)
@@ -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):