[Bf-blender-cvs] [ca9a749b21e] master: Cleanup: Use smart pointers for Outliner tree display and element types

Julian Eisel noreply at git.blender.org
Fri Jan 14 19:28:30 CET 2022


Commit: ca9a749b21e6048845ca1401ba73c023dda68340
Author: Julian Eisel
Date:   Fri Jan 14 18:35:14 2022 +0100
Branches: master
https://developer.blender.org/rBca9a749b21e6048845ca1401ba73c023dda68340

Cleanup: Use smart pointers for Outliner tree display and element types

Smart pointers should be the default choice for C++ owning pointers,
since they let you manage memory using RAII.

Also moved type factory methods into static class functions.

===================================================================

M	source/blender/editors/space_outliner/outliner_intern.hh
M	source/blender/editors/space_outliner/outliner_tree.cc
M	source/blender/editors/space_outliner/space_outliner.cc
M	source/blender/editors/space_outliner/tree/tree_display.cc
M	source/blender/editors/space_outliner/tree/tree_display.hh
M	source/blender/editors/space_outliner/tree/tree_element.cc
M	source/blender/editors/space_outliner/tree/tree_element.hh
M	source/blender/editors/space_outliner/tree/tree_element_id.cc
M	source/blender/editors/space_outliner/tree/tree_element_id.hh

===================================================================

diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh
index 880d0bd7fb1..bc6eedb7620 100644
--- a/source/blender/editors/space_outliner/outliner_intern.hh
+++ b/source/blender/editors/space_outliner/outliner_intern.hh
@@ -23,6 +23,8 @@
 
 #pragma once
 
+#include <memory>
+
 #include "RNA_types.h"
 
 #ifdef __cplusplus
