Blender V4.3
main_idmap.cc File Reference
#include <cstdlib>
#include <cstring>
#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
#include "BLI_mempool.h"
#include "BLI_utildefines.h"
#include "DNA_ID.h"
#include "BKE_idtype.hh"
#include "BKE_lib_id.hh"
#include "BKE_main.hh"
#include "BKE_main_idmap.hh"

Go to the source code of this file.

Classes

struct  IDNameLib_Key
 
struct  IDNameLib_TypeMap
 
struct  IDNameLib_Map
 

Functions

BKE_main_idmap API

Cache ID (name, library lookups). This doesn't account for adding/removing data-blocks, and should only be used when performing many lookups.

Note
GHash's are initialized on demand, since its likely some types will never have lookups run on them, so its a waste to create and never use.
static IDNameLib_TypeMapmain_idmap_from_idcode (IDNameLib_Map *id_map, short id_type)
 
IDNameLib_MapBKE_main_idmap_create (Main *bmain, const bool create_valid_ids_set, Main *old_bmain, const int idmap_types)
 
void BKE_main_idmap_insert_id (IDNameLib_Map *id_map, ID *id)
 
void BKE_main_idmap_remove_id (IDNameLib_Map *id_map, const ID *id)
 
MainBKE_main_idmap_main_get (IDNameLib_Map *id_map)
 
static uint idkey_hash (const void *ptr)
 
static bool idkey_cmp (const void *a, const void *b)
 
IDBKE_main_idmap_lookup_name (IDNameLib_Map *id_map, short id_type, const char *name, const Library *lib)
 
IDBKE_main_idmap_lookup_id (IDNameLib_Map *id_map, const ID *id)
 
IDBKE_main_idmap_lookup_uid (IDNameLib_Map *id_map, const uint session_uid)
 
void BKE_main_idmap_clear (IDNameLib_Map &id_map)
 
void BKE_main_idmap_destroy (IDNameLib_Map *id_map)
 

Detailed Description

Utility functions for faster ID lookups.

Definition in file main_idmap.cc.

Function Documentation

◆ BKE_main_idmap_clear()

void BKE_main_idmap_clear ( IDNameLib_Map & id_map)

◆ BKE_main_idmap_create()

IDNameLib_Map * BKE_main_idmap_create ( Main * bmain,
bool create_valid_ids_set,
Main * old_bmain,
int idmap_types )

Generate mapping from ID type/name to ID pointer for given bmain.

Note
When used during undo/redo, there is no guaranty that ID pointers from UI area are not pointing to freed memory (when some IDs have been deleted). To avoid crashes in those cases, one can provide the 'old' (aka current) Main database as reference. BKE_main_idmap_lookup_id will then check that given ID does exist in old_bmain before trying to use it.
Parameters
create_valid_ids_setIf true, generate a reference to prevent freed memory accesses.
old_bmainIf not NULL, its IDs will be added the valid references set.

Definition at line 77 of file main_idmap.cc.

References BKE_idtype_idcode_iter_step(), BKE_main_gset_create(), BLI_assert, BLI_ghash_ensure_p(), BLI_ghash_int_new(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, IDNameLib_TypeMap::id_type, INDEX_ID_MAX, MAIN_ID_SESSION_UID_UNSET, MAIN_IDMAP_TYPE_UID, IDNameLib_TypeMap::map, MEM_mallocN, POINTER_FROM_UINT, and UNUSED_VARS_NDEBUG.

Referenced by blo_make_old_idmap_from_main(), blo_read_file_internal(), library_id_is_yet_read(), library_link_end(), blender::bke::blendfile::PartialWriteContext::PartialWriteContext(), blender::ed::space_node::NodeClipboard::paste_validate_id_references(), read_libraries(), and setup_app_data().

◆ BKE_main_idmap_destroy()

◆ BKE_main_idmap_insert_id()

◆ BKE_main_idmap_lookup_id()

ID * BKE_main_idmap_lookup_id ( IDNameLib_Map * id_map,
const ID * id )

Definition at line 239 of file main_idmap.cc.

References BKE_main_idmap_lookup_name(), BLI_gset_haskey(), and GS.

◆ BKE_main_idmap_lookup_name()

◆ BKE_main_idmap_lookup_uid()

◆ BKE_main_idmap_main_get()

Main * BKE_main_idmap_main_get ( IDNameLib_Map * id_map)

Definition at line 184 of file main_idmap.cc.

Referenced by library_id_is_yet_read().

◆ BKE_main_idmap_remove_id()

◆ idkey_cmp()

static bool idkey_cmp ( const void * a,
const void * b )
static

Definition at line 199 of file main_idmap.cc.

References b, IDNameLib_Key::lib, IDNameLib_Key::name, and STREQ.

Referenced by BKE_main_idmap_lookup_name().

◆ idkey_hash()

static uint idkey_hash ( const void * ptr)
static

◆ main_idmap_from_idcode()

static IDNameLib_TypeMap * main_idmap_from_idcode ( IDNameLib_Map * id_map,
short id_type )
static