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
24namespace itk
25{
26
28namespace mpl
29{
30
31namespace Details
32{
33
40template <int VTypeEnum, typename TA, typename TB>
41struct SizeToType;
42
47template <int VCharacters>
48struct 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
65ITK_ASSOCIATE(1, TA);
66ITK_ASSOCIATE(2, TB);
67
68ITK_ASSOCIATE(3, short);
69ITK_ASSOCIATE(4, unsigned short);
70ITK_ASSOCIATE(5, int);
71ITK_ASSOCIATE(6, unsigned int);
72ITK_ASSOCIATE(7, long);
73ITK_ASSOCIATE(8, unsigned long);
74ITK_ASSOCIATE(9, long long);
75ITK_ASSOCIATE(10, unsigned long long);
76ITK_ASSOCIATE(11, float);
77ITK_ASSOCIATE(12, double);
78ITK_ASSOCIATE(13, long double);
79#undef ITK_ASSOCIATE
80} // namespace Details
81
103template <typename TA, typename TB>
104struct 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 & Check(typename Details::SizeToType<3, TA, TB>::Type, int);
117 static Details::Identity<4>::Type & Check(typename Details::SizeToType<4, TA, TB>::Type, int);
118 static Details::Identity<5>::Type & Check(typename Details::SizeToType<5, TA, TB>::Type, int);
119 static Details::Identity<6>::Type & Check(typename Details::SizeToType<6, TA, TB>::Type, int);
120 static Details::Identity<7>::Type & Check(typename Details::SizeToType<7, TA, TB>::Type, int);
121 static Details::Identity<8>::Type & Check(typename Details::SizeToType<8, TA, TB>::Type, int);
122 static Details::Identity<9>::Type & Check(typename Details::SizeToType<9, TA, TB>::Type, int);
123 static Details::Identity<10>::Type & Check(typename Details::SizeToType<10, TA, TB>::Type, int);
124 static Details::Identity<11>::Type & Check(typename Details::SizeToType<11, TA, TB>::Type, int);
125 static Details::Identity<12>::Type & Check(typename Details::SizeToType<12, TA, TB>::Type, int);
126 static Details::Identity<13>::Type & Check(typename Details::SizeToType<13, TA, TB>::Type, int);
127
128public:
144 using Type = typename Details::SizeToType<sizeof Check(a + b, 0), TA, TB>::Type;
145};
146} // end namespace mpl
149
150} // end namespace itk
151
152#endif // itkPromoteType_h
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....