VTK  9.6.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
37
38#ifndef vtkNew_h
39#define vtkNew_h
40
41#include "vtkIOStream.h"
42#include "vtkMeta.h" // for IsComplete
43
44#include <type_traits> // for is_base_of
45
46VTK_ABI_NAMESPACE_BEGIN
47class vtkObjectBase;
49
50template <class T>
51class vtkNew;
52
53template <class T>
54void vtkGarbageCollectorReport(vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
55
56template <class T>
57class vtkNew
58{
59 // Allow other smart pointers friend access:
60 template <typename U>
61 friend class vtkNew;
62 template <typename U>
63 friend class vtkSmartPointer;
64 template <typename U>
65 friend class vtkWeakPointer;
66
67 // These static asserts only fire when the function calling CheckTypes is
68 // used. Thus, this smart pointer class may still be used as a member variable
69 // with a forward declared T, so long as T is defined by the time the calling
70 // function is used.
71 template <typename U = T>
72 static void CheckTypes() noexcept
73 {
75 "vtkNew<T>'s T type has not been defined. Missing include?");
77 "Cannot store an object with undefined type in "
78 "vtkNew. Missing include?");
79 static_assert(std::is_base_of<T, U>::value,
80 "Argument type is not compatible with vtkNew<T>'s "
81 "T type.");
82 static_assert(std::is_base_of<vtkObjectBase, T>::value,
83 "vtkNew can only be used with subclasses of vtkObjectBase.");
84 }
85
86public:
91 : Object(T::New())
92 {
93 vtkNew::CheckTypes();
94 }
95
101 vtkNew(vtkNew&& o) noexcept
102 : Object(o.Object)
103 {
104 o.Object = nullptr;
105 }
106
107 template <typename U>
108 vtkNew(vtkNew<U>&& o) noexcept
109 : Object(o.Object)
110 {
111 vtkNew::CheckTypes<U>();
112
113 o.Object = nullptr;
114 }
115
116
118
121 ~vtkNew() { this->Reset(); }
122
123 void Reset()
124 {
125 T* obj = this->Object;
126 if (obj)
127 {
128 this->Object = nullptr;
129 obj->Delete();
130 }
131 }
132
133
138 T* operator->() const noexcept { return this->Object; }
139
141
147 T* GetPointer() const noexcept { return this->Object; }
148 T* Get() const noexcept { return this->Object; }
149 operator T*() const noexcept { return static_cast<T*>(this->Object); }
151
157 T& operator*() const noexcept { return *static_cast<T*>(this->Object); }
158
162 vtkNew<T>& operator=(vtkNew<T>&& other) noexcept
163 {
164 this->Reset();
165 this->Object = other.Object;
166 other.Object = nullptr;
167 return *this;
168 }
169
170private:
171 vtkNew(vtkNew<T> const&) = delete;
172 void operator=(vtkNew<T> const&) = delete;
174 vtkGarbageCollector* collector, vtkNew<T>& ptr, const char* desc);
175 T* Object;
176};
177
178VTK_ABI_NAMESPACE_END
179#endif
180// VTK-HeaderTest-Exclude: vtkNew.h
Detect and break reference loops.
Allocate and hold a VTK object.
Definition vtkNew.h:58
void Reset()
Deletes reference to instance of T.
Definition vtkNew.h:123
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:148
friend class vtkNew
Definition vtkNew.h:61
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:90
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition vtkNew.h:138
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:101
~vtkNew()
Deletes reference to instance of T.
Definition vtkNew.h:121
friend class vtkWeakPointer
Definition vtkNew.h:65
vtkNew(vtkNew< U > &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:108
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:147
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition vtkNew.h:157
friend class vtkSmartPointer
Definition vtkNew.h:63
vtkNew< T > & operator=(vtkNew< T > &&other) noexcept
Move assignment operator.
Definition vtkNew.h:162
abstract base class for most VTK objects
static constexpr bool value
Definition vtkMeta.h:79
static vtkBiQuadraticQuadraticHexahedron * New()
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.