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

KDECore

  • sources
  • kde-4.12
  • kdelibs
  • 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Ă© <[email protected]>
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 
26 class QObject;
27 class QWidget;
28 
29 #define NC(...) __VA_ARGS__
30 
31 namespace KTypeTraits
32 {
33 
34 template<class Types, bool correct>
35 struct TypeSelectImpl
36 {
37  typedef typename Types::Head Result;
38 };
39 
40 template<class Types, unsigned int size>
41 struct 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 
46 template<unsigned int size>
47 struct TypeSelect<KDE::NullType, size>
48 {
49  typedef KDE::NullType Result;
50 };
51 
52 template<typename T, typename U>
53 struct CanConvert
54 {
55 private:
56  class Big { char dummy[2]; };
57  static char test(const U&);
58  static Big test(...);
59  static T makeT();
60 public:
61  enum { value = sizeof(test(makeT())) == sizeof(char) };
62 };
63 
64 template<typename T, typename U>
65 struct IsParentOfChildNonStrict
66 {
67  enum { value = CanConvert<const U*, const T*>::value && !STATIC_EQUAL(T, void) };
68 };
69 
70 template<typename T, typename U>
71 struct IsParentOfChild
72 {
73  enum { value = IsParentOfChildNonStrict<T, U>::value && !STATIC_EQUAL(const T, const U) };
74 };
75 
76 template<typename T, typename U>
77 struct CanDynamicCast
78 {
79  enum { value = CanConvert<const U*, const T*>::value };
80 };
81 
82 template<class Types>
83 struct 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 
90 template<>
91 struct MaxTypeSelect<KDE::NullType>
92 {
93  enum { isMax = true };
94  enum { max = -1 };
95  typedef KDE::NullType Result;
96 };
97 
98 template<class Types>
99 struct 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 
106 template<>
107 struct MinTypeSelect<KDE::NullType>
108 {
109  enum { isMin = true };
110  enum { min = 1000000 };
111  typedef KDE::NullType Result;
112 };
113 
114 typedef K_TYPELIST_6(signed char, wchar_t, signed short, signed int, signed long, signed long long) SignedInts;
115 typedef K_TYPELIST_6(unsigned char, wchar_t, unsigned short, unsigned int, unsigned long, unsigned long long) UnsignedInts;
116 typedef K_TYPELIST_3(float, double, long double) Floats;
117 typedef TypeSelect<SignedInts, 1>::Result int8;
118 typedef TypeSelect<SignedInts, 2>::Result int16;
119 typedef TypeSelect<SignedInts, 4>::Result int32;
120 typedef TypeSelect<SignedInts, 8>::Result int64;
121 typedef TypeSelect<UnsignedInts, 1>::Result uint8;
122 typedef TypeSelect<UnsignedInts, 2>::Result uint16;
123 typedef TypeSelect<UnsignedInts, 4>::Result uint32;
124 typedef TypeSelect<UnsignedInts, 8>::Result uint64;
125 typedef TypeSelect<Floats, 4>::Result float32;
126 typedef TypeSelect<Floats, 8>::Result float64;
127 typedef TypeSelect<Floats, 12>::Result float96;
128 typedef MaxTypeSelect<SignedInts>::Result maxint;
129 typedef MinTypeSelect<SignedInts>::Result minint;
130 typedef MaxTypeSelect<UnsignedInts>::Result maxuint;
131 typedef MinTypeSelect<UnsignedInts>::Result minuint;
132 typedef MaxTypeSelect<Floats>::Result maxfloat;
133 typedef 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 
161 template<typename T>
162 class TypeTraits;
163 
164 namespace 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 
209 template<typename T>
210 struct TypeListCheck
211 {
212  enum { value = false };
213 };
214 
215 template<typename Head, class Tail>
216 struct TypeListCheck<KTypeList<Head, Tail> >
217 {
218  enum { value = TypeTraits<Tail>::isTypeList };
219 };
220 
221 template<>
222 struct TypeListCheck<KDE::NullType>
223 {
224  enum { value = true };
225 };
226 
227 template<typename T>
228 class TypeTraits
229 {
230 public:
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 
251 namespace Modifiers
252 {
253 TTQ_SPECIALIZATION(Pointer, T*)
254 TTQ_SPECIALIZATION(Reference, T&)
255 TTQ_SPECIALIZATION(Const, const T)
256 TTQ_SPECIALIZATION(Volatile, volatile T)
257 TTQ_SPECIALIZATION(ConstReference, const T&)
258 }
259 
260 template<class Types>
261 struct StrippedList
262 {
263  typedef STATIC_FOREACH(Types, Modifiers::StripAll) Result;
264 };
265 
266 template<class Types>
267 struct ParameterList
268 {
269  typedef STATIC_FOREACH(Types, Modifiers::ParameterType) Result;
270 };
271 
272 template<class Types>
273 struct PointerList
274 {
275  typedef STATIC_FOREACH(Types, Modifiers::PointerType) Result;
276 };
277 
278 template<class Types>
279 struct 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 
KTypeTraits::IsParentOfChildNonStrict
Definition: ktypetraits.h:65
KTypeTraits::minuint
MinTypeSelect< UnsignedInts >::Result minuint
Definition: ktypetraits.h:131
KTypeTraits::int16
TypeSelect< SignedInts, 2 >::Result int16
Definition: ktypetraits.h:118
KTypeTraits::TypeTraits::ReferenceType
Modifiers::ReferenceType< T >::Result ReferenceType
Definition: ktypetraits.h:245
Const
QString Const
Definition: kconfig_compiler.cpp:104
KTypeTraits::CanConvert::value
Definition: ktypetraits.h:61
KTypeTraits::TypeSelect< KDE::NullType, size >::Result
KDE::NullType Result
Definition: ktypetraits.h:49
ktypelist.h
This file defines typelist structures as well as convenience macros to create typelists.
KTypeTraits::MinTypeSelect
Definition: ktypetraits.h:99
KTypeTraits::int8
TypeSelect< SignedInts, 1 >::Result int8
Definition: ktypetraits.h:117
KTypeTraits::Modifiers::ConstReferenceType< T & >::Result
const T & Result
Definition: ktypetraits.h:205
KTypeTraits::Modifiers::StripAll
Definition: ktypetraits.h:172
T
#define T
KTypeTraits::Modifiers::PointerType
Definition: ktypetraits.h:182
KTypeTraits::maxint
MaxTypeSelect< SignedInts >::Result maxint
Definition: ktypetraits.h:128
KTypeTraits::maxuint
MaxTypeSelect< UnsignedInts >::Result maxuint
Definition: ktypetraits.h:130
KTypeTraits::IsParentOfChildNonStrict::value
Definition: ktypetraits.h:67
KTypeTraits::float64
TypeSelect< Floats, 8 >::Result float64
Definition: ktypetraits.h:126
KTypeTraits::ParameterList
Definition: ktypetraits.h:267
KTypeTraits::MaxTypeSelect::max
Definition: ktypetraits.h:86
KTypeTraits::float32
TypeSelect< Floats, 4 >::Result float32
Definition: ktypetraits.h:125
KTypeTraits::Modifiers::ReferenceType< T & >::Result
T & Result
Definition: ktypetraits.h:194
KTypeTraits::PointerList
Definition: ktypetraits.h:273
KTypeTraits::uint16
TypeSelect< UnsignedInts, 2 >::Result uint16
Definition: ktypetraits.h:122
KTypeTraits::Modifiers::ParameterType
Definition: ktypetraits.h:177
KTypeTraits::uint8
TypeSelect< UnsignedInts, 1 >::Result uint8
Definition: ktypetraits.h:121
KTypeTraits::int32
TypeSelect< SignedInts, 4 >::Result int32
Definition: ktypetraits.h:119
KTypeTraits::IsParentOfChild::value
Definition: ktypetraits.h:73
QObject
KTypeTraits::MaxTypeSelect
Definition: ktypetraits.h:83
KTypeTraits::TypeSelectImpl::Result
Types::Head Result
Definition: ktypetraits.h:37
TTQ_SPECIALIZATION
#define TTQ_SPECIALIZATION(Name, Check)
Definition: ktypetraits.h:146
STATIC_EQUAL
#define STATIC_EQUAL(type1, type2)
Definition: ktypelistutils.h:229
KDE::NullType
This empty class serves as a terminal marker for typelists.
KTypeList
The building block of typelists of any length.
Definition: ktypelist.h:453
KTypeTraits::K_TYPELIST_3
typedef K_TYPELIST_3(float, double, long double) Floats
KTypeTraits::K_TYPELIST_6
typedef K_TYPELIST_6(signed char, wchar_t, signed short, signed int, signed long, signed long long) SignedInts
KTypeTraits::TypeSelect
Definition: ktypetraits.h:41
KTypeTraits::minfloat
MinTypeSelect< Floats >::Result minfloat
Definition: ktypetraits.h:133
KTypeTraits::TypeSelectImpl
Definition: ktypetraits.h:35
KTypeTraits::Modifiers::ConstReferenceType::Result
const T & Result
Definition: ktypetraits.h:199
KTypeTraits::ReferenceList
Definition: ktypetraits.h:279
KTypeListContains
Definition: ktypelistutils.h:191
KTypeTraits::TypeListCheck
Definition: ktypetraits.h:210
KTypeTraits::MinTypeSelect< KDE::NullType >::Result
KDE::NullType Result
Definition: ktypetraits.h:111
KTypeTraits::Modifiers::ReferenceType::Result
T & Result
Definition: ktypetraits.h:189
KTypeTraits::Modifiers::ReferenceType
Definition: ktypetraits.h:187
KTypeTraits::int64
TypeSelect< SignedInts, 8 >::Result int64
Definition: ktypetraits.h:120
KTypeTraits::StrippedList
Definition: ktypetraits.h:261
KTypeTraits::float96
TypeSelect< Floats, 12 >::Result float96
Definition: ktypetraits.h:127
NC
#define NC(...)
Definition: ktypetraits.h:29
KTypeTraits::Modifiers::StripAll::Result
StripConst< typename StripVolatile< typename StripReference< T >::Result >::Result >::Result Result
Definition: ktypetraits.h:174
TTQ_DECL
#define TTQ_DECL(Name)
Definition: ktypetraits.h:135
KTypeTraits::uint64
TypeSelect< UnsignedInts, 8 >::Result uint64
Definition: ktypetraits.h:124
ktypelistutils.h
KTypeTraits::MaxTypeSelect::STATIC_IF
typedef STATIC_IF(isMax, typename Types::Head, typename MaxTypeSelect< typename Types::Tail >::Result) Result
KTypeTraits::MaxTypeSelect< KDE::NullType >::Result
KDE::NullType Result
Definition: ktypetraits.h:95
KTypeTraits::IsParentOfChild
Definition: ktypetraits.h:71
TTQ_ALIAS
#define TTQ_ALIAS(Name)
Definition: ktypetraits.h:157
KTypeTraits::CanDynamicCast
Definition: ktypetraits.h:77
KTypeTraits::minint
MinTypeSelect< SignedInts >::Result minint
Definition: ktypetraits.h:129
STATIC_FOREACH
#define STATIC_FOREACH(list, modifier)
Apply KTypeListForeach.
Definition: ktypelistutils.h:234
KTypeTraits::TypeTraits
Definition: ktypetraits.h:162
KTypeTraits::maxfloat
MaxTypeSelect< Floats >::Result maxfloat
Definition: ktypetraits.h:132
KTypeTraits::Modifiers::ConstReferenceType
Definition: ktypetraits.h:197
KTypeTraits::TypeSelect::STATIC_IF
typedef STATIC_IF(sizeof(typename Types::Head)==size, typename Types::Head, NC(typename TypeSelect< typename Types::Tail, size >::Result)) Result
KTypeTraits::uint32
TypeSelect< UnsignedInts, 4 >::Result uint32
Definition: ktypetraits.h:123
KTypeTraits::Modifiers::PointerType::Result
T * Result
Definition: ktypetraits.h:184
KTypeTraits::TypeTraits::StripAll
Modifiers::StripAll< T >::Result StripAll
Definition: ktypetraits.h:248
KTypeTraits::Modifiers::ParameterType::Result
TypeTraits< T >::ParameterType Result
Definition: ktypetraits.h:179
KTypeTraits::CanConvert
Definition: ktypetraits.h:53
KTypeTraits::CanDynamicCast::value
Definition: ktypetraits.h:79
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:47:09 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



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