ITK  6.0.0
Insight Toolkit
itkPromoteType.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkPromoteType_h
19 #define itkPromoteType_h
20 
21 #include "itkMacro.h"
22 
23 // Simplification of boost::common_type
24 namespace itk
25 {
26 
28 namespace mpl
29 {
30 
31 namespace Details
32 {
33 
40 template <int VTypeEnum, typename TA, typename TB>
41 struct SizeToType;
42 
47 template <int VCharacters>
48 struct Identity
49 {
50  using Type = char[VCharacters];
51 };
52 
58 #define ITK_ASSOCIATE(VTypeEnum, Typed) \
59  template <typename TA, typename TB> \
60  struct SizeToType<VTypeEnum, TA, TB> \
61  { \
62  using Type = Typed; \
63  }
64 
65 ITK_ASSOCIATE(1, TA);
66 ITK_ASSOCIATE(2, TB);
67 
68 ITK_ASSOCIATE(3, short);
69 ITK_ASSOCIATE(4, unsigned short);
70 ITK_ASSOCIATE(5, int);
71 ITK_ASSOCIATE(6, unsigned int);
72 ITK_ASSOCIATE(7, long);
73 ITK_ASSOCIATE(8, unsigned long);
74 ITK_ASSOCIATE(9, long long);
75 ITK_ASSOCIATE(10, unsigned long long);
76 ITK_ASSOCIATE(11, float);
77 ITK_ASSOCIATE(12, double);
78 ITK_ASSOCIATE(13, long double);
79 #undef ITK_ASSOCIATE
80 } // namespace Details
81 
103 template <typename TA, typename TB>
104 struct PromoteType
105 {
106  static TA a;
107  static TB b;
108 
109  // Aimed at supporting overloads
110  template <typename T>
111  static Details::Identity<1>::Type & Check(typename Details::SizeToType<1, TA, TB>::Type, T);
112  template <typename T>
113  static Details::Identity<2>::Type & Check(typename Details::SizeToType<2, TA, TB>::Type, T);
114 
115  // Common numeric types
116  static Details::Identity<3>::Type &
117  Check(typename Details::SizeToType<3, TA, TB>::Type, int);
118  static Details::Identity<4>::Type &
119  Check(typename Details::SizeToType<4, TA, TB>::Type, int);
120  static Details::Identity<5>::Type &
121  Check(typename Details::SizeToType<5, TA, TB>::Type, int);
122  static Details::Identity<6>::Type &
123  Check(typename Details::SizeToType<6, TA, TB>::Type, int);
124  static Details::Identity<7>::Type &
125  Check(typename Details::SizeToType<7, TA, TB>::Type, int);
126  static Details::Identity<8>::Type &
127  Check(typename Details::SizeToType<8, TA, TB>::Type, int);
128  static Details::Identity<9>::Type &
129  Check(typename Details::SizeToType<9, TA, TB>::Type, int);
130  static Details::Identity<10>::Type &
131  Check(typename Details::SizeToType<10, TA, TB>::Type, int);
132  static Details::Identity<11>::Type &
133  Check(typename Details::SizeToType<11, TA, TB>::Type, int);
134  static Details::Identity<12>::Type &
135  Check(typename Details::SizeToType<12, TA, TB>::Type, int);
136  static Details::Identity<13>::Type &
137  Check(typename Details::SizeToType<13, TA, TB>::Type, int);
138 
139 public:
155  using Type = typename Details::SizeToType<sizeof Check(a + b, 0), TA, TB>::Type;
156 };
157 } // end namespace mpl
160 } // end namespace itk
162 
163 #endif // itkPromoteType_h
Details
Definition: itkVariableLengthVector.h:1046
itkMacro.h
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnatomicalOrientation.h:29