/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ /*========================================================================= * * Portions of this file are subject to the VTK Toolkit Version 3 copyright. * * Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen * * For complete copyright, license and disclaimer of warranty information * please refer to the NOTICE file at the top of the ITK source tree. * *=========================================================================*/ #ifndef itkPixelTraits_h #define itkPixelTraits_h #include "itkMacro.h" namespace itk { /** \class PixelTraits * \brief Traits for a pixel that define the dimension and component type. * * PixelTraits determines the dimension and the component type * of a pixel. The default implementation is suitable for all subclasses * of itk::Array. This (will) include RGBPixel and RGBAPixel. Specialized * versions of PixelTraits are defined for the standard scalar types. * \ingroup ITKCommon */ template class PixelTraits { public: /** Dimension of the pixel (range). */ static constexpr unsigned int Dimension = TPixelType::Length; /** Type of a single component of a pixel. */ using ValueType = typename TPixelType::ValueType; }; /// \cond HIDE_SPECIALIZATION_DOCUMENTATION /** \class PixelTraits * Specialization of PixelTraits for scalar images. * \ingroup ITKCommon */ template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = bool; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = char; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = char; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = unsigned char; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = short; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = unsigned short; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = int; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = unsigned int; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = long; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = unsigned long; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = long long; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = unsigned long long; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = float; }; template <> class PixelTraits { public: static constexpr unsigned int Dimension = 1; using ValueType = double; }; /// \endcond /** \class JoinTraits * \brief Trait to determine what datatype is needed if the specified * pixel types are "joined" into a single vector. * * JoinTraits defines the value type needed to combine the specified * pixel types into a single vector. The data type selected is the * smallest data type that can represent the dynamic range of both * input pixel types. For example, if a char and unsigned short are * "joined", the resulting data type must be a vector of int. In * some cases, like joining a unsigned int and a char, the join * value type is promoted all the way to a float. This provides * consistent behavior on both 32 and 64 bit systems (on 64 bit * systems, we could have promoted to a long which is distinct from * an int but this is not the case for 32 bit systems, so we promote * to float). There are several combinations similar to this. Most * of the JoinTraits are specializations of the base template. * \ingroup ITKCommon */ template class JoinTraits { public: using ValueType = TValue1; }; /// \cond HIDE_SPECIALIZATION_DOCUMENTATION /** \class JoinTraits * Specializations for bool. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = bool; }; template <> class JoinTraits { public: using ValueType = char; }; template <> class JoinTraits { public: using ValueType = unsigned char; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = unsigned short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for char. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = char; }; template <> class JoinTraits { public: using ValueType = char; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: // unsigned int & unsigned long may be the same size, so promote to float using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for unsigned char. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = unsigned char; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = unsigned char; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = unsigned short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for short. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: // unsigned int & unsigned long may be the same size, so promote to float using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for unsigned short. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = unsigned short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = unsigned short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = unsigned short; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for int. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: using ValueType = int; }; template <> class JoinTraits { public: // unsigned int & unsigned long may be the same size, so promote to float using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for unsigned int. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: // unsigned int & unsigned long may be the same size, so promote to float using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: // unsigned int & unsigned long may be the same size, so promote to float using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: // unsigned int & unsigned long may be the same size, so promote to float using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned int; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for long. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for unsigned long. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = unsigned long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for long long. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for unsigned long long. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = unsigned long long; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for float. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = float; }; template <> class JoinTraits { public: using ValueType = double; }; /** \class PixelTraits * Specializations for double. * \ingroup ITKCommon */ template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; template <> class JoinTraits { public: using ValueType = double; }; /// \endcond } // end namespace itk #endif // itkPixelTraits_h