src/cx/hash_key.h

changeset 1664
e5a8c41ecb58
parent 1653
6a842bd49fea
child 1665
b79405fbf91d
--- a/src/cx/hash_key.h	Wed Dec 24 11:53:40 2025 +0100
+++ b/src/cx/hash_key.h	Wed Dec 24 12:00:33 2025 +0100
@@ -192,18 +192,30 @@
  * You should never need to use this manually.
  *
  * @param key the key
- * @return a copy of the key
+ * @return a copy of the key (not the data)
  */
 cx_attr_nodiscard
 CX_INLINE CxHashKey cx_hash_key_identity(CxHashKey key) {
     return key;
 }
 
+/**
+ * The dereference function for the CX_HASH_KEY() macro.
+ * You should never need to use this manually.
+ *
+ * @param key a pointer to a key
+ * @return a copy of the key (not the data)
+ */
+cx_attr_nodiscard
+CX_INLINE CxHashKey cx_hash_key_deref(const CxHashKey *key) {
+    return *key;
+}
+
 #ifndef __cplusplus
 /**
  * Creates a hash key from any of the supported types with implicit length.
  *
- * Does nothing when passing a CxHashkey.
+ * Does nothing when passing a CxHashKey and dereferences CxHashKey pointers.
  *
  * Supported types are UCX strings, zero-terminated C strings,
  * and 32-bit or 64-bit unsigned integers.
@@ -212,6 +224,8 @@
  * @returns the @c CxHashKey
  */
 #define CX_HASH_KEY(key) _Generic((key), \
+        CxHashKey*: cx_hash_key_deref, \
+        const CxHashKey*: cx_hash_key_deref, \
         CxHashKey: cx_hash_key_identity, \
         cxstring: cx_hash_key_cxstr, \
         cxmutstr: cx_hash_key_mutstr, \
@@ -255,6 +269,10 @@
     return key;
 }
 
+CX_CPPDECL CxHashKey CX_HASH_KEY(const CxHashKey *key) {
+    return *key;
+}
+
 CX_CPPDECL CxHashKey CX_HASH_KEY(cxstring str) {
     return cx_hash_key_cxstr(str);
 }

mercurial