[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