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