VTK  9.7.1
vtkNew.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
38 #ifndef vtkNew_h
39 #define vtkNew_h
40 
41 #include "vtkGarbageCollectorManager.h" // Ensure GC infra is initialized
42 #include "vtkIOStream.h"
43 #include "vtkMeta.h" // for IsComplete
44 
45 #include <type_traits> // for is_base_of
46 
47 VTK_ABI_NAMESPACE_BEGIN
48 class vtkObjectBase;
50 
51 template <class T>
52 class vtkNew;
53 
54 template <class T>
55 void vtkGarbageCollectorReport(vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
56 
57 template <class T>
58 class vtkNew
59 {
60  // Allow other smart pointers friend access:
61  template <typename U>
62  friend class vtkNew;
63  template <typename U>
64  friend class vtkSmartPointer;
65  template <typename U>
66  friend class vtkWeakPointer;
67 
68  // These static asserts only fire when the function calling CheckTypes is
69  // used. Thus, this smart pointer class may still be used as a member variable
70  // with a forward declared T, so long as T is defined by the time the calling
71  // function is used.
72  template <typename U = T>
73  static void CheckTypes() noexcept
74  {
76  "vtkNew<T>'s T type has not been defined. Missing include?");
78  "Cannot store an object with undefined type in "
79  "vtkNew. Missing include?");
80  static_assert(std::is_base_of<T, U>::value,
81  "Argument type is not compatible with vtkNew<T>'s "
82  "T type.");
84  "vtkNew can only be used with subclasses of vtkObjectBase.");
85  }
86 
87 public:
92  : Object(T::New())
93  {
94  vtkNew::CheckTypes();
95  }
96 
102  vtkNew(vtkNew&& o) noexcept
103  : Object(o.Object)
104  {
105  o.Object = nullptr;
106  }
107 
108  template <typename U>
109  vtkNew(vtkNew<U>&& o) noexcept
110  : Object(o.Object)
111  {
112  vtkNew::CheckTypes<U>();
113 
114  o.Object = nullptr;
115  }
117 
119 
122  ~vtkNew() { this->Reset(); }
123 
124  void Reset()
125  {
126  T* obj = this->Object;
127  if (obj)
128  {
129  this->Object = nullptr;
130  obj->Delete();
131  }
132  }
134 
139  T* operator->() const noexcept { return this->Object; }
140 
142 
148  T* GetPointer() const noexcept { return this->Object; }
149  T* Get() const noexcept { return this->Object; }
150  operator T*() const noexcept { return static_cast<T*>(this->Object); }
152 
158  T& operator*() const noexcept { return *static_cast<T*>(this->Object); }
159 
163  vtkNew<T>& operator=(vtkNew<T>&& other) noexcept
164  {
165  this->Reset();
166  this->Object = other.Object;
167  other.Object = nullptr;
168  return *this;
169  }
170 
171 private:
172  vtkNew(vtkNew<T> const&) = delete;
173  void operator=(vtkNew<T> const&) = delete;
174  friend void vtkGarbageCollectorReport<T>(
175  vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
176  T* Object;
177 };
178 
179 VTK_ABI_NAMESPACE_END
180 #endif
181 // VTK-HeaderTest-Exclude: vtkNew.h
~vtkNew()
Deletes reference to instance of T.
Definition: vtkNew.h:122
void vtkGarbageCollectorReport(vtkGarbageCollector *collector, vtkNew< T > &ptr, const char *desc)
Function to report a reference held by a vtkNew to a collector.
void Reset()
Deletes reference to instance of T.
Definition: vtkNew.h:124
vtkObjectBase * Object
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition: vtkNew.h:149
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition: vtkNew.h:102
vtkNew()
Create a new T on construction.
Definition: vtkNew.h:91
vtkNew< T > & operator=(vtkNew< T > &&other) noexcept
Move assignment operator.
Definition: vtkNew.h:163
Hold a reference to a vtkObjectBase instance.
Definition: vtkMeta.h:23
Detect and break reference loops.
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition: vtkNew.h:139
This file contains a variety of metaprogramming constructs for working with vtk types.
a weak reference to a vtkObject.
Definition: vtkMeta.h:25
abstract base class for most VTK objects
Definition: vtkObjectBase.h:68
vtkNew(vtkNew< U > &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition: vtkNew.h:109
Allocate and hold a VTK object.
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition: vtkNew.h:158
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition: vtkNew.h:148
virtual void Delete()
Delete a VTK object.