VTK  9.7.1
vtkMeta.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
3 
4 #ifndef vtkMeta_h
5 #define vtkMeta_h
6 
7 #include "vtkABINamespace.h"
8 
9 #include <type_traits>
10 #include <utility>
11 
18 // Forward decs for StripPointers:
19 VTK_ABI_NAMESPACE_BEGIN
20 template <typename ArrayType>
21 class vtkNew;
22 template <typename ArrayType>
24 template <typename ArrayType>
26 template <typename ArrayType>
27 class vtkWeakPtr;
28 VTK_ABI_NAMESPACE_END
29 
30 namespace vtk
31 {
32 namespace detail
33 {
34 VTK_ABI_NAMESPACE_BEGIN
35 
36 //------------------------------------------------------------------------------
37 // Strip vtkNew, vtkSmartPointer, etc from a type.
38 template <typename T>
40 {
41  using type = T;
42 };
43 
44 template <typename T>
45 struct StripPointers<T*>
46 {
47  using type = T;
48 };
49 
50 template <typename ArrayType>
51 struct StripPointers<vtkNew<ArrayType>>
52 {
53  using type = ArrayType;
54 };
55 
56 template <typename ArrayType>
57 struct StripPointers<vtkSmartPointer<ArrayType>>
58 {
59  using type = ArrayType;
60 };
61 
62 template <typename ArrayType>
63 struct StripPointers<vtkWeakPointer<ArrayType>>
64 {
65  using type = ArrayType;
66 };
67 
68 template <typename ArrayType>
69 struct StripPointers<vtkWeakPtr<ArrayType>>
70 {
71  using type = ArrayType;
72 };
73 
74 //------------------------------------------------------------------------------
75 // Test if a type is defined (true) or just forward declared (false).
76 template <typename T>
77 struct IsComplete
78 {
79 private:
80  // Can't take the sizeof an incomplete class.
81  template <typename U, std::size_t = sizeof(U)>
82  static std::true_type impl(U*);
83  static std::false_type impl(...);
84  using bool_constant = decltype(impl(std::declval<T*>()));
85 
86 public:
87  static constexpr bool value = bool_constant::value;
88 };
89 
90 VTK_ABI_NAMESPACE_END
91 }
92 } // end namespace vtk::detail
93 
94 #endif // vtkMeta_h
95 
96 // VTK-HeaderTest-Exclude: vtkMeta.h
Hold a reference to a vtkObjectBase instance.
Definition: vtkMeta.h:23
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
a weak reference to a vtkObject.
Definition: vtkMeta.h:25
Allocate and hold a VTK object.
a weak reference to a vtkObjectBase.
Definition: vtkMeta.h:27
static constexpr bool value
Definition: vtkMeta.h:87