@@ -55,7 +57,7 @@ class AbstractTreeElement;
 struct SpaceOutliner_Runtime {
   /** Object to create and manage the tree for a specific display type (View Layers, Scenes,
    * Blender File, etc.). */
-  blender::ed::outliner::AbstractTreeDisplay *tree_display;
+  std::unique_ptr<blender::ed::outliner::AbstractTreeDisplay> tree_display;
 
   /** Pointers to tree-store elements, grouped by `(id, type, nr)`
    *  in hash-table for faster searching. */
@@ -91,7 +93,7 @@ typedef struct TreeElement {
    * #TreeElement. Step by step, data should be moved to it and operations based on the type should
    * become virtual methods of the class hierarchy.
    */
-  blender::ed::outliner::AbstractTreeElement *type;
+  std::unique_ptr<blender::ed::outliner::AbstractTreeElement> type;
 
   ListBase subtree;
   int xs, ys;                /* Do selection. */
diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc
index 477ed88cb87..5f378a02052 100644
--- a/source/blender/editors/space_outliner/outliner_tree.cc
+++ b/source/blender/editors/space_outliner/outliner_tree.cc
@@ -217,7 +217,7 @@ void outliner_free_tree_element(TreeElement *element, ListBase *parent_subtree)
   if (element->flag & TE_FREE_NAME) {
     MEM_freeN((void *)element->name);
   }
-  outliner_tree_element_type_free(&element->type);
+  element->type = nullptr;
   MEM_freeN(element);
 }
 
@@ -862,7 +862,7 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner,
 
   /* New C++ based type handle. Only some support this, eventually this should replace
    * `TreeElement` entirely. */
-  te->type = outliner_tree_element_type_create(type, *te, idv);
+  te->type = AbstractTreeElement::createFromType(type, *te, idv);
   if (te->type) {
     /* Element types ported to the new design are expected to have their name set at this point! */
     BLI_assert(te->name != nullptr);
@@ -1880,10 +1880,9 @@ void outliner_build_tree(Main *mainvar,
 
   outliner_free_tree(&space_outliner->tree);
   outliner_storage_cleanup(space_outliner);
-  outliner_tree_display_destroy(&space_outliner->runtime->tree_display);
 
-  space_outliner->runtime->tree_display = outliner_tree_display_create(space_outliner->outlinevis,
-                                                                       space_outliner);
+  space_outliner->runtime->tree_display = AbstractTreeDisplay::createFromDisplayMode(
+      space_outliner->outlinevis, *space_outliner);
 
   /* All tree displays should be created as sub-classes of AbstractTreeDisplay. */
   BLI_assert(space_outliner->runtime->tree_display != nullptr);
diff --git a/source/blender/editors/space_outliner/space_outliner.cc b/source/blender/editors/space_outliner/space_outliner.cc
index a7f5a0b906d..a8068bc9b71 100644
--- a/source/blender/editors/space_outliner/space_outliner.cc
+++ b/source/blender/editors/space_outliner/space_outliner.cc
@@ -367,7 +367,7 @@ static void outliner_free(SpaceLink *sl)
   }
 
   if (space_outliner->runtime) {
-    outliner_tree_display_destroy(&space_outliner->runtime->tree_display);
+    space_outliner->runtime->tree_display = nullptr;
     if (space_outliner->runtime->treehash) {
       BKE_outliner_treehash_free(space_outliner->runtime->treehash);
     }
diff --git a/source/blender/editors/space_outliner/tree/tree_display.cc b/source/blender/editors/space_outliner/tree/tree_display.cc
index 25345bc493d..d2b6fff6996 100644
--- a/source/blender/editors/space_outliner/tree/tree_display.cc
+++ b/source/blender/editors/space_outliner/tree/tree_display.cc
@@ -27,45 +27,28 @@ using namespace blender::ed::outliner;
 
 namespace blender::ed::outliner {
 
-AbstractTreeDisplay *outliner_tree_display_create(int /*eSpaceOutliner_Mode*/ mode,
-                                                  SpaceOutliner *space_outliner)
+std::unique_ptr<AbstractTreeDisplay> AbstractTreeDisplay::createFromDisplayMode(
+    int /*eSpaceOutliner_Mode*/ mode, SpaceOutliner &space_outliner)
 {
-  AbstractTreeDisplay *tree_display = nullptr;
-
   switch ((eSpaceOutliner_Mode)mode) {
     case SO_SCENES:
-      tree_display = new TreeDisplayScenes(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplayScenes>(space_outliner);
     case SO_LIBRARIES:
-      tree_display = new TreeDisplayLibraries(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplayLibraries>(space_outliner);
     case SO_SEQUENCE:
-      tree_display = new TreeDisplaySequencer(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplaySequencer>(space_outliner);
     case SO_DATA_API:
-      tree_display = new TreeDisplayDataAPI(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplayDataAPI>(space_outliner);
     case SO_ID_ORPHANS:
-      tree_display = new TreeDisplayIDOrphans(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplayIDOrphans>(space_outliner);
     case SO_OVERRIDES_LIBRARY:
-      tree_display = new TreeDisplayOverrideLibrary(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplayOverrideLibrary>(space_outliner);
     case SO_VIEW_LAYER:
       /* FIXME(Julian): this should not be the default! Return nullptr and handle that as valid
        * case. */
     default:
-      tree_display = new TreeDisplayViewLayer(*space_outliner);
-      break;
+      return std::make_unique<TreeDisplayViewLayer>(space_outliner);
   }
-
-  return tree_display;
-}
-
-void outliner_tree_display_destroy(AbstractTreeDisplay **tree_display)
-{
-  delete *tree_display;
-  *tree_display = nullptr;
 }
 
 bool AbstractTreeDisplay::hasWarnings() const
diff --git a/source/blender/editors/space_outliner/tree/tree_display.hh b/source/blender/editors/space_outliner/tree/tree_display.hh
index d6085770965..c14a5f133cf 100644
--- a/source/blender/editors/space_outliner/tree/tree_display.hh
+++ b/source/blender/editors/space_outliner/tree/tree_display.hh
@@ -73,6 +73,9 @@ class AbstractTreeDisplay {
   }
   virtual ~AbstractTreeDisplay() = default;
 
+  static std::unique_ptr<AbstractTreeDisplay> createFromDisplayMode(
+      int /*eSpaceOutliner_Mode*/ mode, SpaceOutliner &space_outliner);
+
   /**
    * Build a tree for this display mode with the Blender context data given in \a source_data and
    * the view settings in \a space_outliner.
@@ -89,10 +92,6 @@ class AbstractTreeDisplay {
   SpaceOutliner &space_outliner_;
 };
 
-AbstractTreeDisplay *outliner_tree_display_create(int /*eSpaceOutliner_Mode*/ mode,
-                                                  SpaceOutliner *space_outliner);
-void outliner_tree_display_destroy(AbstractTreeDisplay **tree_display);
-
 /* -------------------------------------------------------------------- */
 /* View Layer Tree-Display */
 
diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc
index 5b9a75208f7..7afbe6efb6b 100644
--- a/source/blender/editors/space_outliner/tree/tree_element.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element.cc
@@ -41,7 +41,9 @@
 
 namespace blender::ed::outliner {
 
-AbstractTreeElement *outliner_tree_element_type_create(int type, TreeElement &legacy_te, void *idv)
+std::unique_ptr<AbstractTreeElement> AbstractTreeElement::createFromType(const int type,
+                                                                         TreeElement &legacy_te,
+                                                                         void *idv)
 {
   ID &id = *static_cast<ID *>(idv);
 
@@ -61,28 +63,29 @@ AbstractTreeElement *outliner_tree_element_type_create(int type, TreeElement &le
     case TSE_SOME_ID:
       return TreeElementID::createFromID(legacy_te, id);
     case TSE_ANIM_DATA:
-      return new TreeElementAnimData(legacy_te, *reinterpret_cast<IdAdtTemplate &>(id).adt);
+      return std::make_unique<TreeElementAnimData>(legacy_te,
+                                                   *reinterpret_cast<IdAdtTemplate &>(id).adt);
     case TSE_DRIVER_BASE:
-      return new TreeElementDriverBase(legacy_te, *static_cast<AnimData *>(idv));
+      return std::make_unique<TreeElementDriverBase>(legacy_te, *static_cast<AnimData *>(idv));
     case TSE_NLA:
-      return new TreeElementNLA(legacy_te, *static_cast<AnimData *>(idv));
+      return std::make_unique<TreeElementNLA>(legacy_te, *static_cast<AnimData *>(idv));
     case TSE_NLA_TRACK:
-      return new TreeElementNLATrack(legacy_te, *static_cast<NlaTrack *>(idv));
+      return std::make_unique<TreeElementNLATrack>(legacy_te, *static_cast<NlaTrack *>(idv));
     case TSE_NLA_ACTION:
-      return new TreeElementNLAAction(legacy_te, *static_cast<bAction *>(idv));
+      return std::make_unique<TreeElementNLAAction>(legacy_te, *static_cast<bAction *>(idv));
     case TSE_GP_LAYER:
-      return new TreeElementGPencilLayer(legacy_te, *static_cast<bGPDlayer *>(idv));
+      return std::make_unique<TreeElementGPencilLayer>(legacy_te, *static_cast<bGPDlayer *>(idv));
     case TSE_R_LAYER_BASE:
-      return new TreeElementViewLayerBase(legacy_te, *static_cast<Scene *>(idv));
+      return std::make_unique<TreeElementViewLayerBase>(legacy_te, *static_cast<Scene *>(idv));
     case TSE_SCENE_COLLECTION_BASE:
-      return new TreeElementCollectionBase(legacy_te, *static_cast<Scene *>(idv));
+      return std::make_unique<TreeElementCollectionBase>(legacy_te, *static_cast<Scene *>(idv));
     case TSE_SCENE_OBJECTS_BASE:
-      return new TreeElementSceneObjectsBase(legacy_te, *static_cast<Scene *>(idv));
+      return std::make_unique<TreeElementSceneObjectsBase>(legacy_te, *static_cast<Scene *>(idv));
     case TSE_LIBRARY_OVERRIDE_BASE:
-      return new TreeElementOverridesBase(legacy_te, id);
+      return std::make_unique<TreeElementOverridesBase>(legac

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list