]>
git.proxmox.com Git - mirror_ovs.git/blob - lib/hmapx.c
2 * Copyright (c) 2011, 2012 Nicira, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 static struct hmapx_node
*
24 hmapx_find__(const struct hmapx
*map
, const void *data
, size_t hash
)
26 struct hmapx_node
*node
;
28 HMAP_FOR_EACH_IN_BUCKET (node
, hmap_node
, hash
, &map
->map
) {
29 if (node
->data
== data
) {
36 static struct hmapx_node
*
37 hmapx_add__(struct hmapx
*map
, void *data
, size_t hash
)
39 struct hmapx_node
*node
= xmalloc(sizeof *node
);
41 hmap_insert(&map
->map
, &node
->hmap_node
, hash
);
45 /* Initializes 'map' as an empty set of pointers. */
47 hmapx_init(struct hmapx
*map
)
54 hmapx_destroy(struct hmapx
*map
)
58 hmap_destroy(&map
->map
);
62 /* Initializes 'map' to contain the same pointers as 'orig'. */
64 hmapx_clone(struct hmapx
*map
, const struct hmapx
*orig
)
66 struct hmapx_node
*node
;
69 HMAP_FOR_EACH (node
, hmap_node
, &orig
->map
) {
70 hmapx_add__(map
, node
->data
, node
->hmap_node
.hash
);
74 /* Exchanges the contents of 'a' and 'b'. */
76 hmapx_swap(struct hmapx
*a
, struct hmapx
*b
)
78 hmap_swap(&a
->map
, &b
->map
);
81 /* Adjusts 'map' so that it is still valid after it has been moved around in
82 * memory (e.g. due to realloc()). */
84 hmapx_moved(struct hmapx
*map
)
86 hmap_moved(&map
->map
);
89 /* Returns true if 'map' contains no nodes, false if it contains at least one
92 hmapx_is_empty(const struct hmapx
*map
)
94 return hmap_is_empty(&map
->map
);
97 /* Returns the number of nodes in 'map'. */
99 hmapx_count(const struct hmapx
*map
)
101 return hmap_count(&map
->map
);
104 /* Adds 'data' to 'map'. If 'data' is new, returns the new hmapx_node;
105 * otherwise (if a 'data' already existed in 'map'), returns NULL. */
107 hmapx_add(struct hmapx
*map
, void *data
)
109 uint32_t hash
= hash_pointer(data
, 0);
110 return (hmapx_find__(map
, data
, hash
)
112 : hmapx_add__(map
, data
, hash
));
115 /* Adds 'data' to 'map'. Assert-fails if 'data' was already in 'map'. */
117 hmapx_add_assert(struct hmapx
*map
, void *data
)
119 bool added OVS_UNUSED
= hmapx_add(map
, data
);
123 /* Removes all of the nodes from 'map'. */
125 hmapx_clear(struct hmapx
*map
)
127 struct hmapx_node
*node
, *next
;
129 HMAPX_FOR_EACH_SAFE (node
, next
, map
) {
130 hmapx_delete(map
, node
);
134 /* Deletes 'node' from 'map' and frees 'node'. */
136 hmapx_delete(struct hmapx
*map
, struct hmapx_node
*node
)
138 hmap_remove(&map
->map
, &node
->hmap_node
);
142 /* Searches for 'data' in 'map'. If found, deletes it and returns true. If
143 * not found, returns false without modifying 'map'. */
145 hmapx_find_and_delete(struct hmapx
*map
, const void *data
)
147 struct hmapx_node
*node
= hmapx_find(map
, data
);
149 hmapx_delete(map
, node
);
154 /* Searches for 'data' in 'map' and deletes it. Assert-fails if 'data' is not
157 hmapx_find_and_delete_assert(struct hmapx
*map
, const void *data
)
159 bool deleted OVS_UNUSED
= hmapx_find_and_delete(map
, data
);
163 /* Searches for 'data' in 'map'. Returns its node, if found, otherwise a null
166 hmapx_find(const struct hmapx
*map
, const void *data
)
168 return hmapx_find__(map
, data
, hash_pointer(data
, 0));
171 /* Returns true if 'map' contains 'data', false otherwise. */
173 hmapx_contains(const struct hmapx
*map
, const void *data
)
175 return hmapx_find(map
, data
) != NULL
;
178 /* Returns true if 'a' and 'b' contain the same pointers, false otherwise. */
180 hmapx_equals(const struct hmapx
*a
, const struct hmapx
*b
)
182 struct hmapx_node
*node
;
184 if (hmapx_count(a
) != hmapx_count(b
)) {
188 HMAP_FOR_EACH (node
, hmap_node
, &a
->map
) {
189 if (!hmapx_find__(b
, node
->data
, node
->hmap_node
.hash
)) {