VTK  9.3.0
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
47#ifndef vtkNew_h
48#define vtkNew_h
49
50#include "vtkIOStream.h"
51#include "vtkMeta.h" // for IsComplete
52
53#include <type_traits> // for is_base_of
54
55VTK_ABI_NAMESPACE_BEGIN
56class vtkObjectBase;
57
58template <class T>
59class vtkNew
60{
61 // Allow other smart pointers friend access:
62 template <typename U>
63 friend class vtkNew;
64 template <typename U>
65 friend class vtkSmartPointer;
66 template <typename U>
67 friend class vtkWeakPointer;
68
69 // These static asserts only fire when the function calling CheckTypes is
70 // used. Thus, this smart pointer class may still be used as a member variable
71 // with a forward declared T, so long as T is defined by the time the calling
72 // function is used.
73 template <typename U = T>
74 static void CheckTypes() noexcept
75 {
77 "vtkNew<T>'s T type has not been defined. Missing include?");
79 "Cannot store an object with undefined type in "
80 "vtkNew. Missing include?");
81 static_assert(std::is_base_of<T, U>::value,
82 "Argument type is not compatible with vtkNew<T>'s "
83 "T type.");
84 static_assert(std::is_base_of<vtkObjectBase, T>::value,
85 "vtkNew can only be used with subclasses of vtkObjectBase.");
86 }
87
88public:
93 : Object(T::New())
94 {
95 vtkNew::CheckTypes();
96 }
97
103 vtkNew(vtkNew&& o) noexcept
104 : Object(o.Object)
105 {
106 o.Object = nullptr;
107 }
108
109 template <typename U>
110 vtkNew(vtkNew<U>&& o) noexcept
111 : Object(o.Object)
112 {
113 vtkNew::CheckTypes<U>();
114
115 o.Object = nullptr;
116 }
118
120
123 ~vtkNew() { this->Reset(); }
124
125 void Reset()
126 {
127 T* obj = this->Object;
128 if (obj)
129 {
130 this->Object = nullptr;
131 obj->Delete();
132 }
133 }
135
140 T* operator->() const noexcept { return this->Object; }
141
143
149 T* GetPointer() const noexcept { return this->Object; }
150 T* Get() const noexcept { return this->Object; }
151 operator T*() const noexcept { return static_cast<T*>(this->Object); }
153
159 T& operator*() const noexcept { return *static_cast<T*>(this->Object); }
160
164 vtkNew<T>& operator=(vtkNew<T>&& other) noexcept
165 {
166 this->Reset();
167 this->Object = other.Object;
168 other.Object = nullptr;
169 return *this;
170 }
171
172private:
173 vtkNew(vtkNew<T> const&) = delete;
174 void operator=(vtkNew<T> const&) = delete;
175 T* Object;
176};
177
178VTK_ABI_NAMESPACE_END
179#endif
180// VTK-HeaderTest-Exclude: vtkNew.h
Allocate and hold a VTK object.
Definition vtkNew.h:60
void Reset()
Deletes reference to instance of T.
Definition vtkNew.h:125
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:150
friend class vtkNew
Definition vtkNew.h:63
vtkNew()
Create a new T on construction.
Definition vtkNew.h:92
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition vtkNew.h:140
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:103
~vtkNew()
Deletes reference to instance of T.
Definition vtkNew.h:123
vtkNew(vtkNew< U > &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition vtkNew.h:110
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition vtkNew.h:149
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition vtkNew.h:159
vtkNew< T > & operator=(vtkNew< T > &&other) noexcept
Move assignment operator.
Definition vtkNew.h:164
abstract base class for most VTK objects
Hold a reference to a vtkObjectBase instance.
a weak reference to a vtkObject.
This file contains a variety of metaprogramming constructs for working with vtk types.