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.
This commit is contained in:
Julian Eisel 2022-01-26 16:00:36 +01:00
parent da1b6c4c02
commit 08e2885796
1 changed files with 19 additions and 0 deletions

View File

@ -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