[Bf-blender-cvs] [08e2885796f] master: Outliner: Function to "cast" C-style TreeElement to typed C++ pendant
Julian Eisel
noreply at git.blender.org
Wed Jan 26 19:16:07 CET 2022
Commit: 08e2885796f79a34cfa7233945d194d382b47d23
Author: Julian Eisel
Date: Wed Jan 26 16:00:36 2022 +0100
Branches: master
https://developer.blender.org/rB08e2885796f79a34cfa7233945d194d382b47d23
Outliner: Function to "cast" C-style TreeElement to typed C++ pendant
Add function to safely request the type-specific C++ element from a
C-style `TreeElement`. Looks like this:
```
TreeElementFoo *te_foo = tree_element_cast<TreeElementFoo>(te);
```
The "cast" will return null if the tree-element doesn't match the
requested type.
This is useful for the transition from the C-style type to the new ones.
===================================================================
M source/blender/editors/space_outliner/outliner_intern.hh
===================================================================
diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh
index a62d35131ca..0538cd3a4ae 100644
--- a/source/blender/editors/space_outliner/outliner_intern.hh
+++ b/source/blender/editors/space_outliner/outliner_intern.hh
@@ -27,6 +27,9 @@
#include "RNA_types.h"
+/* Needed for `tree_element_cast()`. */
+#include "tree/tree_element.hh"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -686,3 +689,19 @@ int outliner_context(const struct bContext *C,
#ifdef __cplusplus
}
#endif
+
+namespace blender::ed::outliner {
+
+/**
+ * Helper to safely "cast" a #TreeElement to its new C++ #AbstractTreeElement, if possible.
+ * \return nullptr if the tree-element doesn't match the requested type \a TreeElementT or the
+ * element doesn't hold a C++ #AbstractTreeElement pendant yet.
+ */
+template<typename TreeElementT> TreeElementT *tree_element_cast(const TreeElement *te)
+{
+ static_assert(std::is_base_of_v<AbstractTreeElement, TreeElementT>,
+ "Requested tree-element type must be an AbstractTreeElement");
+ return dynamic_cast<TreeElementT *>(te->type.get());
+}
+
+} // namespace blender::ed::outliner
More information about the Bf-blender-cvs
mailing list