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:
parent
da1b6c4c02
commit
08e2885796
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue