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 
55 VTK_ABI_NAMESPACE_BEGIN
56 class vtkObjectBase;
57 
58 template <class T>
59 class 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.");
85  "vtkNew can only be used with subclasses of vtkObjectBase.");
86  }
87 
88 public:
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 
172 private:
173  vtkNew(vtkNew<T> const&) = delete;
174  void operator=(vtkNew<T> const&) = delete;
175  T* Object;
176 };
177 
178 VTK_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 & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
Definition: vtkNew.h:159
friend class vtkNew
Definition: vtkNew.h:63
vtkNew()
Create a new T on construction.
Definition: vtkNew.h:92
T * Get() const noexcept
Get a raw pointer to the contained object.
Definition: vtkNew.h:150
vtkNew(vtkNew &&o) noexcept
Move the object into the constructed vtkNew wrapper, stealing its reference.
Definition: vtkNew.h:103
T * GetPointer() const noexcept
Get a raw pointer to the contained object.
Definition: vtkNew.h:149
~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
vtkNew< T > & operator=(vtkNew< T > &&other) noexcept
Move assignment operator.
Definition: vtkNew.h:164
T * operator->() const noexcept
Enable pointer-like dereference syntax.
Definition: vtkNew.h:140
abstract base class for most VTK objects
Definition: vtkObjectBase.h:72
virtual void Delete()
Delete a VTK object.
Hold a reference to a vtkObjectBase instance.
vtkObjectBase * Object
a weak reference to a vtkObject.
@ value
Definition: vtkX3D.h:220
This file contains a variety of metaprogramming constructs for working with vtk types.