src/cx/hash_key.h

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1448
0f0fe7311b76
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 /**
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
29 * @file hash_key.h
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
30 * @brief Interface for map implementations.
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
31 * @author Mike Becker
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
32 * @author Olaf Wintermann
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
33 * @copyright 2-Clause BSD License
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 #ifndef UCX_HASH_KEY_H
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 #define UCX_HASH_KEY_H
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39
681
502105523db7 fix common.h include problems - fixes #255
Mike Becker <universe@uap-core.de>
parents: 663
diff changeset
40 #include "common.h"
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
41 #include "string.h"
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 #ifdef __cplusplus
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 extern "C" {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 #endif
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 /** Internal structure for a key within a hash map. */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 struct cx_hash_key_s {
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
49 /**
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
50 * The key data.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
51 * May be NULL when the hash is collision-free.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
52 */
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
53 const void *data;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 * The key data length.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 size_t len;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 /** The hash value of the key data. */
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
59 uint64_t hash;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 };
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 * Type for a hash key.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 typedef struct cx_hash_key_s CxHashKey;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 /**
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
68 * Computes a murmur2 32-bit hash.
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 *
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
70 * You need to initialize @c data and @c len in the key struct.
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 * The hash is then directly written to that struct.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 *
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
73 * Usually you should not need this function.
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
74 * Use cx_hash_key(), instead.
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
75 *
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
76 * @note If @c data is @c NULL, the hash is defined as 1574210520.
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
77 *
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 * @param key the key, the hash shall be computed for
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
79 * @see cx_hash_key()
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
81 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
82 CX_EXPORT void cx_hash_murmur(CxHashKey *key);
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 /**
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
85 * Mixes up a 32-bit integer to be used as a hash.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
86 *
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
87 * This function produces no collisions and has a good statistical distribution.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
88 *
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
89 * @param x the integer
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
90 * @return the hash
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
91 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
92 CX_EXPORT uint32_t cx_hash_u32(uint32_t x);
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
93
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
94 /**
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
95 * Mixes up a 64-bit integer to be used as a hash.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
96 *
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
97 * This function produces no collisions and has a good statistical distribution.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
98 *
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
99 * @param x the integer
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
100 * @return the hash
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
101 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
102 CX_EXPORT uint64_t cx_hash_u64(uint64_t x);
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
103
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
104 /**
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
105 * Computes a hash key from a 32-bit integer.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
106 *
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
107 * @param x the integer
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
108 * @return the hash key
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
109 */
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
110 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
111 CX_EXPORT CxHashKey cx_hash_key_u32(uint32_t x);
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
112
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
113 /**
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
114 * Computes a hash key from a 64-bit integer.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
115 *
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
116 * @param x the integer
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
117 * @return the hash key
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
118 */
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
119 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
120 CX_EXPORT CxHashKey cx_hash_key_u64(uint64_t x);
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
121
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
122 /**
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123 * Computes a hash key from a string.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 * The string needs to be zero-terminated.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 * @param str the string
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
130 cx_attr_nodiscard cx_attr_cstr_arg(1)
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
131 CX_EXPORT CxHashKey cx_hash_key_str(const char *str);
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 /**
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
134 * Computes a hash key from a string.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
135 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
136 * Use this function when the string is represented
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
137 * as an unsigned char array.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
138 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
139 * The string needs to be zero-terminated.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
140 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
141 * @param str the string
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
142 * @return the hash key
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
143 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
144 cx_attr_nodiscard cx_attr_cstr_arg(1)
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
145 CX_EXPORT CxHashKey cx_hash_key_ustr(const unsigned char *str);
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
146
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
147 /**
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148 * Computes a hash key from a byte array.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
149 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150 * @param bytes the array
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
151 * @param len the length
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
152 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
153 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
154 cx_attr_nodiscard cx_attr_access_r(1, 2)
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
155 CX_EXPORT CxHashKey cx_hash_key_bytes(const unsigned char *bytes, size_t len);
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
157 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
158 * Computes a hash key for an arbitrary object.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
159 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 * The computation uses the in-memory representation that might not be
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 * the same on different platforms. Therefore, this hash should not be
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 * used for data exchange with different machines.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
164 * @param obj a pointer to an arbitrary object
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1403
diff changeset
165 * @param len the length of the object in memory
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
168 cx_attr_nodiscard
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
169 cx_attr_access_r(1, 2)
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
170 CX_EXPORT CxHashKey cx_hash_key(const void *obj, size_t len);
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
171
663
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
172 /**
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
173 * Computes a hash key from a UCX string.
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
174 *
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
175 * @param str the string
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
176 * @return the hash key
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
177 */
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
178 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
179 CX_EXPORT CxHashKey cx_hash_key_cxstr(cxstring str);
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
180
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
181 /**
1050
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
182 * Computes a hash key from a UCX string.
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
183 *
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
184 * @param str the string
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
185 * @return the hash key
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
186 */
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
187 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
188 CX_EXPORT CxHashKey cx_hash_key_mutstr(cxmutstr str);
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
189
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
190 /**
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
191 * The identity function for the CX_HASH_KEY() macro.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
192 * You should never need to use this manually.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
193 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
194 * @param key the key
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
195 * @return a copy of the key
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
196 */
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
197 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
198 CX_INLINE CxHashKey cx_hash_key_identity(CxHashKey key) {
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
199 return key;
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
200 }
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
201
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
202 #ifndef __cplusplus
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
203 /**
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
204 * Creates a hash key from any of the supported types with implicit length.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
205 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
206 * Does nothing when passing a CxHashkey.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
207 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
208 * Supported types are UCX strings, zero-terminated C strings,
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
209 * and 32-bit or 64-bit unsigned integers.
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
210 *
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
211 * @param key the key data
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
212 * @returns the @c CxHashKey
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
213 */
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
214 #define CX_HASH_KEY(key) _Generic((key), \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
215 CxHashKey: cx_hash_key_identity, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
216 cxstring: cx_hash_key_cxstr, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
217 cxmutstr: cx_hash_key_mutstr, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
218 char*: cx_hash_key_str, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
219 const char*: cx_hash_key_str, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
220 unsigned char*: cx_hash_key_ustr, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
221 const unsigned char*: cx_hash_key_ustr, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
222 uint32_t: cx_hash_key_u32, \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
223 uint64_t: cx_hash_key_u64) \
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
224 (key)
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
225 #endif // __cplusplus
1402
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
226
6fa42f7e2624 add generic CX_HASH_KEY() macro
Mike Becker <universe@uap-core.de>
parents: 1400
diff changeset
227 /**
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
228 * Compare function for hash keys.
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
229 *
1448
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
230 * The pointers are untyped to be compatible with the cx_compare_func signature.
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
231 *
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
232 * @param left (@c CxHashKey*) the first key
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
233 * @param right (@c CxHashKey*) the second key
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
234 * @return zero when the keys equal, non-zero when they differ
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
235 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
236 cx_attr_nodiscard cx_attr_nonnull
1448
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
237 CX_EXPORT int cx_hash_key_cmp(const void *left, const void *right);
1400
7bc88ae62755 add support for integer keys - resolves #720
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
238
1050
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
239 #ifdef __cplusplus
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
240 } // extern "C"
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
241
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
242 // ----------------------------------------------------------
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
243 // Overloads of CX_HASH_KEY (the C++ version of a _Generic)
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
244 // ----------------------------------------------------------
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
245
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
246 CX_CPPDECL CxHashKey CX_HASH_KEY(CxHashKey key) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
247 return key;
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
248 }
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
249
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
250 CX_CPPDECL CxHashKey CX_HASH_KEY(cxstring str) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
251 return cx_hash_key_cxstr(str);
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
252 }
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
253
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
254 CX_CPPDECL CxHashKey CX_HASH_KEY(cxmutstr str) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
255 return cx_hash_key_mutstr(str);
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
256 }
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
257
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
258 CX_CPPDECL CxHashKey CX_HASH_KEY(const char *str) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
259 return cx_hash_key_str(str);
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
260 }
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
261
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
262 CX_CPPDECL CxHashKey CX_HASH_KEY(const unsigned char *str) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
263 return cx_hash_key_ustr(str);
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
264 }
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
265
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
266 CX_CPPDECL CxHashKey CX_HASH_KEY(uint32_t key) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
267 return cx_hash_key_u32(key);
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
268 }
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
269
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
270 CX_CPPDECL CxHashKey CX_HASH_KEY(uint64_t key) {
1403
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
271 return cx_hash_key_u64(key);
09eca27b27e9 add C++ implementation of CX_HASH_KEY()
Mike Becker <universe@uap-core.de>
parents: 1402
diff changeset
272 }
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
273 #endif
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
274
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 604
diff changeset
275 #endif // UCX_HASH_KEY_H

mercurial