diff options
author | Sybren A. Stüvel <sybren@blender.org> | 2021-12-17 19:31:15 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@blender.org> | 2021-12-17 19:31:15 +0300 |
commit | 4b21067aea415f7eb4604de6dd133a67a4063640 (patch) | |
tree | 5a4aafe466163e3f011569166801099072b9ad99 /source/blender/blenlib/BLI_listbase.h | |
parent | 2648d920d8ac5c590a6fc28ee1cbb5bc48a9bc07 (diff) |
Fix T94116: Drivers can have multiple variables with same name
The RNA setter now ensures that driver variables are uniquely named
(within the scope of the driver).
Versioning code has been added to ensure this uniqueness. The last
variable with the non-unique name retains the original name; this
ensures that the driver will still evaluate to the same value as before
this fix.
This also introduces a new blenlib function `BLI_listbase_from_link()`,
which can be used to find the entire list from any item within the list.
Manifest Task: T94116
Reviewed By: mont29, JacquesLucke
Maniphest Tasks: T94116
Differential Revision: https://developer.blender.org/D13594
Diffstat (limited to 'source/blender/blenlib/BLI_listbase.h')
-rw-r--r-- | source/blender/blenlib/BLI_listbase.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h index 7d808d339e9..a2a6e958213 100644 --- a/source/blender/blenlib/BLI_listbase.h +++ b/source/blender/blenlib/BLI_listbase.h @@ -46,6 +46,11 @@ int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1); +/** + * Return a ListBase representing the entire list the given Link is in. + */ +ListBase BLI_listbase_from_link(struct Link *some_link); + /* Find forwards. */ /** @@ -279,6 +284,23 @@ BLI_INLINE void BLI_listbase_clear(struct ListBase *lb) } /** + * Equality check for ListBase. + * + * This only shallowly compares the ListBase itself (so the first/last + * pointers), and does not do any equality checks on the list items. + */ +BLI_INLINE bool BLI_listbase_equal(const struct ListBase *a, const struct ListBase *b) +{ + if (a == NULL) { + return b == NULL; + } + if (b == NULL) { + return false; + } + return a->first == b->first && a->last == b->last; +} + +/** * Create a generic list node containing link to provided data. */ struct LinkData *BLI_genericNodeN(void *data); @@ -353,3 +375,10 @@ struct LinkData *BLI_genericNodeN(void *data); #ifdef __cplusplus } #endif + +#ifdef __cplusplus +BLI_INLINE bool operator==(const ListBase &a, const ListBase &b) +{ + return BLI_listbase_equal(&a, &b); +} +#endif |