1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkMeta.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#ifndef vtkMeta_h
#define vtkMeta_h
#include "vtkABINamespace.h"
#include <type_traits>
#include <utility>
/**
* @file vtkMeta.h
* This file contains a variety of metaprogramming constructs for working
* with vtk types.
*/
// Forward decs for StripPointers:
VTK_ABI_NAMESPACE_BEGIN
template <typename ArrayType>
class vtkNew;
template <typename ArrayType>
class vtkSmartPointer;
template <typename ArrayType>
class vtkWeakPointer;
VTK_ABI_NAMESPACE_END
namespace vtk
{
namespace detail
{
VTK_ABI_NAMESPACE_BEGIN
//------------------------------------------------------------------------------
// Strip vtkNew, vtkSmartPointer, etc from a type.
template <typename T>
struct StripPointers
{
using type = T;
};
template <typename T>
struct StripPointers<T*>
{
using type = T;
};
template <typename ArrayType>
struct StripPointers<vtkNew<ArrayType>>
{
using type = ArrayType;
};
template <typename ArrayType>
struct StripPointers<vtkSmartPointer<ArrayType>>
{
using type = ArrayType;
};
template <typename ArrayType>
struct StripPointers<vtkWeakPointer<ArrayType>>
{
using type = ArrayType;
};
//------------------------------------------------------------------------------
// Test if a type is defined (true) or just forward declared (false).
template <typename T>
struct IsComplete
{
private:
// Can't take the sizeof an incomplete class.
template <typename U, std::size_t = sizeof(U)>
static std::true_type impl(U*);
static std::false_type impl(...);
using bool_constant = decltype(impl(std::declval<T*>()));
public:
static constexpr bool value = bool_constant::value;
};
VTK_ABI_NAMESPACE_END
}
} // end namespace vtk::detail
#endif // vtkMeta_h
// VTK-HeaderTest-Exclude: vtkMeta.h
|