Move bitmap_hash and bitmap_match to bitmapset.c.

The closely-related function bms_hash_value is already defined in that
file, and this change means that hashfn.c no longer needs to depend on
nodes/bitmapset.h. That gets us closer to allowing use of the hash
functions in hashfn.c in frontend code.

Patch by me, reviewed by Suraj Kharage and Mark Dilger.

Discussion: http://postgr.es/m/CA+TgmoaRiG4TXND8QuM6JXFRkM_1wL2ZNhzaUKsuec9-4yrkgw@mail.gmail.com
This commit is contained in:
Robert Haas 2020-02-24 17:17:08 +05:30
parent bf883b211e
commit 07b95c3d83
4 changed files with 25 additions and 26 deletions

View File

@ -1167,3 +1167,26 @@ bms_hash_value(const Bitmapset *a)
return DatumGetUInt32(hash_any((const unsigned char *) a->words,
(lastword + 1) * sizeof(bitmapword)));
}
/*
* bitmap_hash - hash function for keys that are (pointers to) Bitmapsets
*
* Note: don't forget to specify bitmap_match as the match function!
*/
uint32
bitmap_hash(const void *key, Size keysize)
{
Assert(keysize == sizeof(Bitmapset *));
return bms_hash_value(*((const Bitmapset *const *) key));
}
/*
* bitmap_match - match function to use with bitmap_hash
*/
int
bitmap_match(const void *key1, const void *key2, Size keysize)
{
Assert(keysize == sizeof(Bitmapset *));
return !bms_equal(*((const Bitmapset *const *) key1),
*((const Bitmapset *const *) key2));
}

View File

@ -23,7 +23,6 @@
#include "postgres.h"
#include "fmgr.h"
#include "nodes/bitmapset.h"
#include "utils/hashutils.h"
#include "utils/hsearch.h"
@ -695,26 +694,3 @@ uint32_hash(const void *key, Size keysize)
Assert(keysize == sizeof(uint32));
return DatumGetUInt32(hash_uint32(*((const uint32 *) key)));
}
/*
* bitmap_hash: hash function for keys that are (pointers to) Bitmapsets
*
* Note: don't forget to specify bitmap_match as the match function!
*/
uint32
bitmap_hash(const void *key, Size keysize)
{
Assert(keysize == sizeof(Bitmapset *));
return bms_hash_value(*((const Bitmapset *const *) key));
}
/*
* bitmap_match: match function to use with bitmap_hash
*/
int
bitmap_match(const void *key1, const void *key2, Size keysize)
{
Assert(keysize == sizeof(Bitmapset *));
return !bms_equal(*((const Bitmapset *const *) key1),
*((const Bitmapset *const *) key2));
}

View File

@ -116,5 +116,7 @@ extern int bms_prev_member(const Bitmapset *a, int prevbit);
/* support for hashtables using Bitmapsets as keys: */
extern uint32 bms_hash_value(const Bitmapset *a);
extern uint32 bitmap_hash(const void *key, Size keysize);
extern int bitmap_match(const void *key1, const void *key2, Size keysize);
#endif /* BITMAPSET_H */

View File

@ -152,8 +152,6 @@ extern void AtEOSubXact_HashTables(bool isCommit, int nestDepth);
extern uint32 string_hash(const void *key, Size keysize);
extern uint32 tag_hash(const void *key, Size keysize);
extern uint32 uint32_hash(const void *key, Size keysize);
extern uint32 bitmap_hash(const void *key, Size keysize);
extern int bitmap_match(const void *key1, const void *key2, Size keysize);
#define oid_hash uint32_hash /* Remove me eventually */