Add key structure and hashing utils for ID caches.

Part of D8183, refactoring how we preserve caches across undo steps in
readfile code.
This commit is contained in:
Bastien Montagne 2020-07-03 10:40:42 +02:00
parent a06d95987e
commit 5dda6cefb6
2 changed files with 30 additions and 0 deletions

View File

@ -46,6 +46,19 @@ enum {
IDTYPE_FLAGS_NO_MAKELOCAL = 1 << 2,
};
typedef struct IDCacheKey {
/* The session uuid of the ID owning the cached data. */
unsigned int id_session_uuid;
/* Value uniquely indentifying the cache whithin its ID.
* Typically the offset of its member in the data-block struct, but can be anything. */
size_t offset_in_ID;
/* Actual address of the cached data to save and restore. */
void *cache_v;
} IDCacheKey;
uint BKE_idtype_cache_key_hash(const void *key_v);
bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v);
/* ********** Prototypes for IDTypeInfo callbacks. ********** */
typedef void (*IDTypeInitDataFunction)(struct ID *id);

View File

@ -28,6 +28,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
#include "BLI_utildefines.h"
#include "CLG_log.h"
@ -42,6 +43,22 @@
// static CLG_LogRef LOG = {"bke.idtype"};
uint BKE_idtype_cache_key_hash(const void *key_v)
{
const IDCacheKey *key = key_v;
size_t hash = BLI_ghashutil_uinthash(key->id_session_uuid);
hash = BLI_ghashutil_combine_hash(hash, BLI_ghashutil_uinthash((uint)key->offset_in_ID));
return (uint)BLI_ghashutil_combine_hash(hash, BLI_ghashutil_ptrhash(key->cache_v));
}
bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v)
{
const IDCacheKey *key_a = key_a_v;
const IDCacheKey *key_b = key_b_v;
return (key_a->id_session_uuid != key_b->id_session_uuid) ||
(key_a->offset_in_ID != key_b->offset_in_ID) || (key_a->cache_v != key_b->cache_v);
}
static IDTypeInfo *id_types[MAX_LIBARRAY] = {NULL};
static void id_type_init(void)