Cleanup: Use FunctionRef for IDProperty iteration callback

Avoid the need for a seaprate user_data argument.
This commit is contained in:
Hans Goudey 2024-03-26 13:36:30 -04:00
parent 2a600b4a83
commit e0567eadbd
13 changed files with 66 additions and 123 deletions

View File

@ -11,6 +11,7 @@
#include <memory> #include <memory>
#include "BLI_compiler_attrs.h" #include "BLI_compiler_attrs.h"
#include "BLI_function_ref.hh"
#include "BLI_span.hh" #include "BLI_span.hh"
#include "BLI_string_ref.hh" #include "BLI_string_ref.hh"
#include "BLI_sys_types.h" #include "BLI_sys_types.h"
@ -299,11 +300,6 @@ float IDP_coerce_to_float_or_zero(const IDProperty *prop);
*/ */
double IDP_coerce_to_double_or_zero(const IDProperty *prop); double IDP_coerce_to_double_or_zero(const IDProperty *prop);
/**
* Call a callback for each #IDproperty in the hierarchy under given root one (included).
*/
using IDPForeachPropertyCallback = void (*)(IDProperty *id_property, void *user_data);
/** /**
* Loop through all ID properties in hierarchy of given \a id_property_root included. * Loop through all ID properties in hierarchy of given \a id_property_root included.
* *
@ -314,8 +310,7 @@ using IDPForeachPropertyCallback = void (*)(IDProperty *id_property, void *user_
*/ */
void IDP_foreach_property(IDProperty *id_property_root, void IDP_foreach_property(IDProperty *id_property_root,
int type_filter, int type_filter,
IDPForeachPropertyCallback callback, blender::FunctionRef<void(IDProperty *id_property)> callback);
void *user_data);
/* Format IDProperty as strings */ /* Format IDProperty as strings */
char *IDP_reprN(const IDProperty *prop, uint *r_len); char *IDP_reprN(const IDProperty *prop, uint *r_len);
@ -324,8 +319,8 @@ void IDP_repr_fn(const IDProperty *prop,
void *user_data); void *user_data);
void IDP_print(const IDProperty *prop); void IDP_print(const IDProperty *prop);
void IDP_BlendWrite(struct BlendWriter *writer, const IDProperty *prop); void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop);
void IDP_BlendReadData_impl(struct BlendDataReader *reader, void IDP_BlendReadData_impl(BlendDataReader *reader,
IDProperty **prop, IDProperty **prop,
const char *caller_func_id); const char *caller_func_id);
#define IDP_BlendDataRead(reader, prop) IDP_BlendReadData_impl(reader, prop, __func__) #define IDP_BlendDataRead(reader, prop) IDP_BlendReadData_impl(reader, prop, __func__)

View File

