• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KDECore

  • kdecore
  • util
ktypetraits.h
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 Copyright (C) 2009 Jonathan Schmidt-Dominé <devel@the-user.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation.
7
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details.
12
13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16 Boston, MA 02110-1301, USA.
17*/
18
19#ifndef KTYPETRAITS_H
20#define KTYPETRAITS_H
21
22#include "ktypelist.h"
23#include "ktypelistutils.h"
24#include <stdint.h>
25
26class QObject;
27class QWidget;
28
29#define NC(...) __VA_ARGS__
30
31namespace KTypeTraits
32{
33
34template<class Types, bool correct>
35struct TypeSelectImpl
36{
37 typedef typename Types::Head Result;
38};
39
40template<class Types, unsigned int size>
41struct TypeSelect
42{
43 typedef STATIC_IF(sizeof(typename Types::Head) == size, typename Types::Head, NC(typename TypeSelect<typename Types::Tail, size>::Result)) Result;
44};
45
46template<unsigned int size>
47struct TypeSelect<KDE::NullType, size>
48{
49 typedef KDE::NullType Result;
50};
51
52template<typename T, typename U>
53struct CanConvert
54{
55private:
56 class Big { char dummy[2]; };
57 static char test(const U&);
58 static Big test(...);
59 static T makeT();
60public:
61 enum { value = sizeof(test(makeT())) == sizeof(char) };
62};
63
64template<typename T, typename U>
65struct IsParentOfChildNonStrict
66{
67 enum { value = CanConvert<const U*, const T*>::value && !STATIC_EQUAL(T, void) };
68};
69
70template<typename T, typename U>
71struct IsParentOfChild
72{
73 enum { value = IsParentOfChildNonStrict<T, U>::value && !STATIC_EQUAL(const T, const U) };
74};
75
76template<typename T, typename U>
77struct CanDynamicCast
78{
79 enum { value = CanConvert<const U*, const T*>::value };
80};
81
82template<class Types>
83struct MaxTypeSelect
84{
85 enum { isMax = (int)sizeof(typename Types::Head) > MaxTypeSelect<typename Types::Tail>::max };
86 enum { max = isMax ? (int)sizeof(typename Types::Head) : MaxTypeSelect<typename Types::Tail>::max };
87 typedef STATIC_IF(isMax, typename Types::Head, typename MaxTypeSelect<typename Types::Tail>::Result) Result;
88};
89
90template<>
91struct MaxTypeSelect<KDE::NullType>
92{
93 enum { isMax = true };
94 enum { max = -1 };
95 typedef KDE::NullType Result;
96};
97
98template<class Types>
99struct MinTypeSelect
100{
101 enum { isMin = sizeof(typename Types::Head) < MinTypeSelect<typename Types::Tail>::min };
102 enum { min = isMin ? (int)sizeof(typename Types::Head) : (int)MinTypeSelect<typename Types::Tail>::min };
103 typedef STATIC_IF(isMin, typename Types::Head, typename MinTypeSelect<typename Types::Tail>::Result) Result;
104};
105
106template<>
107struct MinTypeSelect<KDE::NullType>
108{
109 enum { isMin = true };
110 enum { min = 1000000 };
111 typedef KDE::NullType Result;
112};
113
114typedef K_TYPELIST_6(signed char, wchar_t, signed short, signed int, signed long, signed long long) SignedInts;
115typedef K_TYPELIST_6(unsigned char, wchar_t, unsigned short, unsigned int, unsigned long, unsigned long long) UnsignedInts;
116typedef K_TYPELIST_3(float, double, long double) Floats;
117typedef TypeSelect<SignedInts, 1>::Result int8;
118typedef TypeSelect<SignedInts, 2>::Result int16;
119typedef TypeSelect<SignedInts, 4>::Result int32;
120typedef TypeSelect<SignedInts, 8>::Result int64;
121typedef TypeSelect<UnsignedInts, 1>::Result uint8;
122typedef TypeSelect<UnsignedInts, 2>::Result uint16;
123typedef TypeSelect<UnsignedInts, 4>::Result uint32;
124typedef TypeSelect<UnsignedInts, 8>::Result uint64;
125typedef TypeSelect<Floats, 4>::Result float32;
126typedef TypeSelect<Floats, 8>::Result float64;
127typedef TypeSelect<Floats, 12>::Result float96;
128typedef MaxTypeSelect<SignedInts>::Result maxint;
129typedef MinTypeSelect<SignedInts>::Result minint;
130typedef MaxTypeSelect<UnsignedInts>::Result maxuint;
131typedef MinTypeSelect<UnsignedInts>::Result minuint;
132typedef MaxTypeSelect<Floats>::Result maxfloat;
133typedef MinTypeSelect<Floats>::Result minfloat;
134
135#define TTQ_DECL(Name) \
136 template<typename T> \
137 struct Is ##Name \
138 { \
139 enum { value = false };\
140 }; \
141 template<typename T> \
142 struct Strip ##Name \
143 { \
144 typedef T Result; \
145 };
146#define TTQ_SPECIALIZATION(Name, Check)\
147 template<typename T> \
148 struct Is ##Name<Check> \
149 { \
150 enum { value = true }; \
151 }; \
152 template<typename T> \
153 struct Strip ##Name<Check> \
154 { \
155 typedef T Result; \
156 };
157#define TTQ_ALIAS(Name) \
158 typedef typename Modifiers::Strip ##Name<T>::Result Strip ##Name; \
159 enum { is ##Name = Modifiers::Is ##Name<T>::value };
160
161template<typename T>
162class TypeTraits;
163
164namespace Modifiers
165{
166 TTQ_DECL(Pointer)
167 TTQ_DECL(Reference)
168 TTQ_DECL(Const)
169 TTQ_DECL(Volatile)
170 TTQ_DECL(ConstReference)
171 template<typename T>
172 struct StripAll
173 {
174 typedef typename StripConst<typename StripVolatile<typename StripReference<T>::Result>::Result>::Result Result;
175 };
176 template<typename T>
177 struct ParameterType
178 {
179 typedef typename TypeTraits<T>::ParameterType Result;
180 };
181 template<typename T>
182 struct PointerType
183 {
184 typedef T* Result;
185 };
186 template<typename T>
187 struct ReferenceType
188 {
189 typedef T& Result;
190 };
191 template<typename T>
192 struct ReferenceType<T&>
193 {
194 typedef T& Result;
195 };
196 template<typename T>
197 struct ConstReferenceType
198 {
199 typedef const T& Result;
200 };
201
202 template<typename T>
203 struct ConstReferenceType<T&>
204 {
205 typedef const T& Result;
206 };
207};
208
209template<typename T>
210struct TypeListCheck
211{
212 enum { value = false };
213};
214
215template<typename Head, class Tail>
216struct TypeListCheck<KTypeList<Head, Tail> >
217{
218 enum { value = TypeTraits<Tail>::isTypeList };
219};
220
221template<>
222struct TypeListCheck<KDE::NullType>
223{
224 enum { value = true };
225};
226
227template<typename T>
228class TypeTraits
229{
230public:
231 TTQ_ALIAS(Volatile)
232 TTQ_ALIAS(Pointer)
233 TTQ_ALIAS(Reference)
234 TTQ_ALIAS(Const)
235 TTQ_ALIAS(ConstReference)
236 enum { isSignedInt = KTypeListContains<SignedInts, T>::value };
237 enum { isUnsignedInt = KTypeListContains<UnsignedInts, T>::value };
238 enum { isInteger = isSignedInt || isUnsignedInt };
239 enum { isFloat = KTypeListContains<Floats, T>::value };
240 enum { isBoolean = STATIC_EQUAL(T, bool) };
241 enum { isNumeric = isInteger || isFloat || isBoolean };
242 enum { isFundamental = isPointer || isNumeric };
243 enum { isQObject = IsParentOfChildNonStrict<QObject, T>::value };
244 enum { isQWidget = IsParentOfChildNonStrict<QWidget, T>::value };
245 typedef typename Modifiers::ReferenceType<T>::Result ReferenceType;
246 typedef STATIC_IF(isFundamental || isReference, T, typename Modifiers::ReferenceType<const T>::Result) ParameterType;
247 enum { isTypeList = TypeListCheck<T>::value };
248 typedef typename Modifiers::StripAll<T>::Result StripAll;
249};
250
251namespace Modifiers
252{
253TTQ_SPECIALIZATION(Pointer, T*)
254TTQ_SPECIALIZATION(Reference, T&)
255TTQ_SPECIALIZATION(Const, const T)
256TTQ_SPECIALIZATION(Volatile, volatile T)
257TTQ_SPECIALIZATION(ConstReference, const T&)
258}
259
260template<class Types>
261struct StrippedList
262{
263 typedef STATIC_FOREACH(Types, Modifiers::StripAll) Result;
264};
265
266template<class Types>
267struct ParameterList
268{
269 typedef STATIC_FOREACH(Types, Modifiers::ParameterType) Result;
270};
271
272template<class Types>
273struct PointerList
274{
275 typedef STATIC_FOREACH(Types, Modifiers::PointerType) Result;
276};
277
278template<class Types>
279struct ReferenceList
280{
281 typedef STATIC_FOREACH(Types, Modifiers::ReferenceType) Result;
282};
283
284}
285
286#undef TTQ_SPECIALIZATION
287#undef TTQ_DECL
288#undef TTQ_ALIAS
289
290#undef NC
291
292#endif
293
NullType
This empty class serves as a terminal marker for typelists.
KTypeTraits::TypeTraits
Definition: ktypetraits.h:229
KTypeTraits::TypeTraits::isSignedInt
@ isSignedInt
Definition: ktypetraits.h:236
KTypeTraits::TypeTraits::isQWidget
@ isQWidget
Definition: ktypetraits.h:244
KTypeTraits::TypeTraits::isUnsignedInt
@ isUnsignedInt
Definition: ktypetraits.h:237
KTypeTraits::TypeTraits::StripAll
Modifiers::StripAll< T >::Result StripAll
Definition: ktypetraits.h:248
KTypeTraits::TypeTraits::isTypeList
@ isTypeList
Definition: ktypetraits.h:247
KTypeTraits::TypeTraits::isQObject
@ isQObject
Definition: ktypetraits.h:243
KTypeTraits::TypeTraits::STATIC_IF
typedef STATIC_IF(isFundamental||isReference, T, typename Modifiers::ReferenceType< const T >::Result) ParameterType
KTypeTraits::TypeTraits::isNumeric
@ isNumeric
Definition: ktypetraits.h:241
KTypeTraits::TypeTraits::isFundamental
@ isFundamental
Definition: ktypetraits.h:242
KTypeTraits::TypeTraits::isBoolean
@ isBoolean
Definition: ktypetraits.h:240
KTypeTraits::TypeTraits::ReferenceType
Modifiers::ReferenceType< T >::Result ReferenceType
Definition: ktypetraits.h:245
KTypeTraits::TypeTraits::isInteger
@ isInteger
Definition: ktypetraits.h:238
KTypeTraits::TypeTraits::isFloat
@ isFloat
Definition: ktypetraits.h:239
QObject
Const
QString Const
Definition: kconfig_compiler.cpp:104
T
#define T
ktypelist.h
This file defines typelist structures as well as convenience macros to create typelists.
K_TYPELIST_6
#define K_TYPELIST_6(T1, T2, T3, T4, T5, T6)
Definition: ktypelist.h:115
K_TYPELIST_3
#define K_TYPELIST_3(T1, T2, T3)
Definition: ktypelist.h:107
ktypelistutils.h
STATIC_EQUAL
#define STATIC_EQUAL(type1, type2)
Definition: ktypelistutils.h:229
NC
#define NC(...)
@File ktypelistutils.h Various templates to handle typelists in meta-programming.
Definition: ktypelistutils.h:32
TTQ_ALIAS
#define TTQ_ALIAS(Name)
Definition: ktypetraits.h:157
TTQ_SPECIALIZATION
#define TTQ_SPECIALIZATION(Name, Check)
Definition: ktypetraits.h:146
TTQ_DECL
#define TTQ_DECL(Name)
Definition: ktypetraits.h:135
KDE
Definition: netsupp.cpp:1247
KTypeTraits
Definition: ktypetraits.h:32
KTypeTraits::minuint
MinTypeSelect< UnsignedInts >::Result minuint
Definition: ktypetraits.h:131
KTypeTraits::uint64
TypeSelect< UnsignedInts, 8 >::Result uint64
Definition: ktypetraits.h:124
KTypeTraits::int8
TypeSelect< SignedInts, 1 >::Result int8
Definition: ktypetraits.h:117
KTypeTraits::int64
TypeSelect< SignedInts, 8 >::Result int64
Definition: ktypetraits.h:120
KTypeTraits::float96
TypeSelect< Floats, 12 >::Result float96
Definition: ktypetraits.h:127
KTypeTraits::float64
TypeSelect< Floats, 8 >::Result float64
Definition: ktypetraits.h:126
KTypeTraits::maxint
MaxTypeSelect< SignedInts >::Result maxint
Definition: ktypetraits.h:128
KTypeTraits::uint32
TypeSelect< UnsignedInts, 4 >::Result uint32
Definition: ktypetraits.h:123
KTypeTraits::minfloat
MinTypeSelect< Floats >::Result minfloat
Definition: ktypetraits.h:133
KTypeTraits::float32
TypeSelect< Floats, 4 >::Result float32
Definition: ktypetraits.h:125
KTypeTraits::maxuint
MaxTypeSelect< UnsignedInts >::Result maxuint
Definition: ktypetraits.h:130
KTypeTraits::int16
TypeSelect< SignedInts, 2 >::Result int16
Definition: ktypetraits.h:118
KTypeTraits::maxfloat
MaxTypeSelect< Floats >::Result maxfloat
Definition: ktypetraits.h:132
KTypeTraits::minint
MinTypeSelect< SignedInts >::Result minint
Definition: ktypetraits.h:129
KTypeTraits::int32
TypeSelect< SignedInts, 4 >::Result int32
Definition: ktypetraits.h:119
KTypeTraits::uint16
TypeSelect< UnsignedInts, 2 >::Result uint16
Definition: ktypetraits.h:122
KTypeTraits::uint8
TypeSelect< UnsignedInts, 1 >::Result uint8
Definition: ktypetraits.h:121
KTypeListContains
Definition: ktypelistutils.h:192
KTypeList
The building block of typelists of any length.
Definition: ktypelist.h:454
KTypeTraits::CanConvert
Definition: ktypetraits.h:54
KTypeTraits::CanConvert::value
@ value
Definition: ktypetraits.h:61
KTypeTraits::CanDynamicCast
Definition: ktypetraits.h:78
KTypeTraits::CanDynamicCast::value
@ value
Definition: ktypetraits.h:79
KTypeTraits::IsParentOfChildNonStrict
Definition: ktypetraits.h:66
KTypeTraits::IsParentOfChildNonStrict::value
@ value
Definition: ktypetraits.h:67
KTypeTraits::IsParentOfChild
Definition: ktypetraits.h:72
KTypeTraits::IsParentOfChild::value
@ value
Definition: ktypetraits.h:73
KTypeTraits::MaxTypeSelect< KDE::NullType >::Result
KDE::NullType Result
Definition: ktypetraits.h:95
KTypeTraits::MaxTypeSelect
Definition: ktypetraits.h:84
KTypeTraits::MaxTypeSelect::STATIC_IF
typedef STATIC_IF(isMax, typename Types::Head, typename MaxTypeSelect< typename Types::Tail >::Result) Result
KTypeTraits::MaxTypeSelect::max
@ max
Definition: ktypetraits.h:86
KTypeTraits::MinTypeSelect< KDE::NullType >::Result
KDE::NullType Result
Definition: ktypetraits.h:111
KTypeTraits::MinTypeSelect
Definition: ktypetraits.h:100
KTypeTraits::MinTypeSelect::STATIC_IF
typedef STATIC_IF(isMin, typename Types::Head, typename MinTypeSelect< typename Types::Tail >::Result) Result
KTypeTraits::MinTypeSelect::min
@ min
Definition: ktypetraits.h:102
KTypeTraits::Modifiers::ConstReferenceType< T & >::Result
const T & Result
Definition: ktypetraits.h:205
KTypeTraits::Modifiers::ConstReferenceType
Definition: ktypetraits.h:198
KTypeTraits::Modifiers::ConstReferenceType::Result
const T & Result
Definition: ktypetraits.h:199
KTypeTraits::Modifiers::ParameterType
Definition: ktypetraits.h:178
KTypeTraits::Modifiers::ParameterType::Result
TypeTraits< T >::ParameterType Result
Definition: ktypetraits.h:179
KTypeTraits::Modifiers::PointerType
Definition: ktypetraits.h:183
KTypeTraits::Modifiers::PointerType::Result
T * Result
Definition: ktypetraits.h:184
KTypeTraits::Modifiers::ReferenceType< T & >::Result
T & Result
Definition: ktypetraits.h:194
KTypeTraits::Modifiers::ReferenceType
Definition: ktypetraits.h:188
KTypeTraits::Modifiers::ReferenceType::Result
T & Result
Definition: ktypetraits.h:189
KTypeTraits::Modifiers::StripAll
Definition: ktypetraits.h:173
KTypeTraits::Modifiers::StripAll::Result
StripConst< typenameStripVolatile< typenameStripReference< T >::Result >::Result >::Result Result
Definition: ktypetraits.h:174
KTypeTraits::ParameterList
Definition: ktypetraits.h:268
KTypeTraits::ParameterList::STATIC_FOREACH
typedef STATIC_FOREACH(Types, Modifiers::ParameterType) Result
KTypeTraits::PointerList
Definition: ktypetraits.h:274
KTypeTraits::PointerList::STATIC_FOREACH
typedef STATIC_FOREACH(Types, Modifiers::PointerType) Result
KTypeTraits::ReferenceList
Definition: ktypetraits.h:280
KTypeTraits::ReferenceList::STATIC_FOREACH
typedef STATIC_FOREACH(Types, Modifiers::ReferenceType) Result
KTypeTraits::StrippedList
Definition: ktypetraits.h:262
KTypeTraits::StrippedList::STATIC_FOREACH
typedef STATIC_FOREACH(Types, Modifiers::StripAll) Result
KTypeTraits::TypeListCheck
Definition: ktypetraits.h:211
KTypeTraits::TypeListCheck::value
@ value
Definition: ktypetraits.h:212
KTypeTraits::TypeSelectImpl
Definition: ktypetraits.h:36
KTypeTraits::TypeSelectImpl::Result
Types::Head Result
Definition: ktypetraits.h:37
KTypeTraits::TypeSelect< KDE::NullType, size >::Result
KDE::NullType Result
Definition: ktypetraits.h:49
KTypeTraits::TypeSelect
Definition: ktypetraits.h:42
KTypeTraits::TypeSelect::STATIC_IF
typedef STATIC_IF(sizeof(typename Types::Head)==size, typename Types::Head, NC(typename TypeSelect< typename Types::Tail, size >::Result)) Result
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

Skip menu "KDECore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal