X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fhmap.h;h=d770af88ac583fa14d16f1dcfa16bef238290e02;hb=54e05b5f6f7d3504dc74a73dcf9707cbdb28d1d1;hp=67c8e7041d8bafbf2142cfca42171097b2fe1a70;hpb=34e63086edddcae06d7c1a4fa84fec0861e50758;p=openvswitch diff --git a/lib/hmap.h b/lib/hmap.h index 67c8e704..d770af88 100644 --- a/lib/hmap.h +++ b/lib/hmap.h @@ -21,6 +21,10 @@ #include #include "util.h" +#ifdef __cplusplus +extern "C" { +#endif + /* A hash map node, to be embedded inside the data structure being mapped. */ struct hmap_node { size_t hash; /* Hash value. */ @@ -63,8 +67,9 @@ static inline void hmap_insert(struct hmap *, struct hmap_node *, size_t hash); static inline void hmap_remove(struct hmap *, struct hmap_node *); static inline void hmap_moved(struct hmap *, struct hmap_node *, struct hmap_node *); -static inline void hmap_replace(struct hmap *, const struct hmap_node *old, - struct hmap_node *new); +static inline void hmap_replace(struct hmap *, + const struct hmap_node *old_node, + struct hmap_node *new_node); /* Search. */ #define HMAP_FOR_EACH_WITH_HASH(NODE, STRUCT, MEMBER, HASH, HMAP) \ @@ -108,6 +113,14 @@ hmap_count(const struct hmap *hmap) return hmap->n; } +/* Returns the maximum number of nodes that 'hmap' may hold before it should be + * rehashed. */ +static inline size_t +hmap_capacity(const struct hmap *hmap) +{ + return hmap->mask * 2 + 1; +} + /* Returns true if 'hmap' currently contains no nodes, * false otherwise. */ static inline bool @@ -165,23 +178,23 @@ hmap_moved(struct hmap *hmap, *bucket = node; } -/* Puts 'new' in the position in 'hmap' currently occupied by 'old'. The 'new' - * node must hash to the same value as 'old'. The client is responsible for - * ensuring that the replacement does not violate any client-imposed - * invariants (e.g. uniqueness of keys within a map). +/* Puts 'new_node' in the position in 'hmap' currently occupied by 'old_node'. + * The 'new_node' must hash to the same value as 'old_node'. The client is + * responsible for ensuring that the replacement does not violate any + * client-imposed invariants (e.g. uniqueness of keys within a map). * - * Afterward, 'old' is not part of 'hmap', and the client is responsible for - * freeing it (if this is desirable). */ + * Afterward, 'old_node' is not part of 'hmap', and the client is responsible + * for freeing it (if this is desirable). */ static inline void hmap_replace(struct hmap *hmap, - const struct hmap_node *old, struct hmap_node *new) + const struct hmap_node *old_node, struct hmap_node *new_node) { - struct hmap_node **bucket = &hmap->buckets[old->hash & hmap->mask]; - while (*bucket != old) { + struct hmap_node **bucket = &hmap->buckets[old_node->hash & hmap->mask]; + while (*bucket != old_node) { bucket = &(*bucket)->next; } - *bucket = new; - new->hash = old->hash; + *bucket = new_node; + new_node->hash = old_node->hash; } static inline struct hmap_node * @@ -251,4 +264,8 @@ hmap_next(const struct hmap *hmap, const struct hmap_node *node) : hmap_next__(hmap, (node->hash & hmap->mask) + 1)); } +#ifdef __cplusplus +} +#endif + #endif /* hmap.h */