From 599561de841b6f6f2c0ef6a5a4afa80cf3c51918 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 7 Feb 2019 17:16:15 +0100 Subject: BKE_main: add utils to loop over whole IDs of a given Main database. We are currently having the same boiler plate code in tens of places accross our code, we can as well have a utils to do that. --- source/blender/blenkernel/intern/main.c | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'source/blender/blenkernel/intern/main.c') diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c index 327c1cda165..2d3988ed8f5 100644 --- a/source/blender/blenkernel/intern/main.c +++ b/source/blender/blenkernel/intern/main.c @@ -211,6 +211,55 @@ void BKE_main_relations_free(Main *bmain) } } +/** + * Call given callback over every IDs of given \a lb listbase (assumed to be part of given \a bmain). + * + * \return false if the iteration was iterrupted by the callback. + * + * \warning \a callback may affect the ID, but DO NOT change the listbase or Main database (add/remove/reorder its IDs). + */ +bool BKE_main_listbase_foreach_id( + Main *bmain, ListBase *lb, + MainForeachIDCallback callback, void *user_data) +{ + bool keep_looping = true; + for (ID *id = lb->first; id; id = id->next) { + if (!(keep_looping = callback(bmain, id, user_data))) { + return keep_looping; + } + } + return keep_looping; +} + +/** + * Call given callback over every IDs of given \a bmain Main database. + * + * \param reverse_type_order Allow to reverse order in which ID *types* are handled + * (i.e. does not reverse the order in which IDs themselves are handled + * whithin a give listbase). + * \return false if the iteration was iterrupted by the callback. + * + * \warning \a callback may affect the ID, but DO NOT change the Main database (add/remove/reorder its IDs). + */ +bool BKE_main_foreach_id( + Main *bmain, const bool reverse_type_order, + MainForeachIDCallback callback, void *user_data) +{ + ListBase *lbarray[MAX_LIBARRAY]; + const int nbr_types = set_listbasepointers(bmain, lbarray); + + bool keep_looping = true; + for (int i = reverse_type_order ? nbr_types - 1 : 0; + reverse_type_order ? i >= 0 : i < nbr_types; + reverse_type_order ? i-- : i++) + { + if (!(keep_looping = BKE_main_listbase_foreach_id(bmain, lbarray[i], callback, user_data))) { + return keep_looping; + } + } + return keep_looping; +} + /** * Generates a raw .blend file thumbnail data from given image. * -- cgit v1.2.3