VTK  9.7.20260805
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
37
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
47VTK_ABI_NAMESPACE_BEGIN
48class vtkObjectBase;
50
51template <class T>
52class vtkNew;
53
54template <class T>
55void vtkGarbageCollectorReport(vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
56
57template <class T>
58class 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.");
83 static_assert(std::is_base_of<vtkObjectBase, T>::value,
84 "vtkNew can only be used with subclasses of vtkObjectBase.");
85 }
86
87public:
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 }
116
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 }
133
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
171private:
172 vtkNew(vtkNew<T> const&) = delete;
173 void operator=(vtkNew<T> const&) = delete;
175 vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
176 T* Object;
177};
178
179VTK_ABI_NAMESPACE_END
180#endif
181// VTK-HeaderTest-Exclude: vtkNew.h
Detect and break reference loops.
Allocate and hold a VTK object.
Definition vtkNew.h:59
void Reset()
Deletes reference to instance of T.
Definition vtkNew.h:124
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:149
friend class vtkNew
Definition vtkNew.h:62
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:91
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition vtkNew.h:139
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:102
~vtkNew()
Deletes reference to instance of T.
Definition vtkNew.h:122
friend class vtkWeakPointer
Definition vtkNew.h:66
vtkNew(vtkNew< U > &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:109
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:148
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition vtkNew.h:158
friend class vtkSmartPointer
Definition vtkNew.h:64
vtkNew< T > & operator=(vtkNew< T > &&other) noexcept
Move assignment operator.
Definition vtkNew.h:163
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.