26 #ifndef vtkSmartPointer_h
27 #define vtkSmartPointer_h
35 #include <type_traits>
38 VTK_ABI_NAMESPACE_BEGIN
46 template <
typename U = T>
47 static void CheckTypes() noexcept
50 "vtkSmartPointer<T>'s T type has not been defined. Missing "
53 "Cannot store an object with undefined type in "
54 "vtkSmartPointer. Missing include?");
56 "Argument type is not compatible with vtkSmartPointer<T>'s "
59 "vtkSmartPointer can only be used with subclasses of "
87 vtkSmartPointer::CheckTypes<U>();
105 vtkSmartPointer::CheckTypes<U>();
116 vtkSmartPointer::CheckTypes();
119 template <
typename U>
123 vtkSmartPointer::CheckTypes<U>();
131 template <
typename U>
135 vtkSmartPointer::CheckTypes<U>();
156 vtkSmartPointer::CheckTypes<U>();
167 template <
typename U>
170 vtkSmartPointer::CheckTypes<U>();
180 template <
typename U>
183 vtkSmartPointer::CheckTypes<U>();
194 T*
Get() const noexcept {
return static_cast<T*
>(this->
Object); }
200 operator T*()
const noexcept {
return static_cast<T*
>(this->
Object); }
232 template <
class... ArgsT>
277 #if defined(__HP_aCC) || defined(__IBMCPP__)
278 #define VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(op) \
279 bool operator op(NullPointerOnly*) const { return ::operator op(*this, 0); }
282 class NullPointerOnly
287 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(==)
288 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(!=)
289 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(<)
290 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(<=)
291 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(>)
292 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(>=)
293 #undef VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND
307 VTK_ABI_NAMESPACE_END
320 VTK_ABI_NAMESPACE_BEGIN
321 #define VTK_SMART_POINTER_DEFINE_OPERATOR(op) \
322 template <class T, class U> \
323 inline bool operator op(const vtkSmartPointer<T>& l, const vtkSmartPointer<U>& r) \
325 return (l.GetPointer() op r.GetPointer()); \
327 template <class T, class U> \
328 inline bool operator op(T* l, const vtkSmartPointer<U>& r) \
330 return (l op r.GetPointer()); \
332 template <class T, class U> \
333 inline bool operator op(const vtkSmartPointer<T>& l, U* r) \
335 return (l.GetPointer() op r); \
337 template <class T, class U> \
338 inline bool operator op(const vtkNew<T>& l, const vtkSmartPointer<U>& r) \
340 return (l.GetPointer() op r.GetPointer()); \
342 template <class T, class U> \
343 inline bool operator op(const vtkSmartPointer<T>& l, const vtkNew<U>& r) \
345 return (l.GetPointer() op r.GetPointer); \
358 #undef VTK_SMART_POINTER_DEFINE_OPERATOR
359 VTK_ABI_NAMESPACE_END
363 VTK_ABI_NAMESPACE_BEGIN
367 template <
typename T>
375 template <
typename T>
381 VTK_ABI_NAMESPACE_END
384 VTK_ABI_NAMESPACE_BEGIN
391 return os << static_cast<const vtkSmartPointerBase&>(p);
394 VTK_ABI_NAMESPACE_END
Allocate and hold a VTK object.
Non-templated superclass for vtkSmartPointer.
vtkSmartPointerBase() noexcept
Initialize smart pointer to nullptr.
vtkSmartPointerBase & operator=(vtkObjectBase *r)
Assign object to reference.
Hold a reference to a vtkObjectBase instance.
vtkSmartPointer() noexcept
Initialize smart pointer to nullptr.
T * Get() const noexcept
Get the contained pointer.
vtkSmartPointer(vtkNew< U > &&r) noexcept
Move the pointer from the vtkNew smart pointer to the new vtkSmartPointer, stealing its reference and...
static vtkSmartPointer< T > NewInstance(T *t)
Create a new instance of the given VTK object.
vtkSmartPointer(const vtkSmartPointer &r)
Initialize smart pointer with a new reference to the same object referenced by given smart pointer.
vtkSmartPointer(T *r)
Initialize smart pointer to given object.
vtkSmartPointer(const vtkSmartPointer< U > &r)
Initialize smart pointer with a new reference to the same object referenced by given smart pointer.
void TakeReference(T *t)
Transfer ownership of one reference to the given VTK object to this smart pointer.
vtkSmartPointer(vtkSmartPointer &&r) noexcept
Move the contents of r into this.
vtkSmartPointer & operator=(const vtkSmartPointer< U > &r)
Assign object to reference.
static vtkSmartPointer< T > New()
Create an instance of a VTK object.
vtkSmartPointer(vtkSmartPointer< U > &&r) noexcept
Initialize smart pointer with a new reference to the same object referenced by given smart pointer.
static vtkSmartPointer< T > New(ArgsT &&... args)
Create an instance of a VTK object.
vtkSmartPointer & operator=(const vtkNew< U > &r)
Assign object to reference.
vtkSmartPointer & operator=(U *r)
Assign object to reference.
T & operator*() const noexcept
Dereference the pointer and return a reference to the contained object.
T * GetPointer() const noexcept
Get the contained pointer.
T * operator->() const noexcept
Provides normal pointer target member access using operator ->.
static vtkSmartPointer< T > ExtendedNew()
Create an instance of a VTK object in a memkind extended memory space.
vtkSmartPointer(T *r, const NoReference &n)
vtkSmartPointer & operator=(const vtkSmartPointer &r)
Assign object to reference.
static vtkSmartPointer< T > Take(T *t)
Transfer ownership of one reference to the given VTK object to a new smart pointer.
vtkSmartPointer(const vtkNew< U > &r)
Initialize smart pointer to given object.
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
vtkSmartPointer< T > TakeSmartPointer(T *obj)
Construct a vtkSmartPointer<T> containing obj.
vtkSmartPointer< T > MakeSmartPointer(T *obj)
Construct a vtkSmartPointer<T> containing obj.
std::size_t operator()(const vtkSmartPointer< T > &p) const
#define VTK_SMART_POINTER_DEFINE_OPERATOR(op)
ostream & operator<<(ostream &os, const vtkSmartPointer< T > &p)
Streaming operator to print smart pointer like regular pointers.