VTK  9.1.0
vtkNew.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkNew.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================*/
53#ifndef vtkNew_h
54#define vtkNew_h
55
56#include "vtkIOStream.h"
57#include "vtkMeta.h" // for IsComplete
58
59#include <type_traits> // for is_base_of
60
61class vtkObjectBase;
62
63template <class T>
64class vtkNew
65{
66 // Allow other smart pointers friend access:
67 template <typename U>
68 friend class vtkNew;
69 template <typename U>
70 friend class vtkSmartPointer;
71 template <typename U>
72 friend class vtkWeakPointer;
73
74 // These static asserts only fire when the function calling CheckTypes is
75 // used. Thus, this smart pointer class may still be used as a member variable
76 // with a forward declared T, so long as T is defined by the time the calling
77 // function is used.
78 template <typename U = T>
79 static void CheckTypes() noexcept
80 {
82 "vtkNew<T>'s T type has not been defined. Missing include?");
84 "Cannot store an object with undefined type in "
85 "vtkNew. Missing include?");
86 static_assert(std::is_base_of<T, U>::value,
87 "Argument type is not compatible with vtkNew<T>'s "
88 "T type.");
90 "vtkNew can only be used with subclasses of vtkObjectBase.");
91 }
92
93public:
98 : Object(T::New())
99 {
100 vtkNew::CheckTypes();
101 }
102
108 vtkNew(vtkNew&& o) noexcept
109 : Object(o.Object)
110 {
111 o.Object = nullptr;
112 }
113
114 template <typename U>
115 vtkNew(vtkNew<U>&& o) noexcept
116 : Object(o.Object)
117 {
118 vtkNew::CheckTypes<U>();
119
120 o.Object = nullptr;
121 }
123
125
128 ~vtkNew() { this->Reset(); }
129
130 void Reset()
131 {
132 T* obj = this->Object;
133 if (obj)
134 {
135 this->Object = nullptr;
136 obj->Delete();
137 }
138 }
140
145 T* operator->() const noexcept { return this->Object; }
146
148
154 T* GetPointer() const noexcept { return this->Object; }
155 T* Get() const noexcept { return this->Object; }
156 operator T*() const noexcept { return static_cast<T*>(this->Object); }
158
164 T& operator*() const noexcept { return *static_cast<T*>(this->Object); }
165
166private:
167 vtkNew(vtkNew<T> const&) = delete;
168 void operator=(vtkNew<T> const&) = delete;
169 T* Object;
170};
171
172#endif
173// VTK-HeaderTest-Exclude: vtkNew.h
Allocate and hold a VTK object.
Definition: vtkNew.h:65
void Reset()
Deletes reference to instance of T.
Definition: vtkNew.h:130
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition: vtkNew.h:155
friend class vtkNew
Definition: vtkNew.h:68
vtkNew()
Create a new T on construction.
Definition: vtkNew.h:97
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition: vtkNew.h:145
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition: vtkNew.h:108
~vtkNew()
Deletes reference to instance of T.
Definition: vtkNew.h:128
vtkNew(vtkNew< U > &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition: vtkNew.h:115
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition: vtkNew.h:154
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition: vtkNew.h:164
abstract base class for most VTK objects
Definition: vtkObjectBase.h:79
virtual void Delete()
Delete a VTK object.
Hold a reference to a vtkObjectBase instance.
vtkObjectBase * Object
a weak reference to a vtkObject.
vtkWeakPointer & operator=(const vtkWeakPointer &r)
Assign object to reference.
@ value
Definition: vtkX3D.h:226
This file contains a variety of metaprogramming constructs for working with vtk types.