@ -227,9 +227,9 @@ static void armature_free_data(ID *id)
static void armature_foreach_id_bone(Bone *bone, LibraryForeachIDData *data) static void armature_foreach_id_bone(Bone *bone, LibraryForeachIDData *data)
{ {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(bone->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property( BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
bone->prop, IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback, data)); }));
LISTBASE_FOREACH (Bone *, curbone, &bone->childbase) { LISTBASE_FOREACH (Bone *, curbone, &bone->childbase) {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, armature_foreach_id_bone(curbone, data)); BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, armature_foreach_id_bone(curbone, data));
@ -239,21 +239,17 @@ static void armature_foreach_id_bone(Bone *bone, LibraryForeachIDData *data)
static void armature_foreach_id_editbone(EditBone *edit_bone, LibraryForeachIDData *data) static void armature_foreach_id_editbone(EditBone *edit_bone, LibraryForeachIDData *data)
{ {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(edit_bone->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(edit_bone->prop, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
} }
static void armature_foreach_id_bone_collection(BoneCollection *bcoll, LibraryForeachIDData *data) static void armature_foreach_id_bone_collection(BoneCollection *bcoll, LibraryForeachIDData *data)
{ {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(bcoll->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(bcoll->prop, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
} }
static void armature_foreach_id(ID *id, LibraryForeachIDData *data) static void armature_foreach_id(ID *id, LibraryForeachIDData *data)

View File

@ -184,11 +184,9 @@ void BKE_fmodifiers_foreach_id(ListBase *fmodifiers, LibraryForeachIDData *data)
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, fcm_py->script, IDWALK_CB_NOP); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, fcm_py->script, IDWALK_CB_NOP);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(fcm_py->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(fcm_py->prop, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
break; break;
} }
default: default:

View File

@ -1235,29 +1235,28 @@ void IDP_Reset(IDProperty *prop, const IDProperty *reference)
void IDP_foreach_property(IDProperty *id_property_root, void IDP_foreach_property(IDProperty *id_property_root,
const int type_filter, const int type_filter,
IDPForeachPropertyCallback callback, const blender::FunctionRef<void(IDProperty *id_property)> callback)
void *user_data)
{ {
if (!id_property_root) { if (!id_property_root) {
return; return;
} }
if (type_filter == 0 || (1 << id_property_root->type) & type_filter) { if (type_filter == 0 || (1 << id_property_root->type) & type_filter) {
callback(id_property_root, user_data); callback(id_property_root);
} }
/* Recursive call into container types of ID properties. */ /* Recursive call into container types of ID properties. */
switch (id_property_root->type) { switch (id_property_root->type) {
case IDP_GROUP: { case IDP_GROUP: {
LISTBASE_FOREACH (IDProperty *, loop, &id_property_root->data.group) { LISTBASE_FOREACH (IDProperty *, loop, &id_property_root->data.group) {
IDP_foreach_property(loop, type_filter, callback, user_data); IDP_foreach_property(loop, type_filter, callback);
} }
break; break;
} }
case IDP_IDPARRAY: { case IDP_IDPARRAY: {
IDProperty *loop = static_cast<IDProperty *>(IDP_Array(id_property_root)); IDProperty *loop = static_cast<IDProperty *>(IDP_Array(id_property_root));
for (int i = 0; i < id_property_root->len; i++) { for (int i = 0; i < id_property_root->len; i++) {
IDP_foreach_property(&loop[i], type_filter, callback, user_data); IDP_foreach_property(&loop[i], type_filter, callback);
} }
break; break;
} }

View File

@ -344,10 +344,9 @@ static bool library_foreach_ID_link(Main *bmain,
} }
} }
IDP_foreach_property(id->properties, IDP_foreach_property(id->properties, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, &data);
BKE_lib_query_idpropertiesForeachIDLink_callback, });
&data);
if (BKE_lib_query_foreachid_iter_stop(&data)) { if (BKE_lib_query_foreachid_iter_stop(&data)) {
library_foreach_ID_data_cleanup(&data); library_foreach_ID_data_cleanup(&data);
return false; return false;

View File

@ -319,9 +319,9 @@ static void ntree_free_data(ID *id)
static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock) static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
{ {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(sock->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property( BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
sock->prop, IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback, data)); }));
switch (eNodeSocketDatatype(sock->type)) { switch (eNodeSocketDatatype(sock->type)) {
case SOCK_OBJECT: { case SOCK_OBJECT: {
@ -383,11 +383,9 @@ static void node_foreach_id(ID *id, LibraryForeachIDData *data)
BKE_LIB_FOREACHID_PROCESS_ID(data, node->id, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_ID(data, node->id, IDWALK_CB_USER);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(node->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(node->prop, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, library_foreach_node_socket(data, sock)); BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, library_foreach_node_socket(data, sock));
} }

View File

@ -607,11 +607,9 @@ static void item_foreach_id(LibraryForeachIDData *data, bNodeTreeInterfaceItem &
bNodeTreeInterfaceSocket &socket = reinterpret_cast<bNodeTreeInterfaceSocket &>(item); bNodeTreeInterfaceSocket &socket = reinterpret_cast<bNodeTreeInterfaceSocket &>(item);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(socket.properties, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(socket.properties, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
socket_types::socket_data_foreach_id(data, socket); socket_types::socket_data_foreach_id(data, socket);
break; break;

View File

@ -436,11 +436,9 @@ static void object_foreach_id(ID *id, LibraryForeachIDData *data)
if (object->pose) { if (object->pose) {
LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) { LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) {
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(pchan->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(pchan->prop, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, pchan->custom, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, pchan->custom, IDWALK_CB_USER);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(

View File

@ -829,8 +829,9 @@ static bool seq_foreach_member_id_cb(Sequence *seq, void *user_data)
FOREACHID_PROCESS_IDSUPER(data, seq->clip, IDWALK_CB_USER); FOREACHID_PROCESS_IDSUPER(data, seq->clip, IDWALK_CB_USER);
FOREACHID_PROCESS_IDSUPER(data, seq->mask, IDWALK_CB_USER); FOREACHID_PROCESS_IDSUPER(data, seq->mask, IDWALK_CB_USER);
FOREACHID_PROCESS_IDSUPER(data, seq->sound, IDWALK_CB_USER); FOREACHID_PROCESS_IDSUPER(data, seq->sound, IDWALK_CB_USER);
IDP_foreach_property( IDP_foreach_property(seq->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
seq->prop, IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback, data); BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
});
LISTBASE_FOREACH (SequenceModifierData *, smd, &seq->modifiers) { LISTBASE_FOREACH (SequenceModifierData *, smd, &seq->modifiers) {
FOREACHID_PROCESS_IDSUPER(data, smd->mask_id, IDWALK_CB_USER); FOREACHID_PROCESS_IDSUPER(data, smd->mask_id, IDWALK_CB_USER);
} }
@ -885,10 +886,9 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data)
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->world_override, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->world_override, IDWALK_CB_USER);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data,
IDP_foreach_property(view_layer->id_properties, IDP_foreach_property(view_layer->id_properties, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
BKE_lib_query_idpropertiesForeachIDLink_callback, }));
data));
BKE_view_layer_synced_ensure(scene, view_layer); BKE_view_layer_synced_ensure(scene, view_layer);
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
@ -914,11 +914,9 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data)
LISTBASE_FOREACH (TimeMarker *, marker, &scene->markers) { LISTBASE_FOREACH (TimeMarker *, marker, &scene->markers) {
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, marker->camera, IDWALK_CB_NOP); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, marker->camera, IDWALK_CB_NOP);
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(
data, data, IDP_foreach_property(marker->prop, IDP_TYPE_FILTER_ID, [&](IDProperty *prop) {
IDP_foreach_property(marker->prop, BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
IDP_TYPE_FILTER_ID, }));
BKE_lib_query_idpropertiesForeachIDLink_callback,
data));
} }
ToolSettings *toolsett = scene->toolsettings; ToolSettings *toolsett = scene->toolsettings;

View File

@ -672,16 +672,11 @@ void DepsgraphNodeBuilder::build_generic_id(ID *id)
build_parameters(id); build_parameters(id);
} }
static void build_idproperties_callback(IDProperty *id_property, void *user_data)
{
DepsgraphNodeBuilder *builder = reinterpret_cast<DepsgraphNodeBuilder *>(user_data);
BLI_assert(id_property->type == IDP_ID);
builder->build_id(reinterpret_cast<ID *>(id_property->data.pointer));
}
void DepsgraphNodeBuilder::build_idproperties(IDProperty *id_property) void DepsgraphNodeBuilder::build_idproperties(IDProperty *id_property)
{ {
IDP_foreach_property(id_property, IDP_TYPE_FILTER_ID, build_idproperties_callback, this); IDP_foreach_property(id_property, IDP_TYPE_FILTER_ID, [&](IDProperty *id_property) {
this->build_id(static_cast<ID *>(id_property->data.pointer));
});
} }
void DepsgraphNodeBuilder::build_collection(LayerCollection *from_layer_collection, void DepsgraphNodeBuilder::build_collection(LayerCollection *from_layer_collection,

View File

@ -632,16 +632,11 @@ void DepsgraphRelationBuilder::build_generic_id(ID *id)
build_parameters(id); build_parameters(id);
} }
static void build_idproperties_callback(IDProperty *id_property, void *user_data)
{
DepsgraphRelationBuilder *builder = reinterpret_cast<DepsgraphRelationBuilder *>(user_data);
BLI_assert(id_property->type == IDP_ID);
builder->build_id(reinterpret_cast<ID *>(id_property->data.pointer));
}
void DepsgraphRelationBuilder::build_idproperties(IDProperty *id_property) void DepsgraphRelationBuilder::build_idproperties(IDProperty *id_property)
{ {
IDP_foreach_property(id_property, IDP_TYPE_FILTER_ID, build_idproperties_callback, this); IDP_foreach_property(id_property, IDP_TYPE_FILTER_ID, [&](IDProperty *id_property) {
this->build_id(static_cast<ID *>(id_property->data.pointer));
});
} }
void DepsgraphRelationBuilder::build_collection(LayerCollection *from_layer_collection, void DepsgraphRelationBuilder::build_collection(LayerCollection *from_layer_collection,

View File

@ -265,14 +265,11 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain,
needs_own_transform_relation, needs_own_transform_relation,
needs_scene_camera_relation); needs_scene_camera_relation);
IDP_foreach_property( IDP_foreach_property(
&const_cast<IDProperty &>(properties), &const_cast<IDProperty &>(properties), IDP_TYPE_FILTER_ID, [&](IDProperty *property) {
IDP_TYPE_FILTER_ID,
[](IDProperty *property, void *user_data) {
if (ID *id = IDP_Id(property)) { if (ID *id = IDP_Id(property)) {
static_cast<Set<ID *> *>(user_data)->add(id); ids_for_relations.add(id);
} }
}, });
&ids_for_relations);
Vector<const ID *> ids; Vector<const ID *> ids;
ids.append(&node_tree_orig.id); ids.append(&node_tree_orig.id);
@ -289,16 +286,11 @@ static IDProperty *replace_inputs_evaluated_data_blocks(const IDProperty &op_pro
{ {
/* We just create a temporary copy, so don't adjust data-block user count. */ /* We just create a temporary copy, so don't adjust data-block user count. */
IDProperty *properties = IDP_CopyProperty_ex(&op_properties, LIB_ID_CREATE_NO_USER_REFCOUNT); IDProperty *properties = IDP_CopyProperty_ex(&op_properties, LIB_ID_CREATE_NO_USER_REFCOUNT);
IDP_foreach_property( IDP_foreach_property(properties, IDP_TYPE_FILTER_ID, [&](IDProperty *property) {
properties, if (ID *id = IDP_Id(property)) {
IDP_TYPE_FILTER_ID, property->data.pointer = DEG_get_evaluated_id(&depsgraph, id);
[](IDProperty *property, void *user_data) { }
if (ID *id = IDP_Id(property)) { });
Depsgraph *depsgraph = static_cast<Depsgraph *>(user_data);
property->data.pointer = DEG_get_evaluated_id(depsgraph, id);
}
},
&const_cast<Depsgraph &>(depsgraph));
return properties; return properties;
} }

View File

@ -118,17 +118,11 @@ static void init_data(ModifierData *md)
static void find_used_ids_from_settings(const NodesModifierSettings &settings, Set<ID *> &ids) static void find_used_ids_from_settings(const NodesModifierSettings &settings, Set<ID *> &ids)
{ {
IDP_foreach_property( IDP_foreach_property(settings.properties, IDP_TYPE_FILTER_ID, [&](IDProperty *property) {
settings.properties, if (ID *id = IDP_Id(property)) {
IDP_TYPE_FILTER_ID, ids.add(id);
[](IDProperty *property, void *user_data) { }
Set<ID *> *ids = (Set<ID *> *)user_data; });
ID *id = IDP_Id(property);
if (id != nullptr) {
ids->add(id);
}
},
&ids);
} }
/* We don't know exactly what attributes from the other object we will need. */ /* We don't know exactly what attributes from the other object we will need. */
@ -268,21 +262,9 @@ static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md); NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
walk(user_data, ob, (ID **)&nmd->node_group, IDWALK_CB_USER); walk(user_data, ob, (ID **)&nmd->node_group, IDWALK_CB_USER);
struct ForeachSettingData { IDP_foreach_property(nmd->settings.properties, IDP_TYPE_FILTER_ID, [&](IDProperty *id_prop) {
IDWalkFunc walk; walk(user_data, ob, (ID **)&id_prop->data.pointer, IDWALK_CB_USER);
void *user_data; });
Object *ob;
} settings = {walk, user_data, ob};
IDP_foreach_property(
nmd->settings.properties,
IDP_TYPE_FILTER_ID,
[](IDProperty *id_prop, void *user_data) {
ForeachSettingData *settings = (ForeachSettingData *)user_data;
settings->walk(
settings->user_data, settings->ob, (ID **)&id_prop->data.pointer, IDWALK_CB_USER);
},
&settings);
for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) { for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) {
for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num)) for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num))