// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #ifndef vtkMeta_h #define vtkMeta_h #include "vtkABINamespace.h" #include #include /** * @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 class vtkNew; template class vtkSmartPointer; template class vtkWeakPointer; VTK_ABI_NAMESPACE_END namespace vtk { namespace detail { VTK_ABI_NAMESPACE_BEGIN //------------------------------------------------------------------------------ // Strip vtkNew, vtkSmartPointer, etc from a type. template struct StripPointers { using type = T; }; template struct StripPointers { using type = T; }; template struct StripPointers> { using type = ArrayType; }; template struct StripPointers> { using type = ArrayType; }; template struct StripPointers> { using type = ArrayType; }; //------------------------------------------------------------------------------ // Test if a type is defined (true) or just forward declared (false). template struct IsComplete { private: // Can't take the sizeof an incomplete class. template static std::true_type impl(U*); static std::false_type impl(...); using bool_constant = decltype(impl(std::declval())); public: static constexpr bool value = bool_constant::value; }; VTK_ABI_NAMESPACE_END } } // end namespace vtk::detail #endif // vtkMeta_h // VTK-HeaderTest-Exclude: vtkMeta.h