Blender  V3.3
Classes | Macros
BLI_ghash.c File Reference
#include <limits.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_mempool.h"
#include "BLI_sys_types.h"
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_strict_flags.h"
#include "BLI_math.h"

Go to the source code of this file.

Classes

struct  Entry
 
struct  GHashEntry
 
struct  GHash
 

Macros

#define GHASH_INTERNAL_API
 

Functions

Internal Utility API
BLI_INLINE void ghash_entry_copy (GHash *gh_dst, Entry *dst, const GHash *gh_src, const Entry *src, GHashKeyCopyFP keycopyfp, GHashValCopyFP valcopyfp)
 
BLI_INLINE uint ghash_keyhash (const GHash *gh, const void *key)
 
BLI_INLINE uint ghash_entryhash (const GHash *gh, const Entry *e)
 
BLI_INLINE uint ghash_bucket_index (const GHash *gh, const uint hash)
 
BLI_INLINE uint ghash_find_next_bucket_index (const GHash *gh, uint curr_bucket)
 
static void ghash_buckets_resize (GHash *gh, const uint nbuckets)
 
static void ghash_buckets_expand (GHash *gh, const uint nentries, const bool user_defined)
 
static void ghash_buckets_contract (GHash *gh, const uint nentries, const bool user_defined, const bool force_shrink)
 
BLI_INLINE void ghash_buckets_reset (GHash *gh, const uint nentries)
 
BLI_INLINE Entryghash_lookup_entry_ex (const GHash *gh, const void *key, const uint bucket_index)
 
BLI_INLINE Entryghash_lookup_entry_prev_ex (GHash *gh, const void *key, Entry **r_e_prev, const uint bucket_index)
 
BLI_INLINE Entryghash_lookup_entry (const GHash *gh, const void *key)
 
static GHashghash_new (GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info, const uint nentries_reserve, const uint flag)
 
BLI_INLINE void ghash_insert_ex (GHash *gh, void *key, void *val, const uint bucket_index)
 
BLI_INLINE void ghash_insert_ex_keyonly_entry (GHash *gh, void *key, const uint bucket_index, Entry *e)
 
BLI_INLINE void ghash_insert_ex_keyonly (GHash *gh, void *key, const uint bucket_index)
 
BLI_INLINE void ghash_insert (GHash *gh, void *key, void *val)
 
