VTK  9.6.20260402
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
146
147#ifndef vtkNew_h
148#define vtkNew_h
149
150#include "vtkGarbageCollectorManager.h" // Ensure GC infra is initialized
151#include "vtkIOStream.h"
152#include "vtkMeta.h" // for IsComplete
153
154#include <type_traits> // for is_base_of
155
156VTK_ABI_NAMESPACE_BEGIN
157class vtkObjectBase;
159
160template <class T>
161class vtkNew;
162
163template <class T>
164void vtkGarbageCollectorReport(vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
165
166template <class T>
168{
169 // Allow other smart pointers friend access:
170 template <typename U>
171 friend class vtkNew;
172 template <typename U>
173 friend class vtkSmartPointer;
174 template <typename U>
175 friend class vtkWeakPointer;
176
177 // These static asserts only fire when the function calling CheckTypes is
178 // used. Thus, this smart pointer class may still be used as a member variable
179 // with a forward declared T, so long as T is defined by the time the calling
180 // function is used.
181 template <typename U = T>
182 static void CheckTypes() noexcept
183 {
185 "vtkNew<T>'s T type has not been defined. Missing include?");
187 "Cannot store an object with undefined type in "
188 "vtkNew. Missing include?");
189 static_assert(std::is_base_of<T, U>::value,
190 "Argument type is not compatible with vtkNew<T>'s "
191 "T type.");
192 static_assert(std::is_base_of<vtkObjectBase, T>::value,
193 "vtkNew can only be used with subclasses of vtkObjectBase.");
194 }
195
196public:
201 : Object(T::New())
202 {
203 vtkNew::CheckTypes();
204 }
205
211 vtkNew(vtkNew&& o) noexcept
212 : Object(o.Object)
213 {
214 o.Object = nullptr;
215 }
216
217 template <typename U>
218 vtkNew(vtkNew<U>&& o) noexcept
219 : Object(o.Object)
220 {
221 vtkNew::CheckTypes<U>();
222
223 o.Object = nullptr;
224 }
225
226
228
231 ~vtkNew() { this->Reset(); }
232
233 void Reset()
234 {
235 T* obj = this->Object;
236 if (obj)
237 {
238 this->Object = nullptr;
239 obj->Delete();
240 }
241 }
242
243
248 T* operator->() const noexcept { return this->Object; }
249
251
257 T* GetPointer() const noexcept { return this->Object; }
258 T* Get() const noexcept { return this->Object; }
259 operator T*() const noexcept { return static_cast<T*>(this->Object); }
261
267 T& operator*() const noexcept { return *static_cast<T*>(this->Object); }
268
272 vtkNew<T>& operator=(vtkNew<T>&& other) noexcept
273 {
274 this->Reset();
275 this->Object = other.Object;
276 other.Object = nullptr;
277 return *this;
278 }
279
280private:
281 vtkNew(vtkNew<T> const&) = delete;
282 void operator=(vtkNew<T> const&) = delete;
284 vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
285 T* Object;
286};
287
288VTK_ABI_NAMESPACE_END
289#endif
290// VTK-HeaderTest-Exclude: vtkNew.h
Detect and break reference loops.
Allocate and hold a VTK object.
Definition vtkNew.h:168
void Reset()
Deletes reference to instance of T.
Definition vtkNew.h:233
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:258
friend class vtkNew
Definition vtkNew.h:171
friend void vtkGarbageCollectorReport(vtkGarbageCollector *collector, vtkNew< T > &ptr, const char *desc)
Function to report a reference held by a vtkNew to a collector.
vtkNew()
Create a new T on construction.
Definition vtkNew.h:200
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition vtkNew.h:248
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:211
~vtkNew()
Deletes reference to instance of T.
Definition vtkNew.h:231
friend class vtkWeakPointer
Definition vtkNew.h:175
vtkNew(vtkNew< U > &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:218
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:257
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition vtkNew.h:267
friend class vtkSmartPointer
Definition vtkNew.h:173
vtkNew< T > & operator=(vtkNew< T > &&other) noexcept
Move assignment operator.
Definition vtkNew.h:272
abstract base class for most VTK objects
static constexpr bool value
Definition vtkMeta.h:87
This file contains a variety of metaprogramming constructs for working with vtk types.
void vtkGarbageCollectorReport(vtkGarbageCollector *collector, vtkNew< T > &ptr, const char *desc)
Function to report a reference held by a vtkNew to a collector.