You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.1 KiB
C++
95 lines
2.1 KiB
C++
/*=========================================================================
|
|
|
|
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 <type_traits>
|
|
#include <utility>
|
|
|
|
/**
|
|
* @file vtkMeta
|
|
* This file contains a variety of metaprogramming constructs for working
|
|
* with vtk types.
|
|
*/
|
|
|
|
// Forward decs for StripPointers:
|
|
template <typename ArrayType>
|
|
class vtkNew;
|
|
template <typename ArrayType>
|
|
class vtkSmartPointer;
|
|
template <typename ArrayType>
|
|
class vtkWeakPointer;
|
|
|
|
namespace vtk
|
|
{
|
|
namespace detail
|
|
{
|
|
|
|
//------------------------------------------------------------------------------
|
|
// 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;
|
|
};
|
|
|
|
}
|
|
} // end namespace vtk::detail
|
|
|
|
#endif // vtkMeta_h
|
|
|
|
// VTK-HeaderTest-Exclude: vtkMeta.h
|