BLI_INLINE bool ghash_insert_safe (GHash *gh, void *key, void *val, const bool override, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 
BLI_INLINE bool ghash_insert_safe_keyonly (GHash *gh, void *key, const bool override, GHashKeyFreeFP keyfreefp)
 
static Entryghash_remove_ex (GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp, const uint bucket_index)
 
static Entryghash_pop (GHash *gh, GHashIterState *state)
 
static void ghash_free_cb (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 
static GHashghash_copy (const GHash *gh, GHashKeyCopyFP keycopyfp, GHashValCopyFP valcopyfp)
 
GHash Public API
GHashBLI_ghash_new_ex (GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info, const uint nentries_reserve)
 
GHashBLI_ghash_new (GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info)
 
GHashBLI_ghash_copy (const GHash *gh, GHashKeyCopyFP keycopyfp, GHashValCopyFP valcopyfp)
 
void BLI_ghash_reserve (GHash *gh, const uint nentries_reserve)
 
uint BLI_ghash_len (const GHash *gh)
 
void BLI_ghash_insert (GHash *gh, void *key, void *val)
 
bool BLI_ghash_reinsert (GHash *gh, void *key, void *val, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 
voidBLI_ghash_replace_key (GHash *gh, void *key)
 
voidBLI_ghash_lookup (const GHash *gh, const void *key)
 
voidBLI_ghash_lookup_default (const GHash *gh, const void *key, void *val_default)
 
void ** BLI_ghash_lookup_p (GHash *gh, const void *key)
 
bool BLI_ghash_ensure_p (GHash *gh, void *key, void ***r_val)
 
bool BLI_ghash_ensure_p_ex (GHash *gh, const void *key, void ***r_key, void ***r_val)
 
bool BLI_ghash_remove (GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 
voidBLI_ghash_popkey (GHash *gh, const void *key, GHashKeyFreeFP keyfreefp)
 
bool BLI_ghash_haskey (const GHash *gh, const void *key)
 
bool BLI_ghash_pop (GHash *gh, GHashIterState *state, void **r_key, void **r_val)
 
void BLI_ghash_clear_ex (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp, const uint nentries_reserve)
 
void BLI_ghash_clear (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 
void BLI_ghash_free (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 
void BLI_ghash_flag_set (GHash *gh, uint flag)
 
void BLI_ghash_flag_clear (GHash *gh, uint flag)
 
GHash Iterator API
GHashIteratorBLI_ghashIterator_new (GHash *gh)
 
void BLI_ghashIterator_init (GHashIterator *ghi, GHash *gh)
 
void BLI_ghashIterator_step (GHashIterator *ghi)
 
void BLI_ghashIterator_free (GHashIterator *ghi)
 
GSet Public API
GSetBLI_gset_new_ex (GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info, const uint nentries_reserve)
 
GSetBLI_gset_new (GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info)
 
GSetBLI_gset_copy (const GSet *gs, GHashKeyCopyFP keycopyfp)
 
uint BLI_gset_len (const GSet *gs)
 
void BLI_gset_insert (GSet *gs, void *key)
 
bool BLI_gset_add (GSet *gs, void *key)
 
bool BLI_gset_ensure_p_ex (GSet *gs, const void *key, void ***r_key)
 
bool BLI_gset_reinsert (GSet *gs, void *key, GSetKeyFreeFP keyfreefp)
 
voidBLI_gset_replace_key (GSet *gs, void *key)
 
bool BLI_gset_remove (GSet *gs, const void *key, GSetKeyFreeFP keyfreefp)
 
bool BLI_gset_haskey (const GSet *gs, const void *key)
 
bool BLI_gset_pop (GSet *gs, GSetIterState *state, void **r_key)
 
void BLI_gset_clear_ex (GSet *gs, GSetKeyFreeFP keyfreefp, const uint nentries_reserve)
 
void BLI_gset_clear (GSet *gs, GSetKeyFreeFP keyfreefp)
 
void BLI_gset_free (GSet *gs, GSetKeyFreeFP keyfreefp)
 
void BLI_gset_flag_set (GSet *gs, uint flag)
 
void BLI_gset_flag_clear (GSet *gs, uint flag)
 
GSet Combined Key/Value Usage
Note
Not typical set use, only use when the pointer identity matters. This can be useful when the key references data stored outside the GSet.
voidBLI_gset_lookup (const GSet *gs, const void *key)
 
voidBLI_gset_pop_key (GSet *gs, const void *key)
 
Debugging & Introspection
int BLI_ghash_buckets_len (const GHash *gh)
 
int BLI_gset_buckets_len (const GSet *gs)
 
double BLI_ghash_calc_quality_ex (GHash *gh, double *r_load, double *r_variance, double *r_prop_empty_buckets, double *r_prop_overloaded_buckets, int *r_biggest_bucket)
 
double BLI_gset_calc_quality_ex (GSet *gs, double *r_load, double *r_variance, double *r_prop_empty_buckets, double *r_prop_overloaded_buckets, int *r_biggest_bucket)
 
double BLI_ghash_calc_quality (GHash *gh)
 
double BLI_gset_calc_quality (GSet *gs)
 

Structs & Constants

#define GHASH_USE_MODULO_BUCKETS
 
#define hashsizes   BLI_ghash_hash_sizes
 
#define GHASH_MAX_SIZE   27
 
#define GHASH_LIMIT_GROW(_nbkt)   (((_nbkt)*3) / 4)
 
#define GHASH_LIMIT_SHRINK(_nbkt)   (((_nbkt)*3) / 16)
 
#define GHASH_ENTRY_SIZE(_is_gset)   ((_is_gset) ? sizeof(GSetEntry) : sizeof(GHashEntry))
 
typedef struct Entry Entry
 
typedef struct GHashEntry GHashEntry
 
typedef Entry GSetEntry
 
const uint BLI_ghash_hash_sizes []
 
 BLI_STATIC_ASSERT (ARRAY_SIZE(hashsizes)==GHASH_MAX_SIZE, "Invalid 'hashsizes' size")
 

Detailed Description

A general (pointer -> pointer) chaining hash table for 'Abstract Data Types' (known as an ADT Hash Table).

Definition in file BLI_ghash.c.

Macro Definition Documentation

◆ GHASH_ENTRY_SIZE

#define GHASH_ENTRY_SIZE (   _is_gset)    ((_is_gset) ? sizeof(GSetEntry) : sizeof(GHashEntry))

Definition at line 81 of file BLI_ghash.c.

◆ GHASH_INTERNAL_API

#define GHASH_INTERNAL_API

Definition at line 22 of file BLI_ghash.c.

◆ GHASH_LIMIT_GROW

#define GHASH_LIMIT_GROW (   _nbkt)    (((_nbkt)*3) / 4)
Note
Max load GHASH_LIMIT_GROW used to be 3. (pre 2.74). Python uses 0.6666, tommyhashlib even goes down to 0.5. Reducing our from 3 to 0.75 gives huge speedup (about twice quicker pure GHash insertions/lookup, about 25% - 30% quicker 'dynamic-topology' stroke drawing e.g.). Min load GHASH_LIMIT_SHRINK is a quarter of max load, to avoid resizing to quickly.

Definition at line 63 of file BLI_ghash.c.

◆ GHASH_LIMIT_SHRINK

#define GHASH_LIMIT_SHRINK (   _nbkt)    (((_nbkt)*3) / 16)

Definition at line 64 of file BLI_ghash.c.

◆ GHASH_MAX_SIZE

#define GHASH_MAX_SIZE   27

Definition at line 48 of file BLI_ghash.c.

◆ GHASH_USE_MODULO_BUCKETS

#define GHASH_USE_MODULO_BUCKETS

Definition at line 32 of file BLI_ghash.c.

◆ hashsizes

#define hashsizes   BLI_ghash_hash_sizes

Definition at line 45 of file BLI_ghash.c.

Typedef Documentation

◆ Entry

typedef struct Entry Entry

◆ GHashEntry

typedef struct GHashEntry GHashEntry

◆ GSetEntry

typedef Entry GSetEntry

Definition at line 79 of file BLI_ghash.c.

Function Documentation

◆ BLI_ghash_buckets_len()

int BLI_ghash_buckets_len ( const GHash gh)

Definition at line 1088 of file BLI_ghash.c.

References GHash::nbuckets.

Referenced by BLI_gset_buckets_len(), and TEST().

◆ BLI_ghash_calc_quality()

double BLI_ghash_calc_quality ( GHash gh)

Definition at line 1199 of file BLI_ghash.c.

References BLI_ghash_calc_quality_ex(), and NULL.

◆ BLI_ghash_calc_quality_ex()

double BLI_ghash_calc_quality_ex ( GHash gh,
double r_load,
double r_variance,
double r_prop_empty_buckets,
double r_prop_overloaded_buckets,
int *  r_biggest_bucket 
)

◆ BLI_ghash_clear()

void BLI_ghash_clear ( GHash gh,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp 
)

◆ BLI_ghash_clear_ex()

void BLI_ghash_clear_ex ( GHash gh,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp,
unsigned int  nentries_reserve 
)

Reset gh clearing all entries.

Parameters
keyfreefpOptional callback to free the key.
valfreefpOptional callback to free the value.
nentries_reserveOptionally reserve the number of members that the hash will hold.

Definition at line 845 of file BLI_ghash.c.

References BLI_mempool_clear_ex(), GHash::entrypool, ghash_buckets_reset(), and ghash_free_cb().

Referenced by BKE_outliner_treehash_rebuild_from_treestore(), BLI_ghash_clear(), BLI_gset_clear_ex(), and filelist_cache_clear().

◆ BLI_ghash_copy()

GHash* BLI_ghash_copy ( const GHash gh,
GHashKeyCopyFP  keycopyfp,
GHashValCopyFP  valcopyfp 
)

Copy given GHash. Keys and values are also copied if relevant callback is provided, else pointers remain the same.

Definition at line 694 of file BLI_ghash.c.

References ghash_copy().

Referenced by BKE_vfontdata_copy(), and TEST().

◆ BLI_ghash_ensure_p()

bool BLI_ghash_ensure_p ( GHash gh,
void key,
void ***  r_val 
)

Ensure key is exists in gh.

This handles the common situation where the caller needs ensure a key is added to gh, constructing a new value in the case the key isn't found. Otherwise use the existing value.

Such situations typically incur multiple lookups, however this function avoids them by ensuring the key is added, returning a pointer to the value so it can be used or initialized by the caller.

Returns
true when the value didn't need to be added. (when false, the caller must initialize the value).

Definition at line 755 of file BLI_ghash.c.

References BLI_mempool_alloc(), e, GHash::entrypool, ghash_bucket_index(), ghash_insert_ex_keyonly_entry(), ghash_keyhash(), ghash_lookup_entry_ex(), hash, and NULL.

Referenced by BKE_icon_set(), BKE_main_idmap_create(), BKE_main_idmap_insert_id(), BKE_main_library_weak_reference_add_item(), BKE_main_relations_create(), BKE_outliner_treehash_add_element(), bke_view_layer_verify_aov_cb(), BLO_memfile_write_init(), bm_face_region_pivot_edge_find(), BM_log_vert_before_modified(), bm_uuidwalk_facestep_begin(), bm_uuidwalk_pass_add(), bmo_planar_faces_exec(), ccd_build_deflector_hash_single(), drw_duplidata_load(), ED_object_data_xform_container_item_ensure(), ED_object_xform_skip_child_container_item_ensure(), edge_isect_ls_ensure(), EEVEE_motion_blur_cache_finish(), ghash_insert_face_edge_link(), ghash_insert_link(), gpencil_strokes_copy_exec(), GPU_pbvh_bmesh_buffers_update(), layer_collection_objects_sync(), lib_override_group_tag_data_object_to_collection_init_collection_process(), lib_override_resync_tagging_finalize_recurse(), main_relations_create_idlink_cb(), make_object_duplilist_real(), map_insert_vert(), material_opaque(), material_shadow(), menu_types_add_from_keymap_items(), modifyMesh(), nlaevalchan_verify(), read_library_linked_ids(), tc_mesh_customdatacorrect_init_vert(), view_layer_bases_hash_create(), workbench_image_setup_ex(), and workbench_material_setup_ex().

◆ BLI_ghash_ensure_p_ex()

bool BLI_ghash_ensure_p_ex ( GHash gh,
const void key,
void ***  r_key,
void ***  r_val 
)

A version of BLI_ghash_ensure_p that allows caller to re-assign the key. Typically used when the key is to be duplicated.

Warning
Caller must write to r_key when returning false.

Definition at line 771 of file BLI_ghash.c.

References BLI_mempool_alloc(), BMVert::e, e, GHash::entrypool, ghash_bucket_index(), ghash_insert_ex_keyonly_entry(), ghash_keyhash(), ghash_lookup_entry_ex(), hash, and NULL.

Referenced by BKE_previewimg_cached_ensure(), drw_uniform_attrs_pool_ensure(), nlaevalchan_verify_key(), and scene_get_depsgraph_p().

◆ BLI_ghash_flag_clear()

void BLI_ghash_flag_clear ( GHash gh,
unsigned int  flag 
)

Clear a GHash flag.

Definition at line 880 of file BLI_ghash.c.

References GHash::flag, and BLI_mempool::flag.

◆ BLI_ghash_flag_set()

void BLI_ghash_flag_set ( GHash gh,
unsigned int  flag 
)

Sets a GHash flag.

Definition at line 875 of file BLI_ghash.c.

References GHash::flag, and BLI_mempool::flag.

Referenced by BM_mesh_bevel(), and TEST().

◆ BLI_ghash_free()

void BLI_ghash_free ( GHash gh,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp 
)

Frees the GHash and its members.

Parameters
ghThe GHash to free.
keyfreefpOptional callback to free the key.
valfreefpOptional callback to free the value.

Definition at line 863 of file BLI_ghash.c.

References BLI_assert, BLI_mempool_destroy(), BLI_mempool_len(), GHash::buckets, GHash::entrypool, ghash_free_cb(), MEM_freeN, and GHash::nentries.

Referenced by armature_dissolve_selected_exec(), BKE_addon_pref_type_free(), BKE_area_region_free(), BKE_armature_bone_hash_free(), BKE_blendfile_link_append_context_free(), BKE_curve_editNurb_keyIndex_free(), BKE_fcurve_pathcache_destroy(), BKE_gpencil_merge_materials(), BKE_gpencil_merge_materials_table_get(), BKE_gpencil_stroke_copy_to_keyframes(), BKE_icons_free(), BKE_keyconfig_pref_type_free(), BKE_lib_override_library_free(), BKE_main_collection_sync_remap(), BKE_main_idmap_destroy(), BKE_main_library_weak_reference_destroy(), BKE_main_relations_free(), BKE_nlastrip_validate_name(), BKE_node_instance_hash_free(), BKE_node_system_exit(), BKE_object_defgroup_validmap_get(), BKE_object_material_remap_calc(), BKE_outliner_treehash_free(), BKE_pose_channels_hash_free(), BKE_scene_free_depsgraph_hash(), BKE_scene_undo_depsgraphs_restore(), BKE_sim_debug_data_free(), BKE_tracking_copy(), BKE_vfont_free_data(), BKE_view_layer_free_ex(), BKE_view_layer_verify_aov(), BLI_args_destroy(), BLI_array_store_is_valid(), BLI_gset_free(), blo_cache_storage_end(), blo_filedata_free(), BLO_memfile_merge(), BLO_memfile_write_finalize(), bm_edgering_pair_calc(), bm_edgering_pair_store_free(), bm_face_region_pivot_edge_find(), bm_log_entry_free(), BM_log_free(), BM_log_mesh_elems_reorder(), BM_mesh_bevel(), BM_mesh_edgesplit(), BM_mesh_intersect(), BM_mesh_remap(), bm_uuidwalk_free(), bmo_extrude_discrete_faces_exec(), bmo_extrude_vert_indiv_exec(), bmo_inset_region_exec(), bmo_mesh_copy(), bmo_op_slots_free(), bmo_planar_faces_exec(), bmo_triangle_fill_exec(), bmo_weld_verts_exec(), BPY_rna_exit(), build_mesh_leaf_node(), createTransObject(), discard_stabilization_working_context(), DNA_alias_maps(), DNA_sdna_alias_data_ensure(), DNA_sdna_free(), drw_duplidata_free(), DRW_uniform_attrs_pool_free(), ED_armature_join_objects_exec(), ED_gpencil_join_objects_exec(), ED_gpencil_layer_merge(), ED_gpencil_select_stroke_segment(), ED_gpencil_strokes_copybuf_free(), ED_object_data_xform_container_destroy(), ED_object_xform_skip_child_container_destroy(), edbm_face_split_by_edges_exec(), EEVEE_materials_cache_finish(), EEVEE_motion_blur_data_free(), EEVEE_motion_blur_swap_data(), filelist_cache_free(), filelist_free(), free_context_function_ghash(), free_scratch(), fsmenu_xdg_user_dirs_free(), GEO_uv_parametrizer_delete(), gpencil_analyze_strokes(), gpencil_bake_grease_pencil_animation_exec(), gpencil_brush_clone_free(), gpencil_extract_palette_from_vertex(), gpencil_fill_modal(), gpencil_generate_edgeloops(), gpencil_interpolate_exit(), gpencil_interpolate_seq_exec(), gpencil_sculpt_brush_apply_event(), gpencil_sculpt_brush_exit(), gpencil_sculpt_brush_init(), gpencil_select_vertex_color_exec(), gpencil_strokes_copypastebuf_colors_material_to_name_free(), gpencil_strokes_copypastebuf_colors_name_to_material_free(), gpencil_strokes_paste_exec(), GPU_pbvh_bmesh_buffers_update(), IMB_moviecache_free(), imb_thread_cache_exit(), imb_tile_cache_exit(), int4_ghash_tests(), int_ghash_tests(), knife_add_cut(), knifetool_exit_ex(), lib_override_group_tag_data_clear(), lib_override_library_main_resync_on_library_indirect_level(), lib_override_library_resync(), make(), make_duplis_font(), make_object_duplilist_real(), make_structDNA(), mask_clipboard_free_ex(), menu_items_from_ui_create(), mesh_get_x_mirror_faces(), mesh_undostep_reference_elems_from_objects(), modifyMesh(), multi_small_ghash_tests(), nlaeval_free(), OVERLAY_armature_cache_finish(), palette_extract_img_exec(), pbvh_bmesh_collapse_short_edges(), postEditBoneDuplicate(), randint_ghash_tests(), read_library_linked_ids(), recalcData_gpencil_strokes(), RNA_exit(), RNA_free(), scanfill_preprocess_self_isect(), SCULPT_cloth_simulation_free(), seq_cache_destruct(), seq_sequence_lookup_free(), sequencer_free(), state_delete(), stitch_init(), str_ghash_tests(), tc_mesh_customdatacorrect_free(), TEST(), text_autocomplete_free(), thumbnail_freejob(), tracks_map_free(), UI_blocklist_free(), uv_sculpt_stroke_init(), wm_gizmogrouptype_free(), wm_gizmomap_select_all_intern(), wm_gizmotype_free(), wm_link_append_exec(), WM_menutype_free(), wm_operatortype_free(), WM_paneltype_clear(), WM_uilisttype_free(), workbench_cache_finish(), and Freestyle::BlenderStrokeRenderer::~BlenderStrokeRenderer().

◆ BLI_ghash_haskey()

bool BLI_ghash_haskey ( const GHash gh,
const void key 
)
Returns
true if the key is in gh.

Definition at line 822 of file BLI_ghash.c.

References ghash_lookup_entry(), and NULL.

Referenced by animdata_keyframe_list_get(), BKE_gpencil_merge_materials(), BKE_gpencil_merge_materials_table_get(), BKE_node_instance_hash_haskey(), blo_cache_storage_entry_register(), bm_edgering_pair_interpolate(), bm_face_region_pivot_edge_find(), bm_log_face_from_id(), bm_log_face_id_get(), BM_log_face_removed(), BM_log_original_mask(), BM_log_original_vert_co(), BM_log_original_vert_data(), BM_log_original_vert_no(), bm_log_vert_from_id(), bm_log_vert_id_get(), BM_log_vert_removed(), bm_uuidwalk_facestep_begin(), bm_uuidwalk_pass_add(), bm_vert_is_uuid_connect(), ED_armature_bone_rename(), ghash_insert_ex(), ghash_insert_ex_keyonly(), ghash_insert_ex_keyonly_entry(), gpencil_analyze_strokes(), gpencil_bake_grease_pencil_animation_exec(), gpencil_brush_grab_stroke_init(), gpencil_copybuf_validate_colormap(), gpencil_extract_palette_from_vertex(), gpencil_interpolate_seq_exec(), gpencil_interpolate_set_points(), gpencil_interpolate_update_strokes(), gpencil_sculpt_brush_do_frame(), gpencil_select_vertex_color_exec(), gpencil_selected_hue_table(), gpencil_stroke_get_related(), gpencil_walk_edge(), lib_override_library_main_resync_on_library_indirect_level(), lib_override_library_resync(), menu_items_from_ui_create(), modifyMesh(), nla_editbone_name_check(), palette_extract_img_exec(), recalcData_gpencil_strokes(), seq_cache_recycle_linked(), seq_cache_thumbnail_put(), str_ghash_tests(), and wm_link_append_exec().

◆ BLI_ghash_insert()

void BLI_ghash_insert ( GHash gh,
void key,
void val 
)

Insert a key/value pair into the gh.

Note
Duplicates are not checked, the caller is expected to ensure elements are unique unless GHASH_FLAG_ALLOW_DUPES flag is set.

Definition at line 710 of file BLI_ghash.c.

References ghash_insert().

Referenced by _bmo_slot_copy(), add(), add_hit_to_facehits(), animdata_keyframe_list_get(), armature_bone_from_name_insert_recursive(), armature_dissolve_selected_exec(), attach_stabilization_baseline_data(), bevel_vert_construct(), BKE_addon_pref_type_add(), BKE_fcurve_pathcache_create(), BKE_gpencil_frame_selected_hash(), BKE_gpencil_merge_materials_table_get(), BKE_icon_delete_unmanaged(), BKE_keyconfig_pref_type_add(), BKE_lib_override_library_property_get(), BKE_library_make_local(), BKE_main_idmap_insert_id(), BKE_main_idmap_lookup_name(), BKE_main_library_weak_reference_create(), BKE_mask_clipboard_copy_from_layer(), BKE_nlastrip_validate_name(), BKE_node_instance_hash_insert(), BKE_object_defgroup_validmap_get(), BKE_pose_channel_ensure(), BKE_pose_channels_hash_ensure(), BKE_previewimg_cached_thumbnail_read(), BKE_scene_undo_depsgraphs_extract(), blo_cache_storage_entry_register(), BLO_memfile_merge(), bm_edgering_pair_calc(), bm_edgering_pair_store_create(), bm_isect_edge_tri(), bm_log_compress_ids_to_indices(), BM_log_face_added(), BM_log_face_modified(), BM_log_face_removed(), BM_log_vert_added(), BM_log_vert_removed(), BM_mesh_edgesplit(), BM_mesh_intersect_edges(), BM_mesh_remap(), BM_select_history_map_create(), bm_uuidwalk_init_from_edge(), bm_uuidwalk_pass_add(), bm_uuidwalk_rehash_facelinks(), bmo_edge_copy(), BMO_slot_map_insert(), bmo_triangle_fill_exec(), bmo_vert_copy(), bmo_weld_verts_exec(), cloth_sim_initialize_default_node_state(), createTransObject(), custom_bone_instance_shgroup(), debug_data_insert(), DNA_alias_maps(), DNA_sdna_alias_data_ensure_structs_map(), DNA_sdna_patch_struct_nr(), ED_armature_bone_rename(), ED_armature_join_objects_exec(), ED_curve_keyindex_hash_duplicate(), ED_gpencil_join_objects_exec(), ED_gpencil_layer_merge(), ED_gpencil_select_stroke_segment(), EEVEE_motion_blur_object_data_get(), filelist_entry_select_set(), filelist_file_cache_block_create(), filelist_file_ex(), find_family_object(), freetypechar_to_vchar(), fsmenu_xdg_user_dirs_parse(), GEO_uv_prepare_pin_index(), get_automasking_strokes_list(), get_bm_knife_edge(), get_bm_knife_vert(), gpencil_analyze_strokes(), gpencil_brush_grab_stroke_init(), gpencil_copybuf_validate_colormap(), gpencil_extract_palette_from_vertex(), gpencil_fill_modal(), gpencil_interpolate_seq_exec(), gpencil_selected_hue_table(), gpencil_stroke_get_related(), gpencil_stroke_pair_table(), gpencil_strokes_copypastebuf_colors_material_to_name_create(), gpencil_strokes_copypastebuf_colors_name_to_material_create(), gpencil_walk_edge(), icon_create(), imb_global_cache_get_tile(), imb_thread_cache_get_tile(), init_editNurb_keyIndex(), init_structDNA(), int4_ghash_tests(), int_ghash_tests(), internalAdd(), keyIndex_swap(), keyIndex_updateCV(), knife_get_face_kedges(), last_displayed_thumbnails_list_ensure(), lib_override_library_resync(), make_object_duplilist_real(), menu_items_from_ui_create(), mesh_get_x_mirror_faces(), mesh_undostep_reference_elems_from_objects(), modifyMesh(), multi_small_ghash_tests_one(), new_id_to_item_mapping_add(), nodeRegisterSocketType(), nodeRegisterType(), ntreeTypeAdd(), override_library_rna_path_mapping_ensure(), palette_extract_img_exec(), pbvh_bmesh_collapse_edge(), postEditBoneDuplicate(), randint_ghash_tests(), read_file_bhead_idname_map_create(), recalcData_gpencil_strokes(), record_face_kind(), register_context_function(), Freestyle::BlenderStrokeRenderer::RenderStrokeRepBasic(), rna_brna_structs_add(), RNA_def_property(), RNA_def_struct_identifier(), RNA_init(), seq_sequence_lookup_append_effect(), seq_sequence_lookup_build_from_seqbase(), sequencer_thumbnail_ghash_init(), set_lowest_face_tri(), stitch_init(), str_ghash_tests(), tc_mesh_customdatacorrect_init_vert(), TEST(), text_autocomplete_build(), tracking_tracks_copy(), tracks_map_insert(), uv_sculpt_stroke_init(), wm_gizmogrouptype_append__end(), WM_gizmomap_gizmo_hash_new(), wm_gizmotype_append__end(), wm_link_append_exec(), WM_menutype_add(), wm_operatortype_append__end(), WM_operatortype_append_macro(), WM_operatortype_append_macro_ptr(), WM_paneltype_add(), and WM_uilisttype_add().

◆ BLI_ghash_len()

uint BLI_ghash_len ( const GHash gh)

◆ BLI_ghash_lookup()

void* BLI_ghash_lookup ( const GHash gh,
const void key 
)

Lookup the value of key in gh.

Parameters
keyThe key to lookup.
Returns
the value for key or NULL.
Note
When NULL is a valid value, use BLI_ghash_lookup_p to differentiate a missing key from a key with a NULL value. (Avoids calling BLI_ghash_haskey before BLI_ghash_lookup)

Definition at line 734 of file BLI_ghash.c.

References BLI_assert, e, GHash::flag, ghash_lookup_entry(), and NULL.

Referenced by access_stabilization_baseline_data(), add_hit_to_facehits(), BKE_addon_pref_type_find(), BKE_armature_find_bone_name(), BKE_fcurve_pathcache_find(), BKE_fcurve_pathcache_find_array(), BKE_gpencil_frame_selected_hash(), BKE_gpencil_merge_materials(), BKE_keyconfig_pref_type_find(), BKE_lib_override_library_property_find(), BKE_lib_query_unused_ids_tag(), BKE_main_idmap_lookup_name(), BKE_main_idmap_lookup_uuid(), BKE_main_library_weak_reference_remove_item(), BKE_main_library_weak_reference_search_item(), BKE_mask_clipboard_copy_from_layer(), BKE_mask_clipboard_paste_to_layer(), BKE_node_instance_hash_lookup(), BKE_object_defgroup_validmap_get(), BKE_outliner_treehash_lookup_group(), BKE_outliner_treehash_remove_element(), BKE_pose_channel_find_name(), BKE_pose_channels_is_valid(), BKE_previewimg_cached_get(), BKE_scene_get_depsgraph(), BKE_tracking_copy(), BKE_view_layer_base_find(), BKE_view_layer_verify_aov(), blo_cache_storage_entry_clear_in_old(), blo_cache_storage_entry_restore_in_new(), BLO_memfile_merge(), bm_edgering_pair_calc(), bm_edgering_pair_interpolate(), bm_face_region_pivot_edge_find(), bm_face_region_pivot_edge_use_best(), bm_face_region_vert_pass_id(), bm_isect_edge_tri(), bm_log_face_from_id(), bm_log_face_id_get(), BM_log_face_removed(), BM_log_mesh_elems_reorder(), BM_log_original_mask(), BM_log_original_vert_co(), BM_log_original_vert_data(), BM_log_original_vert_no(), BM_log_vert_before_modified(), bm_log_vert_from_id(), bm_log_vert_id_get(), BM_log_vert_removed(), BM_mesh_edgesplit(), BM_mesh_intersect_edges(), BM_mesh_remap(), BM_select_history_merge_from_targetmap(), bmo_edge_copy(), bmo_extrude_discrete_faces_exec(), bmo_extrude_vert_indiv_exec(), bmo_face_copy(), bmo_triangle_fill_exec(), calculate_struct_sizes(), ccd_update_deflector_hash_single(), createTransObject(), custom_bone_instance_shgroup(), debug_data_insert(), dna_sdna_alias_from_static_elem_full(), do_cloth_brush_build_constraints_task_cb_ex(), do_cloth_brush_solve_simulation_task_cb_ex(), DRW_uniform_attrs_pool_find_ubo(), ED_gpencil_layer_merge(), ed_screen_context(), EEVEE_motion_blur_object_data_get(), filelist_entry_is_selected(), filelist_entry_select_get(), filelist_file_ex(), find_bevvert(), find_bhead_from_code_name(), find_bhead_from_idname(), find_vfont_char(), foreach_libblock_link_append_callback(), blender::ed::outliner::foreach_natural_hierarchy_child(), fsmenu_xdg_insert_entry(), generate(), GEO_uv_find_pin_index(), GEO_uv_prepare_pin_index(), get_bm_knife_edge(), get_bm_knife_vert(), get_face_kind(), get_lowest_face_tri(), get_next_free_id(), getCVKeyIndex(), gpencil_brush_clone_add(), gpencil_brush_grab_apply_cached(), gpencil_brush_grab_store_points(), gpencil_brush_grab_stroke_init(), gpencil_check_collision(), gpencil_copybuf_validate_colormap(), gpencil_interpolate_seq_exec(), gpencil_interpolate_set_points(), gpencil_interpolate_update_strokes(), gpencil_strokes_copy_exec(), gpencil_strokes_paste_exec(), icon_ghash_lookup(), imb_global_cache_get_tile(), IMB_moviecache_get(), IMB_moviecache_has_frame(), imb_thread_cache_get_tile(), imb_tile_cache_tile_free(), int4_ghash_tests(), int_ghash_tests(), knife_get_face_kedges(), last_displayed_thumbnails_list_ensure(), lib_override_hierarchy_dependencies_recursive_tag(), lib_override_hierarchy_dependencies_recursive_tag_from(), lib_override_library_main_resync_on_library_indirect_level(), lib_override_library_remap(), lib_override_library_resync(), lib_override_linked_group_tag(), lib_override_linked_group_tag_recursive(), lib_override_overrides_group_tag_recursive(), lib_override_resync_tagging_finalize_recurse(), lib_override_root_find(), lib_override_root_hierarchy_set(), lib_query_unused_ids_tag_recurse(), library_foreach_ID_link(), library_make_local_copying_check(), lookUp(), make_object_duplilist_real(), menu_items_from_ui_create(), mesh_get_x_mirror_faces(), modifyMesh(), multi_small_ghash_tests_one(), mywrite_id_begin(), nodeSocketTypeFind(), nodeTypeFind(), ntreeTypeFind(), pchan_duplicate_map(), randint_ghash_tests(), Freestyle::BlenderStrokeRenderer::RenderStrokeRepBasic(), RNA_def_struct(), RNA_def_struct_nested(), RNA_struct_find(), scanfill_preprocess_self_isect(), SCULPT_cloth_sim_activate_nodes(), seq_cache_get_ex(), seq_sequence_lookup_append_effect(), seq_sequence_lookup_effects_by_seq(), seq_sequence_lookup_meta_by_seq(), SEQ_sequence_lookup_seq_by_name(), sequencer_thumbnail_ghash_init(), set_lowest_face_tri(), stitch_init(), stitch_uv_edge_generate_linked_edges(), str_ghash_tests(), tc_mesh_customdatacorrect_apply_vert(), tc_mesh_vert_orig_co_get(), TEST(), text_autocomplete_build(), thumbnail_start_job(), tracking_plane_tracks_copy(), tracks_map_merge(), UI_block_region_set(), UI_blocklist_free_inactive(), uv_edge_get(), uv_sculpt_stroke_init(), version_elem_static_from_alias(), version_struct_alias_from_static(), version_struct_static_from_alias(), view_layer_objects_base_cache_validate(), WM_gizmo_group_type_free(), WM_gizmogrouptype_find(), WM_gizmotype_find(), WM_gizmotype_remove(), wm_link_append_exec(), WM_menutype_find(), WM_operatortype_find(), WM_paneltype_find(), and WM_uilisttype_find().

◆ BLI_ghash_lookup_default()

void* BLI_ghash_lookup_default ( const GHash gh,
const void key,
void val_default 
)

A version of BLI_ghash_lookup which accepts a fallback argument.

Definition at line 741 of file BLI_ghash.c.

References BLI_assert, e, GHash::flag, and ghash_lookup_entry().

Referenced by DNA_alias_maps(), DNA_sdna_alias_data_ensure(), and DNA_struct_find_nr_wrapper().

◆ BLI_ghash_lookup_p()

void** BLI_ghash_lookup_p ( GHash gh,
const void key 
)

◆ BLI_ghash_new()

GHash* BLI_ghash_new ( GHashHashFP  hashfp,
GHashCmpFP  cmpfp,
const char *  info 
)

◆ BLI_ghash_new_ex()

GHash* BLI_ghash_new_ex ( GHashHashFP  hashfp,
GHashCmpFP  cmpfp,
const char *  info,
unsigned int  nentries_reserve 
)

Creates a new, empty GHash.

Parameters
hashfpHash callback.
cmpfpComparison callback.
infoIdentifier string for the GHash.
nentries_reserveOptionally reserve the number of members that the hash will hold. Use this to avoid resizing buckets if the size is known or can be closely approximated.
Returns
An empty GHash.

Definition at line 681 of file BLI_ghash.c.

References ghash_new().

Referenced by BKE_outliner_treehash_create_from_treestore(), BLI_ghash_int_new_ex(), BLI_ghash_new(), BLI_ghash_pair_new_ex(), BLI_ghash_ptr_new_ex(), BLI_ghash_str_new_ex(), BM_log_create(), DNA_alias_maps(), filelist_cache_init(), ghash_bmelem_new_ex(), and mesh_get_x_mirror_faces().

◆ BLI_ghash_pop()

bool BLI_ghash_pop ( GHash gh,
GHashIterState state,
void **  r_key,
void **  r_val 
)

Remove a random entry from gh, returning true if a key/value pair could be removed, false otherwise.

Parameters
r_keyThe removed key.
r_valThe removed value.
stateUsed for efficient removal.
Returns
true if there was something to pop, false if ghash was already empty.

Definition at line 827 of file BLI_ghash.c.

References BLI_assert, BLI_mempool_free(), BMVert::e, e, GHash::entrypool, GHash::flag, ghash_pop(), NULL, and state.

Referenced by int_ghash_tests(), and TEST().

◆ BLI_ghash_popkey()

void* BLI_ghash_popkey ( GHash gh,
const void key,
GHashKeyFreeFP  keyfreefp 
)

Remove key from gh, returning the value or NULL if the key wasn't found.

Parameters
keyThe key to remove.
keyfreefpOptional callback to free the key.
Returns
the value of key int gh or NULL.

Definition at line 805 of file BLI_ghash.c.

References BLI_assert, BLI_mempool_free(), e, GHash::entrypool, GHash::flag, ghash_bucket_index(), ghash_keyhash(), ghash_remove_ex(), hash, and NULL.

Referenced by BKE_icon_delete(), BKE_icon_delete_unmanaged(), BKE_node_instance_hash_pop(), BKE_previewimg_cached_release(), filelist_file_cache_block_create(), filelist_file_ex(), mesh_undostep_reference_elems_from_objects(), popCVKeyIndex(), and TEST().

◆ BLI_ghash_reinsert()

bool BLI_ghash_reinsert ( GHash gh,
void key,
void val,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp 
)

Inserts a new value to a key that may already be in ghash.

Avoids BLI_ghash_remove, BLI_ghash_insert calls (double lookups)

Returns
true if a new key has been added.

Definition at line 715 of file BLI_ghash.c.

References ghash_insert_safe().

Referenced by BKE_object_material_remap_calc(), bm_log_face_id_set(), bm_log_vert_id_set(), do_moviecache_put(), seq_cache_put_ex(), tracks_map_merge(), and UI_block_region_set().

◆ BLI_ghash_remove()

bool BLI_ghash_remove ( GHash gh,
const void key,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp 
)

Remove key from gh, or return false if the key wasn't found.

Parameters
keyThe key to remove.
keyfreefpOptional callback to free the key.
valfreefpOptional callback to free the value.
Returns
true if key was removed from gh.

Definition at line 790 of file BLI_ghash.c.

References BLI_mempool_free(), e, GHash::entrypool, ghash_bucket_index(), ghash_keyhash(), ghash_remove_ex(), and hash.

Referenced by BKE_addon_pref_type_remove(), BKE_curve_editNurb_keyIndex_delCV(), BKE_icon_id_delete(), BKE_icons_deferred_free(), BKE_keyconfig_pref_type_remove(), BKE_layer_collection_sync(), BKE_lib_override_library_property_delete(), BKE_main_idmap_remove_id(), BKE_main_library_weak_reference_remove_item(), BKE_node_instance_hash_remove(), BKE_outliner_treehash_remove_element(), BKE_pose_channels_remove(), BKE_scene_free_view_layer_depsgraph(), BKE_sim_debug_data_clear_category(), BKE_sim_debug_data_remove_element(), BLI_gset_remove(), BM_log_face_removed(), BM_log_vert_removed(), check_unused_keys(), DNA_sdna_patch_struct_nr(), DRW_uniform_attrs_pool_clear_all(), ED_armature_bone_rename(), filelist_entry_select_set(), filelist_file_cache_block_release(), filelist_file_ex(), imb_global_cache_get_tile(), IMB_moviecache_cleanup(), IMB_moviecache_remove(), imb_thread_cache_get_tile(), imb_tile_cache_tile_free(), menu_items_from_ui_create(), nodeUnregisterSocketType(), nodeUnregisterType(), ntreeTypeFreeLink(), RNA_def_struct_identifier(), SEQ_cache_cleanup(), seq_cache_cleanup_sequence(), seq_cache_free_temp_cache(), seq_cache_recycle_linked(), seq_cache_thumbnail_cleanup(), UI_blocklist_free_inactive(), WM_gizmo_group_type_free_ptr(), WM_gizmotype_remove_ptr(), WM_menutype_freelink(), WM_operatortype_remove_ptr(), WM_paneltype_remove(), and WM_uilisttype_remove_ptr().

◆ BLI_ghash_replace_key()

void* BLI_ghash_replace_key ( GHash gh,
void key 
)

Replaces the key of an item in the gh.

Use when a key is re-allocated or its memory location is changed.

Returns
The previous key or NULL if not found, the caller may free if it's needed.

Definition at line 721 of file BLI_ghash.c.

References BMVert::e, e, ghash_bucket_index(), ghash_keyhash(), ghash_lookup_entry_ex(), hash, and NULL.

Referenced by BLI_gset_replace_key().

◆ BLI_ghash_reserve()

void BLI_ghash_reserve ( GHash gh,
unsigned int  nentries_reserve 
)

Reserve given amount of entries (resize gh accordingly if needed).

Definition at line 699 of file BLI_ghash.c.

References ghash_buckets_contract(), and ghash_buckets_expand().

Referenced by BM_log_all_added(), int4_ghash_tests(), int_ghash_tests(), multi_small_ghash_tests_one(), randint_ghash_tests(), and str_ghash_tests().

◆ BLI_ghashIterator_free()

void BLI_ghashIterator_free ( GHashIterator ghi)

◆ BLI_ghashIterator_init()

void BLI_ghashIterator_init ( GHashIterator ghi,
GHash gh 
)

◆ BLI_ghashIterator_new()

GHashIterator* BLI_ghashIterator_new ( GHash gh)

Create a new GHashIterator. The hash table must not be mutated while the iterator is in use, and the iterator will step exactly #BLI_ghash_len(gh) times before becoming done.

Parameters
ghThe GHash to iterate over.
Returns
Pointer to a new iterator.

Definition at line 891 of file BLI_ghash.c.

References BLI_ghashIterator_init(), and MEM_mallocN.

Referenced by BKE_main_relations_tag_set(), BKE_node_instance_hash_iterator_new(), BLI_gsetIterator_new(), IMB_moviecacheIter_new(), lib_override_library_main_resync_on_library_indirect_level(), nodeSocketTypeGetIterator(), nodeTypeGetIterator(), ntreeTypeGetIterator(), sb_detect_aabb_collisionCached(), sb_detect_edge_collisionCached(), sb_detect_face_collisionCached(), sb_detect_face_pointCached(), and sb_detect_vertex_collisionCached().

◆ BLI_ghashIterator_step()

void BLI_ghashIterator_step ( GHashIterator ghi)

◆ BLI_gset_add()

bool BLI_gset_add ( GSet gs,
void key 
)

A version of BLI_gset_insert which checks first if the key is in the set.

Returns
true if a new key has been added.
Note
GHash has no equivalent to this because typically the value would be different.

Definition at line 969 of file BLI_ghash.c.

References ghash_insert_safe_keyonly(), and NULL.

Referenced by add_selected_item(), animdata_filter_remove_duplis(), BKE_fcurves_calc_keyed_frames_ex(), BKE_lib_query_foreachid_process(), BKE_library_foreach_ID_embedded(), BKE_library_make_local(), BKE_main_gset_create(), BKE_main_id_repair_duplicate_names_listbase(), BKE_pbvh_get_grid_updates(), BLO_blendhandle_get_linkable_groups(), bm_isect_tri_tri(), BM_mesh_intersect(), bmw_FaceLoopWalker_step(), collection_find_data_to_edit(), createTransObject(), do_render_compositor_scenes(), draw_seq_strip_thumbnail(), drw_batch_cache_generate_requested_delayed(), ED_object_xform_array_m4(), ED_object_xform_skip_child_container_item_ensure_from_array(), get_used_lightgroups(), gpencil_select_same_material(), gpu_material_library_use_function(), IMB_thumb_path_lock(), knife_make_face_cuts(), layer_collection_find_data_to_edit(), library_foreach_ID_link(), library_make_local_copying_check(), loop_find_region(), make_override_library_exec(), make_structDNA(), menu_items_from_ui_create(), menu_types_add_from_keymap_items(), nla_eval_domain_action(), outliner_find_objects_to_delete(), outliner_hide_find_data_to_edit(), pbvh_bmesh_collapse_edge(), pbvh_bmesh_create_nodes_fast_recursive(), pbvh_bmesh_node_finalize(), pbvh_bmesh_split_edge(), pose_face_sets_fk_find_masked_floodfill_cb(), pose_face_sets_floodfill_cb(), pose_ik_chain_init_face_sets(), py_bvhtree_overlap(), screen_ctx_sel_actions_impl(), sculpt_boundary_index_add(), sculpt_expand_geodesics_from_state_boundary(), sculpt_expand_modal(), sculpt_expand_snap_initialize_from_enabled(), SCULPT_geodesic_from_vertex(), SCULPT_geodesic_from_vertex_and_symm(), select_more_less_seq__internal(), SEQ_fcurves_by_strip_get(), similar_edge_select_exec(), similar_face_select_exec(), similar_vert_select_exec(), skin_root_clear(), skin_root_mark_exec(), stats_object(), subdiv_ccg_affected_face_adjacency(), uv_rip_pairs_add(), uv_rip_single_from_loop(), uv_select_overlap(), and wm_msg_rna_update_by_id().

◆ BLI_gset_buckets_len()

int BLI_gset_buckets_len ( const GSet gs)

Definition at line 1092 of file BLI_ghash.c.

References BLI_ghash_buckets_len().

◆ BLI_gset_calc_quality()

double BLI_gset_calc_quality ( GSet gs)

Definition at line 1203 of file BLI_ghash.c.

References BLI_ghash_calc_quality_ex(), and NULL.

◆ BLI_gset_calc_quality_ex()

double BLI_gset_calc_quality_ex ( GSet gs,
double r_load,
double r_variance,
double r_prop_empty_buckets,
double r_prop_overloaded_buckets,
int *  r_biggest_bucket 
)

Definition at line 1184 of file BLI_ghash.c.

References BLI_ghash_calc_quality_ex().

◆ BLI_gset_clear()

void BLI_gset_clear ( GSet gs,
GSetKeyFreeFP  keyfreefp 
)

◆ BLI_gset_clear_ex()

void BLI_gset_clear_ex ( GSet gs,
GSetKeyFreeFP  keyfreefp,
const uint  nentries_reserve 
)

Definition at line 1027 of file BLI_ghash.c.

References BLI_ghash_clear_ex(), and NULL.

◆ BLI_gset_copy()

GSet* BLI_gset_copy ( const GSet gs,
GSetKeyCopyFP  keycopyfp 
)

Copy given GSet. Keys are also copied if callback is provided, else pointers remain the same.

Definition at line 952 of file BLI_ghash.c.

References ghash_copy(), and NULL.

◆ BLI_gset_ensure_p_ex()

bool BLI_gset_ensure_p_ex ( GSet gs,
const void key,
void ***  r_key 
)

Set counterpart to BLI_ghash_ensure_p_ex. similar to BLI_gset_add, except it returns the key pointer.

Warning
Caller must write to r_key when returning false.

Definition at line 974 of file BLI_ghash.c.

References BLI_mempool_alloc(), e, ghash_bucket_index(), ghash_insert_ex_keyonly_entry(), ghash_keyhash(), ghash_lookup_entry_ex(), hash, and NULL.

Referenced by bm_edgering_pair_calc(), engine_tile_highlight_set(), IMB_anim_index_rebuild_context(), object_base_unique(), SEQ_collection_append_strip(), and WM_msg_subscribe_with_key().

◆ BLI_gset_flag_clear()

void BLI_gset_flag_clear ( GSet gs,
uint  flag 
)

Definition at line 1047 of file BLI_ghash.c.

References BLI_mempool::flag.

◆ BLI_gset_flag_set()

void BLI_gset_flag_set ( GSet gs,
uint  flag 
)

Definition at line 1042 of file BLI_ghash.c.

References BLI_mempool::flag.

Referenced by BKE_mesh_merge_verts().

◆ BLI_gset_free()

void BLI_gset_free ( GSet gs,
GSetKeyFreeFP  keyfreefp 
)

Definition at line 1037 of file BLI_ghash.c.

References BLI_ghash_free(), and NULL.

Referenced by animdata_filter_remove_duplis(), animsys_evaluate_nla_domain(), BKE_fcurves_calc_keyed_frames_ex(), BKE_library_make_local(), BKE_main_id_repair_duplicate_names_listbase(), BKE_main_idmap_destroy(), BKE_modifier_check_uuids_unique_and_report(), BKE_pbvh_free(), BKE_pbvh_get_grid_updates(), BKE_pose_check_uuids_unique_and_report(), BKE_scene_objects_iterator_end(), BLO_blendhandle_get_linkable_groups(), bm_edgering_pair_calc(), BM_mesh_beautify_fill(), BM_mesh_intersect(), bm_uuidwalk_free(), bmo_grid_fill_exec(), bmo_subdivide_edgering_exec(), BMW_end(), bone_mouse_select_menu(), cachefile_handle_free(), collection_flag_exec(), collection_instance_exec(), collection_isolate_exec(), collection_link_exec(), collection_view_layer_exec(), collection_visibility_exec(), collections_view_layer_poll(), createTransObject(), do_render_compositor_scenes(), drw_task_graph_deinit(), ED_image_save_all_modified_info(), ED_object_xform_array_m4(), ED_object_xform_skip_child_container_item_ensure_from_array(), gpencil_select_same_material(), gpu_node_graph_free(), IMB_thumb_locks_release(), join_tracks_exec(), knifetool_exit_ex(), last_displayed_thumbnails_list_free(), lib_override_library_create_post_process(), library_foreach_ID_data_cleanup(), loop_find_regions(), make_override_library_exec(), make_structDNA(), menu_items_from_ui_create(), outliner_collection_delete(), outliner_delete_exec(), outliner_hide_exec(), pbvh_bmesh_node_split(), pose_ik_chain_init_face_sets(), pose_ik_chain_init_face_sets_fk(), py_bvhtree_overlap(), RE_FreeRender(), recalcData_pose(), render_pipeline_free(), screen_ctx_sel_actions_impl(), sculpt_boundary_indices_init(), sculpt_expand_cache_data_free(), sculpt_expand_geodesics_from_state_boundary(), sculpt_expand_modal(), SCULPT_geodesic_from_vertex(), SCULPT_geodesic_from_vertex_and_symm(), select_more_less_seq__internal(), selected_items_free(), SEQ_animation_duplicate(), SEQ_collection_free(), SEQ_free_animdata(), SEQ_offset_animdata(), seq_proxy_build_job(), SEQ_relations_check_uuids_unique_and_report(), sequencer_copy_animation(), sequencer_rebuild_proxy_exec(), similar_edge_select_exec(), similar_face_select_exec(), similar_vert_select_exec(), skin_root_mark_exec(), special_aftertrans_update__pose(), stats_update(), subdiv_ccg_average_faces_boundaries_and_corners(), uv_rip_pairs_free(), uv_rip_single_free(), uv_select_overlap(), view_layer_add_used_lightgroups_exec(), view_layer_remove_unused_lightgroups_exec(), and WM_msgbus_destroy().

◆ BLI_gset_haskey()

bool BLI_gset_haskey ( const GSet gs,
const void key 
)

Definition at line 1007 of file BLI_ghash.c.

References ghash_lookup_entry(), and NULL.

Referenced by BKE_main_idmap_lookup_id(), BKE_mesh_merge_verts(), bm_edge_update_beauty_cost_single(), BM_mesh_beautify_fill(), BM_mesh_intersect(), bm_uuidwalk_pass_add(), bmw_ConnectedVertexWalker_step(), bmw_ConnectedVertexWalker_visitVertex(), bmw_EdgeboundaryWalker_begin(), bmw_EdgeboundaryWalker_step(), bmw_EdgeLoopWalker_step(), bmw_EdgeringWalker_step(), bmw_FaceLoopWalker_include_face(), bmw_FaceShellWalker_visitEdge(), bmw_IslandboundWalker_step(), bmw_IslandWalker_step_ex(), bmw_LoopShellWalker_visitEdgeWire(), bmw_LoopShellWalker_visitLoop(), bmw_LoopShellWireWalker_visitVert(), bmw_NonManifoldedgeWalker_begin(), bmw_NonManifoldedgeWalker_step(), bmw_UVEdgeWalker_begin(), bmw_UVEdgeWalker_step(), bmw_VertShellWalker_visitEdge(), bone_mouse_select_menu(), createTransObject(), do_render_compositor_scenes(), ED_image_save_all_modified_info(), ED_object_xform_skip_child_container_item_ensure_from_array(), gpencil_select_same_material(), is_edit_bone_selected(), is_object_selected(), is_pose_bone_selected(), library_make_local_copying_check(), loop_find_regions(), make_override_library_exec(), pbvh_bmesh_collapse_edge(), pbvh_bmesh_create_nodes_fast_recursive(), pbvh_bmesh_face_remove(), pbvh_bmesh_node_finalize(), pbvh_bmesh_split_edge(), pbvh_bmesh_vert_ownership_transfer(), pbvh_bmesh_vert_remove(), pose_face_sets_fk_find_masked_floodfill_cb(), pose_face_sets_floodfill_cb(), sculpt_boundary_indices_init(), sculpt_expand_face_state_get(), sculpt_expand_state_get(), SCULPT_geodesic_mesh_create(), sculpt_geodesic_mesh_test_dist_add(), SEQ_collection_has_strip(), uv_rip_pairs_add(), uv_rip_pairs_remove(), view_layer_remove_unused_lightgroups_exec(), and wm_msg_rna_update_by_id().

◆ BLI_gset_insert()

void BLI_gset_insert ( GSet gs,
void key 
)

◆ BLI_gset_len()

uint BLI_gset_len ( const GSet gs)

◆ BLI_gset_lookup()

void* BLI_gset_lookup ( const GSet gs,
const void key 
)

◆ BLI_gset_new()

GSet* BLI_gset_new ( GSetHashFP  hashfp,
GSetCmpFP  cmpfp,
const char *  info 
)

◆ BLI_gset_new_ex()

GSet* BLI_gset_new_ex ( GSetHashFP  hashfp,
GSetCmpFP  cmpfp,
const char *  info,
const uint  nentries_reserve 
)

◆ BLI_gset_pop()

bool BLI_gset_pop ( GSet gs,
GSetIterState state,
void **  r_key 
)

Remove a random entry from gs, returning true if a key could be removed, false otherwise.

Parameters
r_keyThe removed key.
stateUsed for efficient removal.
Returns
true if there was something to pop, false if gset was already empty.

Definition at line 1012 of file BLI_ghash.c.

References BLI_mempool_free(), e, ghash_pop(), NULL, and state.

Referenced by GPUCodegen::generate_library().

◆ BLI_gset_pop_key()

void* BLI_gset_pop_key ( GSet gs,
const void key 
)

Returns the pointer to the key if it's found, removing it from the GSet.

Note
Caller must handle freeing.

Definition at line 1067 of file BLI_ghash.c.

References BLI_mempool_free(), e, ghash_bucket_index(), ghash_keyhash(), ghash_remove_ex(), hash, and NULL.

◆ BLI_gset_reinsert()

bool BLI_gset_reinsert ( GSet gh,
void key,
GSetKeyFreeFP  keyfreefp 
)

Adds the key to the set (duplicates are managed). Matching BLI_ghash_reinsert

Returns
true if a new key has been added.

Definition at line 992 of file BLI_ghash.c.

References ghash_insert_safe_keyonly().

Referenced by BKE_cachefile_reader_open().

◆ BLI_gset_remove()

bool BLI_gset_remove ( GSet gs,
const void key,
GSetKeyFreeFP  keyfreefp 
)

◆ BLI_gset_replace_key()

void* BLI_gset_replace_key ( GSet gs,
void key 
)

Replaces the key to the set if it's found. Matching BLI_ghash_replace_key

Returns
The old key or NULL if not found.

Definition at line 997 of file BLI_ghash.c.

References BLI_ghash_replace_key().

◆ BLI_STATIC_ASSERT()

BLI_STATIC_ASSERT ( ARRAY_SIZE(hashsizes = =GHASH_MAX_SIZE,
"Invalid 'hashsizes' size  
)

◆ ghash_bucket_index()

BLI_INLINE uint ghash_bucket_index ( const GHash gh,
const uint  hash 
)

◆ ghash_buckets_contract()

static void ghash_buckets_contract ( GHash gh,
const uint  nentries,
const bool  user_defined,
const bool  force_shrink 
)
static

◆ ghash_buckets_expand()

static void ghash_buckets_expand ( GHash gh,
const uint  nentries,
const bool  user_defined 
)
static

Check if the number of items in the GHash is large enough to require more buckets, or small enough to require less buckets, and resize gh accordingly.

Definition at line 252 of file BLI_ghash.c.

References GHash::buckets, GHash::cursize, ghash_buckets_resize(), GHASH_LIMIT_GROW, GHASH_LIMIT_SHRINK, GHASH_MAX_SIZE, hashsizes, LIKELY, GHash::limit_grow, GHash::limit_shrink, GHash::nbuckets, and GHash::size_min.

Referenced by BLI_ghash_reserve(), ghash_buckets_reset(), ghash_copy(), ghash_insert_ex(), ghash_insert_ex_keyonly(), and ghash_insert_ex_keyonly_entry().

◆ ghash_buckets_reset()

BLI_INLINE void ghash_buckets_reset ( GHash gh,
const uint  nentries 
)

Clear and reset gh buckets, reserve again buckets for given number of entries.

Definition at line 340 of file BLI_ghash.c.

References GHash::buckets, GHash::cursize, ghash_buckets_expand(), GHASH_LIMIT_GROW, GHASH_LIMIT_SHRINK, hashsizes, GHash::limit_grow, GHash::limit_shrink, MEM_SAFE_FREE, GHash::nbuckets, GHash::nentries, and GHash::size_min.

Referenced by BLI_ghash_clear_ex(), and ghash_new().

◆ ghash_buckets_resize()

static void ghash_buckets_resize ( GHash gh,
const uint  nbuckets 
)
static

Expand buckets to the next size up or down.

Definition at line 183 of file BLI_ghash.c.

References BLI_assert, GHash::buckets, e, ghash_bucket_index(), ghash_entryhash(), hash, MEM_callocN, MEM_freeN, and GHash::nbuckets.

Referenced by ghash_buckets_contract(), and ghash_buckets_expand().

◆ ghash_copy()

static GHash* ghash_copy ( const GHash gh,
GHashKeyCopyFP  keycopyfp,
GHashValCopyFP  valcopyfp 
)
static

◆ ghash_entry_copy()

BLI_INLINE void ghash_entry_copy ( GHash gh_dst,
Entry dst,
const GHash gh_src,
const Entry src,
GHashKeyCopyFP  keycopyfp,
GHashValCopyFP  valcopyfp 
)

Definition at line 107 of file BLI_ghash.c.

References GHash::flag, Entry::key, NULL, and src.

Referenced by ghash_copy().

◆ ghash_entryhash()

BLI_INLINE uint ghash_entryhash ( const GHash gh,
const Entry e 
)

Get the full hash for an entry.

Definition at line 138 of file BLI_ghash.c.

References e, and GHash::hashfp.

Referenced by ghash_buckets_resize().

◆ ghash_find_next_bucket_index()

BLI_INLINE uint ghash_find_next_bucket_index ( const GHash gh,
uint  curr_bucket 
)

Find the index of next used bucket, starting from curr_bucket (gh is assumed non-empty).

Definition at line 158 of file BLI_ghash.c.

References BLI_assert_unreachable, GHash::buckets, and GHash::nbuckets.

Referenced by ghash_pop().

◆ ghash_free_cb()

static void ghash_free_cb ( GHash gh,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp 
)
static

Run free callbacks for freeing entries.

Definition at line 615 of file BLI_ghash.c.

References BLI_assert, GHash::buckets, e, GHash::flag, and GHash::nbuckets.

Referenced by BLI_ghash_clear_ex(), and BLI_ghash_free().

◆ ghash_insert()

BLI_INLINE void ghash_insert ( GHash gh,
void key,
void val 
)

Definition at line 491 of file BLI_ghash.c.

References ghash_bucket_index(), ghash_insert_ex(), ghash_keyhash(), and hash.

Referenced by BLI_ghash_insert().

◆ ghash_insert_ex()

BLI_INLINE void ghash_insert_ex ( GHash gh,
void key,
void val,
const uint  bucket_index 
)

Internal insert function. Takes hash and bucket_index arguments to avoid calling ghash_keyhash and ghash_bucket_index multiple times.

Definition at line 442 of file BLI_ghash.c.

References BLI_assert, BLI_ghash_haskey(), BLI_mempool_alloc(), GHash::buckets, BMVert::e, e, GHash::entrypool, GHash::flag, ghash_buckets_expand(), GHASH_FLAG_ALLOW_DUPES, and GHash::nentries.

Referenced by ghash_insert(), and ghash_insert_safe().

◆ ghash_insert_ex_keyonly()

BLI_INLINE void ghash_insert_ex_keyonly ( GHash gh,
void key,
const uint  bucket_index 
)

Insert function that doesn't set the value (use for GSet)

Definition at line 477 of file BLI_ghash.c.

References BLI_assert, BLI_ghash_haskey(), BLI_mempool_alloc(), GHash::buckets, e, GHash::entrypool, GHash::flag, ghash_buckets_expand(), GHASH_FLAG_ALLOW_DUPES, and GHash::nentries.

Referenced by BLI_gset_insert(), and ghash_insert_safe_keyonly().

◆ ghash_insert_ex_keyonly_entry()

BLI_INLINE void ghash_insert_ex_keyonly_entry ( GHash gh,
void key,
const uint  bucket_index,
Entry e 
)

Insert function that takes a pre-allocated entry.

Definition at line 460 of file BLI_ghash.c.

References BLI_assert, BLI_ghash_haskey(), GHash::buckets, e, GHash::flag, ghash_buckets_expand(), GHASH_FLAG_ALLOW_DUPES, and GHash::nentries.

Referenced by BLI_ghash_ensure_p(), BLI_ghash_ensure_p_ex(), and BLI_gset_ensure_p_ex().

◆ ghash_insert_safe()

BLI_INLINE bool ghash_insert_safe ( GHash gh,
void key,
void val,
const bool  override,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp 
)

◆ ghash_insert_safe_keyonly()

BLI_INLINE bool ghash_insert_safe_keyonly ( GHash gh,
void key,
const bool  override,
GHashKeyFreeFP  keyfreefp 
)

◆ ghash_keyhash()

BLI_INLINE uint ghash_keyhash ( const GHash gh,
const void key 
)

◆ ghash_lookup_entry()

BLI_INLINE Entry* ghash_lookup_entry ( const GHash gh,
const void key 
)

◆ ghash_lookup_entry_ex()

BLI_INLINE Entry* ghash_lookup_entry_ex ( const GHash gh,
const void key,
const uint  bucket_index 
)

Internal lookup function. Takes hash and bucket_index arguments to avoid calling ghash_keyhash and ghash_bucket_index multiple times.

Definition at line 368 of file BLI_ghash.c.

References GHash::buckets, GHash::cmpfp, e, NULL, and UNLIKELY.

Referenced by BLI_ghash_ensure_p(), BLI_ghash_ensure_p_ex(), BLI_ghash_replace_key(), BLI_gset_ensure_p_ex(), ghash_insert_safe(), ghash_insert_safe_keyonly(), and ghash_lookup_entry().

◆ ghash_lookup_entry_prev_ex()

BLI_INLINE Entry* ghash_lookup_entry_prev_ex ( GHash gh,
const void key,
Entry **  r_e_prev,
const uint  bucket_index 
)

Internal lookup function, returns previous entry of target one too. Takes bucket_index argument to avoid calling ghash_keyhash and ghash_bucket_index multiple times. Useful when modifying buckets somehow (like removing an entry...).

Definition at line 388 of file BLI_ghash.c.

References GHash::buckets, GHash::cmpfp, e, NULL, and UNLIKELY.

Referenced by ghash_remove_ex().

◆ ghash_new()

static GHash* ghash_new ( GHashHashFP  hashfp,
GHashCmpFP  cmpfp,
const char *  info,
const uint  nentries_reserve,
const uint  flag 
)
static

◆ ghash_pop()

static Entry* ghash_pop ( GHash gh,
GHashIterState state 
)
static

Remove a random entry and return it (or NULL if empty), caller must free from gh->entrypool.

Definition at line 591 of file BLI_ghash.c.

References BLI_assert, GHash::buckets, e, ghash_find_next_bucket_index(), ghash_remove_ex(), GHash::nentries, NULL, and state.

Referenced by BLI_ghash_pop(), and BLI_gset_pop().

◆ ghash_remove_ex()

static Entry* ghash_remove_ex ( GHash gh,
const void key,
GHashKeyFreeFP  keyfreefp,
GHashValFreeFP  valfreefp,
const uint  bucket_index 
)
static

Remove the entry and return it, caller must free from gh->entrypool.

Definition at line 556 of file BLI_ghash.c.

References BLI_assert, GHash::buckets, e, GHash::flag, ghash_buckets_contract(), ghash_lookup_entry_prev_ex(), GHash::nentries, and Entry::next.

Referenced by BLI_ghash_popkey(), BLI_ghash_remove(), BLI_gset_pop_key(), and ghash_pop().

Variable Documentation

◆ BLI_ghash_hash_sizes

const uint BLI_ghash_hash_sizes
Initial value:
= {
5, 11, 17, 37, 67, 131, 257, 521, 1031,
2053, 4099, 8209, 16411, 32771, 65537, 131101, 262147, 524309,
1048583, 2097169, 4194319, 8388617, 16777259, 33554467, 67108879, 134217757, 268435459,
}

Next prime after 2^n (skipping 2 & 3).

Note
Also used by: BLI_edgehash & BLI_smallhash.

Definition at line 40 of file BLI_ghash.c.